auto deploy on production server now finalized ready for smoke test.
All checks were successful
Production — tag build, push, deploy / build-and-push (push) Successful in 4m23s
Production — tag build, push, deploy / deploy (push) Successful in 11m52s

This commit is contained in:
2026-08-29 16:25:27 +03:30
parent 23c37519b5
commit 573e5e0886
10 changed files with 373 additions and 64 deletions

View File

@@ -1,13 +1,11 @@
# Production stack — pull images from Docker Hub, HTTPS via Let's Encrypt (certbot).
# Production stack — pull backend/frontend from Gitea (or Docker Hub fallback).
# HTTPS via Let's Encrypt (certbot) on this host only (nudentic.ir).
#
# Server setup (minimal):
# 1. Copy deploy.prod.env.example → .env (DOMAIN, DOCKER_USERNAME, LETSENCRYPT_EMAIL)
# 2. Copy secrets/*.example → ../secrets/ (database.env, backend.env) — outside git
# 3. docker login (private Docker Hub images)
# 4. ./scripts/init-letsencrypt.sh (first time only)
# 5. docker compose -f docker-compose.prod.yml --env-file .env up -d
# Gitea tag deploy: set REGISTRY_PREFIX=wixur.ir:3000/<owner> and TAG=v1.0.1 in .env
# Hub fallback: omit REGISTRY_PREFIX, set DOCKER_USERNAME=dyolink (image dyolink/dyolink-*).
#
# Updates: docker compose pull && docker compose up -d
# First SSL: ./scripts/init-letsencrypt.sh then up -d
# Tag updates: CI runs scripts/prod-remote-deploy.sh (or pull + up locally)
name: dyolink-prod
@@ -39,7 +37,7 @@ services:
start_period: 40s
backend:
image: ${DOCKER_USERNAME}/dyolink-backend:${TAG:-latest}
image: ${REGISTRY_PREFIX:-dyolink}/dyolink-backend:${TAG:-latest}
container_name: dyolink_backend_prod
depends_on:
postgres:
@@ -68,7 +66,7 @@ services:
start_period: 60s
frontend:
image: ${DOCKER_USERNAME}/dyolink-frontend:${TAG:-latest}
image: ${REGISTRY_PREFIX:-dyolink}/dyolink-frontend:${TAG:-latest}
container_name: dyolink_frontend_prod
depends_on:
- backend
@@ -88,7 +86,8 @@ services:
max-size: "10m"
max-file: "3"
healthcheck:
test: ["CMD", "node", "-e", "require('http').get('http://127.0.0.1:3000/', (r) => {if(r.statusCode!==200)process.exit(1)})"]
# Next.js `/` redirects to `/en` — accept 2xx/3xx.
test: ["CMD", "node", "-e", "require('http').get('http://127.0.0.1:3000/', (r) => { process.exit(r.statusCode >= 200 && r.statusCode < 400 ? 0 : 1); }).on('error', () => process.exit(1))"]
interval: 30s
timeout: 10s
retries: 3