Pre-launch — Gluecron is in final validation. Public signups and git hosting for non-owner users open after launch review.
CodeIssuesDiscussionsWikiPull RequestsProjectsCommitsActionsReleasesContributorsPulse● GatesSecuritySettingsDeploymentsPipelineInsightsAgents✨ Explain✨ Ask AI✨ Workspace✨ Spec✨ Tests▓ Debt Map✨ NL Search🏛 Archaeology
Blame · Line-by-line history

docker-compose.standalone.yml

Each line is annotated with the commit that last touched it. Click any SHA to jump to that commit and see the surrounding change.

docker-compose.standalone.ymlBlame103 lines · 1 contributor
f635e2fClaude1# Standalone single-box deploy: Gluecron + Postgres(pgvector) + Caddy(auto-HTTPS)
2# plus self-healing (autoheal), log rotation, daily backups, and fast auto-deploy.
95e33b0Claude3#
4# For a DEDICATED VPS where Gluecron owns ports 80/443 (no co-tenant). One
5# command brings up the whole stack with automatic Let's Encrypt certs:
6#
7# docker compose -f docker-compose.standalone.yml up -d --build
8#
9# Variables come from a local .env (POSTGRES_PASSWORD, optional ANTHROPIC_API_KEY)
f635e2fClaude10# — see scripts/standalone-deploy.sh which generates it and installs the backup
11# + auto-deploy systemd timers. The Caddyfile already serves gluecron.com + www.
12
13x-logging: &default-logging
14 driver: json-file
15 options:
16 max-size: "10m"
17 max-file: "3"
18
95e33b0Claude19services:
20 postgres:
21 # pgvector image is required: migration 0057 does CREATE EXTENSION vector.
22 image: pgvector/pgvector:pg16
23 environment:
24 POSTGRES_USER: gluecron
25 POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
26 POSTGRES_DB: gluecron
27 volumes:
28 - pgdata:/var/lib/postgresql/data
29 restart: unless-stopped
f635e2fClaude30 logging: *default-logging
95e33b0Claude31 healthcheck:
32 test: ["CMD-SHELL", "pg_isready -U gluecron -d gluecron"]
33 interval: 10s
34 timeout: 5s
35 retries: 6
36
37 gluecron:
38 build: .
39 environment:
09d5f39Claude40 - DATABASE_URL=${DATABASE_URL:-}
95e33b0Claude41 - GIT_REPOS_PATH=/data/repos
42 - PORT=3000
43 - NODE_ENV=production
44 - APP_BASE_URL=https://gluecron.com
45 - SSH_PORT=0
46 - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY:-}
56ea9a9Claude47 # "Sign in with Google" — values come from .env (gitignored). Wiring them
48 # here is what makes the env bootstrap reach the container and survive
49 # redeploys; a config saved at /admin/google-oauth (DB) still takes
50 # precedence over these.
51 - GOOGLE_OAUTH_CLIENT_ID=${GOOGLE_OAUTH_CLIENT_ID:-}
52 - GOOGLE_OAUTH_CLIENT_SECRET=${GOOGLE_OAUTH_CLIENT_SECRET:-}
53 - GOOGLE_OAUTH_AUTO_CREATE=${GOOGLE_OAUTH_AUTO_CREATE:-}
54 - GOOGLE_OAUTH_ALLOWED_DOMAINS=${GOOGLE_OAUTH_ALLOWED_DOMAINS:-}
95e33b0Claude55 expose:
56 - "3000"
57 volumes:
58 - git-repos:/data/repos
59 depends_on:
60 postgres:
61 condition: service_healthy
62 restart: unless-stopped
f635e2fClaude63 logging: *default-logging
95e33b0Claude64 healthcheck:
f635e2fClaude65 # Liveness — autoheal restarts the container if this fails repeatedly.
95e33b0Claude66 test: ["CMD", "wget", "-qO-", "http://localhost:3000/healthz"]
67 interval: 30s
68 timeout: 10s
69 retries: 3
f635e2fClaude70 start_period: 60s
95e33b0Claude71
72 caddy:
73 image: caddy:2-alpine
74 restart: unless-stopped
f635e2fClaude75 logging: *default-logging
95e33b0Claude76 ports:
77 - "80:80"
78 - "443:443"
79 volumes:
80 - ./Caddyfile:/etc/caddy/Caddyfile:ro
81 - caddy-data:/data
82 - caddy-config:/config
83 depends_on:
84 - gluecron
85
f635e2fClaude86 # Self-healing: watches every container that declares a healthcheck and
87 # restarts any that goes unhealthy (a hung process that didn't crash).
88 autoheal:
89 image: willfarrell/autoheal:latest
90 restart: unless-stopped
91 logging: *default-logging
92 environment:
93 - AUTOHEAL_CONTAINER_LABEL=all
94 - AUTOHEAL_INTERVAL=15
95 - AUTOHEAL_START_PERIOD=60
96 volumes:
97 - /var/run/docker.sock:/var/run/docker.sock
98
95e33b0Claude99volumes:
100 pgdata:
101 git-repos:
102 caddy-data:
103 caddy-config: