Dependency production
Kết nối PostgreSQL 17+, Redis 7+ và MinIO với bucket riêng tư. Đặt DATABASE_URL, REDIS_URL, các biến MINIO, SMTP, PUBLIC_URL và OAUTH_CLIENTS trong Secret.
Dùng schema owner riêng cho auth/scheduler/snapshot và status_runtime cho transaction tenant. Owner không cần SUPERUSER hoặc BYPASSRLS. Với PostgreSQL được quản lý, operator tạo trước runtime role NOLOGIN và cho owner SET ROLE nhưng không kế thừa quyền runtime. Migration cần quyền sở hữu/DDL; nếu owner không có CREATEROLE thì bước tạo role thuộc bootstrap operator.
Bảng tenant giữ FORCE RLS. Migration 011 thêm policy rõ ràng cho schema owner; SET ROLE sang runtime vẫn giới hạn theo tổ chức. Không chia sẻ credential DB với client. Xác minh TLS đầy đủ và CA của nhà cung cấp khi cần.
Image và Helm
Build backend/web/docs với build argument SOURCE_SHA và ghi digest. Web nhận API_INTERNAL_URL và DOCS_URL lúc runtime; dùng DOCS_URL=/docs/ khi cùng origin. Không cần rebuild frontend theo môi trường. Docs build với DOCS_BASE=/docs/, canonical DOCS_SITE_URL=https://status.nextvisions.ai; Dev có header X-Robots-Tag: noindex, nofollow.
SMTP hỗ trợ SMTP_TLS_MODE=auto|implicit|starttls|none. Cổng 465 dùng implicit, xác minh chứng chỉ; none từ chối credential. Dev dùng Mailpit riêng. Credential SMTP Production nằm trong Secret, không đưa vào build argument.
helm lint deploy/helm/nextvision-status
helm template status deploy/helm/nextvision-status -f production-values.yamlTạo Secret status-secrets trước. Thay image/digest, domain, ingress và TLS trong values. API chỉ mở nội bộ; UI và API dùng chung origin. Docs xuất static, chạy bằng container hoặc Cloudflare.
Self-host độc lập có thể cài overlay đã review bằng Helm với gitops.enabled=false. Với hai môi trường Nextvision, commit manifests render vào GitOps và để Argo triển khai; không chạy Helm upgrade song song vào các namespace này. Bật gitops.enabled, postSync.enabled và pin digest test image. Migration là Argo PreSync, nghiệm thu là Argo PostSync. Helm test hook không thay bằng chứng nghiệm thu release.
Workload chạy non-root, filesystem chỉ đọc, readiness/liveness và graceful shutdown; HPA tùy chọn. NetworkPolicy phải khớp đường mạng thực tế: Traefik hostNetwork có thể dùng IP node/tunnel; PostgreSQL NodePort có thể đổi thành compute Pod/port sau DNAT. Chỉ cho phép compute riêng của môi trường. Redis dùng AOF/PVC; một replica Longhorn không phải HA hoặc backup.
Bắt đầu một worker replica; đo contention trước khi mở rộng. Helm lint/render không chứng minh đã deploy thành công trên cluster.
CI và rollback
GitHub giữ source chính, đồng bộ đúng SHA dev/main sang GitLab private. GitLab đọc CI/controller từ tag bảo vệ ci-control-v3; chạy Go race/vet/integration, libpq non-root, Next.js/Nimbus và Helm/gate tests trước khi build bộ image bất biến. Integration dùng PostgreSQL/Redis/MinIO/Mailpit tạm, không cần Docker daemon.
Controller ghi digest vào dev-gitops. Argo phải reconcile đúng revision, Healthy, full sync thành công và PostSync đạt. PostSync kiểm hai tổ chức, thành viên, gói, branding, MCP key, SQL RLS và snapshot qua API có DB/Redis không khả dụng. Sau đó GitHub-hosted runner kiểm public chỉ đọc. Evidence lưu source/tree/jobs/digests, GitOps revision, hook UID/log và external run.
Push main không tự deploy Production. Owner GitLab đã chỉ định bấm promote-production; job kiểm danh tính, main HEAD/tree, evidence Dev và Production GitOps HEAD, dùng nguyên digest đã đạt Dev, không rebuild. Production chỉ PASS sau PostSync/public acceptance riêng. Thiếu evidence vẫn chặn promote dù workload đã phục vụ traffic.
Khi chỉ cấp Kubernetes RBAC theo namespace, đăng ký Argo cluster watch đúng namespace. AppProject cần cho quan sát Pod/ReplicaSet/ControllerRevision con để lấy hook UID/log; Kubernetes RBAC vẫn có thể cấm tạo trực tiếp ba loại này. CI chỉ có credential observer Argo, không có Kubernetes writer. Mapping vận hành và override bootstrap ở docs/devops/ trong repo.
Rollback bằng commit chart/cấu hình/digest tốt trước đó vào GitOps của môi trường, kiểm HEAD hiện tại và push bình thường. Thu full sync/PostSync và public acceptance mới; không force push hoặc selective sync. Không chạy down migration tự động. Khôi phục DB cần quyết định backup/recovery point riêng; diễn tập rollback cấu hình không chứng minh image rollback hoặc SQL restore.