diff --git a/docker-compose.yml b/docker-compose.yml index d971b2b..0b5fbf0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,8 +9,6 @@ services: environment: NODE_ENV: ${NODE_ENV:-development} NEXT_TELEMETRY_DISABLED: "1" - # App uses this to connect to Mongo: - MONGODB_URI: ${MONGODB_URI:-mongodb://appuser:apppass@mongo:27017/mokse?authSource=admin} volumes: - ${DEV_MOUNT:-.:/app} # - ${DEV_NODEMODULES_MOUNT:-/app/node_modules} # this is thought to be handled in Dockerfile now @@ -20,28 +18,3 @@ services: condition: service_healthy profiles: - ${COMPOSE_PROFILES:-dev} - - mongo: - image: mongo:7 - container_name: mongo - restart: unless-stopped - # Expose the port ONLY in dev by default (override via .env if needed) - ports: - - "${MONGO_PORT:-27017}:27017" - environment: - MONGO_INITDB_ROOT_USERNAME: ${MONGO_ROOT_USER:-root} - MONGO_INITDB_ROOT_PASSWORD: ${MONGO_ROOT_PASS:-changeme} - MONGO_INITDB_DATABASE: ${MONGO_DB:-mokse} - volumes: - - mongo_data:/data/db - - ./docker/mongo/init:/docker-entrypoint-initdb.d:ro - healthcheck: - test: ["CMD-SHELL", "mongosh --norc --quiet --eval \"db.runCommand({ ping: 1 }).ok\" | grep 1 >/dev/null"] - interval: 10s - timeout: 5s - retries: 5 - profiles: - - ${COMPOSE_PROFILES:-dev} - -volumes: - mongo_data: diff --git a/docker/mongo/init/01-create-app-user.js b/docker/mongo/init/01-create-app-user.js deleted file mode 100644 index 172eb81..0000000 --- a/docker/mongo/init/01-create-app-user.js +++ /dev/null @@ -1,15 +0,0 @@ -// Creates a readWrite app user on first container start. -// Uses env from docker-compose via the official entrypoint. -const dbName = process.env.MONGO_INITDB_DATABASE || 'mokse'; -const appUser = process.env.MONGO_APP_USER || 'appuser'; -const appPass = process.env.MONGO_APP_PASS || 'apppass'; - -db = db.getSiblingDB(dbName); - -db.createUser({ - user: appUser, - pwd: appPass, - roles: [ - { role: 'readWrite', db: dbName } - ] -}); diff --git a/ogDockerfile b/ogDockerfile new file mode 100644 index 0000000..b112d13 --- /dev/null +++ b/ogDockerfile @@ -0,0 +1,47 @@ +# ---- Base ---- +FROM node:20-alpine AS base +WORKDIR /app +RUN apk add --no-cache libc6-compat +ENV NEXT_TELEMETRY_DISABLED=1 + +# ---- Deps (with dev deps; used by dev & build) ---- +FROM base AS deps +COPY package.json package-lock.json* pnpm-lock.yaml* yarn.lock* .npmrc* ./ +RUN if [ -f package-lock.json ]; then npm ci; else npm install; fi + +# ---- Builder (prod build) ---- +FROM base AS builder +ENV NODE_ENV=development +COPY --from=deps /app/node_modules ./node_modules +COPY . . +# Standalone output for tiny runtime +RUN npm run build + +# ---- Runner (prod runtime) ---- +FROM node:20-alpine AS runner +WORKDIR /app +ENV NODE_ENV=production +ENV NEXT_TELEMETRY_DISABLED=1 + +# Non-root +RUN addgroup -S nextjs && adduser -S nextjs -G nextjs + +# Only what the server needs +COPY --from=builder /app/.next/standalone ./ +COPY --from=builder /app/.next/static ./.next/static +COPY --from=builder /app/public ./public + +RUN apk add --no-cache wget + +EXPOSE 3000 +HEALTHCHECK --interval=30s --timeout=5s --retries=3 CMD wget -qO- http://127.0.0.1:3000/ || exit 1 +USER nextjs +CMD ["node", "server.js"] + +# ---- Dev (hot-reload runtime) ---- +FROM base AS dev +ENV NODE_ENV=development +COPY --from=deps /app/node_modules ./node_modules +# source is bind-mounted in compose; keep image lean +EXPOSE 3000 +CMD ["npm", "run", "dev"]