version: "3.9" # ============================================================================= # MASTER DOCKER COMPOSE - SINGLE SOURCE OF TRUTH # ============================================================================= # This file manages ALL apps and shared services # Used by both Portainer and CLI - no conflicts # ============================================================================= services: # =========================================================================== # SHARED SERVICES (Global - used by all apps) # =========================================================================== postgres: image: postgres:15 container_name: igny8_postgres restart: always environment: POSTGRES_USER: igny8 POSTGRES_PASSWORD: igny8pass POSTGRES_DB: igny8_db volumes: - pgdata:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB} || exit 1"] interval: 20s timeout: 5s retries: 5 start_period: 15s networks: [igny8_net] redis: image: redis:7 container_name: igny8_redis restart: always command: ["redis-server", "--save", "60", "1", "--loglevel", "warning"] volumes: - redisdata:/data healthcheck: test: ["CMD-SHELL", "redis-cli ping | grep -q PONG"] interval: 20s timeout: 3s retries: 5 networks: [igny8_net] pgadmin: image: dpage/pgadmin4 container_name: igny8_pgadmin restart: always environment: PGADMIN_DEFAULT_EMAIL: admin@igny8.com PGADMIN_DEFAULT_PASSWORD: admin123 ports: - "0.0.0.0:5050:80" volumes: - pgadmin_data:/var/lib/pgadmin networks: [igny8_net] filebrowser: image: filebrowser/filebrowser:v2.25.0 container_name: igny8_filebrowser restart: always environment: TZ: Asia/Karachi ports: - "0.0.0.0:8080:80" volumes: - /data:/srv - /backups:/srv/backups - filebrowser_db:/database networks: [igny8_net] labels: - "com.docker.compose.project=igny8-infra" - "com.docker.compose.service=filebrowser" gitea: image: gitea/gitea:latest container_name: gitea restart: always environment: - USER_UID=1000 - USER_GID=1000 volumes: - ./gitea:/data - /data/app/igny8:/deploy/igny8:rw # Mount app directory for deployment ports: - "0.0.0.0:3000:3000" # Web UI - "0.0.0.0:2222:22" # SSH for Git access networks: [igny8_net] labels: - "com.docker.compose.project=igny8-infra" - "com.docker.compose.service=gitea" caddy: image: caddy:latest container_name: igny8_caddy restart: always ports: - "80:80" - "443:443" volumes: - caddy_data:/data - caddy_config:/config # Mount Caddyfile for routing configuration - /var/lib/docker/volumes/portainer_data/_data/caddy/Caddyfile:/etc/caddy/Caddyfile networks: [igny8_net] setup-helper: image: alpine:3.20 container_name: setup-helper command: ["sh", "-c", "sleep infinity"] restart: always networks: [igny8_net] volumes: - /data/backups:/backups:rw - /scripts:/scripts:ro volumes: pgdata: redisdata: pgadmin_data: filebrowser_db: caddy_data: caddy_config: networks: igny8_net: external: true