Hai phần: Supabase (Postgres + Auth + Storage + Edge Function) và Netlify (frontend + Route Handlers Next.js, deploy cùng nhau). Không còn backend Java riêng.
Supabase project:
iehmucsshklgjmxqyggp. Không in secret vào log hay tài liệu.
supabase/migrations/:
npx supabase link --project-ref iehmucsshklgjmxqyggp
npx supabase db push
Kiểm tra Dashboard → Table Editor có đủ 5 bảng: invitations, guests, rsvps, wishes, rate_limits.
media đã có, Public (thiệp hiển thị ảnh/nhạc cho khách không đăng nhập). Upload chỉ qua server đã authorize; browser không có quyền ghi.mailer_autoconfirm: true) để tài khoản mới có session ngay. Đăng nhập chỉ dùng Google OAuth (không email/mật khẩu — quyết định 2026-09-27).https://iehmucsshklgjmxqyggp.supabase.co/auth/v1/callback
và thêm https://<domain-cua-ban>/auth/callback vào Supabase Additional Redirect URLs. Local dùng http://127.0.0.1:54321/auth/v1/callback và các biến SUPABASE_AUTH_EXTERNAL_GOOGLE_* trong .env.public-write (RSVP/lời chúc, rate limit, chống bot):
npx supabase secrets set EDGE_SHARED_SECRET=<cùng-giá-trị-với-Netlify-và-.env.local>
npx supabase functions deploy public-write
Kiểm tra: GET https://<ref>.supabase.co/functions/v1/public-write không còn 404 NOT_FOUND.
npm run build:next, plugin @netlify/plugin-nextjs (đã có trong netlify.toml), Node 22..env.example:
NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY (Dashboard → Project Settings → API; hệ key mới: sb_publishable_...)SUPABASE_SERVICE_ROLE_KEY (sb_secret_..., chỉ server, không commit)EDGE_SHARED_SECRET, RATE_LIMIT_HMAC_SECRET (tự tạo: openssl rand -hex 32)NEXT_PUBLIC_SITE_URL = tên miền thật, vd https://moc.vn. Bắt buộc ở production (sitemap, canonical, Open Graph)./docs (spec JSON ở /api/docs)./templates: mẫu hiện ra, bấm vào từng mẫu xem được./account./studio → chọn mẫu → sửa tên cô dâu chú rể → thấy “Đã lưu”./invite/<slug>?g=<mã> của từng hộ ở tab ẩn danh: phong bì ghi đúng tên hộ, ảnh hiện, nhạc phát.?g=<token>: hiện đúng tên hộ.https://<domain>/sitemap.xml và /robots.txt trỏ đúng tên miền.pg_dump định kỳ bằng connection string (Database → Connection string, nhớ percent-encode mật khẩu)..env.local + Netlify env + supabase secrets set, deploy lại cả hai.