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 FROM installer AS builder
COPY --from=pruner /app/out/full/ . COPY --from=pruner /app/out/full/ .
COPY tsconfig.base.json ./ COPY tsconfig.base.json ./
# Generate Prisma client
RUN pnpm exec prisma generate --schema=apps/api/prisma/schema.prisma 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 ─── # ─── Production runner ───
FROM node:22-alpine AS runner FROM node:22-alpine AS runner
RUN corepack enable && corepack prepare pnpm@10 --activate RUN corepack enable && corepack prepare pnpm@10 --activate
WORKDIR /app 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-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/apps/api/dist ./apps/api/dist
COPY --from=builder /app/packages/config/dist ./packages/config/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/logger/dist ./packages/logger/dist
COPY --from=builder /app/packages/search/dist ./packages/search/dist COPY --from=builder /app/packages/search/dist ./packages/search/dist
COPY --from=builder /app/packages/types/dist ./packages/types/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 RUN pnpm exec prisma generate --schema=apps/api/prisma/schema.prisma
COPY apps/api/docker-entrypoint.sh /usr/local/bin/ COPY apps/api/docker-entrypoint.sh /usr/local/bin/
+8 -2
View File
@@ -1,8 +1,14 @@
#!/bin/sh #!/bin/sh
set -e
echo "Running database migrations..." 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..." echo "Starting TOWER API..."
exec "$@" exec "$@"
+3 -1
View File
@@ -9,10 +9,12 @@
"target": "ES2021", "target": "ES2021",
"sourceMap": true, "sourceMap": true,
"outDir": "./dist", "outDir": "./dist",
"rootDir": "./src",
"baseUrl": "./", "baseUrl": "./",
"incremental": true, "incremental": true,
"skipLibCheck": true, "skipLibCheck": true,
"strictNullChecks": true, "strictNullChecks": true,
"noImplicitAny": true "noImplicitAny": true
} },
"include": ["src/**/*"]
} }
+5 -3
View File
@@ -23,22 +23,24 @@ COPY tsconfig.base.json ./
RUN mkdir -p apps/worker/prisma RUN mkdir -p apps/worker/prisma
COPY --from=pruner /app/apps/api/prisma/schema.prisma apps/worker/prisma/schema.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 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 ─── # ─── Production runner ───
FROM node:22-alpine AS runner FROM node:22-alpine AS runner
RUN corepack enable && corepack prepare pnpm@10 --activate RUN corepack enable && corepack prepare pnpm@10 --activate
WORKDIR /app 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-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/apps/worker/dist ./apps/worker/dist
COPY --from=builder /app/packages/config/dist ./packages/config/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/logger/dist ./packages/logger/dist
COPY --from=builder /app/packages/search/dist ./packages/search/dist COPY --from=builder /app/packages/search/dist ./packages/search/dist
COPY --from=builder /app/packages/types/dist ./packages/types/dist COPY --from=builder /app/packages/types/dist ./packages/types/dist
RUN pnpm install --prod --frozen-lockfile
RUN mkdir -p apps/worker/prisma RUN mkdir -p apps/worker/prisma
COPY --from=pruner /app/apps/api/prisma/schema.prisma apps/worker/prisma/schema.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 pnpm exec prisma generate --schema=apps/worker/prisma/schema.prisma
+20 -4
View File
@@ -13,7 +13,9 @@ services:
timeout: 5s timeout: 5s
retries: 5 retries: 5
restart: unless-stopped restart: unless-stopped
networks:
- dokploy-network
redis: redis:
image: redis:7-alpine image: redis:7-alpine
volumes: volumes:
@@ -24,7 +26,9 @@ services:
timeout: 5s timeout: 5s
retries: 5 retries: 5
restart: unless-stopped restart: unless-stopped
networks:
- dokploy-network
meilisearch: meilisearch:
image: getmeili/meilisearch:v1.11 image: getmeili/meilisearch:v1.11
ports: ports:
@@ -35,7 +39,9 @@ services:
volumes: volumes:
- meilisearch_data:/meili_data - meilisearch_data:/meili_data
restart: unless-stopped restart: unless-stopped
networks:
- dokploy-network
api: api:
build: build:
context: . context: .
@@ -74,6 +80,8 @@ services:
meilisearch: meilisearch:
condition: service_started condition: service_started
restart: unless-stopped restart: unless-stopped
networks:
- dokploy-network
worker: worker:
build: build:
@@ -102,10 +110,18 @@ services:
condition: service_healthy condition: service_healthy
redis: redis:
condition: service_healthy condition: service_healthy
api:
condition: service_started
restart: unless-stopped restart: unless-stopped
networks:
- dokploy-network
volumes: volumes:
postgres_data: postgres_data:
redis_data: redis_data:
meilisearch_data: meilisearch_data:
sessions: sessions:
networks:
dokploy-network:
external: true
+4
View File
@@ -7,6 +7,10 @@
"test": "turbo test", "test": "turbo test",
"lint": "turbo lint" "lint": "turbo lint"
}, },
"dependencies": {
"prisma": "^6.0.0",
"@prisma/client": "^6.0.0"
},
"devDependencies": { "devDependencies": {
"turbo": "^2.0.0", "turbo": "^2.0.0",
"typescript": "^5.7.0", "typescript": "^5.7.0",
+3
View File
@@ -8,6 +8,9 @@ importers:
.: .:
dependencies: dependencies:
'@prisma/client':
specifier: ^6.0.0
version: 6.19.3(prisma@6.19.3(typescript@5.9.3))(typescript@5.9.3)
prisma: prisma:
specifier: ^6.0.0 specifier: ^6.0.0
version: 6.19.3(typescript@5.9.3) version: 6.19.3(typescript@5.9.3)