Bạn đang tìm kiếm một giải pháp lưu trữ đám mây riêng (self-hosted) tốc độ cao, bảo mật tuyệt đối để thay thế Google Drive hay Dropbox? Seafile Server chính là câu trả lời hoàn hảo. Nổi tiếng với lõi được viết bằng C, Seafile mang lại hiệu suất đồng bộ dữ liệu vượt trội và cực kỳ nhẹ nhàng.
Từ phiên bản 13.0, Seafile Community Edition đã chuyển sang mô hình triển khai hoàn toàn bằng Docker, giúp quá trình cài đặt trở nên đơn giản và gọn gàng hơn bao giờ hết. Bài viết này sẽ hướng dẫn bạn từng bước cài đặt Seafile Server trên Ubuntu 24.04 hoặc 22.04 bằng Docker.
1. Chuẩn Bị Trước Khi Cài Đặt (Prerequisites)
Để đảm bảo quá trình cài đặt diễn ra suôn sẻ, máy chủ (VPS/Server) của bạn cần đáp ứng các tiêu chí sau:
- Hệ điều hành: Ubuntu 24.04 LTS hoặc Ubuntu 22.04 LTS.
- Phần mềm cốt lõi: Đã cài đặt sẵn Docker Engine và plugin Docker Compose.
- Tên miền (Domain): Đã trỏ bản ghi A (A Record) về địa chỉ IP của máy chủ (Ví dụ:
cloud.tenmien.com). - Tường lửa (Firewall): Đã mở cổng
80(HTTP) và443(HTTPS). - Phần cứng tối thiểu: 2GB RAM và 20GB dung lượng ổ cứng (khuyến nghị dung lượng cao hơn tùy thuộc vào nhu cầu lưu trữ tệp của bạn).
- Docker: Đã cài đặt Docker Engine và plugin Docker Compose.
Hướng Dẫn Cài Đặt Docker Engine và Plugin Docker Compose Chi Tiết Nhất: Tại Đây
2. Kiến Trúc Của Hệ Thống Seafile Docker
Với việc sử dụng Docker Compose, chúng ta sẽ triển khai một cụm gồm 5 container (dịch vụ) hoạt động song song để tạo nên một hệ thống Seafile hoàn chỉnh:
- Seafile Server: Máy chủ ứng dụng lõi xử lý logic và giao diện web.
- MariaDB (seafile-mysql): Cơ sở dữ liệu lưu trữ thông tin cấu hình và người dùng.
- Redis (seafile-redis): Hệ thống bộ nhớ đệm (Cache) giúp tăng tốc độ phản hồi.
- Caddy (seafile-caddy): Máy chủ Reverse Proxy kiêm nhiệm vụ tự động xin và gia hạn chứng chỉ bảo mật SSL (Let’s Encrypt).
- SeaDoc: Tích hợp trình soạn thảo tài liệu cộng tác trực tuyến.
3. Những gì được triển khai
Hệ thống Docker Compose chạy năm container:
| Container | Image | Mục đích |
|---|---|---|
| seafile | seafileltd/seafile-mc:13.0-latest | Máy chủ Seafile (bao gồm Nginx nội bộ) |
| seafile-mysql | mariadb:10.11 | Hệ thống cơ sở dữ liệu |
| seafile-redis | redis | Bộ nhớ đệm (thay thế memcached trong phiên bản v13) |
| seafile-caddy | lucaslorentz/caddy-docker-proxy:2.12-alpine | Máy chủ proxy ngược với chứng chỉ SSL Let’s Encrypt tự động. |
| seadoc | seafileltd/sdoc-server:2.0-latest | Trình soạn thảo tài liệu cộng tác (SeaDoc 2.0) |
Caddy tự động xử lý SSL. Khi bạn thiết lập giao thức là https, Caddy sẽ tự động lấy và gia hạn chứng chỉ Let’s Encrypt mà không cần cấu hình thêm. Không cần certbot, không cần quản lý chứng chỉ thủ công.
4. Các Bước Cài Đặt Seafile Server Bằng Docker
Bước 1: Khởi tạo thư mục và tạo khóa bảo mật
Đầu tiên, hãy tạo một thư mục chuyên dụng để chứa toàn bộ cấu hình và dữ liệu của Seafile:
sudo mkdir -p /opt/seafile && cd /opt/seafile
Tiếp theo, tạo một chuỗi khóa bí mật (JWT Secret) dùng để xác thực nội bộ giữa các container. Lưu ý: Hãy copy và cất giữ chuỗi mã này:
openssl rand -hex 20
Bước 2: Cấu hình biến môi trường (File .env)
Tạo một file .env tại thư mục /opt/seafile để khai báo các thông số quan trọng nhất:
vi /opt/seafile/.envTrong file này, bạn cần đặc biệt chú ý thiết lập 3 thông số sau:
SEAFILE_SERVER_HOSTNAME: Điền tên miền của bạn (vd:cloud.phongdinh.info.vn).JWT_PRIVATE_KEY: Dán chuỗi mã 20 ký tự bạn vừa tạo ở Bước 1.- Mật khẩu: Thiết lập mật khẩu bảo mật cho Database (
MYSQL_ROOT_PASSWORD) và tài khoản Quản trị viên Seafile (SEAFILE_ADMIN_PASSWORD).
COMPOSE_FILE=seafile-server.yml,caddy.yml,seadoc.yml
COMPOSE_PATH_SEPARATOR=,
SEAFILE_IMAGE=seafileltd/seafile-mc:13.0-latest
SEAFILE_DB_IMAGE=mariadb:10.11
SEAFILE_REDIS_IMAGE=redis
SEAFILE_CADDY_IMAGE=lucaslorentz/caddy-docker-proxy:2.12-alpine
SEADOC_IMAGE=seafileltd/sdoc-server:2.0-latest
SEAFILE_VOLUME=/opt/seafile-data
SEAFILE_MYSQL_VOLUME=/opt/seafile-mysql/db
SEAFILE_CADDY_VOLUME=/opt/seafile-caddy
SEADOC_VOLUME=/opt/seadoc-data
SEAFILE_SERVER_HOSTNAME=seafile.example.com
SEAFILE_SERVER_PROTOCOL=https
TIME_ZONE=Etc/UTC
JWT_PRIVATE_KEY=your_generated_jwt_key_here
SEAFILE_MYSQL_DB_HOST=db
SEAFILE_MYSQL_DB_USER=seafile
SEAFILE_MYSQL_DB_PASSWORD=change_this_db_password
SEAFILE_MYSQL_DB_CCNET_DB_NAME=ccnet_db
SEAFILE_MYSQL_DB_SEAFILE_DB_NAME=seafile_db
SEAFILE_MYSQL_DB_SEAHUB_DB_NAME=seahub_db
CACHE_PROVIDER=redis
REDIS_HOST=redis
REDIS_PORT=6379
INIT_SEAFILE_MYSQL_ROOT_PASSWORD=change_this_root_password
[email protected]
INIT_SEAFILE_ADMIN_PASSWORD=change_this_admin_password
ENABLE_SEADOC=true
Bước 3: Tạo các file Docker Compose (YAML)
Để dễ quản lý, cấu trúc chuẩn sẽ chia thành 3 file YAML riêng biệt. Bạn tạo lần lượt các file sau bằng trình soạn thảo (như nano hoặc vim) và dán cấu hình mẫu từ tài liệu của Seafile vào:
cd /opt/seafileseafile-server.yml: Cấu hình cho App, Database và Redis.
vi seafile-server.ymlservices:
db:
image: ${SEAFILE_DB_IMAGE:-mariadb:10.11}
container_name: seafile-mysql
restart: unless-stopped
environment:
- MYSQL_ROOT_PASSWORD=${INIT_SEAFILE_MYSQL_ROOT_PASSWORD:-}
- MYSQL_LOG_CONSOLE=true
- MARIADB_AUTO_UPGRADE=1
volumes:
- "${SEAFILE_MYSQL_VOLUME}:/var/lib/mysql"
networks:
- seafile-net
healthcheck:
test: ["CMD", "/usr/local/bin/healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 20s
start_period: 30s
retries: 10
redis:
image: ${SEAFILE_REDIS_IMAGE:-redis}
container_name: seafile-redis
restart: unless-stopped
networks:
- seafile-net
seafile:
image: ${SEAFILE_IMAGE:-seafileltd/seafile-mc:13.0-latest}
container_name: seafile
restart: unless-stopped
volumes:
- ${SEAFILE_VOLUME}:/shared
environment:
- SEAFILE_MYSQL_DB_HOST=${SEAFILE_MYSQL_DB_HOST:-db}
- SEAFILE_MYSQL_DB_USER=${SEAFILE_MYSQL_DB_USER:-seafile}
- SEAFILE_MYSQL_DB_PASSWORD=${SEAFILE_MYSQL_DB_PASSWORD}
- INIT_SEAFILE_MYSQL_ROOT_PASSWORD=${INIT_SEAFILE_MYSQL_ROOT_PASSWORD:-}
- SEAFILE_MYSQL_DB_CCNET_DB_NAME=${SEAFILE_MYSQL_DB_CCNET_DB_NAME:-ccnet_db}
- SEAFILE_MYSQL_DB_SEAFILE_DB_NAME=${SEAFILE_MYSQL_DB_SEAFILE_DB_NAME:-seafile_db}
- SEAFILE_MYSQL_DB_SEAHUB_DB_NAME=${SEAFILE_MYSQL_DB_SEAHUB_DB_NAME:-seahub_db}
- TIME_ZONE=${TIME_ZONE:-Etc/UTC}
- INIT_SEAFILE_ADMIN_EMAIL=${INIT_SEAFILE_ADMIN_EMAIL:[email protected]}
- INIT_SEAFILE_ADMIN_PASSWORD=${INIT_SEAFILE_ADMIN_PASSWORD:-asecret}
- SEAFILE_SERVER_HOSTNAME=${SEAFILE_SERVER_HOSTNAME}
- SEAFILE_SERVER_PROTOCOL=${SEAFILE_SERVER_PROTOCOL:-http}
- JWT_PRIVATE_KEY=${JWT_PRIVATE_KEY}
- ENABLE_SEADOC=${ENABLE_SEADOC:-false}
- SEADOC_SERVER_URL=${SEAFILE_SERVER_PROTOCOL}://${SEAFILE_SERVER_HOSTNAME}/sdoc-server
- CACHE_PROVIDER=${CACHE_PROVIDER:-redis}
- REDIS_HOST=${REDIS_HOST:-redis}
- REDIS_PORT=${REDIS_PORT:-6379}
labels:
caddy: ${SEAFILE_SERVER_PROTOCOL}://${SEAFILE_SERVER_HOSTNAME}
caddy.reverse_proxy: "{{upstreams 80}}"
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:80 || exit 1"]
interval: 30s
timeout: 10s
retries: 3
start_period: 30s
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
networks:
- seafile-net
networks:
seafile-net:
name: seafile-net
caddy.yml: Cấu hình cho máy chủ Caddy (SSL).
vi caddy.ymlservices:
caddy:
image: ${SEAFILE_CADDY_IMAGE:-lucaslorentz/caddy-docker-proxy:2.12-alpine}
restart: unless-stopped
container_name: seafile-caddy
ports:
- 80:80
- 443:443
environment:
- CADDY_INGRESS_NETWORKS=seafile-net
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ${SEAFILE_CADDY_VOLUME}:/data/caddy
networks:
- seafile-net
networks:
seafile-net:
name: seafile-net
seadoc.yml: Cấu hình cho công cụ soạn thảo SeaDoc.
vi seadoc.ymlservices:
seadoc:
image: ${SEADOC_IMAGE:-seafileltd/sdoc-server:2.0-latest}
container_name: seadoc
restart: unless-stopped
volumes:
- ${SEADOC_VOLUME}:/shared
environment:
- DB_HOST=${SEAFILE_MYSQL_DB_HOST:-db}
- DB_USER=${SEAFILE_MYSQL_DB_USER:-seafile}
- DB_PASSWORD=${SEAFILE_MYSQL_DB_PASSWORD}
- DB_NAME=${SEAFILE_MYSQL_DB_SEAHUB_DB_NAME:-seahub_db}
- TIME_ZONE=${TIME_ZONE:-Etc/UTC}
- JWT_PRIVATE_KEY=${JWT_PRIVATE_KEY}
- SEAHUB_SERVICE_URL=http://seafile
labels:
caddy: ${SEAFILE_SERVER_PROTOCOL}://${SEAFILE_SERVER_HOSTNAME}
caddy.1_handle_path: "/socket.io/*"
caddy.1_handle_path.0_rewrite: "* /socket.io{uri}"
caddy.1_handle_path.1_reverse_proxy: "{{upstreams 80}}"
caddy.2_handle_path: "/sdoc-server/*"
caddy.2_handle_path.0_rewrite: "* {uri}"
caddy.2_handle_path.1_reverse_proxy: "{{upstreams 80}}"
depends_on:
db:
condition: service_healthy
networks:
- seafile-net
networks:
seafile-net:
name: seafile-net
Bước 4: Khởi chạy hệ thống
Khi các file cấu hình đã sẵn sàng trong thư mục /opt/seafile, hãy chạy lệnh sau để kéo (pull) image và khởi động các container:
cd /opt/seafile
docker compose up -dLưu ý: Lần khởi động đầu tiên sẽ mất khoảng 1-3 phút để MariaDB tiến hành khởi tạo cơ sở dữ liệu.


Bạn có thể kiểm tra trạng thái hoạt động của các container bằng lệnh:
docker compose ps
Bước 5: Truy cập và sử dụng
Mở trình duyệt web và truy cập vào tên miền của bạn (ví dụ: https://cloud.phongdinh.info.vn). Nếu Caddy hoạt động đúng, trang web của bạn đã tự động có biểu tượng ổ khóa an toàn (SSL).

Đăng nhập bằng Email và Mật khẩu của tài khoản Admin mà bạn đã khai báo trong file .env. Bây giờ bạn đã có thể tạo các Library (Thư viện) và bắt đầu đồng bộ dữ liệu!


4. Quản Lý Hệ Thống Và Khắc Phục Lỗi (Troubleshooting)
Bạn nên nắm vững các lệnh cơ bản sau để bảo trì Server:
- Xem nhật ký (Log) để bắt lỗi:
docker compose logs -f --tail 50- Khởi động lại toàn bộ Seafile:
docker compose restart- Cập nhật lên phiên bản mới: Rất đơn giản, bạn chỉ cần đổi tag phiên bản trong file
.env, sau đó chạy:
docker compose pull
docker compose up -dMột số lỗi thường gặp:
- Lỗi SSL (Không có HTTPS): Kiểm tra lại xem bản ghi DNS đã trỏ đúng IP chưa và tường lửa có đang chặn cổng 80/443 không. Xem log của Caddy:
docker logs seafile-caddy 2>&1 | grep -i "error". - Seafile bị kẹt ở vòng lặp khởi động (Restart loop): Thường do khai báo sai mật khẩu Database trong file
.envhoặc thiếu biếnJWT_PRIVATE_KEY.
Tổng kết
Việc tự lưu trữ dữ liệu với Seafile Server bằng Docker trên Ubuntu không chỉ giúp bạn làm chủ 100% dữ liệu cá nhân/doanh nghiệp mà còn tiết kiệm được chi phí lớn so với các dịch vụ Cloud thương mại. Kiến trúc Docker giúp hệ thống hoạt động ổn định, dễ dàng nâng cấp và sao lưu trong tương lai.
