- migrations/0002_delta.sql: idempotent SQL extracted from 20260515_162527.ts
(redirects table, locations detail fields, globals versioning, new pages)
so the psql migrator container applies it on next deploy
- Dockerfile: ARG/ENV NEXT_PUBLIC_SITE_URL in builder stage so the URL is
baked into the Next.js bundle (fixes postMessage origin warning in admin)
- docker-compose.prod.yml: pass build arg NEXT_PUBLIC_SITE_URL=https://shumi.ai-impress.com
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Remove push:true from postgres adapter (unreliable for new columns)
- Remove profile:tools from migrate service so it runs on every deploy
- Add restart:no to migrate service (one-shot runner)
- App now depends on migrate with service_completed_successfully condition:
postgres healthy → migrate applies pending → app starts
Workflow for future schema changes:
1. Add field to collection/global TypeScript
2. ssh server: docker-compose run --rm migrate migrate:create --name <field>
3. git pull the generated .ts migration file
4. commit + push → next deploy applies it automatically
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add Dockerfile.migrator (node:22-alpine + full source) and
docker-compose.prod.yml `migrate` service (profile: tools) so
migrations can be generated and applied on the server without
Node.js v26/tsx compatibility issues.
Workflow:
# generate migration:
docker compose --profile tools run --rm migrate migrate:create --name <desc>
# apply pending migrations:
docker compose --profile tools run --rm migrate
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Dockerfile: create /app/media dir with nextjs ownership before USER switch
- docker-compose.prod.yml: mount named volume shumiland-media-uploads → /app/media
- Reviews: add VideoReviewCard component with 9:16 portrait inline player
- Add review-video.mp4 (93s, 720×1280, 15MB) + poster from IMG_8336.MOV
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- New collections: Locations, Reviews, BirthdayPackages
- New lib: getHomeData() — single cache-wrapped data fetch for homepage
- All sections now read from CMS with static fallbacks
- Header dropdown auto-populates 5 locations from Locations collection
- Seed API at /api/admin/seed creates all collections + uploads media
- docker-compose.prod.yml: replaced nginx/certbot with Traefik labels (shumi.ai-impress.com)
- Fixed image assignments: Locations 3-5 use gallery images (not news-bg)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>