ลดความยุ่งยากในการใช้คลาวด์ พูดคุยกับเจ้าหน้าที่

ติดตั้ง Nextcloud ด้วย Docker Compose บน Cloud VPS
Home ติดตั้ง Nextcloud ด้วย Docker Compose บน Cloud VPS

ติดตั้ง Nextcloud ด้วย Docker Compose บน Cloud VPS

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

ขั้นตอนที่ 5: ปรับแต่งหลังติดตั้ง

# เข้าไปรันคำสั่งของ Nextcloud
sudo docker compose exec -u www-data app php occ status
sudo docker compose exec -u www-data app php occ config:system:set overwrite.cli.url --value="https://cloud.example.com"
sudo docker compose exec -u www-data app php occ config:system:set default_phone_region --value="TH"

# เพิ่ม Index ที่ระบบแนะนำ ทำให้เร็วขึ้นชัดเจน
sudo docker compose exec -u www-data app php occ db:add-missing-indices
sudo docker compose exec -u www-data app php occ db:convert-filecache-bigint

ตรวจคำเตือนในหน้าผู้ดูแลที่เมนู Administration settings แล้ว Overview ระบบจะบอกสิ่งที่ควรแก้ทั้งหมด

ขั้นตอนที่ 6: ตั้งการสำรองข้อมูล

sudo nano /usr/local/bin/nextcloud-backup.sh
#!/bin/bash
set -euo pipefail
cd /opt/nextcloud
source .env

DEST=/var/backups/nextcloud
STAMP=$(date +%F-%H%M)
mkdir -p "$DEST"

# เข้าโหมดบำรุงรักษาเพื่อให้ข้อมูลคงที่ระหว่างสำรอง
docker compose exec -T -u www-data app php occ maintenance:mode --on

docker compose exec -T db mysqldump --single-transaction \
  -u root -p"$MYSQL_ROOT_PASSWORD" "$MYSQL_DATABASE" | gzip > "$DEST/db-$STAMP.sql.gz"

tar czf "$DEST/config-$STAMP.tar.gz" ./html/config ./html/themes 2>/dev/null || true

docker compose exec -T -u www-data app php occ maintenance:mode --off

# ไฟล์ผู้ใช้ สำรองแยกด้วย restic เพราะมีขนาดใหญ่และเปลี่ยนทีละน้อย
restic backup /opt/nextcloud/data --tag nextcloud

find "$DEST" -name '*.gz' -mtime +14 -delete
echo "nextcloud backup ok: $STAMP"
sudo chmod +x /usr/local/bin/nextcloud-backup.sh

โหมดบำรุงรักษาสำคัญมาก การสำรองฐานข้อมูลกับไฟล์คนละจังหวะโดยไม่หยุดระบบ จะได้ข้อมูลที่ไม่สอดคล้องกันและกู้คืนแล้วไฟล์หาย

ขั้นตอนที่ 7: อัปเกรด

cd /opt/nextcloud
sudo /usr/local/bin/nextcloud-backup.sh

sudo docker compose pull
sudo docker compose up -d
sudo docker compose exec -u www-data app php occ upgrade
sudo docker compose exec -u www-data app php occ maintenance:mode --off

ข้ามเวอร์ชันหลักไม่ได้ ต้องอัปเกรดทีละรุ่นเสมอ เช่น จาก 27 ไป 28 แล้วจึงไป 29

ปัญหาที่พบบ่อย

ขึ้นว่า Access through untrusted domain

โดเมนที่ใช้ไม่ได้อยู่ในรายการที่เชื่อถือ เพิ่มด้วย

sudo docker compose exec -u www-data app php occ config:system:set trusted_domains 1 --value="cloud.example.com"

อัปโหลดไฟล์ใหญ่ไม่ได้

ตรวจสามชั้น client_max_body_size ใน Nginx ค่า upload_max_filesize และ post_max_size ของ PHP ในคอนเทนเนอร์ และพื้นที่ดิสก์ที่เหลือ

หน้าเว็บช้ามาก

ตรวจว่า Redis ทำงานและถูกใช้จริงด้วย occ config:list system | grep -A5 memcache และตรวจว่าคอนเทนเนอร์ cron ทำงานอยู่

ไคลเอนต์เดสก์ท็อปซิงก์ไม่ได้

มักเป็นเรื่อง header ที่ Proxy ส่งไม่ครบ ตรวจว่ามี X-Forwarded-Proto และตั้ง OVERWRITEPROTOCOL: https แล้ว

ต้องการ Cloud VPS ที่ติดตั้งแอปให้พร้อมใช้งาน ดูบริการ Cloud VPS App Plus ได้ที่ https://thaidata.cloud/contact/

ผู้ให้บริการคลาวด์ไทย
เพื่อธุรกิจของคนไทย

"มุ่งมั่น" และ "มั่นคง"
พร้อมรับมือทุกการเติบโต
Trust Cloud
คลาว์ที่ปลอดภัย
คือรากฐานที่มั่นคง
cloud security