---
title: "Docker và Kubernetes"
description: "Nextvision Status — Docker và Kubernetes"
---

> Documentation Index
> Fetch the complete documentation index at: https://status.nextvisions.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Docker và Kubernetes

## 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.

```sh
helm lint deploy/helm/nextvision-status
helm template status deploy/helm/nextvision-status -f production-values.yaml
```

Tạ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.

Source: https://status.nextvisions.ai/docs/vi/deployment/index.mdx
