services: db: image: postgis/postgis:16-3.4 environment: POSTGRES_DB: bm POSTGRES_USER: bm POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} volumes: - bm_dev_db_data:/var/lib/postgresql/data networks: - bm_internal restart: unless-stopped healthcheck: test: ["CMD-SHELL", "pg_isready -U bm -d bm"] interval: 10s timeout: 5s retries: 5 redis: image: redis:7-alpine command: ["redis-server", "--appendonly", "yes"] volumes: - bm_dev_redis_data:/data networks: - bm_internal flaresolverr: image: ghcr.io/flaresolverr/flaresolverr:latest environment: LOG_LEVEL: info CAPTCHA_SOLVER: none networks: - bm_internal restart: unless-stopped crawler: build: context: apps/crawler environment: DATABASE_URL: postgres://bm:${POSTGRES_PASSWORD}@db:5432/bm FLARESOLVERR_URL: http://flaresolverr:8191 CRAWLER_SCHED_INCREMENTAL_H: "4" CRAWLER_SCHED_ENRICH_H: "2" CRAWLER_SCHED_FULL_DAY: "0" depends_on: db: condition: service_healthy flaresolverr: condition: service_started networks: - bm_internal restart: unless-stopped geocoder-worker: build: context: apps/geocoder working_dir: /app environment: DATABASE_URL: postgres://bm:${POSTGRES_PASSWORD}@db:5432/bm NOMINATIM_BASE: "https://nominatim.openstreetmap.org" NOMINATIM_EMAIL: ${NOMINATIM_EMAIL} NOMINATIM_USER_AGENT: ${NOMINATIM_USER_AGENT} NOMINATIM_MIN_DELAY: "1.05" NOMINATIM_JITTER: "0.35" GEOCODE_MAX_PER_RUN: "5000" command: ["python", "src/worker.py"] depends_on: db: condition: service_healthy networks: - bm_internal restart: "no" pgadmin: image: dpage/pgadmin4:8 environment: PGADMIN_DEFAULT_EMAIL: ${PGADMIN_EMAIL} PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_PASSWORD} PGADMIN_CONFIG_SERVER_MODE: "True" volumes: - bm_dev_pgadmin_data:/var/lib/pgadmin depends_on: db: condition: service_healthy networks: - bm_internal - coolify labels: - traefik.enable=true - traefik.docker.network=coolify - traefik.http.routers.dev-pgadmin.rule=Host(`dev-pgadmin.metalfrom.eu`) - traefik.http.routers.dev-pgadmin.entrypoints=https - traefik.http.routers.dev-pgadmin.tls=true - traefik.http.routers.dev-pgadmin.tls.certresolver=letsencrypt - traefik.http.services.dev-pgadmin.loadbalancer.server.port=80 api: build: context: apps/api environment: PORT: "3000" DATABASE_URL: postgres://bm:${POSTGRES_PASSWORD}@db:5432/bm BM_IMPORT_TOKEN: ${BM_IMPORT_TOKEN} CORS_ORIGINS: https://dev.metalfrom.eu depends_on: db: condition: service_healthy networks: - bm_internal - coolify labels: - traefik.enable=true - traefik.docker.network=coolify - traefik.http.routers.dev-api.rule=Host(`dev-api.metalfrom.eu`) - traefik.http.routers.dev-api.entrypoints=https - traefik.http.routers.dev-api.tls=true - traefik.http.routers.dev-api.tls.certresolver=letsencrypt - traefik.http.services.dev-api.loadbalancer.server.port=3000 web: build: context: apps/web args: API_BASE: https://dev-api.metalfrom.eu networks: - coolify labels: - traefik.enable=true - traefik.docker.network=coolify - traefik.http.routers.dev-web.rule=Host(`dev.metalfrom.eu`) - traefik.http.routers.dev-web.entrypoints=https - traefik.http.routers.dev-web.tls=true - traefik.http.routers.dev-web.tls.certresolver=letsencrypt - traefik.http.services.dev-web.loadbalancer.server.port=80 networks: bm_internal: driver: bridge coolify: external: true name: coolify volumes: bm_dev_db_data: bm_dev_redis_data: bm_dev_pgadmin_data: