# NCV DCIMS — NCV Dental Clinical Image Management System

## Bộ bảo vệ vùng lưu trữ khi Synology khởi động

Mục tiêu của cơ chế này là ngăn Docker ghi dữ liệu vào một thư mục rỗng trên Volume 1 khi shared folder mã hóa `ncv-dcims` hoặc shared folder WriteOnce `ncv-dcims-ledger` chưa được mount sau khi NAS khởi động lại.

Script chính:

```text
scripts/synology/ncv-dcims-storage-safety-controller.sh
```

### Nguyên tắc an toàn

- Không tự tạo các thư mục gốc lưu trữ. Thư mục thiếu được xem là lỗi mount.
- Mỗi vùng lưu trữ phải có marker riêng và đúng nội dung.
- `media`, `backup/repository` và `backup/receipts` phải ghi/xóa được file kiểm tra nhỏ.
- `ncv-dcims-ledger` chỉ được đọc marker vì đây là vùng WriteOnce/WORM.
- Khi kiểm tra thất bại, ứng dụng bị dừng; script không tự xóa container, volume hoặc dữ liệu.
- Log không chứa secret, nội dung file hay dữ liệu bệnh nhân.

### 1. Khởi tạo marker một lần

Chỉ chạy sau khi đã xác nhận cả hai shared folder đang mount đúng và các thư mục con hiện hữu:

```sh
sh /volume1/docker/ncv-dcims-production/scripts/synology/ncv-dcims-storage-safety-controller.sh initialize --confirm-mounted-storage
```

Lệnh không tạo thư mục bị thiếu và không ghi đè marker có nội dung sai.

### 2. Tác vụ khởi động có bảo vệ

Trong DSM **Control Panel → Task Scheduler**, tắt chế độ tự khởi động hiện tại của project nếu có, rồi tạo **Triggered Task → User-defined script**:

- Tên: `NCV DCIMS guarded start`
- User: `root`
- Event: `Boot-up`
- Script:

```sh
sh /volume1/docker/ncv-dcims-production/scripts/synology/ncv-dcims-storage-safety-controller.sh start >> /volume1/docker/ncv-dcims-production/storage-guard.log 2>&1
```

Script chờ tối đa 300 giây để storage sẵn sàng. Nếu vẫn không hợp lệ, NCV DCIMS không được khởi chạy.

### 3. Watchdog định kỳ

Tạo **Scheduled Task → User-defined script**:

- Tên: `NCV DCIMS storage watchdog`
- User: `root`
- Lịch: mỗi 5 phút
- Không cho phép chạy song song nhiều phiên của cùng tác vụ.
- Script:

```sh
sh /volume1/docker/ncv-dcims-production/scripts/synology/ncv-dcims-storage-safety-controller.sh watchdog >> /volume1/docker/ncv-dcims-production/storage-guard.log 2>&1
```

Nếu storage bị unmount trong lúc hệ thống đang hoạt động, watchdog dừng các service có khả năng đọc/ghi dữ liệu. Sau khi remount, quản trị viên chạy lại tác vụ `NCV DCIMS guarded start`.

### 4. Kiểm thử không đụng dữ liệu thật

```sh
sh /volume1/docker/ncv-dcims-production/scripts/synology/ncv-dcims-storage-safety-controller.sh self-test
```

Kết quả đạt phải có:

```text
NCV_DCIMS_STORAGE_GUARD_SELF_TEST_OK
```

### 5. Kiểm tra sau mỗi lần NAS restart

1. Xác nhận `ncv-dcims` đã mount và thấy các thư mục `media`, `backup/repository`, `backup/receipts`.
2. Xác nhận `ncv-dcims-ledger` hiển thị nhãn WriteOnce và marker vẫn tồn tại.
3. Kiểm tra `storage-guard.log` có `NCV_DCIMS_GUARDED_START_OK`.
4. Kiểm tra project `ncv-dcims-production` healthy.
5. Thử đăng nhập và đọc một hồ sơ dữ liệu giả lập; không dùng dữ liệu bệnh nhân thật cho bài kiểm tra.

## Điều chưa thể tự động hóa hoàn toàn

Marker phát hiện được việc Docker nhìn thấy nhầm thư mục rỗng, nhưng không thay thế backup ngoài NAS. OneDrive offsite và bài thử phục hồi định kỳ vẫn là hai lớp bảo vệ riêng cần duy trì.
