Independent Coolify services with MySQL and S3
Deploy the backend first, run migrations once, confirm readiness, then deploy the frontend against the backend's internal or public URL.
01
Coolify services
Four explicit units in one project.
- pentascope-be from GitLab/Dockerfile on port 3000
- pentascope-fe from GitLab/Dockerfile on port 3000
- MySQL 8 with persistent volume and backups
- Private MinIO/S3 bucket with volume/retention
- HTTPS frontend domain and internal/public backend endpoint
02
Backend environment
Required values never enter the UI.
- DATABASE_URL and DB pool/timeout limits
- FRONTEND_URL
- S3_ENDPOINT/REGION/BUCKET/ACCESS_KEY_ID/SECRET_ACCESS_KEY
- QA_CREDENTIAL_MASTER_KEY: base64 32-byte key
- FILE_SIGNING_SECRET and TOKEN_HASH_SECRET
- WEBHOOK_ALLOWED_HOSTS
- Optional OPENAI_API_KEY or OPENROUTER_API_KEY
03
Frontend environment
The frontend has no direct database or S3 connection.
- BACKEND_URL=https://backend.example.com
- Never copy DATABASE_URL or S3 secrets to frontend
- Redeploy when BACKEND_URL changes
- Probe /api/health from the platform and /api/ready from internal monitoring
04
Release order
Promote the same tested commit through environments.
- feature → dev → testing → staging → main
- npm ci then typecheck/lint/test/build/audit
- Back up before irreversible migration
- npm run db:migrate before the new backend
- Enable webhook:retry and schedule:dispatch as Coolify scheduled tasks
- Confirm /api/ready, then smoke-test business routes