services: keepalive: build: context: . restart: unless-stopped # keepalive is a background worker: it opens no port and serves no HTTP, # so there is no `expose`, no `ports`, no domain and no healthcheck (the # distroless image has no shell or HTTP client to run one anyway). # # Every setting lives in the config file; the app reads no environment # variables. The real config holds datastore credentials, so never commit # it: locally, copy config.example.yml to config.yml; on Coolify, this bind # mount becomes an editable file storage. volumes: - ./config.yml:/config.yml:ro