Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
0a3ee67
Update package.json
seonang Mar 31, 2026
9c64543
Update server.js
seonang Mar 31, 2026
c1dd887
g
seonang Mar 31, 2026
50dbf8a
Pin OpenClaw as app dependency
seonang Mar 31, 2026
32b0a90
Update Dockerfile
seonang Mar 31, 2026
c6fed67
Update Dockerfile
seonang Mar 31, 2026
724a872
chore: bump OpenClaw to 2026.3.31 and sync version automation
seonang Apr 1, 2026
48d1742
fix: align lockfile and override axios for Railway deploy stability (#3)
seonang Apr 1, 2026
24862de
fix: use lockfile-backed npm ci for runtime wrapper deps
seonang Apr 1, 2026
180e33c
fix: exclude oxfmt from pnpm maturity guard during source build
seonang Apr 1, 2026
081261d
fix: exclude oxlint from pnpm maturity guard during source build
seonang Apr 1, 2026
f02470b
fix: exclude MCP SDK from pnpm maturity guard during source build
seonang Apr 1, 2026
b8819c6
chore: recover repo after failed OpenClaw update attempt (#9)
seonang Apr 1, 2026
2df522b
Update package.json
seonang Apr 1, 2026
d152c7d
chore: bump OpenClaw to 2026.3.31 and sync version automation (#10)
seonang Apr 1, 2026
1fe7cdf
refactor: switch OpenClaw runtime image to npm package path (#11)
seonang Apr 1, 2026
87555aa
Update package.json
seonang Apr 1, 2026
954224c
Update Dockerfile
seonang Apr 1, 2026
9eb2819
package fix
seonang Apr 1, 2026
cc20ed9
쉼표
seonang Apr 1, 2026
1ae3e79
grammy add
seonang Apr 1, 2026
3d2c598
Chore/openclaw 2026 4 2 (#13)
seonang Apr 3, 2026
54bcfbc
chore: update openclaw to 2026.4.12
seonang Apr 13, 2026
951f18a
chore: make Docker build assertions debuggable
seonang Apr 13, 2026
c88776d
chore: add verbose npm ci logging for Docker build
seonang Apr 13, 2026
893d8d4
chore: regenerate lockfile for openclaw 2026.4.12
seonang Apr 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions .github/workflows/bump-openclaw-ref.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
name: Bump OpenClaw release ref

on:
schedule:
- cron: "23 9 * * *" # daily 09:23 UTC
workflow_dispatch: {}

permissions:
Expand Down
83 changes: 25 additions & 58 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,46 +1,5 @@
# Build openclaw from source to avoid npm packaging gaps (some dist files are not shipped).
FROM node:22-bookworm AS openclaw-build

# Dependencies needed for openclaw build
RUN apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
git \
ca-certificates \
curl \
python3 \
make \
g++ \
&& rm -rf /var/lib/apt/lists/*

# Install Bun (openclaw build uses it)
RUN curl -fsSL https://bun.sh/install | bash
ENV PATH="/root/.bun/bin:${PATH}"

RUN corepack enable

WORKDIR /openclaw

# Pin to a known-good ref (tag/branch). Override in Railway template settings if needed.
# Using a released tag avoids build breakage when `main` temporarily references unpublished packages.
ARG OPENCLAW_GIT_REF=v2026.3.8
RUN git clone --depth 1 --branch "${OPENCLAW_GIT_REF}" https://github.com/openclaw/openclaw.git .

# Patch: relax version requirements for packages that may reference unpublished versions.
# Apply to all extension package.json files to handle workspace protocol (workspace:*).
RUN set -eux; \
find ./extensions -name 'package.json' -type f | while read -r f; do \
sed -i -E 's/"openclaw"[[:space:]]*:[[:space:]]*">=[^"]+"/"openclaw": "*"/g' "$f"; \
sed -i -E 's/"openclaw"[[:space:]]*:[[:space:]]*"workspace:[^"]+"/"openclaw": "*"/g' "$f"; \
done

RUN pnpm install --no-frozen-lockfile
RUN pnpm build
ENV OPENCLAW_PREFER_PNPM=1
RUN pnpm ui:install && pnpm ui:build


# Runtime image
FROM node:22-bookworm

ENV NODE_ENV=production

RUN apt-get update \
Expand All @@ -55,35 +14,43 @@ RUN apt-get update \
RUN corepack enable && corepack prepare pnpm@10.23.0 --activate

# Persist user-installed tools by default by targeting the Railway volume.
# - npm global installs -> /data/npm
# - pnpm global installs -> /data/pnpm (binaries) + /data/pnpm-store (store)
ENV NPM_CONFIG_PREFIX=/data/npm
ENV NPM_CONFIG_CACHE=/data/npm-cache
ENV PNPM_HOME=/data/pnpm
ENV PNPM_STORE_DIR=/data/pnpm-store
ENV PATH="/data/npm/bin:/data/pnpm:${PATH}"
ENV PATH="/usr/local/bin:/data/npm/bin:/data/pnpm:${PATH}"

WORKDIR /app

# Wrapper deps
COPY package.json ./
RUN npm install --omit=dev && npm cache clean --force
COPY package.json package-lock.json ./
RUN npm ci --omit=dev --foreground-scripts --loglevel verbose

# Copy built openclaw
COPY --from=openclaw-build /openclaw /openclaw
RUN npm_config_global=true node node_modules/openclaw/scripts/postinstall-bundled-plugins.mjs

RUN npm cache clean --force

RUN test -f node_modules/openclaw/dist/entry.js

RUN test -d node_modules/openclaw/skills || (echo "missing: node_modules/openclaw/skills" && ls -la node_modules/openclaw && exit 1)

RUN test -d node_modules/openclaw/assets || (echo "missing: node_modules/openclaw/assets" && ls -la node_modules/openclaw && exit 1)

RUN test -f node_modules/openclaw/node_modules/grammy/package.json || (echo "missing: grammy" && find node_modules/openclaw -maxdepth 3 -type f | grep 'grammy/package.json' || true && exit 1)

RUN test -f node_modules/openclaw/node_modules/@grammyjs/runner/package.json || (echo "missing: @grammyjs/runner" && find node_modules/openclaw -maxdepth 4 -type f | grep '@grammyjs/runner/package.json' || true && exit 1)

RUN test -f node_modules/openclaw/node_modules/@grammyjs/transformer-throttler/package.json || (echo "missing: @grammyjs/transformer-throttler" && find node_modules/openclaw -maxdepth 4 -type f | grep '@grammyjs/transformer-throttler/package.json' || true && exit 1)

RUN test -f node_modules/openclaw/node_modules/@aws-sdk/client-bedrock/package.json || (echo "missing: @aws-sdk/client-bedrock" && find node_modules/openclaw -maxdepth 4 -type f | grep '@aws-sdk/client-bedrock/package.json' || true && exit 1)

# Provide an openclaw executable
RUN printf '%s\n' '#!/usr/bin/env bash' 'exec node /openclaw/dist/entry.js "$@"' > /usr/local/bin/openclaw \
&& chmod +x /usr/local/bin/openclaw

COPY src ./src

# The wrapper listens on $PORT.
# IMPORTANT: Do not set a default PORT here.
# Railway injects PORT at runtime and routes traffic to that port.
# If we force a different port, deployments can come up but the domain will route elsewhere.
# Canonical OpenClaw launcher
RUN printf '%s\n' '#!/usr/bin/env bash' 'exec node /app/node_modules/openclaw/dist/entry.js "$@"' > /usr/local/bin/openclaw \
&& chmod +x /usr/local/bin/openclaw

EXPOSE 8080

# Ensure PID 1 reaps zombies and forwards signals.
ENTRYPOINT ["tini", "--"]
CMD ["node", "src/server.js"]
Loading