Commitd980ea8unknown_key
deploy: app-only Vultr config behind existing Bun proxy
deploy: app-only Vultr config behind existing Bun proxy Adds a Caddy-free deploy path for the Vultr box (149.28.119.158), which already runs another platform whose custom Bun service owns 80/443 and terminates TLS. docker-compose.override.yml publishes the app on 127.0.0.1:3000 (loopback only) and disables git-over-SSH; the existing Bun service reverse-proxies gluecron.com to it. DEPLOY_VULTR.md documents the DNS records and the runbook. https://claude.ai/code/session_01QKaJBYpD6DGErWHrRVChkf
2 files changed+91−0d980ea875f189ebb45514e8d4868827a40b6db83
2 changed files+91−0
AddedDEPLOY_VULTR.md+71−0View fileUnifiedSplit
@@ -0,0 +1,71 @@
1# DEPLOY_VULTR.md — Gluecron on the Vultr box (149.28.119.158)
2
3Current production home: **Vultr server at `149.28.119.158`**, which also
4runs another platform. That platform's **custom Bun service owns ports 80/443
5and terminates TLS**, so Gluecron does **not** use its bundled Caddy here.
6Instead Gluecron runs as an app-only container on `127.0.0.1:3000` and the
7existing Bun service reverse-proxies `gluecron.com` to it.
8
9```
10Internet ──443──> custom Bun service (existing) ──> 127.0.0.1:3000 (gluecron app)
11```
12
13## 1. DNS (Cloudflare, "DNS only" / grey cloud)
14
15| Type | Name | Content |
16|------|----------------|-------------------|
17| A | `gluecron.com` | `149.28.119.158` |
18| A | `www.gluecron.com` | `149.28.119.158` |
19
20Remove the old Vercel `www` CNAME and the `_vercel` TXT verification record.
21
22## 2. One-time box setup
23
24```sh
25command -v docker >/dev/null || curl -fsSL https://get.docker.com | sh
26git clone https://github.com/ccantynz-alt/Gluecron.com.git /opt/gluecron
27cd /opt/gluecron
28git checkout claude/site-migration-vercel-XstpK
29cp .env.example .env
30# Edit .env — at minimum set DATABASE_URL (Neon) and APP_BASE_URL=https://gluecron.com
31nano .env
32```
33
34## 3. Deploy (app only — bundled Caddy is skipped)
35
36`docker-compose.override.yml` publishes the app on `127.0.0.1:3000` and
37disables git-over-SSH. Bring up only the `gluecron` service:
38
39```sh
40docker compose up -d --build gluecron
41docker compose exec gluecron bun run db:migrate # first deploy only
42curl -s localhost:3000/healthz # -> ok
43```
44
45## 4. Point the existing Bun proxy at it
46
47Add a virtual-host route in the custom Bun service so requests for
48`gluecron.com` (and `www.gluecron.com`) proxy to `http://127.0.0.1:3000`.
49The Bun service keeps owning TLS on :443.
50
51## 5. Verify
52
53```sh
54curl -sI https://gluecron.com/healthz # 200 ok, served via the Bun proxy
55```
56
57- `https://gluecron.com/healthz` → `ok`
58- `https://gluecron.com/readyz` → `ok`
59- `https://gluecron.com/status` → status page
60
61## Later redeploys
62
63```sh
64cd /opt/gluecron && git pull && docker compose up -d --build gluecron
65```
66
67## Rollback
68
69```sh
70cd /opt/gluecron && git checkout <prev-sha> && docker compose up -d --build gluecron
71```
Addeddocker-compose.override.yml+20−0View fileUnifiedSplit
@@ -0,0 +1,20 @@
1# App-only deploy override.
2#
3# For hosts that already run their own reverse proxy / TLS terminator and
4# therefore must NOT have Gluecron's bundled Caddy grab ports 80/443.
5# Current home: the Vultr box at 149.28.119.158, fronted by a custom Bun
6# service on :443 that proxies gluecron.com -> 127.0.0.1:3000.
7#
8# Usage (brings up ONLY the app, skips the caddy service):
9# docker compose up -d --build gluecron
10#
11# This file is auto-loaded by `docker compose`. It publishes the app on the
12# loopback interface only, so the external proxy can reach it but the
13# container is never exposed directly to the internet. SSH_PORT=0 disables
14# the git-over-SSH listener (HTTPS git clone/push is unaffected).
15services:
16 gluecron:
17 ports:
18 - "127.0.0.1:3000:3000"
19 environment:
20 - SSH_PORT=0
021