Compare commits

..

10 Commits

7 changed files with 62 additions and 13 deletions
+19 -3
View File
@@ -20,23 +20,39 @@ RUN pnpm install --frozen-lockfile
FROM installer AS builder
COPY --from=pruner /app/out/full/ .
COPY tsconfig.base.json ./
# Generate Prisma client
RUN pnpm exec prisma generate --schema=apps/api/prisma/schema.prisma
RUN pnpm turbo build --filter=@tower/api
# Build internal workspace packages that api depends on (in dependency order)
RUN pnpm --filter @tower/types run build
RUN pnpm --filter @tower/config run build
RUN pnpm --filter @tower/logger run build
RUN pnpm --filter @tower/search run build
# Build the API via its package script (runs nest build from apps/api/)
RUN pnpm --filter @tower/api run build
# Hard verify: fail the Docker build if dist wasn't produced
RUN test -f apps/api/dist/main.js || (echo "ERROR: apps/api/dist/main.js not found after build!" && exit 1)
# ─── Production runner ───
FROM node:22-alpine AS runner
RUN corepack enable && corepack prepare pnpm@10 --activate
WORKDIR /app
COPY --from=pruner /app/out/full/ .
COPY --from=pruner /app/out/json/ .
COPY --from=pruner /app/out/pnpm-lock.yaml ./pnpm-lock.yaml
COPY --from=pruner /app/out/pnpm-workspace.yaml ./pnpm-workspace.yaml
RUN pnpm install --frozen-lockfile
COPY --from=builder /app/apps/api/dist ./apps/api/dist
COPY --from=builder /app/packages/config/dist ./packages/config/dist
COPY --from=builder /app/packages/logger/dist ./packages/logger/dist
COPY --from=builder /app/packages/search/dist ./packages/search/dist
COPY --from=builder /app/packages/types/dist ./packages/types/dist
RUN pnpm install --prod --frozen-lockfile
COPY --from=pruner /app/apps/api/prisma ./apps/api/prisma
RUN pnpm exec prisma generate --schema=apps/api/prisma/schema.prisma
COPY apps/api/docker-entrypoint.sh /usr/local/bin/
+8 -2
View File
@@ -1,8 +1,14 @@
#!/bin/sh
set -e
echo "Running database migrations..."
pnpm exec prisma migrate deploy --schema=apps/api/prisma/schema.prisma
for i in $(seq 1 30); do
if pnpm exec prisma migrate deploy --schema=apps/api/prisma/schema.prisma; then
echo "Migrations complete"
break
fi
echo "Migration attempt $i failed, retrying in 2s..."
sleep 2
done
echo "Starting TOWER API..."
exec "$@"
+3 -1
View File
@@ -9,10 +9,12 @@
"target": "ES2021",
"sourceMap": true,
"outDir": "./dist",
"rootDir": "./src",
"baseUrl": "./",
"incremental": true,
"skipLibCheck": true,
"strictNullChecks": true,
"noImplicitAny": true
}
},
"include": ["src/**/*"]
}
+5 -3
View File
@@ -23,22 +23,24 @@ COPY tsconfig.base.json ./
RUN mkdir -p apps/worker/prisma
COPY --from=pruner /app/apps/api/prisma/schema.prisma apps/worker/prisma/schema.prisma
RUN pnpm exec prisma generate --schema=apps/worker/prisma/schema.prisma
RUN cd apps/worker && pnpm exec tsc
RUN pnpm turbo build --filter=@tower/worker
# ─── Production runner ───
FROM node:22-alpine AS runner
RUN corepack enable && corepack prepare pnpm@10 --activate
WORKDIR /app
COPY --from=pruner /app/out/full/ .
COPY --from=pruner /app/out/json/ .
COPY --from=pruner /app/out/pnpm-lock.yaml ./pnpm-lock.yaml
COPY --from=pruner /app/out/pnpm-workspace.yaml ./pnpm-workspace.yaml
RUN pnpm install --frozen-lockfile
COPY --from=builder /app/apps/worker/dist ./apps/worker/dist
COPY --from=builder /app/packages/config/dist ./packages/config/dist
COPY --from=builder /app/packages/logger/dist ./packages/logger/dist
COPY --from=builder /app/packages/search/dist ./packages/search/dist
COPY --from=builder /app/packages/types/dist ./packages/types/dist
RUN pnpm install --prod --frozen-lockfile
RUN mkdir -p apps/worker/prisma
COPY --from=pruner /app/apps/api/prisma/schema.prisma apps/worker/prisma/schema.prisma
RUN pnpm exec prisma generate --schema=apps/worker/prisma/schema.prisma
+20 -4
View File
@@ -13,7 +13,9 @@ services:
timeout: 5s
retries: 5
restart: unless-stopped
networks:
- dokploy-network
redis:
image: redis:7-alpine
volumes:
@@ -24,7 +26,9 @@ services:
timeout: 5s
retries: 5
restart: unless-stopped
networks:
- dokploy-network
meilisearch:
image: getmeili/meilisearch:v1.11
ports:
@@ -35,7 +39,9 @@ services:
volumes:
- meilisearch_data:/meili_data
restart: unless-stopped
networks:
- dokploy-network
api:
build:
context: .
@@ -74,6 +80,8 @@ services:
meilisearch:
condition: service_started
restart: unless-stopped
networks:
- dokploy-network
worker:
build:
@@ -102,10 +110,18 @@ services:
condition: service_healthy
redis:
condition: service_healthy
api:
condition: service_started
restart: unless-stopped
networks:
- dokploy-network
volumes:
postgres_data:
redis_data:
meilisearch_data:
sessions:
networks:
dokploy-network:
external: true
+4
View File
@@ -7,6 +7,10 @@
"test": "turbo test",
"lint": "turbo lint"
},
"dependencies": {
"prisma": "^6.0.0",
"@prisma/client": "^6.0.0"
},
"devDependencies": {
"turbo": "^2.0.0",
"typescript": "^5.7.0",
+3
View File
@@ -8,6 +8,9 @@ importers:
.:
dependencies:
'@prisma/client':
specifier: ^6.0.0
version: 6.19.3(prisma@6.19.3(typescript@5.9.3))(typescript@5.9.3)
prisma:
specifier: ^6.0.0
version: 6.19.3(typescript@5.9.3)