3dct-client-mirror/README.md
Mannu 596cfcca34 snapshot(2026-08-15): client production system, pre-engagement baseline
Read-only mirror of the client's existing system as it stood before our
work began. Taken from matthijsexpand@149.210.159.152 (TransIP VPS,
Lelystad NL) with the client's written permission.

Contents:
- home-weddingcaketopper/  Next.js app, proxy.py, supabase schema
- var-www/                 static webroots for all three domains
- etc-nginx/               vhost configs (previously unversioned, server-only)

Excluded: node_modules (704M, regenerable), .next (17M, regenerable),
and env file contents (present on local disk, gitignored — see README).

Not our IP. Not covered by the proposal's assignment clause.
2026-08-15 08:57:40 +05:30

86 lines
4.6 KiB
Markdown

# 3dct-client-mirror
Read-only snapshots of **the client's existing production system** for `3dcaketopper.nl`, `birthdaycaketopper.nl` and `weddingcaketopper.nl`.
> [!important] This is not our code
> Everything here is the property of the client. It is mirrored with written permission, solely so that we have a reproducible baseline of the system as it stood before our engagement began. **Nothing in this repository is transferred to us, and nothing here is covered by the IP assignment in our proposal.** Do not develop against this tree — our delivery code lives in `3D_Cake_topper`.
---
## Snapshots
| Snapshot | Taken | Source |
| --- | --- | --- |
| `snapshot-2026-08-15/` | 2026-08-15 | `matthijsexpand@149.210.159.152` (TransIP VPS, Lelystad NL) |
Each snapshot is a point-in-time copy. Never edit one — take a new snapshot instead. The value of this repository is that the old ones remain untouched.
### Layout
```
snapshot-YYYY-MM-DD/
├── home-weddingcaketopper/ ~/weddingcaketopper — Next.js app + proxy.py
├── var-www/ /var/www — static webroots for all three domains
├── etc-nginx/ /etc/nginx/sites-available — vhost configs
└── secrets-DO-NOT-COMMIT/ env files — gitignored, local disk only
```
### Deliberate exclusions
| Excluded | Why |
| --- | --- |
| `node_modules/` (704 MB) | Third-party packages, regenerable with `npm install`. Not client IP, and permanent git bloat. |
| `.next/` (17 MB) | Build output, regenerable with `npm run build`. |
| Env file **contents** | See below. |
---
## Why the secrets are not committed
The two env files were pulled and **are present on local disk** at `snapshot-*/secrets-DO-NOT-COMMIT/`. Nothing was lost. They are excluded from git only.
| File | Contains |
| --- | --- |
| `etc-weddingcaketopper.env` | `ANTHROPIC_API_KEY`, `OPENAI_API_KEY` |
| `weddingcaketopper.env.local` | `SUPABASE_SERVICE_ROLE_KEY`, `ADYEN_API_KEY`, `ADYEN_CLIENT_KEY`, `ADYEN_MERCHANT_ACCOUNT`, `OPENAI_API_KEY` |
Three reasons this line is drawn at the commit rather than the pull:
1. **Git history is permanent.** "We'll decide later" works for a file on disk. It does not work for a commit — removal requires `filter-repo`, which rewrites every hash and breaks every clone. The reversible choice is to keep them out now and add them deliberately later if wanted; the irreversible choice is the reverse.
2. **These are the client's live credentials, not ours.** A Supabase *service-role* key bypasses all row-level security on the customer database. The Adyen keys are payment infrastructure. Committing them to our git server materially increases *the client's* exposure, and that is not a risk we can accept on their behalf.
3. **They are already flagged as compromised.** Risk S-01 in the project Risk Register: an open unauthenticated relay served these keys to the public internet with no logging. They should be rotated, which makes the current values worth preserving as evidence — not as configuration.
**If you later decide they must be versioned**, the correct mechanism is encryption at rest — `git-crypt`, `age`, or SOPS — so the repository holds ciphertext and the key lives elsewhere. Say the word and it can be set up.
`.env.example` **is** committed: it records which variables the system requires, without any value.
---
## How a snapshot is taken
```bash
BASE=snapshot-$(date +%F)
mkdir -p "$BASE"/{home-weddingcaketopper,var-www,etc-nginx,secrets-DO-NOT-COMMIT}
rsync -az --exclude node_modules --exclude .next \
3dct:/home/matthijsexpand/weddingcaketopper/ "$BASE/home-weddingcaketopper/"
rsync -az 3dct:/var/www/ "$BASE/var-www/"
rsync -az 3dct:/etc/nginx/sites-available/ "$BASE/etc-nginx/"
rsync -az 3dct:/etc/weddingcaketopper.env "$BASE/secrets-DO-NOT-COMMIT/etc-weddingcaketopper.env"
mv "$BASE/home-weddingcaketopper/.env.local" "$BASE/secrets-DO-NOT-COMMIT/weddingcaketopper.env.local"
```
`3dct` is the SSH host alias in `~/.ssh/config`.
---
## What the 2026-08-15 snapshot documents
Full analysis in the project vault: `01-context/Infrastructure and Live Stack Audit`.
- `proxy/proxy.py` — 60-line `http.server` script; the open relay behind finding S-01
- `app/api/` — Adyen session/webhook, OpenAI preview, order creation routes
- `supabase/schema.sql``orders` and `uploads` tables, no row-level security
- `README.md` — the previous developer's own list of six items outstanding before production
- `var-www/3dcaketopper.nl/ontwerp/` — the live vanilla-JS configurator being replaced
- `etc-nginx/` — the three vhosts, previously existing only on the server with no history