| 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 |
|
|
| |
| 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: {} |
|
|