This repository has been archived on 2026-06-09. You can view files and clone it, but cannot push or open issues or pull requests.
Go to file
Claude 00baf9bd89
feat: full Docker stack on a VPS with improved admin editing
Self-hosted rewrite of the wedding photo app: Node + Hono replaces
Cloudflare Workers, Postgres 16 replaces D1, MinIO replaces R2,
Caddy fronts the stack with automatic Let's Encrypt TLS. Same routes
and feature set as before; storage abstraction is the same S3 client
so MinIO drops in without code changes.

Architecture:
- docker-compose.yml: postgres, minio, minio-init (creates bucket +
  anonymous read + CORS), app, caddy (reverse proxy + media subdomain).
- Dockerfile: multi-stage pnpm build, single runtime image serving
  the API and the SPA dist as static assets from one process.
- Caddyfile: primary domain proxies to app; media subdomain proxies
  to MinIO so guests upload directly and signatures match Host.
- app: tsx runtime, runs SQL migrations idempotently at startup via
  a schema_migrations(name, sha256, applied_at) table.

Admin upgrades requested:
- PATCH /api/admin/uploads/:id to edit author/message.
- POST /api/admin/uploads/bulk for bulk approve/reject/delete.
- POST /api/admin/uploads/:id/cover and DELETE /api/admin/event/cover
  to set/clear a featured image (rendered on Home when set).
- GET /api/admin/uploads gains ?q= text search across author and
  message and ?kind=photo|video filter.
- Dashboard: bulk select checkboxes with a toolbar, edit modal that
  rewrites author and message, search input, kind filter, set-cover
  button per item, cover preview + clear in the event card.

Singletons replace the per-request bindings pattern: initDb() and
initStorage() run once in server.ts; routes call getDb()/getStorage()
directly rather than threading env.DB / env.MEDIA through.

env.ts uses zod to parse process.env and fails fast if anything
mandatory is missing. .env.example documents every variable and
flags the hairpin tradeoff for MinIO access from the app container.
2026-06-07 22:11:10 +00:00
apps feat: full Docker stack on a VPS with improved admin editing 2026-06-07 22:11:10 +00:00
infra feat: full Docker stack on a VPS with improved admin editing 2026-06-07 22:11:10 +00:00
packages/shared feat: full Docker stack on a VPS with improved admin editing 2026-06-07 22:11:10 +00:00
.dockerignore feat: full Docker stack on a VPS with improved admin editing 2026-06-07 22:11:10 +00:00
.env.example feat: full Docker stack on a VPS with improved admin editing 2026-06-07 22:11:10 +00:00
.gitignore feat: full Docker stack on a VPS with improved admin editing 2026-06-07 22:11:10 +00:00
.npmrc feat: full Docker stack on a VPS with improved admin editing 2026-06-07 22:11:10 +00:00
Caddyfile feat: full Docker stack on a VPS with improved admin editing 2026-06-07 22:11:10 +00:00
docker-compose.yml feat: full Docker stack on a VPS with improved admin editing 2026-06-07 22:11:10 +00:00
Dockerfile feat: full Docker stack on a VPS with improved admin editing 2026-06-07 22:11:10 +00:00
package.json feat: full Docker stack on a VPS with improved admin editing 2026-06-07 22:11:10 +00:00
pnpm-lock.yaml feat: full Docker stack on a VPS with improved admin editing 2026-06-07 22:11:10 +00:00
pnpm-workspace.yaml feat: full Docker stack on a VPS with improved admin editing 2026-06-07 22:11:10 +00:00
tsconfig.base.json feat: full Docker stack on a VPS with improved admin editing 2026-06-07 22:11:10 +00:00