Compare commits

..

13 Commits

Author SHA1 Message Date
8ce9314887 fix(web): serve Nitro assets reliably
Some checks failed
CI / validate (push) Failing after 8m18s
CI / validate (pull_request) Successful in 29m51s
Co-authored-by: multica-agent <github@multica.ai>
2026-08-20 13:38:32 +05:00
40100cccab Merge pull request 'DUNGEONS-8: test Coolify PR webhook (recreated #2)' (#6) from test/coolify-webhook-3 into main
Some checks failed
CI / validate (push) Has been cancelled
Reviewed-on: #6
2026-08-19 14:50:41 +00:00
a079598f9c test(coolify): trigger preview deployment webhook
Some checks failed
CI / validate (pull_request) Has been cancelled
CI / validate (push) Has been cancelled
Co-authored-by: multica-agent <github@multica.ai>
2026-08-19 19:44:34 +05:00
263bee12dd Merge pull request 'DUNGEONS-8: test Coolify PR webhook (recreated)' (#5) from test/coolify-webhook-2 into main
Some checks failed
CI / validate (push) Has been cancelled
Reviewed-on: #5
2026-08-19 14:42:43 +00:00
de815cb9c1 test(coolify): trigger preview deployment webhook
Some checks failed
CI / validate (pull_request) Has been cancelled
CI / validate (push) Successful in 14m54s
Co-authored-by: multica-agent <github@multica.ai>
2026-08-19 19:21:18 +05:00
bf48924644 Merge pull request 'DUNGEONS-8: test Coolify PR webhook' (#4) from test/coolify-webhook into main
Some checks failed
CI / validate (push) Has been cancelled
Reviewed-on: #4
2026-08-19 14:19:40 +00:00
e90dccd8bb test(coolify): trigger preview deployment webhook
All checks were successful
CI / validate (push) Successful in 15m15s
CI / validate (pull_request) Successful in 16m0s
Co-authored-by: multica-agent <github@multica.ai>
2026-08-19 19:15:46 +05:00
9c08cabcf7 Merge pull request 'DUNGEONS-6: Fix Nitro public assets in Coolify image' (#3) from perfect_python500/dungeons-6-coolify-assets into main
All checks were successful
CI / validate (push) Successful in 14m28s
Reviewed-on: #3
2026-08-19 13:28:05 +00:00
8651a9aad1 Fix Nitro public assets in Coolify image
All checks were successful
CI / validate (push) Successful in 20m23s
CI / validate (pull_request) Successful in 17m14s
Co-authored-by: multica-agent <github@multica.ai>
2026-08-19 18:19:59 +05:00
860a5383b0 Merge pull request 'Fix Dockerfile healthcheck for Coolify PORT override' (#2) from agent/opencode-deepseek/1fa9d179 into main
All checks were successful
CI / validate (push) Successful in 23m18s
Reviewed-on: #2
2026-08-19 12:06:45 +00:00
62f01f1db3 Fix healthcheck to respect runtime PORT
Some checks failed
CI / validate (push) Successful in 26m55s
CI / validate (pull_request) Failing after 1m15s
Co-authored-by: multica-agent <github@multica.ai>
2026-08-19 17:00:39 +05:00
8f42a6664b Merge pull request 'Add Dockerfile for containerized build and run' (#1) from agent/opencode-deepseek/1fa9d179 into main
All checks were successful
CI / validate (push) Successful in 14m54s
Reviewed-on: #1
2026-08-19 09:47:20 +00:00
95fb688910 Add Dockerfile to build and run the project in Docker
Some checks failed
CI / validate (push) Successful in 16m14s
CI / validate (pull_request) Failing after 15s
Co-authored-by: multica-agent <github@multica.ai>
2026-08-19 14:43:50 +05:00
2 changed files with 86 additions and 0 deletions

79
Dockerfile Normal file
View File

@@ -0,0 +1,79 @@
# syntax=docker/dockerfile:1
#
# Dungeons & Ground — production image.
#
# Build: docker build -t dungeons-ground .
# Run: docker run --env-file .env -p 3000:3000 dungeons-ground
#
# Required env vars at runtime (see .env.example):
# NUXT_PUBLIC_SUPABASE_URL, SUPABASE_URL, NUXT_PUBLIC_SUPABASE_ANON_KEY,
# SUPABASE_SERVICE_ROLE_KEY, plus the AI provider key (OPENROUTER_API_KEY
# or DEEPSEEK_API_KEY). REDIS_URL is optional.
# The Supabase schema is NOT created by the container; install
# supabase/bootstrap.sql (or run `pnpm db:ensure` with SUPABASE_DB_URL set)
# in your Supabase project before starting.
FROM node:18.20.8-slim AS base
ENV PNPM_HOME=/pnpm
ENV PATH=$PNPM_HOME:$PATH
RUN corepack enable && corepack prepare pnpm@10.15.0 --activate
WORKDIR /app
# ---------- Dependencies ----------
FROM base AS deps
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
COPY apps/web/package.json apps/web/package.json
COPY apps/worker/package.json apps/worker/package.json
COPY packages/shared/package.json packages/shared/package.json
COPY packages/game-engine/package.json packages/game-engine/package.json
RUN pnpm install --frozen-lockfile
# ---------- Build ----------
FROM deps AS build
COPY . .
# The web build explicitly loads ../../.env (--dotenv); an empty file keeps
# the build hermetic — all real values come from container env at runtime.
RUN touch .env && pnpm --filter @dng/web build
# ---------- Runtime ----------
FROM base AS runtime
ENV NODE_ENV=production
ENV HOST=0.0.0.0
ENV PORT=3000
WORKDIR /app
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
COPY apps/web/package.json apps/web/package.json
COPY apps/worker/package.json apps/worker/package.json
COPY packages/shared/package.json packages/shared/package.json
COPY packages/game-engine/package.json packages/game-engine/package.json
COPY --from=deps /app/node_modules node_modules
COPY --from=build /app/apps/web/.output apps/web/.output
COPY --from=build /app/apps/worker apps/worker
COPY --from=build /app/packages/shared packages/shared
COPY --from=build /app/packages/game-engine packages/game-engine
EXPOSE 3000
# Coolify (and other hosts) override PORT at runtime; probe that port, not a
# hardcoded one.
HEALTHCHECK --interval=30s --timeout=5s --start-period=30s --retries=3 \
CMD node -e "fetch('http://127.0.0.1:' + (process.env.PORT || 3000) + '/').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"
# The Nuxt web server reads its config through Nuxt runtimeConfig, which is
# baked at build time and overridden at runtime only by NUXT_-prefixed env
# vars; the worker reads plain names (SUPABASE_URL, OPENROUTER_API_KEY, ...)
# directly. The entrypoint maps the plain .env.example names onto the NUXT_
# runtime overrides so `docker run --env-file .env` works for both processes.
# The web server runs in the foreground (PID 1); the AI worker runs alongside
# it in the background. Stop the container with `docker stop` — both die with
# it.
CMD ["sh", "-c", "export NUXT_SUPABASE_URL=\"${NUXT_SUPABASE_URL:-${SUPABASE_URL:-}}\" NUXT_SUPABASE_SERVICE_ROLE_KEY=\"${NUXT_SUPABASE_SERVICE_ROLE_KEY:-${SUPABASE_SERVICE_ROLE_KEY:-}}\" NUXT_AI_PROVIDER=\"${NUXT_AI_PROVIDER:-${AI_PROVIDER:-}}\" NUXT_OPENROUTER_API_KEY=\"${NUXT_OPENROUTER_API_KEY:-${OPENROUTER_API_KEY:-}}\" NUXT_OPENROUTER_MODEL=\"${NUXT_OPENROUTER_MODEL:-${OPENROUTER_MODEL:-}}\" NUXT_OPENROUTER_API_ENDPOINT=\"${NUXT_OPENROUTER_API_ENDPOINT:-${OPENROUTER_API_ENDPOINT:-}}\" NUXT_DEEPSEEK_API_KEY=\"${NUXT_DEEPSEEK_API_KEY:-${DEEPSEEK_API_KEY:-}}\" NUXT_DEEPSEEK_MODEL=\"${NUXT_DEEPSEEK_MODEL:-${DEEPSEEK_MODEL:-}}\" NUXT_DEEPSEEK_API_ENDPOINT=\"${NUXT_DEEPSEEK_API_ENDPOINT:-${DEEPSEEK_API_ENDPOINT:-}}\" NUXT_REDIS_URL=\"${NUXT_REDIS_URL:-${REDIS_URL:-}}\"; pnpm --filter @dng/worker start & exec node apps/web/.output/server/index.mjs"]

View File

@@ -3,6 +3,13 @@ export default defineNuxtConfig({
devtools: { enabled: false }, devtools: { enabled: false },
css: ['~/assets/css/main.css'], css: ['~/assets/css/main.css'],
modules: [], modules: [],
nitro: {
// Nitro 2.10 resolves file-backed assets relative to its split runtime
// chunk, which makes every /_nuxt request fail outside the Docker-only
// symlink workaround. Embedding them keeps every production launcher
// (preview, Docker, and managed hosts) on the same reliable code path.
serveStatic: 'inline',
},
runtimeConfig: { runtimeConfig: {
aiProvider: process.env.AI_PROVIDER ?? 'openrouter', aiProvider: process.env.AI_PROVIDER ?? 'openrouter',
openrouterApiKey: process.env.OPENROUTER_API_KEY, openrouterApiKey: process.env.OPENROUTER_API_KEY,