Nextcloud 完整教學 2026:自架私有雲硬碟取代 Google Drive,Docker Compose 安裝、反向代理、Redis 快取、S3 外部儲存到 Nextcloud Assistant 本機 AI 一次學會

Nextcloud 是 GitHub 上超過 36,000 stars 的開源私有雲平台(AGPL-3.0),把檔案同步、日曆、聯絡人、線上 Office、視訊會議、AI 助理全部裝進你自己的一台機器,2026 年 9 月發布的最新版是 Nextcloud Hub 26 Summer(v35)。本文從零開始完整教學:Nextcloud 到底解決什麼問題、五種部署方式比較表(AIO/社群 Docker 映像/Snap/手動/企業版)、可直接複製的 docker-compose.yml(MariaDB + Redis + Apache)、trusted_domains 與反向代理設定、PHP 上傳上限與 APACHE_BODY_LIMIT 調整、occ 指令速查、Nextcloud Assistant 本機 AI 與 Ollama 串接、S3 相容物件儲存當主儲存、備份與跨版本升級鐵則,以及與 Google Drive、Dropbox、Immich 的定位對照。

  • Dennis
  • 13 分鐘閱讀
Nextcloud 完整教學 2026:自架私有雲硬碟取代 Google Drive,Docker Compose 安裝、反向代理、Redis 快取、S3 外部儲存到 Nextcloud Assistant 本機 AI 一次學會

Nextcloud 是開源私有雲平台:在自己機器上架出檔案同步、日曆、Office 與 AI 助理,取代 Google Drive,資料完全不出你的硬碟。

為什麼要自架 Nextcloud?

如果只用一句話說明 Nextcloud:它是一套「放在你自己機器上的 Google Drive + Google Docs + Google Calendar + Google Meet」,而且是開源、AGPL-3.0 授權。

Nextcloud 專案由 Nextcloud GmbH 主導,伺服器本體在 GitHub 上有超過 36,800 顆星、5,200 個 fork,是自架領域少數同時具備「十年以上成熟度」與「活躍商業支援」的專案。目前最新穩定版是 Nextcloud Hub 26 Summer(伺服器版本 35),於 2026 年 9 月 16 日發布;官方同時維護 34、33、32 三個仍受支援的版本線。

自架的三個實際理由:

理由說明
容量成本雲端硬碟的空間費用是月租制、長期累積;自架只需付你手上硬碟的錢,2TB 的 NVMe 買斷可能不到一年雲端訂閱費
資料主權檔案、通訊錄、行事曆、聊天紀錄全部留在自己的機器;對於需要合規或單純不想被掃描的使用者,這是唯一解
功能可組合同一套系統可以接上本機 LLM(Ollama)、自己的物件儲存、自己的 SSO,不用被單一廠商的方案綁死

代價也很明確:你要自己維護備份、自己處理升級、自己在半夜修服務。 這篇教學就是把這三件事講清楚。

五種部署方式:先選路線再開工

Nextcloud 官方與社群提供多條安裝路線,選錯會讓你未來兩年的維護成本差好幾倍。

部署方式適合誰優點缺點
AIO(All-in-One)90% 自架新手、單機部署Nextcloud 官方維護、一個 mastercontainer 帶起整個堆疊(含 Office、Talk、AI 元件)、內建備份與更新介面佔用資源較多、需要掛載 Docker socket、客製空間較小
社群 Docker 映像(apache / fpm)想自己掌控每個元件的人輕量、可自由組合資料庫與快取、最容易與既有 Caddy/Traefik 整合DB、Redis、反向代理、憑證要自己處理
手動安裝(tarball)特殊需求、學習用途完全控制、可深度調校升級與 PHP 相依性維護成本最高
Snap 套件Ubuntu 使用者、想五分鐘上線安裝最快、自動更新部分第三方 app 與擴充受限
Nextcloud Enterprise組織、需要認證與 SLA官方支援、企業級合規功能付費

本文主線走 社群 Docker 映像(apache 版),因為它最適合搭配本站既有的自架系列(Proxmox → Docker → Caddy → Cloudflare Tunnel)。如果你只想最快看到登入畫面,直接跳到下面的 AIO 段落。

最快的路:AIO 一行指令

AIO 的做法是啟動一個「mastercontainer」來指揮整個 Nextcloud 堆疊。Linux 主機上(沒有既有 web server)的官方指令是:

sudo docker run \
  --init \
  --sig-proxy=false \
  --name nextcloud-aio-mastercontainer \
  --restart always \
  --publish 80:80 \
  --publish 8080:8080 \
  --publish 8443:8443 \
  --volume nextcloud_aio_mastercontainer:/mnt/docker-aio-config \
  --volume /var/run/docker.sock:/var/run/docker.sock:ro \
  ghcr.io/nextcloud-releases/all-in-one:latest

啟動後開啟 https://<你的主機IP>:8080(自簽憑證,瀏覽器會跳警告),介面會引導你設定網域、管理員帳號與要啟用的元件。

⚠️ 三個 AIO 的硬規則:

  1. 容器名稱不能改nextcloud-aio-mastercontainer),AIO 的自我更新依賴這個名稱。
  2. Snap 版的 Docker 不支援。檢查方式:sudo docker info | grep "Docker Root Dir",若路徑含 /var/snap/docker/ 就必須先遷移到標準 Docker 安裝。
  3. 若前面已經有反向代理(例如 Caddy),可以省略 --publish 80:80,但必須照官方 reverse-proxy 文件設定,否則登入會出現「trusted domain」錯誤。

社群 Docker 映像:完整 docker-compose.yml

以下是最小可用但已具備生產水準的組合:Apache 版 Nextcloud + MariaDB + Redis。Redis 不是可選項——沒有它,Nextcloud 在多使用者情境下的效能會明顯低落。

services:
  db:
    image: mariadb:lts            # 官方建議 MariaDB 11.8 LTS 線
    restart: always
    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
    volumes:
      - db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=請改成強密碼_root
      - MYSQL_PASSWORD=請改成強密碼_db
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud

  redis:
    image: redis:alpine
    restart: always
    command: redis-server --requirepass 請改成強密碼_redis

  app:
    image: nextcloud:stable-apache
    restart: always
    depends_on:
      - redis
      - db
    ports:
      - 127.0.0.1:8080:80        # 只綁本機,對外一律走反向代理
    volumes:
      - nextcloud:/var/www/html
    environment:
      # 資料庫
      - MYSQL_HOST=db
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_PASSWORD=請改成強密碼_db
      # Redis 快取
      - REDIS_HOST=redis
      - REDIS_HOST_PASSWORD=請改成強密碼_redis
      # 首次安裝自動建立管理員(省掉網頁安裝精靈)
      - NEXTCLOUD_ADMIN_USER=admin
      - NEXTCLOUD_ADMIN_PASSWORD=請改成強密碼_admin
      # 網域與反向代理
      - NEXTCLOUD_TRUSTED_DOMAINS=cloud.example.com
      - OVERWRITEPROTOCOL=https
      - TRUSTED_PROXIES=172.16.0.0/12
      # 上傳與記憶體
      - PHP_MEMORY_LIMIT=512M
      - PHP_UPLOAD_LIMIT=10G
      - PHP_OPCACHE_MEMORY_CONSUMPTION=128
      - APACHE_BODY_LIMIT=0      # 0 = 不限制 request body
    # SMTP(選填,但沒有它無法寄出分享通知與密碼重設信)
    #  - SMTP_HOST=smtp.example.com
    #  - SMTP_SECURE=tls
    #  - SMTP_PORT=587
    #  - SMTP_AUTHTYPE=LOGIN
    #  - SMTP_NAME=user@example.com
    #  - SMTP_PASSWORD=請改成SMTP密碼
    #  - MAIL_FROM_ADDRESS=nextcloud
    #  - MAIL_DOMAIN=example.com

volumes:
  nextcloud:
  db:

啟動:

docker compose up -d
docker compose logs -f app      # 等 "Apache ... ready" 之類的訊息

幾個關鍵設定說明:

  • NEXTCLOUD_ADMIN_USER + NEXTCLOUD_ADMIN_PASSWORD:只要同時提供資料庫參數與管理員帳密,映像檔會完全跳過網頁安裝精靈,直接完成安裝。這在自動化部署時非常方便。
  • NEXTCLOUD_TRUSTED_DOMAINS:Nextcloud 只接受清單內的 Host。填錯的話會在瀏覽器看到「Access through untrusted domain」而進不去,這是最常見的第一個坑。
  • TRUSTED_PROXIES:告訴 Nextcloud 哪些來源是可信代理;否則它看到的用戶 IP 全部會變成反向代理的 IP,登入記錄與 rate limit 都會失準。
  • APACHE_BODY_LIMIT=0:Apache 預設擋掉超過 1GiB 的 request body。要傳 4K 影片或大型 ISO,這個一定要調。
  • PHP_UPLOAD_LIMITpost_max_sizeupload_max_filesize 是同一組限制,光改一個沒用。

反向代理設定(Caddy / Cloudflare Tunnel)

Nextcloud 對反向代理很敏感。除了 TRUSTED_PROXIES,建議直接把對外資訊寫死,避免它產生 http:// 的內部連結:

    environment:
      - OVERWRITEHOST=cloud.example.com
      - OVERWRITEPROTOCOL=https
      - OVERWRITECLIURL=https://cloud.example.com

在 Caddy 端只要把 cloud.example.com 反代到 127.0.0.1:8080 即可,Caddy 會自動處理 TLS。若你不打算開防火牆 port,也可以走本站介紹過的 Cloudflare Tunnel 或 Tailscale 路徑。

進階:把資料與設定拆成獨立 volume

上面的 compose 把整個 /var/www/html 掛成一個 volume,備份最簡單。但如果你希望資料檔可以獨立掛在不同硬碟(例如資料放大容量 HDD、程式碼放 SSD),可以拆成多個 mount:

    volumes:
      - nextcloud:/var/www/html
      - ./custom_apps:/var/www/html/custom_apps
      - ./config:/var/www/html/config
      - ./data:/var/www/html/data

⚠️ 這裡有個官方明確警告的地雷:所有掛在 /var/www/html 底下的自訂目錄,必須列進映像檔的 upgrade.exclude,否則每次升級都會被覆蓋或刪除。官方支援的 custom_appsconfigdatathemes 已經在清單內,你自己加的目錄要另外處理。

另外注意:data 目錄是使用者實際檔案,不能放在 web 根目錄以外的奇怪位置後忘記同步 NEXTCLOUD_DATA_DIR。若真的要改,用環境變數 NEXTCLOUD_DATA_DIR 指定。

occ 指令速查:日常維運的核心

Nextcloud 的命令列工具叫 occ。Docker 版本的正確呼叫方式(注意要用 uid 33,不是 root):

# Debian 基底映像
docker compose exec -u33 app ./occ status

# Alpine 基底映像請改用 uid 82
docker compose exec -u82 app ./occ status
用途指令
檢查版本與維護模式./occ status
列出合併後的有效設定(自動隱藏密碼)./occ config:list system
開啟/關閉維護模式./occ maintenance:mode --on / --off
手動觸發升級./occ upgrade
掃描全部檔案(手動放檔案進 data 目錄後必跑)./occ files:scan --all
補齊缺失的資料庫索引(升級後常見提示)./occ db:add-missing-indices
執行修復程序(含耗時項目)./occ maintenance:repair --include-expensive
安裝 app./occ app:install <appname>
把背景工作改為系統 cron./occ background:cron
產生縮圖(大量相片匯入後很有用)./occ preview:generate-all -vvv

若你有手動把檔案丟進 data/ 目錄(例如從舊硬碟搬過來),一定要跑 occ files:scan,否則網頁上看不到;而 occ files:scan 只建立索引,不會刪檔。

設定好 occ background:cron 後,主機 crontab 加一行(每 5 分鐘):

*/5 * * * * docker exec -u33 nextcloud-app php -f /var/www/html/cron.php

容器實際名稱請用 docker ps 確認,通常會是 <專案名>-app-1

接上本機 AI:Nextcloud Assistant

Nextcloud 的 AI 不是「另外裝一個服務」,而是內建在平台裡的 Nextcloud Assistant,並透過一組稱為 ExApp 的外部應用元件擴充。2026 年的版本已經包含:

能力對應元件
LLM 對話(文字生成)Local large language model(llm2)
語音轉文字Local Whisper STT(stt_whisper2)
文字轉語音Local Text-To-Speech(text2speech_kokoro)
機器翻譯Local Machine translation 2(translate2)
圖片生成Local Image Generation(Stable Diffusion 2 / Flux)
OCR 辨識Local Optical Character Recognition(ocr_paddle)、Recognize
跨 App 問答(語意搜尋你的檔案/信件)Context Chat、Context Agent
對話摘要Talk 的 Summary Bot
即時逐字稿與翻譯Talk live_transcription

重點是:這些元件可以全部跑在你自己的硬體上,透過 Ollama 或 LocalAI 接到本機模型,不一定要把資料送給雲端 LLM。你也可以選擇付費雲端供應商(OpenAI、Mistral、Groq 等),Nextcloud 在介面上會標示「目前由哪個供應商提供模型」,這是為了符合歐盟 AI 法(EU AI Act)的透明度要求;官方文件甚至有一整個章節在談 AI Act 合規。

實務建議:先用本站的 Ollama 教學把本機推論跑起來,再讓 Nextcloud 接上去。這樣做的最大好處是「檔案不出門」——你的 Context Chat 索引的是你自己的文件,而模型也在你自己的機器上。

把檔案本體搬到 S3 物件儲存

Nextcloud 預設把所有檔案存在 data/ 目錄。但如果你已經有一套 S3 相容的物件儲存(例如自架的 Garage、SeaweedFS、RustFS),可以把它設成 Primary Storage,讓檔案本體直接寫進物件儲存、資料庫只留 metadata:

    environment:
      - OBJECTSTORE_S3_BUCKET=nextcloud
      - OBJECTSTORE_S3_REGION=us-east-1
      - OBJECTSTORE_S3_HOST=s3.internal.example.com
      - OBJECTSTORE_S3_PORT=9000
      - OBJECTSTORE_S3_KEY=你的AccessKey
      - OBJECTSTORE_S3_SECRET=你的SecretKey
      - OBJECTSTORE_S3_SSL=true
      - OBJECTSTORE_S3_USEPATH_STYLE=true      # 自架 S3 通常需要
      - OBJECTSTORE_S3_AUTOCREATE=true

⚠️ Primary Storage 是「開機前」就要決定的事。官方明確說明這會近乎取代預設的資料目錄,已經在跑的實例不能事後直接切換(資料目錄仍必須存在,只是不再放檔案)。所以在正式匯入資料前想清楚:檔案放本地硬碟,還是放物件儲存。

備份與升級:兩個絕不能省略的動作

備份(三個東西都要備)

# 1) 資料庫
docker compose exec db mariadb-dump -u root -p'你的root密碼' --single-transaction \
  --routines --triggers nextcloud > nextcloud-db-$(date +%F).sql

# 2) 資料與設定 volume
docker run --rm -v nextcloud_nextcloud:/data -v "$PWD":/backup alpine \
  tar czf /backup/nextcloud-data-$(date +%F).tar.gz /data

# 3) 你的 compose 檔與 .env(最容易忘記,但沒有它還原等於重來)

備份要在維護模式或低負載時做。只備資料庫而沒備 data volume 是最常見的悲劇;只用 tar 打整個 volume 而沒 dump 資料庫,還原後會出現檔案與資料庫對不上的「幽靈檔案」。兩者要同一個時間點。

升級(跨版本是最大的坑)

Nextcloud 不允許跳過主要版本:從 33 要升到 35,必須先升到 34,再升到 35。升級流程:

# 0) 先備份(見上)
docker compose pull
docker compose up -d                      # 映像檔會自動執行升級程序
docker compose exec -u33 app ./occ upgrade # 若自動升級沒跑,手動執行
docker compose exec -u33 app ./occ maintenance:mode --off
docker compose exec -u33 app ./occ db:add-missing-indices
docker compose exec -u33 app ./occ maintenance:repair --include-expensive

如果你在升級後看到這行警告:

Warning: /var/www/html/config/$cfgFile differs from the latest version of this image at /usr/src/nextcloud/config/$cfgFile

代表映像檔內建的設定檔(例如反向代理、自動設定相關的 *.config.php)比你容器裡的新。修法:

docker exec <容器名稱> sh -c "cp /usr/src/nextcloud/config/*.php /var/www/html/config"

(前提是你沒有手動改過這些檔案;若改過,請先手動比對差異。)

Nextcloud vs Google Drive vs Immich:各自的位置

看完上面你可能會想:「那我還需要 Immich 嗎?」答案是用途不同。Nextcloud 的 Photos 模組在 Hub 26 Summer 有大幅翻新,但它的本質是「檔案雲端硬碟附帶相簿」;Immich 則是為「手機照片自動備份 + 人臉辨識 + 時間軸」這種行動優先體驗而生的專門工具。

需求建議工具原因
檔案同步、Office 協作、日曆通訊錄Nextcloud一站式、生態最完整
手機相片自動備份、以相片為中心的瀏覽體驗Immich行動體驗與辨識功能更專精
只想放檔案、不想維運Google Drive / Dropbox零維運成本,代價是月租與資料主權
文件掃描歸檔Paperless-ngx為 OCR 與標籤歸檔設計
密碼管理Vaultwarden與 Nextcloud 同為自架必備,但用途分離

實務上很多人的做法是:Nextcloud 當「雲端硬碟 + Office」,Immich 當「相片庫」,兩者各自掛在同一台 Proxmox 上,再用 Caddy 給不同子網域。

常見坑與排查對照表

症狀原因解法
網頁顯示 Access through untrusted domainNEXTCLOUD_TRUSTED_DOMAINS 沒填你實際用的網域補上環境變數重啟,或用 occ config:system:set trusted_domains 1 --value=...
上傳大檔失敗(沒有任何錯誤訊息)Apache body limit 或 PHP upload limitAPACHE_BODY_LIMIT=0PHP_UPLOAD_LIMIT 提高
網頁很慢、多人同時用會卡沒接 Redis依本文 compose 加上 Redis 與 REDIS_HOST
登入記錄全部是代理的 IP沒設 TRUSTED_PROXIES設定代理網段並重啟容器
檔案權限錯誤(Permission denied)volume 的 owner 與容器 uid(33 或 82)不符-u33 執行 occ,必要時修正 volume 權限
手動放進 data/ 的檔案在網頁看不到沒有索引occ files:scan --all
升級後出現 $cfgFile differs 警告映像檔內建設定檔過期依上文從 /usr/src/nextcloud/config 複製
還原備份後檔案與資料庫對不上只備了其中一邊資料庫 dump 與 data volume 必須同一時間點
更新後 occ upgrade 說不能跳版本一次跳了多個主要版本逐版升級(33 → 34 → 35)

系統需求對照(Nextcloud 35)

官方文件對自架環境的要求如下,Docker 版本大致相同:

項目支援版本
作業系統(64-bit)Ubuntu 26.04 LTS(建議)、Ubuntu 24.04、RHEL 10/9、Debian 13、openSUSE Leap 16、Alpine 等
資料庫MariaDB 11.8(建議)、PostgreSQL 18(建議)、MySQL 8.4/9.7、SQLite(僅測試)
Web ServerApache 2.4 with mod_php 或 php-fpm(建議)、nginx + php-fpm
PHP8.3 / 8.4 / 8.5(建議)
記憶體每個 process 建議至少 512MB;內建 Updater 至少需 256MB
行動裝置iOS 17.0+(Files)、Android 9.0+

若用 MariaDB,還必須符合三件事:InnoDB 引擎READ COMMITTED 交易隔離層級(就是 compose 裡那行 --transaction-isolation=READ-COMMITTED)、以及關閉 binary logging 或設為 ROW。漏掉這幾項,Nextcloud 在大量寫入時會出現鎖等待與資料異常。

結語:Nextcloud 是自架全家桶的「門面」

對大多數人來說,Google Drive 的替代品就是自架旅程的第一站——因為它是家人唯一會主動使用的服務。也因為這樣,它值得用最穩的方式部署:Docker Compose 明確列出每個元件、Redis 一定要接、反向代理一定要設對、備份一定要三個都備。

先把 Nextcloud 跑起來、把家人的手機同步設定好,再慢慢把 Ollama 的 AI 助理接上去。當你發現「自己的檔案在自己的硬碟、自己的 AI 在自己的機器」時,這套自架系統的價值就會變得非常有感。

參考資料

延伸閱讀

📬 訂閱 most.tw 電子報

每週精選 AI 工具教學與技術乾貨,直接送到你的信箱。免費、隨時可退訂。

💬 有問題想討論?加 LINE 聯絡我

歡迎透過 LINE 官方帳號直接留言,我會盡快回覆你的問題。

加入 LINE 好友