services: bot: build: context: . dockerfile: ./Dockerfile image: bot:latest container_name: ${COMPOSE_PROJECT_NAME}-bot restart: always env_file: - .env ports: - ${WEBHOOK_PORT}:${WEBHOOK_PORT} networks: - app - monitoring depends_on: - pgbouncer - redis admin: build: context: . dockerfile: ./admin/Dockerfile container_name: ${COMPOSE_PROJECT_NAME}-admin restart: always env_file: - .env ports: - ${ADMIN_PORT}:${ADMIN_PORT} networks: - app depends_on: - bot volumes: - ./admin:/usr/src/app/admin postgres: image: postgres:14-alpine container_name: ${COMPOSE_PROJECT_NAME}-postgres restart: always env_file: - .env environment: - POSTGRES_USER=${DB_USER} - POSTGRES_PASSWORD=${DB_PASS} - POSTGRES_DB=${DB_NAME} - PGDATA='/var/lib/postgresql/data/pgdata' networks: - app volumes: - postgres-data:/var/lib/postgresql/data pgbouncer: image: edoburu/pgbouncer container_name: ${COMPOSE_PROJECT_NAME}-pgbouncer restart: always env_file: - .env environment: - DB_USER=${DB_USER} - DB_PASSWORD=${DB_PASS} - DB_HOST=postgres - POOL_MODE=session - MAX_DB_CONNECTIONS=0 - DEFAULT_POOL_SIZE=40 - ADMIN_USERS=postgres,${DB_USER} - AUTH_TYPE=scram-sha-256 ports: - ${DB_PORT}:${DB_PORT} depends_on: - postgres networks: - app pgbackup: container_name: ${COMPOSE_PROJECT_NAME}-pgbackup image: prodrigestivill/postgres-backup-local restart: always volumes: - backups-data:/backups networks: - app depends_on: - postgres environment: - POSTGRES_HOST=postgres - POSTGRES_DB=${DB_NAME} - POSTGRES_USER=${DB_USER} - POSTGRES_PASSWORD=${DB_PASS} - POSTGRES_EXTRA_OPTS=-Z9 --schema=public --blobs - SCHEDULE=@every 0h30m00s - BACKUP_KEEP_DAYS=7 - BACKUP_KEEP_WEEKS=4 - BACKUP_KEEP_MONTHS=6 - HEALTHCHECK_PORT=81 redis: image: redis:7-alpine container_name: ${COMPOSE_PROJECT_NAME}-redis restart: always env_file: - .env ports: - ${REDIS_PORT}:${REDIS_PORT} networks: - app volumes: - redis-data:/bitnami/redis/data command: /bin/sh -c 'if [ -n "$REDIS_PASS" ]; then redis-server --requirepass "$REDIS_PASS"; else redis-server; fi' migrator: image: bot:latest container_name: ${COMPOSE_PROJECT_NAME}-migrator restart: "on-failure" command: alembic upgrade head env_file: - .env networks: - app depends_on: - bot volumes: - ./migrations:/usr/src/app/migrations # MONITORING node-exporter: image: prom/node-exporter:latest container_name: ${COMPOSE_PROJECT_NAME}-node-exporter restart: unless-stopped ports: - 9100:9100 networks: - monitoring volumes: - /proc:/host/proc:ro - /sys:/host/sys:ro - /:/rootfs:ro command: - "--path.procfs=/host/proc" - "--path.sysfs=/host/sys" - "--collector.filesystem.mount-points-exclude" - "^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/)" prometheus: image: prom/prometheus:v2.43.0 container_name: ${COMPOSE_PROJECT_NAME}-prometheus restart: unless-stopped env_file: - .env ports: - ${PROMETHEUS_PORT}:${PROMETHEUS_PORT} depends_on: - bot - node-exporter networks: - monitoring volumes: - ./configs/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml - prometheus-data:/prometheus command: - "--config.file=/etc/prometheus/prometheus.yml" - "--storage.tsdb.path=/prometheus" - "--web.console.libraries=/etc/prometheus/console_libraries" - "--web.console.templates=/etc/prometheus/consoles" - "--web.enable-lifecycle" grafana: image: grafana/grafana:8.5.22 container_name: ${COMPOSE_PROJECT_NAME}-grafana restart: always env_file: - .env environment: - GF_SECURITY_ADMIN_USER=${GRAFANA_ADMIN_USER} - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_ADMIN_PASSWORD} - GF_INSTALL_PLUGINS=grafana-clock-panel ports: - ${GRAFANA_PORT}:${GRAFANA_PORT} depends_on: - prometheus networks: - monitoring volumes: - ./configs/grafana/datasources:/etc/grafana/provisioning/datasources - ./configs/grafana/dashboards:/etc/grafana/provisioning/dashboards - ./configs/grafana/node-exporter.json:/var/lib/grafana/dashboards/node-exporter.json - grafana-data:/var/lib/grafana user: "0" networks: app: driver: bridge monitoring: driver: bridge volumes: backups-data: {} postgres-data: {} redis-data: {} prometheus-data: {} grafana-data: {}