configs/docker-compose.yml

317 lines
9.0 KiB
YAML

services:
uploader-bot-image:
build:
context: ../uploader-bot
dockerfile: Dockerfile
image: ${BACKEND_IMAGE:-uploader-bot:latest}
command: ["true"]
networks: [mynet]
db:
image: postgres:16
environment:
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- ${DB_DATA_DIR_HOST:-./postgres-data}:/var/lib/postgresql/data
ports:
- "${POSTGRES_FORWARD_PORT:-15380}:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 10
restart: unless-stopped
networks: [mynet]
backend-app:
image: ${BACKEND_IMAGE:-uploader-bot:latest}
command: python -m app
env_file:
- ./.env
environment:
- NODE_ROLE=primary
depends_on:
uploader-bot-image:
condition: service_completed_successfully
db:
condition: service_healthy
ipfs:
condition: service_started
volumes:
- ${BACKEND_LOGS_DIR_HOST:-./app-logs}:/app/logs
- ${BACKEND_DATA_DIR_HOST:-./dynamicStorage}:/app/data
- ${TUSD_DATA_DIR_HOST:-./data/tusd}:/data
ports:
- "${BACKEND_HTTP_PORT:-8080}:${SANIC_PORT:-8080}"
healthcheck:
test: ["CMD-SHELL", "curl -fsS http://127.0.0.1:$${SANIC_PORT}/api/system.version >/dev/null || exit 1"]
interval: 15s
timeout: 5s
retries: 5
restart: unless-stopped
networks: [mynet]
ipfs:
image: ipfs/kubo:latest
container_name: ipfs
restart: unless-stopped
environment:
IPFS_PROFILE: server
GOMAXPROCS: "4"
GOMEMLIMIT: "7500MiB"
IPFS_PRIVATE_BOOTSTRAP: '${IPFS_PRIVATE_BOOTSTRAP:-}'
IPFS_PEERING_PEERS: '${IPFS_PEERING_PEERS:-}'
IPFS_ANNOUNCE_ADDRESSES: '${IPFS_ANNOUNCE_ADDRESSES:-}'
IPFS_NOANNOUNCE_ADDRESSES: '${IPFS_NOANNOUNCE_ADDRESSES:-}'
IPFS_SWARM_ANNOUNCE_PRIVATE: '${IPFS_SWARM_ANNOUNCE_PRIVATE:-}'
volumes:
- ${IPFS_DATA_DIR_HOST:-./data/ipfs}:/data/ipfs
- ./ipfs/init/001-config.sh:/container-init.d/001-config.sh:ro
# Опционально: приватный swarm.key. Смонтируйте файл, если он есть.
- ${IPFS_SWARM_KEY_FILE:-./ipfs/swarm.key}:/data/ipfs/swarm.key:ro
ports:
- "4001:4001/tcp"
- "4001:4001/udp"
- "${IPFS_GATEWAY_BIND:-127.0.0.1}:8080:8080"
networks: [mynet]
ulimits:
nofile: { soft: 65536, hard: 65536 }
tusd:
image: tusproject/tusd:v1.12.0
container_name: tusd
restart: unless-stopped
# Host volume is often owned by root (created by provisioning scripts),
# while tusd image runs as a non-root user; run as root to avoid /data permission issues.
user: "0:0"
command:
- -host=0.0.0.0
- -port=1080
- -upload-dir=/data
- -hooks-http=http://backend-app:${SANIC_PORT:-8080}/api/v1/upload.tus-hook
- -hooks-http-forward-headers=Authorization,X-Upload-Metadata
- -behind-proxy
- -disable-cors
environment:
- TUSD_LOG_LEVEL=info
volumes:
- ${TUSD_DATA_DIR_HOST:-./data/tusd}:/data
ports:
- "${TUSD_HTTP_PORT:-13400}:1080"
depends_on:
backend-app:
condition: service_started
networks: [mynet]
backend-indexer:
image: ${BACKEND_IMAGE:-uploader-bot:latest}
command: python -m app indexer
env_file:
- ./.env
environment:
- NODE_ROLE=worker
depends_on:
uploader-bot-image:
condition: service_completed_successfully
db:
condition: service_healthy
backend-app:
condition: service_healthy
ipfs:
condition: service_started
volumes:
- ${BACKEND_LOGS_DIR_HOST:-./app-logs}:/app/logs
- ${BACKEND_DATA_DIR_HOST:-./dynamicStorage}:/app/data
- ${TUSD_DATA_DIR_HOST:-./data/tusd}:/data
restart: unless-stopped
networks: [mynet]
backend-ton-daemon:
image: ${BACKEND_IMAGE:-uploader-bot:latest}
command: python -m app ton_daemon
env_file:
- ./.env
environment:
- NODE_ROLE=worker
depends_on:
uploader-bot-image:
condition: service_completed_successfully
db:
condition: service_healthy
backend-app:
condition: service_healthy
ipfs:
condition: service_started
volumes:
- ${BACKEND_LOGS_DIR_HOST:-./app-logs}:/app/logs
- ${BACKEND_DATA_DIR_HOST:-./dynamicStorage}:/app/data
- ${TUSD_DATA_DIR_HOST:-./data/tusd}:/data
restart: unless-stopped
networks: [mynet]
backend-license-index:
image: ${BACKEND_IMAGE:-uploader-bot:latest}
command: python -m app license_index
env_file:
- ./.env
environment:
- NODE_ROLE=worker
depends_on:
uploader-bot-image:
condition: service_completed_successfully
db:
condition: service_healthy
backend-app:
condition: service_healthy
ipfs:
condition: service_started
volumes:
- ${BACKEND_LOGS_DIR_HOST:-./app-logs}:/app/logs
- ${BACKEND_DATA_DIR_HOST:-./dynamicStorage}:/app/data
- ${TUSD_DATA_DIR_HOST:-./data/tusd}:/data
restart: unless-stopped
networks: [mynet]
backend-events-sync:
image: ${BACKEND_IMAGE:-uploader-bot:latest}
command: python -m app events_sync
env_file:
- ./.env
environment:
- NODE_ROLE=worker
depends_on:
uploader-bot-image:
condition: service_completed_successfully
db:
condition: service_healthy
backend-app:
condition: service_healthy
ipfs:
condition: service_started
volumes:
- ${BACKEND_LOGS_DIR_HOST:-./app-logs}:/app/logs
- ${BACKEND_DATA_DIR_HOST:-./dynamicStorage}:/app/data
- ${TUSD_DATA_DIR_HOST:-./data/tusd}:/data
restart: unless-stopped
networks: [mynet]
backend-convert-process:
image: ${BACKEND_IMAGE:-uploader-bot:latest}
command: python -m app convert_process
env_file:
- ./.env
environment:
- NODE_ROLE=worker
depends_on:
uploader-bot-image:
condition: service_completed_successfully
db:
condition: service_healthy
backend-app:
condition: service_healthy
ipfs:
condition: service_started
volumes:
- ${BACKEND_LOGS_DIR_HOST:-./app-logs}:/app/logs
- ${BACKEND_DATA_DIR_HOST:-./dynamicStorage}:/app/data
- ${TUSD_DATA_DIR_HOST:-./data/tusd}:/data
- /var/run/docker.sock:/var/run/docker.sock # required by conversion pipeline
restart: unless-stopped
cpus: ${CONVERT_PROCESS_CPUS:-0.5}
mem_limit: ${CONVERT_PROCESS_MEM:-512m}
cpuset: ${CONVERT_CPUSET:-0}
networks: [mynet]
backend-convert-v3:
image: ${BACKEND_IMAGE:-uploader-bot:latest}
command: python -m app convert_v3
env_file:
- ./.env
environment:
- NODE_ROLE=worker
depends_on:
uploader-bot-image:
condition: service_completed_successfully
db:
condition: service_healthy
backend-app:
condition: service_healthy
ipfs:
condition: service_started
volumes:
- ${BACKEND_LOGS_DIR_HOST:-./app-logs}:/app/logs
- ${BACKEND_DATA_DIR_HOST:-./dynamicStorage}:/app/data
- ${TUSD_DATA_DIR_HOST:-./data/tusd}:/data
- /var/run/docker.sock:/var/run/docker.sock
restart: unless-stopped
cpus: ${CONVERT_V3_CPUS:-1}
mem_limit: ${CONVERT_V3_MEM:-2048m}
cpuset: ${CONVERT_CPUSET:-0}
networks: [mynet]
backend-index-scout-v3:
image: ${BACKEND_IMAGE:-uploader-bot:latest}
command: python -m app index_scout_v3
env_file:
- ./.env
environment:
- NODE_ROLE=worker
depends_on:
uploader-bot-image:
condition: service_completed_successfully
db:
condition: service_healthy
backend-app:
condition: service_healthy
ipfs:
condition: service_started
networks: [mynet]
backend-derivative-janitor:
image: ${BACKEND_IMAGE:-uploader-bot:latest}
command: python -m app derivative_janitor
env_file:
- ./.env
environment:
- NODE_ROLE=worker
depends_on:
uploader-bot-image:
condition: service_completed_successfully
db:
condition: service_healthy
backend-app:
condition: service_healthy
ipfs:
condition: service_started
networks: [mynet]
frontend:
build:
context: ../web2-client
dockerfile: Dockerfile
args:
VITE_SENTRY_DSN: ${VITE_SENTRY_DSN}
VITE_API_BASE_URL: ${VITE_API_BASE_URL}
VITE_API_BASE_STORAGE_URL: ${VITE_API_BASE_STORAGE_URL}
VITE_TUS_ENDPOINT: ${VITE_TUS_ENDPOINT}
depends_on:
backend-app:
condition: service_started
ports:
- "${FRONTEND_HTTP_PORT:-8081}:80"
healthcheck:
test: ["CMD-SHELL", "curl -fsS http://127.0.0.1/ >/dev/null || exit 1"]
interval: 30s
timeout: 5s
retries: 5
restart: unless-stopped
networks: [mynet]
volumes: {}
networks:
mynet:
driver: bridge