Skip to content

Commit 149e7ee

Browse files
VladUZHclaude
andcommitted
docs: update deployment report with Google OAuth and final status
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent f3b5099 commit 149e7ee

1 file changed

Lines changed: 169 additions & 0 deletions

File tree

Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
# SidClaw Production Deployment Report
2+
3+
**Date:** 2026-03-21
4+
**Deployed by:** Claude Opus 4.6 + VladUZH
5+
6+
---
7+
8+
## 1. Services Deployed
9+
10+
### Railway Project
11+
- **Project name:** sidclaw
12+
- **Project URL:** https://railway.com/project/33c5e1aa-ac1a-4184-b514-8737c30f733c
13+
- **Region:** us-east4-eqdc4a
14+
15+
### PostgreSQL
16+
- **Status:** Online
17+
- **Provider:** Railway managed PostgreSQL
18+
- **Internal URL:** `postgres.railway.internal:5432`
19+
- **Database:** railway
20+
- **Migrations:** 8 migrations applied successfully
21+
22+
### API Service (platform)
23+
- **URL:** https://api.sidclaw.com
24+
- **Railway URL:** https://platform-production-6dea.up.railway.app
25+
- **Health check:** `GET /health` — passing
26+
- **Health response:** `{"status":"healthy","version":"0.1.0","checks":{"database":{"status":"healthy","latency_ms":4}}}`
27+
- **Port:** 4000
28+
- **Dockerfile:** `apps/api/Dockerfile`
29+
- **Environment variables:** DATABASE_URL, NODE_ENV, PORT, SESSION_SECRET, ALLOWED_ORIGINS, RATE_LIMIT_ENABLED, DASHBOARD_URL, EMAIL_FROM, GITHUB_CLIENT_ID, GITHUB_CLIENT_SECRET
30+
31+
### Dashboard Service (perpetual-commitment)
32+
- **URL:** https://app.sidclaw.com
33+
- **Status:** Online (returns 307 redirect to login)
34+
- **Port:** 3000
35+
- **Dockerfile:** `apps/dashboard/Dockerfile`
36+
- **Environment variables:** NEXT_PUBLIC_API_URL, PORT, NODE_ENV
37+
38+
### Docs & Landing
39+
- **Not deployed yet** — can be added as additional Railway services when ready
40+
41+
---
42+
43+
## 2. DNS Configuration (Cloudflare)
44+
45+
### CNAME Records
46+
| Name | Target | Proxy Status |
47+
|------|--------|-------------|
48+
| `api` | `mjqfk7bc.up.railway.app` | Proxied |
49+
| `app` | `gy8u8yoq.up.railway.app` | Proxied |
50+
51+
### Verification TXT Records
52+
- `_railway-verify.api` — Added via Cloudflare one-click DNS setup
53+
- `_railway-verify.app` — Added via Cloudflare one-click DNS setup
54+
55+
### SSL/TLS
56+
- **Mode:** Full (Strict)
57+
- **Always Use HTTPS:** Enabled
58+
- **Minimum TLS Version:** 1.2
59+
60+
---
61+
62+
## 3. OAuth Apps Registered
63+
64+
### GitHub OAuth
65+
- **Client ID:** `0v23liPXyfntf24Bvze1`
66+
- **Callback URL:** `https://api.sidclaw.com/api/v1/auth/callback/github`
67+
- **Organization:** sidclawhq
68+
- **Credentials added to Railway:** Yes
69+
70+
### Google OAuth
71+
- **Client ID:** `251725911373-ccl49vbqjulue4dhtj660uprqknef6t6.apps.googleusercontent.com`
72+
- **Callback URL:** `https://api.sidclaw.com/api/v1/auth/callback/google`
73+
- **GCP Project:** sidclaw
74+
- **Credentials added to Railway:** Yes
75+
76+
---
77+
78+
## 4. Email (Resend)
79+
- **Not configured yet** — Email notifications disabled
80+
81+
---
82+
83+
## 5. npm Published
84+
85+
- **Package:** `@sidclaw/sdk`
86+
- **Version:** 0.1.0
87+
- **URL:** https://www.npmjs.com/package/@sidclaw/sdk
88+
- **License:** Apache-2.0
89+
- **Published:** 2026-03-21
90+
- **Install test:** Pending registry propagation
91+
92+
---
93+
94+
## 6. GitHub Repository
95+
96+
- **URL:** https://github.com/sidclawhq/platform
97+
- **Visibility:** Public
98+
- **Commits:** 50+
99+
- **License:** Apache-2.0 (SDK), proprietary (platform)
100+
101+
---
102+
103+
## 7. Verification Results
104+
105+
| Check | Status |
106+
|-------|--------|
107+
| API health (`api.sidclaw.com/health`) | PASS |
108+
| API Swagger docs (`api.sidclaw.com/docs`) | PASS |
109+
| Dashboard (`app.sidclaw.com`) | PASS (307 redirect to login) |
110+
| Database connection | PASS (4ms latency) |
111+
| Prisma migrations | PASS (8 migrations applied) |
112+
| GitHub OAuth registered | PASS |
113+
| npm package published | PASS (propagating) |
114+
| SSL certificates | PASS (Cloudflare universal cert) |
115+
| DNS resolution | PASS |
116+
| Landing page (`sidclaw.com`) | NOT DEPLOYED |
117+
| Docs (`docs.sidclaw.com`) | NOT DEPLOYED |
118+
| Google OAuth | SKIPPED |
119+
| Resend email | SKIPPED |
120+
| Demo script against production | NOT TESTED |
121+
122+
---
123+
124+
## 8. Issues Encountered & Resolved
125+
126+
### Docker Build Issues
127+
1. **`lefthook install` failing** — The `prepare` script runs `lefthook install` which fails in Docker. Fixed by adding `--ignore-scripts` to `npm ci` in all Dockerfiles.
128+
129+
2. **Workspace `node_modules` not found** — npm workspaces hoist dependencies to root. Removed individual workspace `node_modules` COPY commands from Dockerfiles.
130+
131+
3. **Missing `package.json` in build stage** — The second `npm ci --omit=dev` needed root `package.json` and `package-lock.json`. Added COPY for these files.
132+
133+
4. **Empty `public/` directories** — Git doesn't track empty directories. Dashboard and landing `public/` dirs were empty, causing Docker COPY to fail. Added `.gitkeep` files.
134+
135+
### Prisma Issues
136+
5. **`prisma` not found at runtime**`prisma` is a devDependency, excluded by `--omit=dev`. Fixed by installing `prisma@7` globally in the Docker production stage.
137+
138+
6. **`datasource.url` not found** — Prisma CLI couldn't find the database URL. Root cause: `prisma.config.ts` (which provides the URL in Prisma 7) wasn't copied to the production container. Added COPY for `prisma.config.ts`.
139+
140+
7. **`url` property not supported in Prisma 7 schema** — Attempted to add `url = env("DATABASE_URL")` to schema.prisma, but Prisma 7 moved this to `prisma.config.ts`. Reverted the schema change.
141+
142+
### Runtime Issues
143+
8. **`DATABASE_URL` not resolving** — Railway variable reference `${{Postgres.DATABASE_URL}}` entered via Raw Editor was stored as a literal string with quotes. Fixed by manually re-adding the variable through Railway's UI.
144+
145+
9. **ESM directory imports not supported** — The shared package uses `moduleResolution: "bundler"` which allows bare directory imports (e.g., `./types`). Node.js ESM doesn't support this. Fixed by rebuilding the shared package as CommonJS in the Docker build.
146+
147+
10. **`OIDC_ISSUER` required in production** — Config validation crashed the server when OIDC wasn't configured. Changed from hard requirement to warning.
148+
149+
---
150+
151+
## 9. Architecture Notes
152+
153+
- Railway's Trial plan has a custom domain limit — only 2 custom domains could be added (api + app)
154+
- Cloudflare proxy is detected by Railway; SSL works with Full (Strict) mode
155+
- Railway's internal networking uses `*.railway.internal` hostnames for service-to-service communication
156+
- The API runs migrations on startup via `prisma migrate deploy` in the Docker CMD
157+
- Background jobs (approval expiry, trace cleanup, webhook delivery, session cleanup, audit batch) start automatically
158+
159+
---
160+
161+
## 10. Next Steps
162+
163+
1. **Deploy docs and landing page** — Add as additional Railway services
164+
2. **Configure Google OAuth** — Set up GCP project and add credentials
165+
3. **Configure Resend** — Add domain, DNS records, API key for email notifications
166+
4. **Verify npm package** — Confirm registry propagation and test install
167+
5. **Run demo script** — Test full evaluate → approve → trace flow against production
168+
6. **Upgrade Railway plan** — Trial plan has resource limits; upgrade for production use
169+
7. **Set up monitoring** — Add uptime monitoring for all services

0 commit comments

Comments
 (0)