คำตอบสั้น ๆ: สร้างระบบเก็บไฟล์และแชร์งานขององค์กรบนเซิร์ฟเวอร์ของตัวเอง ข้อมูลอยู่ในประเทศไทย พร้อม SSL และการสำรองข้อมูล
คู่มือนี้อธิบาย Docker Compose ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
Nextcloud คือระบบเก็บและแชร์ไฟล์แบบเดียวกับบริการคลาวด์ทั่วไป แต่ทำงานบนเซิร์ฟเวอร์ของคุณเอง องค์กรที่มีข้อกำหนดว่าข้อมูลต้องอยู่ในประเทศ หรือไม่ต้องการจ่ายค่าบริการรายผู้ใช้ต่อเดือน จะได้ประโยชน์ชัดเจนที่สุด
คู่มือนี้ติดตั้งด้วย Docker Compose พร้อมฐานข้อมูล MariaDB และ Redis สำหรับแคช ซึ่งเป็นชุดที่รองรับผู้ใช้จำนวนมากได้ดีกว่าการติดตั้งแบบพื้นฐาน
สิ่งที่ต้องเตรียม
- Cloud VPS ที่มี RAM อย่างน้อย 4 GB และพื้นที่ตามปริมาณไฟล์ที่ต้องเก็บ
- โดเมนที่ชี้มาที่ IP ของเซิร์ฟเวอร์แล้ว
- Docker และ Docker Compose ติดตั้งเรียบร้อย
docker --version
docker compose version
ขั้นตอนที่ 1: เตรียมโครงสร้างโฟลเดอร์
sudo mkdir -p /opt/nextcloud/{html,data,db,redis}
cd /opt/nextcloud
sudo nano .env
MYSQL_ROOT_PASSWORD=รหัสผ่านที่ยาวและสุ่ม
MYSQL_PASSWORD=รหัสผ่านอีกตัวที่ต่างกัน
MYSQL_DATABASE=nextcloud
MYSQL_USER=nextcloud
NEXTCLOUD_ADMIN_USER=admin
NEXTCLOUD_ADMIN_PASSWORD=รหัสผ่านผู้ดูแล
NEXTCLOUD_TRUSTED_DOMAINS=cloud.example.com
REDIS_PASSWORD=รหัสผ่านของ Redis
sudo chmod 600 .env
ขั้นตอนที่ 2: เขียนไฟล์ Compose
sudo nano docker-compose.yml
services:
db:
image: mariadb:11
restart: unless-stopped
command: --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROW
volumes:
- ./db:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 10s
retries: 5
redis:
image: redis:7-alpine
restart: unless-stopped
command: redis-server --requirepass ${REDIS_PASSWORD}
volumes:
- ./redis:/data
app:
image: nextcloud:29-apache
restart: unless-stopped
depends_on:
db:
condition: service_healthy
ports:
- "127.0.0.1:8080:80"
volumes:
- ./html:/var/www/html
- ./data:/var/www/html/data
environment:
MYSQL_HOST: db
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
REDIS_HOST: redis
REDIS_HOST_PASSWORD: ${REDIS_PASSWORD}
NEXTCLOUD_ADMIN_USER: ${NEXTCLOUD_ADMIN_USER}
NEXTCLOUD_ADMIN_PASSWORD: ${NEXTCLOUD_ADMIN_PASSWORD}
NEXTCLOUD_TRUSTED_DOMAINS: ${NEXTCLOUD_TRUSTED_DOMAINS}
OVERWRITEPROTOCOL: https
cron:
image: nextcloud:29-apache
restart: unless-stopped
volumes:
- ./html:/var/www/html
- ./data:/var/www/html/data
entrypoint: /cron.sh
depends_on:
- db
- redis
สังเกตว่าพอร์ตผูกกับ 127.0.0.1 เท่านั้น ทำให้เข้าจากอินเทอร์เน็ตโดยตรงไม่ได้ ต้องผ่าน Nginx ที่จะตั้งในขั้นตอนถัดไป ซึ่งปลอดภัยกว่าการเปิดพอร์ตออกไปตรง ๆ
คอนเทนเนอร์ cron จำเป็น Nextcloud มีงานเบื้องหลังที่ต้องทำเป็นระยะ เช่น การจัดทำดัชนีไฟล์และการส่งการแจ้งเตือน หากขาดตัวนี้ระบบจะค่อย ๆ มีปัญหาสะสม
ขั้นตอนที่ 3: เริ่มระบบ
sudo docker compose up -d
sudo docker compose ps
sudo docker compose logs -f app
รอจนเห็นข้อความว่าติดตั้งเสร็จ ครั้งแรกใช้เวลาหลายนาที
ขั้นตอนที่ 4: ตั้ง Nginx และ SSL
sudo apt install -y nginx certbot python3-certbot-nginx
sudo nano /etc/nginx/sites-available/nextcloud
server {
listen 80;
server_name cloud.example.com;
# ไฟล์ขนาดใหญ่ ปรับตามที่ต้องการให้อัปโหลดได้
client_max_body_size 10G;
client_body_timeout 300s;
location / {
proxy_pass http://127.0.0.1:8080;
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 $scheme;
proxy_buffering off;
proxy_request_buffering off;
proxy_read_timeout 300s;
}
# เส้นทางที่ไคลเอนต์เดสก์ท็อปและมือถือต้องใช้
location /.well-known/carddav { return 301 $scheme://$host/remote.php/dav; }
location /.well-known/caldav { return 301 $scheme://$host/remote.php/dav; }
}
sudo ln -s /etc/nginx/sites-available/nextcloud /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d cloud.example.com --agree-tos -m [email protected] --redirect