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 的硬規則:
- 容器名稱不能改(
nextcloud-aio-mastercontainer),AIO 的自我更新依賴這個名稱。 - Snap 版的 Docker 不支援。檢查方式:
sudo docker info | grep "Docker Root Dir",若路徑含/var/snap/docker/就必須先遷移到標準 Docker 安裝。 - 若前面已經有反向代理(例如 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_LIMIT與post_max_size/upload_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_apps、config、data、themes 已經在清單內,你自己加的目錄要另外處理。
另外注意: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 domain | NEXTCLOUD_TRUSTED_DOMAINS 沒填你實際用的網域 | 補上環境變數重啟,或用 occ config:system:set trusted_domains 1 --value=... |
| 上傳大檔失敗(沒有任何錯誤訊息) | Apache body limit 或 PHP upload limit | APACHE_BODY_LIMIT=0、PHP_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 Server | Apache 2.4 with mod_php 或 php-fpm(建議)、nginx + php-fpm |
| PHP | 8.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 在自己的機器」時,這套自架系統的價值就會變得非常有感。
參考資料
- Nextcloud server(GitHub,36.8K stars,AGPL-3.0)
- nextcloud/docker 官方社群映像 README(compose 範例、環境變數、hook、Docker Secrets、升級注意事項)
- Nextcloud All-in-One(GitHub,10.4K stars)(mastercontainer 啟動指令與限制)
- Nextcloud 系統需求(Admin Manual)
- Nextcloud 人工智慧文件(Admin Manual)(Assistant、Context Chat、ExApp 清單)
- Nextcloud Hub 26 Summer 發布公告(v35 新功能:Teams、Tables、Assistant OCR、Office for desktop、Photos)
延伸閱讀
- 自架 S3 物件儲存完整教學 2026:MinIO 社群版停止維護後該選誰?Garage、SeaweedFS、RustFS、AIStor Free 完整比較+Docker 實戰
- Caddy 完整教學 2026:自動 HTTPS 的網頁伺服器與反向代理,從安裝到多站台部署
- Cloudflare Tunnel 完整教學 2026:不開防火牆 port 也能把自架服務搬上網
- Tailscale 完整教學 2026:36K 星 WireGuard Mesh VPN,從安裝、MagicDNS 到遠端連回家中自架服務
- Proxmox VE 9.2 完整教學 2026:從 ISO 安裝、ZFS、LXC/VM 選擇到 GPU 直通、PBS 備份與叢集
- Immich 自架相片管理:手機照片自動備份的開源方案
- Paperless-ngx 完整教學 2026:把家中紙本文件全部數位化,中文 OCR+AI 自動分類的自架文件管理系統
- Ollama 本機 LLM 完整教學:在自己的機器上跑開源模型
