建立自己的雲端硬碟 - Nextcloud

透過 Docker 建立自己的雲端服務,並串接外網

自動我大學畢業後無限空間的 G Suit 被收回之後,我一直就有著雲端空間不足的焦慮感,雖然目前還有每個月付款 $90 元給 Google One 服務買 200GB 的雲端空間,但老實說還是很快就用光了,也逼得我後來直接改變跳舞練習影片看完就刪掉的習慣,而不會上傳到網路空間。

這幾年開始感受到需要有一個自己存放資料的方法,因此就想到了 自建雲端空間 這個 Idea,那直接列入選項的就是 Nextcloud,這個甚至在多個 OS 系統內可以被整合的系統,而其他選項多數為中國的平台,在使用習慣評估之後就決定朝著 Nextcloud 的建置進行。

Nextcloud 規劃

這已經是我第二次挑戰了,上一次建立時一直搞不清楚 Device 上的 trust domain 設定,因此一直無法建立起來,這次就有順利解決這個狀態。

設計上我會先從以下幾個開始構想:

  1. 我要建設在我的 Ubuntu Server 上 - 因為我的硬碟安裝在上面,很好理解
  2. 透過 Docker 建置 - 簡單實作
  3. 透過 Cloudflared tunner - 外網使用為主,畢竟我要上傳檔案、下載檔案都是透過外網,或者是提供給他人連結都很好使用
  4. 可以經由手機操作 - 上傳照片等

Docker 設定

不囉唆直接上 docker compose 檔案

services:
  nextcloud-db: # 使用 MariaDB 資料庫
    image: mariadb:11.8
    container_name: nextcloud-db
    restart: always
    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
    volumes:
      - /mydata/db:/var/lib/mysql # 不使用 Docker volumes,改為實體位置是未來方便管理
    environment:
      - MYSQL_ROOT_PASSWORD=password # 密碼
      - MYSQL_PASSWORD=password # 密碼
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
    networks:
      - net

  nextcloud-redis: # 使用 Redis 資料庫
    image: redis:alpine
    container_name: nextcloud-redis
    restart: always
    networks:
      - net

  nextcloud: # 使用最新版 Nextcloud
    image: nextcloud
    restart: always
    container_name: nextcloud
    volumes:
      - /mydata/nextcloud:/var/www/html # 同樣是實體位置未來方便管理
    depends_on:
      - nextcloud-redis
      - nextcloud-db
    environment:
      - MYSQL_PASSWORD=password # db 密碼
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_HOST=nextcloud-db
      - REDIS_HOST=nextcloud-redis
      - NEXTCLOUD_ADMIN_USER=admin # 管理員帳號
      - NEXTCLOUD_ADMIN_PASSWORD=adminpd # 管理員密碼
    networks:
      - net
networks:
  net:
    external: true

基本上一樣 Build 起來就可以用了,然後接著就是去 Cloudflared tunnel,把內網設定做好,接著就要去處理下一個 Trust domain 問題了。

修改 Trust domain 設定

這也是我為何為了方便管理下,會把資料映射到實體硬碟而不是用 Docker volumes 的原因,這樣就好讓我們可以更輕鬆地修改設定。

  1. 找到你的 nextcloud/config/config.php 檔案
  2. 加入以下內容
'trusted_domains' => [
  'yourdomain',
],
'trusted_proxies' => [
  '172.18.0.0/16',
],
'overwritehost' => 'yourdomain',
'overwriteprotocol' => 'https',
'overwrite.cli.url' => 'https://yourdomain',
'forwarded_for_headers' => [
  'HTTP_CF_CONNECTING_IP',

存檔,基本上就完成了

登入設定!結束

接下來就是透過你的 https://yourdomain 來登入了,我是習慣先用寫在 docker compose 內的 admin 帳號來登入的,然後再去建立其他 user。

目前用下來覺得 Nextcloud 功能滿 Fancy 且龐大,除了雲端硬碟外也可以整合 email、日曆、以及其他相關功能,後續可以再多摸索看看,並且早點搬離 Google 生態系。