services: db: image: postgres:17 restart: always env_file: ./app/.env.db ports: - "127.0.0.1:5433:5432" volumes: - ./data/postgres:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"] interval: 5s timeout: 5s retries: 5 tutortool: build: context: ./app dockerfile: Dockerfile env_file: ./app/.env.tutortool ports: - "127.0.0.1:5000:5000" volumes: - ./data/slides:/src/data/slides - ./data/exports:/src/data/exports - ./logs:/src/logs depends_on: db: condition: service_healthy redis: condition: service_started restart: on-failure redis: image: redis:alpine restart: unless-stopped prometheus: image: prom/prometheus:latest restart: unless-stopped ports: - "127.0.0.1:9090:9090" volumes: - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml - ./data/prometheus:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.retention.time=15d' - '--storage.tsdb.retention.size=512MB' depends_on: - blackbox-exporter blackbox-exporter: image: prom/blackbox-exporter:latest restart: unless-stopped volumes: - ./prometheus/blackbox.yml:/etc/blackbox-exporter/config.yml grafana: image: grafana/grafana:latest restart: unless-stopped env_file: - ./app/.env.db - ./.env.grafana ports: - "127.0.0.1:3333:3000" volumes: - ./data/grafana:/var/lib/grafana - ./grafana/provisioning:/etc/grafana/provisioning environment: - GF_USERS_ALLOW_SIGN_UP=false - GF_SERVER_ROOT_URL=https://tutor.cato447.de/dashboard/ - GF_SERVER_SERVE_FROM_SUB_PATH=true - GF_SECURITY_ALLOW_EMBEDDING=true depends_on: - prometheus - db act-runner: image: gitea/act_runner:latest restart: unless-stopped environment: - GITEA_INSTANCE_URL=https://gitea.cato447.de - GITEA_RUNNER_REGISTRATION_TOKEN=${ACT_RUNNER_TOKEN} - GITEA_RUNNER_NAME=tutor-runner - GITEA_RUNNER_LABELS=ubuntu-latest:docker://node:22 volumes: - /var/run/docker.sock:/var/run/docker.sock - ./data/act_runner:/data - ./data/slides:/slides - ./data/exports:/exports mem_limit: 2g