Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
106 lines
2.8 KiB
YAML
106 lines
2.8 KiB
YAML
# Barev Club — продакшен на общем VPS.
|
|
# Наружу смотрит только barev-web (в сети proxy Nginx Proxy Manager), остальное — во внутренней сети.
|
|
name: barev
|
|
|
|
x-env: &env
|
|
env_file: .env
|
|
|
|
services:
|
|
barev-db:
|
|
image: postgres:16-alpine
|
|
restart: unless-stopped
|
|
environment:
|
|
POSTGRES_USER: barev
|
|
POSTGRES_PASSWORD: ${DB_PASSWORD}
|
|
POSTGRES_DB: barev
|
|
TZ: Asia/Yerevan
|
|
volumes: [db:/var/lib/postgresql/data]
|
|
networks: [internal]
|
|
mem_limit: 256m
|
|
healthcheck:
|
|
test: ['CMD-SHELL', 'pg_isready -U barev']
|
|
interval: 10s
|
|
retries: 10
|
|
|
|
barev-redis:
|
|
image: redis:7-alpine
|
|
restart: unless-stopped
|
|
command: redis-server --save 60 1 --maxmemory 64mb --maxmemory-policy noeviction
|
|
volumes: [redis:/data]
|
|
networks: [internal]
|
|
mem_limit: 96m
|
|
|
|
# S3-совместимое хранилище для фотоотчётов и сканов (приватный бакет)
|
|
barev-s3:
|
|
image: chrislusf/seaweedfs:latest
|
|
restart: unless-stopped
|
|
command: server -dir=/data -s3 -s3.port=9000 -s3.config=/etc/seaweed/s3.json -master.volumeSizeLimitMB=64 -volume.max=10
|
|
volumes:
|
|
- s3:/data
|
|
- ./seaweed-s3.json:/etc/seaweed/s3.json:ro
|
|
# ключ шифрования SSE-S3 (s3.sse.kek): файлы шифруются при записи
|
|
- ./security.toml:/etc/seaweedfs/security.toml:ro
|
|
networks: [internal]
|
|
mem_limit: 192m
|
|
|
|
# API + воркер + оба бота
|
|
barev-app:
|
|
image: barev-app:latest
|
|
<<: *env
|
|
restart: unless-stopped
|
|
depends_on:
|
|
barev-db: { condition: service_healthy }
|
|
barev-redis: { condition: service_started }
|
|
barev-s3: { condition: service_started }
|
|
networks: [internal]
|
|
mem_limit: 512m
|
|
|
|
barev-landing:
|
|
image: barev-app:latest
|
|
<<: *env
|
|
restart: unless-stopped
|
|
working_dir: /landing
|
|
command: ['node', 'apps/landing/server.js']
|
|
environment:
|
|
PORT: '3000'
|
|
HOSTNAME: 0.0.0.0
|
|
networks: [internal]
|
|
mem_limit: 192m
|
|
|
|
barev-web:
|
|
image: barev-web:latest
|
|
restart: unless-stopped
|
|
depends_on: [barev-app, barev-landing]
|
|
networks: [internal, proxy]
|
|
mem_limit: 64m
|
|
|
|
# ежедневный бэкап БД, хранится 14 дней
|
|
barev-backup:
|
|
image: postgres:16-alpine
|
|
restart: unless-stopped
|
|
environment:
|
|
PGPASSWORD: ${DB_PASSWORD}
|
|
volumes: [backups:/backups]
|
|
networks: [internal]
|
|
mem_limit: 64m
|
|
entrypoint:
|
|
- sh
|
|
- -c
|
|
- |
|
|
while true; do
|
|
pg_dump -h barev-db -U barev -Fc barev > /backups/barev-$$(date +%F).dump && echo "backup ok"
|
|
find /backups -name '*.dump' -mtime +14 -delete
|
|
sleep 86400
|
|
done
|
|
|
|
networks:
|
|
internal: {}
|
|
proxy:
|
|
external: true
|
|
|
|
volumes:
|
|
db: {}
|
|
redis: {}
|
|
s3: {}
|
|
backups: {}
|