Decision log

Every committed call, tagged by state.

01Scope: two use casescommitted

① Host public side-projects on a deploy platform. ② Host self-hosted Google Photos with backups. Everything else (smart home, media) is phase 2.

02No VPS — Pangolin on own hardwarecommitted

The public edge runs at home, not on a rented server. Committed; specs decided later.

03Public IPresolved

Confirmed: the Istanbul line has a public IP; a static one is obtainable if needed. Gate resolved — Pangolin-at-home is viable.

04Deploy platform: Dokploycommitted

Docker-Compose-native PaaS for side projects (git-deploy, DBs, built-in backups). No Kubernetes for real workloads; k3s stays a learning sandbox option.

05Photos: Immich, single primarycommitted

One write-active instance in Istanbul. No dual-write / split-brain. Tallinn holds copies, never a second writer.

06Backup topology: 4 NAScommitted

1 active Istanbul · 1 passive Istanbul (LAN restic) · 2 passive Tallinn (offsite restic + LAN copy). Passive boxes are dumb storage — cheap hardware.

07Backup engine: restic, nightlycommitted

Dedup + client-side encryption. Multi-target job: pg_dump → NAS 2 (LAN) + NAS 3 (mesh); NAS 4 copies NAS 3 on brother’s LAN. Initial full sync is the one-time bandwidth cost.

08Site-to-site: Pangolin sitescommitted

Pangolin covers edge + mesh + device access. Headscale/Tailscale dropped. Accepted tradeoff: Pangolin down = public access + backup pipe down.

09Monitoring & alertingcommitted

Uptime Kuma + Grafana/Prometheus for services; healthchecks-style pings on backup jobs. Backup failure alerts are mandatory.

10Single active box (Option A)committed

Pangolin + Dokploy + Immich on NAS 1. Pangolin kept as an isolated compose project so the A→B migration (dedicated edge box) stays a ~1h job. Exit path preserved.

11This site: Astro + React on Cloudflare Pagescommitted

The homelab documentation lives as a static site — free tier, auto-HTTPS, custom domain via the DNS already needed.

12Hardware specsopen

CPU / RAM / disks per box not yet sized. Contract: NAS 1 needs headroom (Immich ML + Dokploy + edge); NAS 2–4 are dumb storage.

13Domain choiceopen

Registrar + DNS provider for the public edge (e.g. app.yourdomain.com). TBD.

14Initial sync planopen

First full library push Istanbul → Tallinn is days on residential upload. Plan as a scheduled one-time transfer before daily deltas.

15NAS OS: TrueNAS SCALE + 3-disk ZFS mirroropen

Evaluating. TrueNAS SCALE as the base OS: ZFS checksums, snapshots, web UI, SMART alerts. The active box runs Dokploy / Pangolin / Immich on top — workable, but TrueNAS adds an app-management layer to integrate with. 3-disk mirror = triple RAID-1: survives two disk failures, uses 1/3 of raw capacity. Not yet committed.

16Extra backup targets: S3 or a third siteopen

restic multi-target scales beyond the 4 NAS: Backblaze B2 / Cloudflare R2 adds a true third failure domain (client-side encrypted); another homelab or friend’s box adds another offsite leg. Each copy is a full-capacity repo — dedup is per-repo. Cost/benefit to size before committing.

17Photos: public URL behind Google OAuth2 SSOcommitted

Family photos reachable from any browser at a public URL, gated by “Login with Google” (OAuth2) at the Pangolin edge — optionally restricted to specific Google accounts or a domain. Photos join the public exposure zone: patching, monitoring, and auth review are now mandatory for them.