From c999999456e50ceba349f83285747aee444cd605 Mon Sep 17 00:00:00 2001 From: Till-JS <101404291+Till-JS@users.noreply.github.com> Date: Tue, 17 Feb 2026 10:45:35 +0100 Subject: [PATCH] feat(planta): add Docker deployment for planta-backend and matrix-planta-bot - Add Dockerfile and docker-entrypoint.sh for planta-backend - Add planta-backend service to docker-compose.macmini.yml (port 3022) - Add matrix-planta-bot service to docker-compose.macmini.yml (port 4022) - Configure dependencies: mana-auth, minio, redis, synapse, planta-backend Co-Authored-By: Claude Opus 4.5 --- apps/planta/apps/backend/Dockerfile | 81 +++++++++++++++++++ apps/planta/apps/backend/docker-entrypoint.sh | 23 ++++++ docker-compose.macmini.yml | 77 ++++++++++++++++++ 3 files changed, 181 insertions(+) create mode 100644 apps/planta/apps/backend/Dockerfile create mode 100644 apps/planta/apps/backend/docker-entrypoint.sh diff --git a/apps/planta/apps/backend/Dockerfile b/apps/planta/apps/backend/Dockerfile new file mode 100644 index 000000000..f8a98137c --- /dev/null +++ b/apps/planta/apps/backend/Dockerfile @@ -0,0 +1,81 @@ +# Build stage +FROM node:20-alpine AS builder + +# Install pnpm +RUN corepack enable && corepack prepare pnpm@9.15.0 --activate + +WORKDIR /app + +# Copy root workspace files +COPY pnpm-workspace.yaml ./ +COPY package.json ./ +COPY pnpm-lock.yaml ./ + +# Copy shared packages (all required dependencies) +COPY packages/shared-errors ./packages/shared-errors +COPY packages/shared-nestjs-auth ./packages/shared-nestjs-auth +COPY packages/shared-nestjs-health ./packages/shared-nestjs-health +COPY packages/shared-nestjs-setup ./packages/shared-nestjs-setup +COPY packages/shared-storage ./packages/shared-storage +COPY packages/shared-tsconfig ./packages/shared-tsconfig + +# Copy planta packages and backend +COPY apps/planta/packages ./apps/planta/packages +COPY apps/planta/apps/backend ./apps/planta/apps/backend + +# Install dependencies (ignore scripts since generate-env.mjs isn't in Docker context) +RUN pnpm install --frozen-lockfile --ignore-scripts + +# Build shared packages first (in dependency order) +WORKDIR /app/packages/shared-errors +RUN pnpm build + +WORKDIR /app/packages/shared-nestjs-auth +RUN pnpm build + +WORKDIR /app/packages/shared-nestjs-health +RUN pnpm build + +WORKDIR /app/packages/shared-nestjs-setup +RUN pnpm build + +WORKDIR /app/packages/shared-storage +RUN pnpm build + +# Build the backend +WORKDIR /app/apps/planta/apps/backend +RUN pnpm build + +# Production stage +FROM node:20-alpine AS production + +# Install pnpm and postgresql-client for health checks +RUN corepack enable && corepack prepare pnpm@9.15.0 --activate \ + && apk add --no-cache postgresql-client + +WORKDIR /app + +# Copy everything from builder (including node_modules) +COPY --from=builder /app/pnpm-workspace.yaml ./ +COPY --from=builder /app/package.json ./ +COPY --from=builder /app/pnpm-lock.yaml ./ +COPY --from=builder /app/node_modules ./node_modules +COPY --from=builder /app/packages ./packages +COPY --from=builder /app/apps/planta ./apps/planta + +# Copy entrypoint script +COPY apps/planta/apps/backend/docker-entrypoint.sh /usr/local/bin/ +RUN chmod +x /usr/local/bin/docker-entrypoint.sh + +WORKDIR /app/apps/planta/apps/backend + +# Expose port +EXPOSE 3022 + +# Health check +HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ + CMD wget --no-verbose --tries=1 --spider http://localhost:3022/health || exit 1 + +# Run entrypoint script +ENTRYPOINT ["docker-entrypoint.sh"] +CMD ["node", "dist/main.js"] diff --git a/apps/planta/apps/backend/docker-entrypoint.sh b/apps/planta/apps/backend/docker-entrypoint.sh new file mode 100644 index 000000000..8bdfa40f6 --- /dev/null +++ b/apps/planta/apps/backend/docker-entrypoint.sh @@ -0,0 +1,23 @@ +#!/bin/sh +set -e + +echo "=== Planta Backend Entrypoint ===" + +# Wait for PostgreSQL to be ready +echo "Waiting for PostgreSQL..." +until pg_isready -h ${DB_HOST:-postgres} -p ${DB_PORT:-5432} -U ${DB_USER:-postgres} 2>/dev/null; do + echo "PostgreSQL is unavailable - sleeping" + sleep 2 +done +echo "PostgreSQL is up!" + +cd /app/apps/planta/apps/backend + +# Run schema push +echo "Pushing database schema..." +npx drizzle-kit push --force +echo "Schema push completed!" + +# Execute the main command +echo "Starting application..." +exec "$@" diff --git a/docker-compose.macmini.yml b/docker-compose.macmini.yml index 7267cd34b..f87e3239b 100644 --- a/docker-compose.macmini.yml +++ b/docker-compose.macmini.yml @@ -624,6 +624,43 @@ services: retries: 3 start_period: 40s + planta-backend: + build: + context: . + dockerfile: apps/planta/apps/backend/Dockerfile + image: planta-backend:local + container_name: mana-app-planta-backend + restart: always + depends_on: + mana-auth: + condition: service_healthy + minio: + condition: service_healthy + environment: + NODE_ENV: production + PORT: 3022 + DATABASE_URL: postgresql://postgres:${POSTGRES_PASSWORD:-mana123}@postgres:5432/planta + DB_HOST: postgres + DB_PORT: 5432 + DB_USER: postgres + MANA_CORE_AUTH_URL: http://mana-auth:3001 + CORS_ORIGINS: https://planta.mana.how,https://mana.how + GOOGLE_GEMINI_API_KEY: ${GOOGLE_GEMINI_API_KEY} + S3_ENDPOINT: http://minio:9000 + S3_PUBLIC_ENDPOINT: https://minio.mana.how + S3_REGION: us-east-1 + S3_ACCESS_KEY: ${MINIO_ACCESS_KEY:-minioadmin} + S3_SECRET_KEY: ${MINIO_SECRET_KEY:-minioadmin} + S3_BUCKET: planta-storage + ports: + - "3022:3022" + healthcheck: + test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://127.0.0.1:3022/health"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + # ============================================ # Tier 4: Matrix Stack (Ports 4000-4099) # ============================================ @@ -1121,6 +1158,46 @@ services: retries: 3 start_period: 40s + matrix-planta-bot: + build: + context: . + dockerfile: services/matrix-planta-bot/Dockerfile + image: matrix-planta-bot:local + container_name: mana-matrix-bot-planta + restart: always + depends_on: + synapse: + condition: service_healthy + mana-auth: + condition: service_healthy + redis: + condition: service_healthy + planta-backend: + condition: service_healthy + environment: + NODE_ENV: production + PORT: 4022 + TZ: Europe/Berlin + MATRIX_HOMESERVER_URL: http://synapse:8008 + MATRIX_ACCESS_TOKEN: ${MATRIX_PLANTA_BOT_TOKEN} + MATRIX_ALLOWED_ROOMS: ${MATRIX_PLANTA_BOT_ROOMS:-} + PLANTA_BACKEND_URL: http://planta-backend:3022 + PLANTA_API_PREFIX: /api + MANA_CORE_AUTH_URL: http://mana-auth:3001 + REDIS_HOST: redis + REDIS_PORT: 6379 + REDIS_PASSWORD: ${REDIS_PASSWORD:-redis123} + volumes: + - matrix_bots_data:/app/data + ports: + - "4022:4022" + healthcheck: + test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://127.0.0.1:4022/health"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + # ============================================ # Tier 5: Web Frontends (Ports 5000-5099) # ============================================