services: # бот для получения храниния и обновления ключей сертификатов https certbot: build: context: ./certbot dockerfile: Dockerfile container_name: certbot volumes: - ./certbot/config:/etc/letsencrypt/config - certbot_data:/etc/letsencrypt - certbot_www:/var/www/certbot - /var/run/docker.sock:/var/run/docker.sock env_file: - .env environment: - EMAIL=${EMAIL} - STAGING=0 restart: unless-stopped healthcheck: test: ["CMD-SHELL", "ls /etc/letsencrypt/live/*/fullchain.pem 2>/dev/null | head -1 | xargs test -f || exit 1"] interval: 30s timeout: 10s retries: 3 start_period: 40s # service сервис для работы nginx. Тут логика такая, если все перечисленные в стартовом скрипте, сайта (домены) имеют ключи тогда этот сервис свичаеться и работает через https. nginx: build: context: ./nginx dockerfile: Dockerfile env_file: .env container_name: nginx restart: unless-stopped ports: - "80:80" - "443:443" volumes: - certbot_data:/etc/letsencrypt - certbot_www:/var/www/certbot - ./stubSite:/usr/share/nginx/stub/html - ./BB/bbvue/dist:/usr/share/nginx/begushiybashkir/html - analytics_logs:/var/log/analytics:ro - ./nginx/conf.available:/etc/nginx/conf.available:ro networks: - web-network - internal - app-network depends_on: easysite: condition: service_healthy api_bb: condition: service_healthy analytics: condition: service_healthy api_yal: condition: service_healthy yalarba: condition: service_healthy valitovgaziz: condition: service_healthy healthcheck: test: ["CMD", "wget", "--spider", "http://localhost/"] interval: 30s timeout: 10s retries: 3 start_period: 40s # Statistics для сайта valitovgaziz.ru server работает на node.js 22 или выше. С бд не работает analytics: build: context: ./valitovgaziz/analytics dockerfile: Dockerfile container_name: analytics restart: unless-stopped ports: - "9999:3000" environment: - NODE_ENV=production - PORT=3000 - LOG_LEVEL=info - LOG_RETENTION_DAYS=30 volumes: - analytics_logs:/app/logs - analytics_data:/app/data networks: - web-network - internal healthcheck: test: ["CMD", "wget", "--spider", "http://localhost:3000/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s # Vue 3 SPA для valitovgaziz.ru valitovgaziz: build: context: ./valitovgaziz dockerfile: Dockerfile container_name: valitovgaziz restart: unless-stopped networks: - web-network depends_on: analytics: condition: service_healthy healthcheck: test: ["CMD", "wget", "--spider", "http://localhost/"] interval: 30s timeout: 10s retries: 3 start_period: 40s # PostgresQL DB база данных для храниния информации приложений Yalarba.ru && Easysite102.ru db: image: postgres:15-alpine restart: unless-stopped ports: - "5432:5432" environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: mydb container_name: db_tp volumes: - db_tp_data:/var/lib/postgresql/data - ./migrations:/docker-entrypoint-initdb.d networks: - app-network healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 30s timeout: 10s retries: 5 # REST API on Golang (Gorm, Chi) логика обработки информации для сайта БегущийБашкир api_bb: build: context: ./BB/api_bb dockerfile: Dockerfile ports: - "7777:8080" container_name: api_bb restart: unless-stopped depends_on: db: condition: service_healthy env_file: - ./BB/api_bb/.env volumes: - api_bb_uploads:/app/uploads environment: DB_HOST: db DB_PORT: 5432 DB_USER: postgres DB_PASSWORD: postgres DB_NAME: bb_db DB_SCHEMA: bb APP_PORT: 8080 networks: - app-network healthcheck: test: [ "CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8080/api/health", ] interval: 30s timeout: 10s retries: 3 # SPA app прилжение выполнено на nuxt.js интерфейс для туристического бизнеса. Хранение информации в api_yal REST API app easysite: build: context: ./yalarba/easySite dockerfile: Dockerfile container_name: easysite restart: unless-stopped ports: - "3000:3000" environment: NODE_ENV: production HOST: 0.0.0.0 PORT: 3000 NUXT_PUBLIC_API_BASE: /api/v1 networks: - web-network - app-network healthcheck: test: ["CMD", "wget", "--spider", "http://localhost:3000/api/health"] interval: 30s timeout: 10s retries: 3 # REST API app on Golang для api_yal сервиса api_yal: build: context: ./yalarba/api_yal # Укажите правильный путь к вашему проекту dockerfile: Dockerfile container_name: api_yal restart: unless-stopped env_file: - ./yalarba/api_yal/.env depends_on: db: condition: service_healthy networks: - web-network - app-network healthcheck: test: [ "CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8787/health", ] interval: 30s timeout: 10s retries: 3 start_period: 40s # Nuxt 4 SPA для yalarba.ru yalarba: build: context: ./yalarba/yalarba-nuxt dockerfile: Dockerfile container_name: yalarba restart: unless-stopped environment: NODE_ENV: production HOST: 0.0.0.0 PORT: 3000 NUXT_PUBLIC_API_BASE: /api/v1 NUXT_PUBLIC_APP_URL: https://yalarba.ru networks: - web-network - app-network healthcheck: test: ["CMD", "wget", "--spider", "http://localhost:3000/api/health"] interval: 30s timeout: 10s retries: 3 # ────────────────────────────────────────────── # Gitea — self-hosted Git сервер + CI/CD # ────────────────────────────────────────────── gitea: image: gitea/gitea:latest container_name: gitea restart: unless-stopped ports: - "3001:3000" - "2222:22" volumes: - gitea_data:/data - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro environment: - USER_UID=1000 - USER_GID=1000 - GITEA__server__DOMAIN=git.yalarba.ru - GITEA__server__SSH_DOMAIN=94.41.23.97 - GITEA__server__ROOT_URL=https://git.yalarba.ru networks: - web-network - internal healthcheck: test: ["CMD", "wget", "--spider", "http://localhost:3000"] interval: 30s timeout: 10s retries: 3 gitea-runner: image: gitea/act_runner:latest container_name: gitea-runner restart: unless-stopped volumes: - /var/run/docker.sock:/var/run/docker.sock - /home/gaziz/artefacts/tp:/home/gaziz/artefacts/tp - gitea_runner:/data environment: - GITEA_INSTANCE_URL=http://gitea:3000 - GITEA_RUNNER_REGISTRATION_TOKEN= depends_on: gitea: condition: service_healthy networks: - internal # ────────────────────────────────────────────── # Backup — ежедневные бэкапы БД + файлов → локально + Яндекс.Диск # ────────────────────────────────────────────── backup: build: context: ./backup dockerfile: Dockerfile container_name: backup restart: unless-stopped volumes: - /var/backups/tp:/backups - certbot_data:/data/certbot:ro - api_bb_uploads:/data/uploads:ro - analytics_data:/data/analytics:ro - ./backup/rclone.conf:/root/.config/rclone/rclone.conf:ro environment: DB_HOST: db DB_PORT: 5432 DB_USER: postgres DB_PASSWORD: postgres DB_NAMES: mydb,bb_db RCLONE_REMOTE: "yadisk:tp-backups" BACKUP_RETENTION_DAYS: 7 BACKUP_TIME: "0 3 * * *" healthcheck: test: ["CMD-SHELL", "pidof crond > /dev/null && ls /backups/ > /dev/null || exit 1"] interval: 30s timeout: 10s retries: 3 start_period: 15s depends_on: db: condition: service_healthy networks: - app-network volumes: certbot_data: # volume для данных Certbot certbot_www: # volume для данных Certbot db_tp_data: # Volume для данных БД yalarba.ru api_bb_uploads: # Volume для загружаемых файлов бегущий башкир analytics_logs: # Volume для логов аналитики analytics_data: # Volume для данных аналитики gitea_data: # Volume для Gitea gitea_runner: # Volume для Gitea Runner networks: web-network: driver: bridge internal: driver: bridge app-network: driver: bridge # Эта опция автоматически удаляет orphans (Не используемые контейнеры) x-remove-orphans: true