# Triển khai production NCV DCIMS 0.2.30

NCV DCIMS — NCV Dental Clinical Image Management System.

Hướng dẫn hiện hành cho site Volume 2 nằm tại [Cập nhật 0.2.29 → 0.2.30](operations/synology-update-0.2.30.md). Các PDF/Markdown trong `final/0.2.29` và `final/0.2.29-NAS-V2-r2` là tài liệu lưu trữ; không dùng layout credential một URL của chúng cho bản mới. Chưa triển khai NAS trong đợt này. Tài liệu lịch sử ngày 02/08 đã mô tả scanner không còn trong runtime từ 0.1.19.

- Runtime gồm PostgreSQL, API, Web, Gateway; các job secret/storage/migration chạy tạm, backup chạy theo profile/lịch riêng.
- Gateway là cổng public duy nhất; API, database, media, hợp đồng và backup giữ private.
- Ảnh JPEG/PNG tối đa 10 MiB, PDF hợp đồng tối đa 5 MiB. Pipeline giữ quarantine, MIME/chữ ký, giải mã an toàn, giới hạn trang/pixel và chặn active content PDF; không có bước quét antivirus.
- Không đổi chính sách backup, retention, purge hoặc restore. Cache watermark chỉ ở RAM riêng, không tạo storage root mới.
- NAS được báo cáo chạy 0.2.29 ngày 15/09: dùng revision updater Volume 2 có DSM sync cho 0.2.30; không di chuyển Docker Root hoặc chown/chmod đệ quy ledger WORM.

## Credential database 0.2.30

API nhận URL `ncv_dcims_runtime`, chỉ DML và INSERT audit; migration nhận URL `ncv_dcims_migration`, sở hữu schema/objects; backup nhận URL `ncv_dcims_backup`, chỉ đọc. URL quản trị chỉ mount vào job `ncv-dcims-db-roles` có profile maintenance. Secret-init xử lý quyền các file được chỉ định; không đưa giá trị URL/password vào log.

Provision chạy trước migration và lại sau migration, trước khi API khởi động. Job sau migration loại quyền runtime với `_prisma_migrations` và UPDATE/DELETE audit. Không chạy provisioning từ API startup. Cài mới dùng thứ tự: chuẩn bị secrets → secret-init → PostgreSQL healthy → db-roles → migrate → seed/bootstrap một lần bằng credential migration → db-roles → ứng dụng. Chỉ dùng storage-init trên storage mới đã xác minh, không chạy trên ledger WORM hiện có. Cập nhật database đang vận hành không seed/bootstrap; theo hướng dẫn site ở trên.

## Kiểm tra kỹ thuật

```sh
node --test scripts/production-media-runtime-contract.test.mjs scripts/production-access-runtime-contract.test.mjs scripts/synology-update-release-contract.test.mjs
```

Kiểm cấu hình Compose với .env và đường dẫn NAS thực tế bằng `docker compose --env-file .env -f compose.production.certified.yml config --quiet`.

## Kiểm tra vận hành

Sau triển khai theo đúng hướng dẫn phiên bản, chạy smoke test bằng HTTPS và dữ liệu giả. Xác minh đăng nhập ba vai trò, scope/IDOR, upload hợp lệ/sai định dạng, xem ảnh/PDF, chia sẻ và backup theo chính sách đã duyệt. Bằng chứng workspace không thay thế UAT NAS.
