Nextcloud AIO — Kiến trúc và triển khai
DOC PATH deployments/nextcloud/aio-installation
Kiến trúc AIO, Docker, reverse proxy, cấu hình ứng dụng và bàn giao vận hành. Đọc theo thứ tự các chương hoặc chọn mục cần tra cứu trong mục lục.
Kiến trúc và phạm vi
Mục có tiêu đề “Kiến trúc và phạm vi”Architecture Diagram
System Flow
Tổng quan hệ thống
Mục có tiêu đề “Tổng quan hệ thống”Hệ thống cung cấp nền tảng lưu trữ file tập trung cho user nội bộ trong mạng LAN. Client truy cập tên miền nội bộ qua HTTPS; cụm Nginx HA thực hiện TLS termination, sau đó chuyển tiếp request đến backend Apache của Nextcloud AIO.
Các nguyên tắc chính:
- Không công khai trực tiếp Nextcloud AIO ra Internet.
- Chỉ reverse proxy nhận kết nối HTTPS từ client.
- Giao diện quản trị AIO chỉ dành cho mạng quản trị.
- PostgreSQL, Redis và các container thành phần nằm trong phạm vi Docker của AIO.
- Backup và restore được thực hiện bằng BorgBackup tích hợp trong AIO.
Thành phần
Mục có tiêu đề “Thành phần”| Thành phần | Vai trò |
|---|---|
| nextcloud-aio-mastercontainer | Điều phối AIO và quản lý các sibling container thông qua Docker socket. |
| nextcloud-aio-apache | Backend HTTP tại port 11000, nhận request từ reverse proxy. |
| nextcloud-aio-nextcloud | Ứng dụng PHP chính của Nextcloud. |
| nextcloud-aio-database | PostgreSQL lưu thông tin user, share, metadata và file index. |
| nextcloud-aio-redis | Cache, transactional file locking và hỗ trợ notify_push. |
| nextcloud-aio-notify-push | High Performance Backend for Nextcloud Files, giảm polling từ client. |
| nextcloud-aio-borgbackup | Thành phần backup/restore sử dụng BorgBackup. |
| nextcloud-aio-collabora | Nextcloud Office tùy chọn. |
| nextcloud-aio-clamav | Thành phần chống mã độc tùy chọn cho luồng upload. |
Quyết định thiết kế
Mục có tiêu đề “Quyết định thiết kế”TLS Termination
Mục có tiêu đề “TLS Termination”TLS termination tại Nginx HA giúp quản lý tập trung certificate, định tuyến và chính sách truy cập. Cần cấu hình chính xác Host, X-Forwarded-*, timeout và trusted proxy.
Internal Backend
Mục có tiêu đề “Internal Backend”Backend Apache của AIO không nhận traffic trực tiếp từ Internet. Mọi request đều đi qua reverse proxy để áp dụng chính sách truy cập và giảm bề mặt tấn công.
Quản lý container
Mục có tiêu đề “Quản lý container”Giao diện web của AIO là control plane chính để khởi động, dừng và bật các thành phần tùy chọn. Ưu tiên quản lý các container thành phần qua giao diện này trong quá trình vận hành hằng ngày.
Backup Isolation
Mục có tiêu đề “Backup Isolation”Repository Borg được đặt trên backup storage riêng để giảm rủi ro khi server ứng dụng hỏng. Khả năng restore vẫn phải được kiểm tra định kỳ, không chỉ kiểm tra việc tạo backup.
Giới hạn
Mục có tiêu đề “Giới hạn”- Mô hình này phụ thuộc vào độ sẵn sàng của DNS nội bộ và cụm reverse proxy.
- Mất backup storage sẽ ảnh hưởng trực tiếp đến lịch backup.
- Collabora và ClamAV có thể làm tăng đáng kể mức sử dụng CPU/RAM.
- SKIP_DOMAIN_VALIDATION không thay thế cho kiểm thử HTTPS, DNS và định tuyến.
- Khai báo trusted proxy sai có thể khiến Nextcloud ghi nhận sai IP client hoặc gây lỗi truy cập.
- Kiến trúc này không cung cấp HA cho server ứng dụng AIO khi chỉ có một backend.
- RPO/RTO thực tế phụ thuộc vào lịch Borg, dung lượng repository và thời gian restore.
Mục tiêu
Mục có tiêu đề “Mục tiêu”Triển khai một hệ thống Nextcloud AIO có các đặc điểm:
- Chạy trên Ubuntu Server.
- Nextcloud được triển khai bằng Docker và Nextcloud AIO.
- User truy cập qua HTTPS và tên miền riêng.
- Nginx làm reverse proxy phía trước Nextcloud.
- Backend Apache của AIO không công khai trực tiếp ra Internet.
- PostgreSQL, Redis và các thành phần AIO được quản lý bằng container.
- Hỗ trợ High Performance Backend for Nextcloud Files /
notify_push. - Backup bằng BorgBackup tích hợp trong AIO.
- Có thể bật thêm Nextcloud Office / Collabora, ClamAV và Server-side Encryption (SSE).
- Có quy trình kiểm tra sau khi triển khai.
Chuẩn bị hạ tầng và runtime
Mục có tiêu đề “Chuẩn bị hạ tầng và runtime”Cấu hình tham khảo
Mục có tiêu đề “Cấu hình tham khảo”30 user
Mục có tiêu đề “30 user”Chỉ dùng Files, Redis, PostgreSQL và backup:
CPU : 4 vCPURAM : 8 GBOS : 80–100 GBNIC : 1 GbpsData : tùy nhu cầuCó thêm Office và SSE:
CPU : 4–6 vCPURAM : 8–12 GBCó Office, ClamAV và SSE:
CPU : 6 vCPURAM : 16 GBClamAV và Collabora có thể tiêu thụ RAM đáng kể.
Hạ tầng
Mục có tiêu đề “Hạ tầng”Server
Mục có tiêu đề “Server”Khuyến nghị:
OS : Ubuntu Server 24.04 LTS hoặc phiên bản LTS được AIO hỗ trợCPU : >= 4 vCPURAM : >= 8 GBNIC : 1 GbpsTimezone : Asia/Ho_Chi_MinhKiểm tra:
hostnamectlip addrlsblkfree -hdf -htimedatectlĐặt timezone:
timedatectl set-timezone Asia/Ho_Chi_MinhTên miền của Nextcloud phải phân giải về địa chỉ reverse proxy:
<nextcloud-domain> | +----> <reverse-proxy-vip>Kiểm tra:
nslookup <nextcloud-domain>dig <nextcloud-domain>Firewall và mạng
Mục có tiêu đề “Firewall và mạng”Luồng tối thiểu:
Máy khách | | TCP/443 vNginx Reverse Proxy | | TCP/11000 vNextcloud AIOGiao diện quản trị AIO dùng TCP/8080 và nên chỉ cho phép truy cập từ mạng quản trị.
Không công khai trực tiếp TCP/11000 ra Internet.
Ubuntu
Mục có tiêu đề “Ubuntu”Cập nhật hệ thống:
apt updateapt upgrade -yCài các gói phần mềm cơ bản:
apt install -y \ ca-certificates \ curl \ gnupg \ unzip \ nfs-commonKhởi động lại nếu kernel hoặc gói phần mềm hệ thống yêu cầu:
rebootDocker
Mục có tiêu đề “Docker”Tạo keyring và import GPG key của Docker:
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \ | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpgThêm Docker repository:
echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \ https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo \"$VERSION_CODENAME\") stable" \ > /etc/apt/sources.list.d/docker.listCài Docker và kiểm tra:
apt updateapt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
docker versiondocker compose versionsystemctl status docker --no-pagerTriển khai AIO và data directory
Mục có tiêu đề “Triển khai AIO và data directory”Thư mục AIO
Mục có tiêu đề “Thư mục AIO”Lưu file cấu hình triển khai trong thư mục riêng để thuận tiện kiểm tra và backup:
mkdir -p /root/nextcloud-aiocd /root/nextcloud-aioDocker Compose
Mục có tiêu đề “Docker Compose”Tạo file cấu hình tại /root/nextcloud-aio/compose.yaml:
services: nextcloud-aio-mastercontainer: image: ghcr.io/nextcloud-releases/all-in-one:<AIO_IMAGE_TAG> container_name: nextcloud-aio-mastercontainer restart: unless-stopped ports: - "8080:8080" volumes: - nextcloud_aio_mastercontainer:/mnt/docker-aio-config - /var/run/docker.sock:/var/run/docker.sock:ro environment: APACHE_PORT: 11000 APACHE_IP_BINDING: 0.0.0.0 SKIP_DOMAIN_VALIDATION: true
volumes: nextcloud_aio_mastercontainer:APACHE_PORT là port backend nội bộ dành cho reverse proxy. Không mở port này trực tiếp ra Internet. Chỉ bật SKIP_DOMAIN_VALIDATION khi cơ chế xác minh tên miền mặc định không phù hợp với mô hình triển khai; cần kiểm tra lại HTTPS và định tuyến theo các bước bên dưới.
Dữ liệu
Mục có tiêu đề “Dữ liệu”Nếu cần dùng thư mục dữ liệu riêng trên host, chuẩn bị đường dẫn trước khi khởi động AIO:
mkdir -p /srv/nextcloud-datachown root:root /srv/nextcloud-datachmod 750 /srv/nextcloud-dataCác lệnh trên chỉ tạo thư mục, chưa cấu hình AIO sử dụng thư mục đó. Ví dụ Compose ở trên vẫn dùng vị trí dữ liệu mặc định. Để dùng đường dẫn riêng, cần khai báo biến NEXTCLOUD_DATADIR cho mastercontainer trước lần cài đặt Nextcloud đầu tiên, theo hướng dẫn datadir chính thức. Không đổi biến này tùy ý sau khi đã cài đặt Nextcloud.
Không tự ý đổi quyền hoặc xóa volume khi chưa xác định rõ thư mục dữ liệu và phương án restore.
Khởi động
Mục có tiêu đề “Khởi động”cd /root/nextcloud-aiodocker compose up -ddocker psMở giao diện quản trị AIO từ mạng quản trị:
https://<nextcloud-backend-ip>:8080Trong giao diện AIO:
- Lưu mật khẩu quản trị AIO trong password manager.
- Nhập tên miền đã được DNS trỏ về reverse proxy.
- Chọn các thành phần cần thiết theo cấu hình thực tế.
- Xác nhận thư mục dữ liệu trước khi hoàn tất cài đặt.
- Chờ các container chuyển sang trạng thái healthy/running.
Không đưa mật khẩu quản trị AIO hoặc Borg passphrase vào Git, file Compose, ảnh chụp màn hình hay log CI/CD.
Reverse proxy và kết nối
Mục có tiêu đề “Reverse proxy và kết nối”Nginx Reverse Proxy
Mục có tiêu đề “Nginx Reverse Proxy”Ví dụ server block rút gọn cho luồng HTTPS đến backend Apache:
server { listen 443 ssl http2; server_name <nextcloud-domain>;
ssl_certificate /path/to/fullchain.pem; ssl_certificate_key /path/to/privkey.pem;
client_max_body_size 10G;
location / { proxy_pass http://<nextcloud-backend-ip>:11000; proxy_http_version 1.1;
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https; proxy_set_header X-Forwarded-Host $host;
proxy_read_timeout 3600; proxy_send_timeout 3600; proxy_buffering off; }
location /.well-known/carddav { return 301 /remote.php/dav; }
location /.well-known/caldav { return 301 /remote.php/dav; }}Kiểm tra cấu hình trước khi reload:
nginx -tsystemctl reload nginxVí dụ này chưa có phần chuyển tiếp WebSocket Upgrade. Khi dùng chức năng cần WebSocket, phải bổ sung xử lý các header Upgrade và Connection theo cấu hình Nginx chính thức của Nextcloud AIO. Kiểm tra riêng kết nối WebSocket, notify_push và timeout trước khi đưa vào sử dụng.
Trusted Proxies
Mục có tiêu đề “Trusted Proxies”Trong Nextcloud, khai báo địa chỉ hoặc subnet của reverse proxy trong danh sách trusted_proxies. Lấy giá trị thực tế từ hồ sơ hạ tầng, ví dụ:
docker exec --user www-data nextcloud-aio-nextcloud php occ config:system:set trusted_proxies 0 --value=<reverse-proxy-vip>docker exec --user www-data nextcloud-aio-nextcloud php occ config:system:set trusted_proxies 1 --value=<reverse-proxy-node-01>docker exec --user www-data nextcloud-aio-nextcloud php occ config:system:set trusted_proxies 2 --value=<reverse-proxy-node-02>Không khai báo toàn bộ Internet hoặc một subnet quá rộng làm trusted proxy. Điều đó có thể làm sai lệch địa chỉ IP client và tạo rủi ro bảo mật.
Kiểm tra
Mục có tiêu đề “Kiểm tra”docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'
docker exec --user www-data nextcloud-aio-nextcloud php occ statusdocker exec --user www-data nextcloud-aio-nextcloud php occ config:list systemKiểm tra từ client:
curl -I https://<nextcloud-domain>/Kết quả mong đợi: kết nối HTTPS hợp lệ, không có redirect loop và giao diện đăng nhập tải được qua tên miền đã cấu hình.
Ứng dụng và tác vụ nền
Mục có tiêu đề “Ứng dụng và tác vụ nền”notify_push
Mục có tiêu đề “notify_push”Chỉ bật thành phần này sau khi Files và các luồng HTTPS cơ bản đã ổn định:
- Bật container
notify_push(High Performance Backend for Nextcloud Files) trong AIO. - Kiểm tra container tương ứng ở trạng thái running/healthy.
- Kiểm tra cấu hình notify_push bằng lệnh occ.
- Đăng nhập bằng user thử nghiệm và kiểm tra khả năng nhận cập nhật theo thời gian thực.
Ví dụ kiểm tra:
docker exec --user www-data nextcloud-aio-nextcloud php occ app:list | grep notify_pushdocker exec --user www-data nextcloud-aio-nextcloud php occ notify_push:self-testNếu self-test thất bại, kiểm tra DNS, certificate, header proxy, WebSocket và firewall trước khi thay đổi ứng dụng.
Nextcloud nên chạy các tác vụ nền bằng cron thay vì chỉ dựa vào AJAX:
docker exec --user www-data nextcloud-aio-nextcloud php occ background:cronSau khi cấu hình cron theo cơ chế vận hành của server, kiểm tra trạng thái tác vụ nền trong giao diện quản trị hoặc bằng lệnh occ.
Upload / Download
Mục có tiêu đề “Upload / Download”Thực hiện bằng một user thử nghiệm:
- Upload file nhỏ.
- Download file đó và đối chiếu checksum.
- Upload file lớn hơn giới hạn mặc định để kiểm tra
client_max_body_size. - Đổi tên, di chuyển và xóa file thử nghiệm.
- Kiểm tra log của Nginx và Nextcloud nếu có lỗi.
Không dùng dữ liệu thật trong bài kiểm tra ban đầu.
Server-side Encryption
Mục có tiêu đề “Server-side Encryption”SSE chỉ nên bật sau khi đã thống nhất mô hình quản lý khóa, backup và restore.
docker exec --user www-data nextcloud-aio-nextcloud php occ app:enable encryptiondocker exec --user www-data nextcloud-aio-nextcloud php occ encryption:statusLưu ý vận hành:
- Phải có quy trình bảo vệ khóa mã hóa.
- Phải kiểm tra restore trên môi trường an toàn.
- Backup phải có đủ khóa mã hóa cần thiết để restore dữ liệu.
- Một số luồng ZIP/UNZIP có thể làm thay đổi cách dữ liệu được xử lý; cần kiểm thử riêng trước khi dùng trong môi trường thật.
Optional Components
Mục có tiêu đề “Optional Components”ClamAV
Mục có tiêu đề “ClamAV”Chỉ bật ClamAV khi đã dự trù đủ RAM/CPU và có yêu cầu quét mã độc. Sau khi bật, upload file thử nghiệm và theo dõi thời gian xử lý.
Nextcloud Office / Collabora
Mục có tiêu đề “Nextcloud Office / Collabora”Chỉ bật Office khi cần chỉnh sửa tài liệu trên web. Kiểm tra thêm:
- Tên miền hoặc endpoint của Office.
- TLS và WebSocket qua reverse proxy.
- Giới hạn tài nguyên của container.
- Mở và chỉnh sửa file thử nghiệm.
- Tình huống container Office dừng hoặc khởi động lại.
Backup và bàn giao vận hành
Mục có tiêu đề “Backup và bàn giao vận hành”Backup Storage
Mục có tiêu đề “Backup Storage”Ví dụ mount NFS vào server Nextcloud:
mkdir -p /mnt/nextcloud-backupmount -t nfs <backup-server-ip>:/export/nextcloud /mnt/nextcloud-backupdf -h /mnt/nextcloud-backupSau khi kiểm tra quyền truy cập, yêu cầu kết nối mạng và hành vi khi server backup tạm thời không khả dụng, khai báo mount trong /etc/fstab để tự động mount khi khởi động.
BorgBackup
Mục có tiêu đề “BorgBackup”Khởi tạo repository Borg ở vị trí backup đã được phê duyệt. Lưu Borg passphrase trong password manager hoặc secret store riêng, không lưu trong repository Git.
Khai báo biến môi trường cho repository đang vận hành:
export BORG_REPO=/mnt/nextcloud-backup/borg-repositoryexport BORG_PASSPHRASE='<borg-passphrase>'Quy trình backup tối thiểu:
- Xác nhận mount backup đang hoạt động.
- Xác nhận còn đủ dung lượng.
- Ghi lại metadata cần thiết của Nextcloud.
- Chạy backup theo lịch đã phê duyệt.
- Kiểm tra backup mới nhất.
- Kiểm tra cảnh báo backup và khả năng truy cập dữ liệu trong bản backup. Thực hiện restore theo runbook riêng.
Kiểm tra repository:
borg list "$BORG_REPO"borg info "$BORG_REPO"borg check "$BORG_REPO"Retention policy cần đáp ứng yêu cầu RPO/RTO trong giới hạn dung lượng hiện có. Ví dụ:
Giữ 7 bản gần nhấtGiữ 4 bản theo tuầnGiữ 6 bản theo thángCác con số trên chỉ là mẫu; cần điều chỉnh theo yêu cầu thực tế và kiểm tra khả năng restore định kỳ.
Lệnh kiểm tra nhanh
Mục có tiêu đề “Lệnh kiểm tra nhanh”docker psdocker compose -f /root/nextcloud-aio/compose.yaml psdocker logs --tail 100 nextcloud-aio-mastercontainerdocker exec --user www-data nextcloud-aio-nextcloud php occ statusdf -hfree -hOff-host Secrets
Mục có tiêu đề “Off-host Secrets”Lưu các thông tin sau trong password manager hoặc secret store phù hợp:
- Mật khẩu quản trị AIO.
- Borg passphrase.
- Thông tin DNS và gia hạn certificate.
- Hồ sơ backend, reverse proxy và server backup.
- Thông tin mount NFS.
- Quy trình restore và người chịu trách nhiệm.