Dockerfile
Rama main · réplica de lectura del repositorio original.
# syntax=docker/dockerfile:1.7
ARG NODE_IMAGE=node:24-bookworm-slim
FROM ${NODE_IMAGE} AS workspace
ENV PNPM_HOME=/pnpm
ENV PATH=${PNPM_HOME}:${PATH}
ENV NPM_CONFIG_REGISTRY=https://registry.npmmirror.com
# Prefer China mirrors so ECS builds are not gated on deb.debian.org / npmjs.
RUN sed -i 's|deb.debian.org|mirrors.aliyun.com|g' /etc/apt/sources.list.d/debian.sources 2>/dev/null || \
sed -i 's|deb.debian.org|mirrors.aliyun.com|g' /etc/apt/sources.list && \
sed -i 's|security.debian.org|mirrors.aliyun.com|g' /etc/apt/sources.list.d/debian.sources 2>/dev/null || \
sed -i 's|security.debian.org|mirrors.aliyun.com|g' /etc/apt/sources.list && \
apt-get update && \
apt-get install --yes --no-install-recommends g++ make python3 && \
npm install --global pnpm@11.9.0 --registry=https://registry.npmmirror.com && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
WORKDIR /workspace
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml turbo.json tsconfig.base.json ./
RUN --mount=type=cache,id=tokems-pnpm-store,target=/pnpm/store \
pnpm fetch --frozen-lockfile
COPY . .
ARG NUXT_PUBLIC_API_BASE=/api/v1
ARG NUXT_PUBLIC_ORGANIZATION_SLUG=geo-conference
ARG VITE_API_BASE=/api/v1
ARG VITE_ADMIN_BASE=/admin/
ARG VITE_SIMPLE_AUTH=false
ARG BUILD_SHA=unknown
ARG BUILD_TIME=unknown
ARG BUILD_MIGRATION=unknown
ARG BUILD_MIGRATION_HASH=unknown
ENV NUXT_PUBLIC_API_BASE=${NUXT_PUBLIC_API_BASE}
ENV NUXT_PUBLIC_ORGANIZATION_SLUG=${NUXT_PUBLIC_ORGANIZATION_SLUG}
ENV VITE_API_BASE=${VITE_API_BASE}
ENV VITE_ADMIN_BASE=${VITE_ADMIN_BASE}
ENV VITE_SIMPLE_AUTH=${VITE_SIMPLE_AUTH}
ENV BUILD_SHA=${BUILD_SHA}
ENV BUILD_TIME=${BUILD_TIME}
ENV BUILD_MIGRATION=${BUILD_MIGRATION}
ENV BUILD_MIGRATION_HASH=${BUILD_MIGRATION_HASH}
RUN --mount=type=cache,id=tokems-pnpm-store,target=/pnpm/store \
pnpm install --offline --frozen-lockfile
RUN pnpm build
RUN node tooling/write-build-info.mjs --service admin --output /workspace/.build-info/admin/version.json && \
node tooling/write-build-info.mjs --service gateway --output /workspace/.build-info/gateway/version.json
RUN --mount=type=cache,id=tokems-pnpm-store,target=/pnpm/store \
pnpm --filter @conference/api deploy --prod --legacy /opt/deploy/api && \
pnpm --filter @conference/worker deploy --prod --legacy /opt/deploy/worker
FROM ${NODE_IMAGE} AS api
ARG BUILD_SHA=unknown
ARG BUILD_TIME=unknown
ARG BUILD_MIGRATION=unknown
ARG BUILD_MIGRATION_HASH=unknown
LABEL org.opencontainers.image.source="https://github.com/yaojingang/TokEMS" \
org.opencontainers.image.revision="${BUILD_SHA}" \
org.opencontainers.image.created="${BUILD_TIME}" \
com.tokems.service="api" \
com.tokems.build.sha="${BUILD_SHA}" \
com.tokems.build.time="${BUILD_TIME}" \
com.tokems.build.migration="${BUILD_MIGRATION}" \
com.tokems.build.migration-hash="${BUILD_MIGRATION_HASH}"
ENV NODE_ENV=production
ENV API_PORT=4100
WORKDIR /app
COPY --chown=node:node --from=workspace /opt/deploy/api/ ./
USER node
EXPOSE 4100
CMD ["node", "dist/main.js"]
FROM ${NODE_IMAGE} AS worker
ARG BUILD_SHA=unknown
ARG BUILD_TIME=unknown
ARG BUILD_MIGRATION=unknown
ARG BUILD_MIGRATION_HASH=unknown
LABEL org.opencontainers.image.source="https://github.com/yaojingang/TokEMS" \
org.opencontainers.image.revision="${BUILD_SHA}" \
org.opencontainers.image.created="${BUILD_TIME}" \
com.tokems.service="worker" \
com.tokems.build.sha="${BUILD_SHA}" \
com.tokems.build.time="${BUILD_TIME}" \
com.tokems.build.migration="${BUILD_MIGRATION}" \
com.tokems.build.migration-hash="${BUILD_MIGRATION_HASH}"
ENV NODE_ENV=production
LABEL com.tokems.worker-ready-protocol="1"
WORKDIR /app
COPY --chown=node:node --from=workspace /opt/deploy/worker/ ./
USER node
CMD ["node", "dist/main.js"]
FROM ${NODE_IMAGE} AS web
ARG BUILD_SHA=unknown
ARG BUILD_TIME=unknown
ARG BUILD_MIGRATION=unknown
ARG BUILD_MIGRATION_HASH=unknown
LABEL org.opencontainers.image.source="https://github.com/yaojingang/TokEMS" \
org.opencontainers.image.revision="${BUILD_SHA}" \
org.opencontainers.image.created="${BUILD_TIME}" \
com.tokems.service="web" \
com.tokems.build.sha="${BUILD_SHA}" \
com.tokems.build.time="${BUILD_TIME}" \
com.tokems.build.migration="${BUILD_MIGRATION}" \
com.tokems.build.migration-hash="${BUILD_MIGRATION_HASH}"
ENV NODE_ENV=production
ENV HOST=0.0.0.0
ENV PORT=3000
WORKDIR /app
COPY --chown=node:node --from=workspace /workspace/apps/web/.output/ ./
USER node
EXPOSE 3000
CMD ["node", "server/index.mjs"]
FROM nginx:1.31-alpine AS admin
ARG BUILD_SHA=unknown
ARG BUILD_TIME=unknown
ARG BUILD_MIGRATION=unknown
ARG BUILD_MIGRATION_HASH=unknown
LABEL org.opencontainers.image.source="https://github.com/yaojingang/TokEMS" \
org.opencontainers.image.revision="${BUILD_SHA}" \
org.opencontainers.image.created="${BUILD_TIME}" \
com.tokems.service="admin" \
com.tokems.build.sha="${BUILD_SHA}" \
com.tokems.build.time="${BUILD_TIME}" \
com.tokems.build.migration="${BUILD_MIGRATION}" \
com.tokems.build.migration-hash="${BUILD_MIGRATION_HASH}"
COPY docker/admin.nginx.conf /etc/nginx/conf.d/default.conf
COPY --from=workspace /workspace/apps/admin/dist/ /usr/share/nginx/html/
COPY --from=workspace /workspace/.build-info/admin/version.json /usr/share/nginx/html/version.json
EXPOSE 8080
CMD ["nginx", "-g", "daemon off;"]
FROM nginx:1.31-alpine AS gateway
ARG BUILD_SHA=unknown
ARG BUILD_TIME=unknown
ARG BUILD_MIGRATION=unknown
ARG BUILD_MIGRATION_HASH=unknown
LABEL org.opencontainers.image.source="https://github.com/yaojingang/TokEMS" \
org.opencontainers.image.revision="${BUILD_SHA}" \
org.opencontainers.image.created="${BUILD_TIME}" \
com.tokems.service="gateway" \
com.tokems.build.sha="${BUILD_SHA}" \
com.tokems.build.time="${BUILD_TIME}" \
com.tokems.build.migration="${BUILD_MIGRATION}" \
com.tokems.build.migration-hash="${BUILD_MIGRATION_HASH}"
COPY docker/gateway.nginx.conf /etc/nginx/conf.d/default.conf
COPY docker/gateway-object-storage.include /etc/nginx/tokems-object-storage.include
COPY --from=workspace /workspace/.build-info/gateway/version.json /usr/share/nginx/html/version.json
EXPOSE 8080
CMD ["nginx", "-g", "daemon off;"]
FROM ${NODE_IMAGE} AS notification-sink
ARG BUILD_SHA=unknown
ARG BUILD_TIME=unknown
ARG BUILD_MIGRATION=unknown
ARG BUILD_MIGRATION_HASH=unknown
LABEL org.opencontainers.image.source="https://github.com/yaojingang/TokEMS" \
org.opencontainers.image.revision="${BUILD_SHA}" \
org.opencontainers.image.created="${BUILD_TIME}" \
com.tokems.service="notification-sink" \
com.tokems.build.sha="${BUILD_SHA}" \
com.tokems.build.time="${BUILD_TIME}" \
com.tokems.build.migration="${BUILD_MIGRATION}" \
com.tokems.build.migration-hash="${BUILD_MIGRATION_HASH}"
ENV NODE_ENV=production
ENV NOTIFICATION_SINK_PORT=4080
WORKDIR /app
COPY --chown=node:node tooling/local-notification-sink.mjs ./local-notification-sink.mjs
USER node
EXPOSE 4080
CMD ["node", "local-notification-sink.mjs"]