mirror of
https://github.com/logos-co/logos-web.git
synced 2026-08-27 12:11:14 +00:00
* docs: add page-copy single-source spec and implementation plan * feat(content): add typed home section schemas and migrate home copy into content Add 7 bespoke home* section schemas (+ techStack ctas) to the page section union and populate content/pages/en/home.json with home copy moved verbatim from messages. * refactor(web): source home page copy from @repo/content; drop home namespace from messages Feed every home section from content via findSection/data props (replacing next-intl getTranslations), remove the home namespace from messages/en.json, and add a regression guard plus content-based tests. Render output unchanged. * docs: add get-started/movement page-copy dedup spec and plan * feat(content): add get-started & movement section schemas and content docs Move get-started/movement page copy verbatim into content/pages so it is single-sourced in @repo/content. * refactor(web): source get-started/movement copy from content; drop those namespaces from messages Feed both pages from content via findSection/data props (replacing next-intl), switch them to content-based metadata, delete pages.getStarted/movement from messages, and add content-based tests + ownership guard. Render unchanged. * docs: add navbar-pages CMS copy spec and plan * feat(content): add navbar page section schemas + Pages docs (book, brand-kit, research, node-programme, lambda-prize, manifesto, media, podcast, broadcast, tech-stack explorer) * refactor(web): source navbar pages copy from content; drop those namespaces from messages Migrate book, brand-kit, research (incl. rich-text via a tagged-text renderer), node-programme, lambda-prize, manifesto, media, podcast, logos-broadcast-network, and the tech-stack explorer to read copy from content via findSection/data props and content-based metadata; remove the migrated pages.* namespaces from messages; update guards + contracts. Render output unchanged. * feat(web): source activist/coalition pages copy from content (CMS title/description) Migrate activistBuilder, activistLeaderSteward, and coalitionPartner page metadata from next-intl messages.pages.* into @repo/content PageCopy JSON, following the established bookCopy pattern. - Add activistBuilderCopySectionSchema, activistLeaderStewardCopySectionSchema, coalitionPartnerCopySectionSchema to packages/content/src/schemas/pages.ts and wire them into the pageSectionSchema discriminated union - Create content/pages/en/activist-builder.json, activist-leader-steward.json, coalition-partner.json with verbatim title/description/heading values from the old messages namespace - Switch all three route pages from createTranslatedPageMetadata to createPageMetadata(ROUTE), removing the NAMESPACE constant - Remove activistBuilder, activistLeaderSteward, coalitionPartner from apps/web/messages/en.json pages object - Add schema parse tests, renderToStaticMarkup page tests, messages ownership guards, and content-route contract entries for all three pages * chore(web): remove dead faq (pages.faq + unused FaqSection components) * fix: remove stale faq links * fix: pass payload env through turbo build * fix: preserve lambda prize support labels * fix: preserve live copy after master rebase * fix: address page copy review feedback * refactor: move design guide copy to content * feat: add schemas for home and page copy sections - Introduced home section schemas including homeSocialProof, homeChoosePath, homeDecide, homeStartBuilding, homeAbout, homeUseCases, and homeBuilderPortal. - Added page copy section schemas such as getStartedCopy, movementCopy, bookCopy, designGuideCopy, activistBuilderCopy, activistLeaderStewardCopy, coalitionPartnerCopy, researchCopy, nodeProgrammeCopy, lambdaPrizeCopy, mediaCopy, podcastCopy, broadcastCopy, and manifestoCopy. - Created shared schema for section keys to maintain consistency across sections. * chore(web): remove dead pages.faq from messages * fix: resolve page copy migration conflicts * fix: source connect form page copy from content * fix: remove duplicated afform page copy exports * fix: stop generating afform page copy exports * fix(cms): require only server actions key * fix(cms): load env files before build validation * fix(cms): make env loader available during build * fix(cms): load next env via require * test(cms): isolate missing env validation * feat: add homepage testnet highlight * fix: restore lambda prize support links
99 lines
4.4 KiB
Docker
99 lines
4.4 KiB
Docker
# =============================================================================
|
|
# Production image for apps/cms (Payload CMS 3.83 + Next.js 16)
|
|
#
|
|
# Build context MUST be the monorepo root so pnpm can resolve workspace
|
|
# packages (@repo/content). From the repo root:
|
|
#
|
|
# docker build -f apps/cms/Dockerfile \
|
|
# --build-arg NEXT_SERVER_ACTIONS_ENCRYPTION_KEY="$NEXT_SERVER_ACTIONS_ENCRYPTION_KEY" \
|
|
# --build-arg NEXT_PUBLIC_SERVER_URL=https://cms.example.com \
|
|
# --build-arg NEXT_PUBLIC_WEB_URL=https://www.example.com \
|
|
# -t logos-cms .
|
|
#
|
|
# NEXT_PUBLIC_* values are inlined into the client bundle at build time, so
|
|
# they must be the real public origins here — not at runtime.
|
|
# =============================================================================
|
|
|
|
FROM node:24-bookworm-slim AS base
|
|
ENV PNPM_HOME=/pnpm
|
|
ENV PATH="$PNPM_HOME:$PATH"
|
|
RUN corepack enable
|
|
WORKDIR /app
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# deps — install only what cms (and its workspace deps) need, with a frozen
|
|
# lockfile for reproducible builds.
|
|
# -----------------------------------------------------------------------------
|
|
FROM base AS deps
|
|
# Copy the workspace manifest layer first for better layer caching.
|
|
COPY pnpm-lock.yaml pnpm-workspace.yaml package.json .npmrc ./
|
|
COPY apps/cms/package.json apps/cms/package.json
|
|
COPY packages/config/package.json packages/config/package.json
|
|
COPY packages/content/package.json packages/content/package.json
|
|
COPY packages/tokens/package.json packages/tokens/package.json
|
|
COPY packages/types/package.json packages/types/package.json
|
|
COPY packages/ui/package.json packages/ui/package.json
|
|
RUN --mount=type=cache,id=pnpm,target=/pnpm/store \
|
|
pnpm install --frozen-lockfile --filter cms...
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# builder — copy sources and build the Next.js production output.
|
|
# -----------------------------------------------------------------------------
|
|
FROM base AS builder
|
|
ARG NEXT_SERVER_ACTIONS_ENCRYPTION_KEY
|
|
ARG NEXT_PUBLIC_SERVER_URL
|
|
ARG NEXT_PUBLIC_WEB_URL
|
|
# Build-time placeholders: payload.config.ts validates these env vars at module
|
|
# load (during `next build`). DATABASE_URL/PAYLOAD_SECRET are NOT inlined and
|
|
# are overridden with real values at runtime; the build never connects to the DB.
|
|
ENV NODE_ENV=production \
|
|
NEXT_SERVER_ACTIONS_ENCRYPTION_KEY=${NEXT_SERVER_ACTIONS_ENCRYPTION_KEY} \
|
|
NEXT_TELEMETRY_DISABLED=1 \
|
|
NEXT_PUBLIC_SERVER_URL=${NEXT_PUBLIC_SERVER_URL} \
|
|
NEXT_PUBLIC_WEB_URL=${NEXT_PUBLIC_WEB_URL} \
|
|
DATABASE_URL=postgresql://build:build@localhost:5432/build \
|
|
PAYLOAD_SECRET=build-time-placeholder-secret
|
|
|
|
# Bring in the resolved node_modules from the deps stage, then layer the full
|
|
# monorepo sources on top.
|
|
COPY --from=deps /app/ ./
|
|
COPY . .
|
|
RUN pnpm --filter cms build
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# runner — production runtime. Runs `next start` via pnpm.
|
|
# -----------------------------------------------------------------------------
|
|
FROM base AS runner
|
|
ENV NODE_ENV=production \
|
|
NEXT_TELEMETRY_DISABLED=1 \
|
|
PORT=3000 \
|
|
HOSTNAME=0.0.0.0
|
|
|
|
# Run as an unprivileged user (with a home dir so any tool that needs a cache
|
|
# has a writable location).
|
|
RUN groupadd --system --gid 1001 nodejs \
|
|
&& useradd --system --create-home --uid 1001 --gid nodejs nextjs
|
|
|
|
# Copy the fully built monorepo (sources + node_modules + .next output).
|
|
COPY --from=builder --chown=nextjs:nodejs /app ./
|
|
|
|
# Media uploads are written here at runtime; mount a volume on this path so
|
|
# uploaded files survive container restarts (see docker-compose).
|
|
RUN mkdir -p /app/apps/web/public/cms/uploads \
|
|
&& chown -R nextjs:nodejs /app/apps/web/public/cms/uploads \
|
|
&& chmod +x /app/apps/cms/docker-entrypoint.sh
|
|
|
|
USER nextjs
|
|
WORKDIR /app/apps/cms
|
|
EXPOSE 3000
|
|
|
|
HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \
|
|
CMD node -e "fetch('http://localhost:'+(process.env.PORT||3000)+'/api/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"
|
|
|
|
# The entrypoint applies DB migrations, then execs the CMD below. `next start`
|
|
# runs via the workspace-local binary to avoid invoking pnpm/corepack at runtime
|
|
# (corepack would try to download a package manager into a non-writable cache
|
|
# and crash-loop the container).
|
|
ENTRYPOINT ["/app/apps/cms/docker-entrypoint.sh"]
|
|
CMD ["node_modules/.bin/next", "start"]
|