services: postgres: image: postgres:17 container_name: remnawave-minishop-postgres env_file: - ${APP_ENV_FILE:-../../.env} volumes: - remnawave-minishop-db-data:/var/lib/postgresql/data networks: - remnawave-network restart: unless-stopped healthcheck: test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"] interval: 5s timeout: 5s retries: 20 redis: image: redis:7-alpine container_name: remnawave-minishop-redis command: ["redis-server", "--appendonly", "yes"] volumes: - remnawave-minishop-redis-data:/data networks: - remnawave-network restart: unless-stopped healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 3s retries: 20 migrate: container_name: remnawave-minishop-migrate image: ghcr.io/3252a8/remnawave-minishop-backend:${IMAGE_TAG:-latest} command: ["python", "backend/main_migrate.py"] env_file: - ${APP_ENV_FILE:-../../.env} environment: IMAGE_TAG: ${IMAGE_TAG:-latest} POSTGRES_HOST: postgres REDIS_URL: redis://redis:6379/0 volumes: - shop-data:/app/data networks: - remnawave-network depends_on: postgres: condition: service_healthy redis: condition: service_healthy backend: container_name: remnawave-minishop-backend image: ghcr.io/3252a8/remnawave-minishop-backend:${IMAGE_TAG:-latest} env_file: - ${APP_ENV_FILE:-../../.env} environment: IMAGE_TAG: ${IMAGE_TAG:-latest} POSTGRES_HOST: postgres REDIS_URL: redis://redis:6379/0 WEBAPP_ENABLED: "true" TRUSTED_PROXIES: ${TRUSTED_PROXIES:-127.0.0.1,::1,172.16.0.0/12} volumes: - shop-data:/app/data networks: - remnawave-network restart: unless-stopped depends_on: postgres: condition: service_healthy redis: condition: service_healthy migrate: condition: service_completed_successfully healthcheck: test: ["CMD-SHELL", "python -c \"import urllib.request; urllib.request.urlopen('http://127.0.0.1:8080/healthz', timeout=3).read()\""] interval: 30s timeout: 5s retries: 5 start_period: 30s worker: container_name: remnawave-minishop-worker image: ghcr.io/3252a8/remnawave-minishop-worker:${IMAGE_TAG:-latest} env_file: - ${APP_ENV_FILE:-../../.env} environment: IMAGE_TAG: ${IMAGE_TAG:-latest} POSTGRES_HOST: postgres REDIS_URL: redis://redis:6379/0 volumes: - shop-data:/app/data networks: - remnawave-network restart: unless-stopped depends_on: postgres: condition: service_healthy redis: condition: service_healthy migrate: condition: service_completed_successfully frontend: container_name: remnawave-minishop-frontend image: ghcr.io/3252a8/remnawave-minishop-frontend:${IMAGE_TAG:-latest} environment: IMAGE_TAG: ${IMAGE_TAG:-latest} FRONTEND_PORT: ${FRONTEND_PORT:-8082} FRONTEND_PUBLIC: via caddy networks: - remnawave-network restart: unless-stopped depends_on: backend: condition: service_healthy healthcheck: test: ["CMD-SHELL", "wget -qO- http://127.0.0.1/health | grep -q ok"] interval: 30s timeout: 5s retries: 5 caddy: image: caddy:2-alpine container_name: remnawave-minishop-caddy depends_on: frontend: condition: service_healthy backend: condition: service_healthy ports: - "${HTTP_BIND:-0.0.0.0:80}:80" - "${HTTPS_BIND:-0.0.0.0:443}:443" volumes: - ../docker/caddy/Caddyfile:/etc/caddy/Caddyfile:ro - caddy-data:/data - caddy-config:/config networks: - remnawave-network restart: unless-stopped networks: remnawave-network: volumes: remnawave-minishop-db-data: name: remnawave-minishop-db-data remnawave-minishop-redis-data: name: remnawave-minishop-redis-data shop-data: name: remnawave-minishop-shop-data caddy-data: name: remnawave-minishop-caddy-data caddy-config: name: remnawave-minishop-caddy-config