|
| 1 | +--- |
| 2 | +title: "在 Synology NAS 上用 rclone + pCloud 建立加密雲端備份" |
| 3 | +summary: "使用 Docker 版 rclone 將 Synology NAS 的資料端對端加密後備份到 pCloud,包含配置、headless 授權、排程與驗證建議。" |
| 4 | +tags: ["rclone", "pcloud", "synology", "backup", "docker"] |
| 5 | +categories: [] |
| 6 | +date: 2025-11-22T10:00:00+08:00 |
| 7 | +lastmod: 2025-11-22T10:00:00+08:00 |
| 8 | +draft: false |
| 9 | + |
| 10 | +# toha params |
| 11 | +menu: |
| 12 | + sidebar: |
| 13 | + name: 在 Synology NAS 上用 rclone + pCloud 建立加密雲端備份 |
| 14 | + identifier: rclone-pcloud-backup |
| 15 | + parent: |
| 16 | + weight: 20 |
| 17 | +--- |
| 18 | + |
| 19 | +## 前言 |
| 20 | +本文說明如何在 Synology NAS 上使用 `rclone` 這套工具,搭配 pCloud 這個雲端來做到雲端方案的端對端加密備份,讓資料的保障更上一層樓 |
| 21 | + |
| 22 | +## 安裝 rclone |
| 23 | +這邊以 macOS 為例, 透過 `brew` 安裝 rclone |
| 24 | +```sh |
| 25 | +brew install rclone |
| 26 | +``` |
| 27 | + |
| 28 | +Synology NAS 的部分,本文會使用 docker 來執行 rclone, 因此無須在 Synolog 的 host 上面安裝 rclone |
| 29 | + |
| 30 | +## 設定 rclone remote for pCloud |
| 31 | + |
| 32 | +這個步驟是為了讓 rclone 取得存取 pCloud 的權限 |
| 33 | + |
| 34 | +ssh 進 Synology, 透過 docker 執行 rclone config |
| 35 | +```sh |
| 36 | +docker run --rm -it --volume /volume1/docker/rclone/config:/config/rclone --user $(id -u):$(id -g) rclone/rclone config |
| 37 | +``` |
| 38 | + |
| 39 | +這邊請透過 volume 選項將 rclone 的 `rclone.conf` 設定檔放到你想放的 NAS 位置,如果沒加 volume 的話 `rclone.conf` 會放在 container 內,這樣就沒辦法保存設定給後面的備份設定使用,例如這邊的範例是我將 config 檔保存在 `/volume1/docker/rclone/config` 中,這樣一來在後面的 rclone 備份指令中就可以沿用這個步驟設定完成的 `rclone.conf` |
| 40 | + |
| 41 | + |
| 42 | +進到 rclone 的互動式介面後,選擇 New remote,接著按照系統提示一步一步設定 pcloud remote (storage type 選擇 42 代表要加入 pcloud) |
| 43 | + |
| 44 | +``` |
| 45 | +42 / Pcloud |
| 46 | + \ (pcloud) |
| 47 | +``` |
| 48 | + |
| 49 | +範例設定如下 (client_id, client_secret 留空即可) |
| 50 | +``` |
| 51 | +Storage> 42 |
| 52 | +
|
| 53 | +Option client_id. |
| 54 | +OAuth Client Id. |
| 55 | +Leave blank normally. |
| 56 | +Enter a value. Press Enter to leave empty. |
| 57 | +client_id> |
| 58 | +
|
| 59 | +Option client_secret. |
| 60 | +OAuth Client Secret. |
| 61 | +Leave blank normally. |
| 62 | +Enter a value. Press Enter to leave empty. |
| 63 | +client_secret> |
| 64 | +
|
| 65 | +Edit advanced config? |
| 66 | +y) Yes |
| 67 | +n) No (default) |
| 68 | +y/n> n |
| 69 | +
|
| 70 | +Use web browser to automatically authenticate rclone with remote? |
| 71 | + * Say Y if the machine running rclone has a web browser you can use |
| 72 | + * Say N if running rclone on a (remote) machine without web browser access |
| 73 | +If not sure try Y. If Y failed, try N. |
| 74 | +
|
| 75 | +y) Yes (default) |
| 76 | +n) No |
| 77 | +y/n> N |
| 78 | +
|
| 79 | +Option config_token. |
| 80 | +For this to work, you will need rclone available on a machine that has |
| 81 | +a web browser available. |
| 82 | +For more help and alternate methods see: https://rclone.org/remote_setup/ |
| 83 | +Execute the following on the machine with the web browser (same rclone |
| 84 | +version recommended): |
| 85 | + rclone authorize "pcloud" |
| 86 | +Then paste the result. |
| 87 | +Enter a value. |
| 88 | +config_token> |
| 89 | +``` |
| 90 | + |
| 91 | +<br> |
| 92 | + |
| 93 | +到了 Option config_token 這步,由於 Synology NAS 沒有 Web browser, 因此選擇 `n`,我們回到 macOS, 使用以下指令進行認證 |
| 94 | +```sh |
| 95 | +rclone authorize pcloud |
| 96 | +``` |
| 97 | + |
| 98 | +瀏覽器會跳轉到 pcloud 的登入頁面,登入成功後瀏覽器會顯示一個 access token,將這個 access token 貼回 Synology 的 rclone config 中就設定完成了 |
| 99 | + |
| 100 | +完成後 NAS 的檔案總管上在你指定的 volume 底下的 folder 預期可以得到一份 rclone.conf,請把這個檔案備份好 |
| 101 | + |
| 102 | + |
| 103 | +## 設定 rclone crypt remote pcloud |
| 104 | + |
| 105 | +順利讓 rclone 取得 pcloud 的存取權限後,接下來我們要在 rclone 開一個 crypt remote, 把 pcloud 的指定路徑變成我們的端對端加密備份的路徑 |
| 106 | + |
| 107 | +在 Synology 上透過 docker 執行 rclone config |
| 108 | +```sh |
| 109 | +docker run --rm -it --volume /volume1/docker/rclone/config:/config/rclone --user $(id -u):$(id -g) rclone/rclone config |
| 110 | +``` |
| 111 | + |
| 112 | +選擇 New remote,remote name 輸入 `pcloud_crypt`,Storage type 選擇 crypt |
| 113 | +``` |
| 114 | +15 / Encrypt/Decrypt a remote |
| 115 | + \ (crypt) |
| 116 | +``` |
| 117 | + |
| 118 | +接著會要你輸入想要 encrypt/decrypt 的 remote 以及 path |
| 119 | +``` |
| 120 | +Storage> 15 |
| 121 | +
|
| 122 | +Option remote. |
| 123 | +Remote to encrypt/decrypt. |
| 124 | +Normally should contain a ':' and a path, e.g. "myremote:path/to/dir", |
| 125 | +"myremote:bucket" or maybe "myremote:" (not recommended). |
| 126 | +Enter a value. |
| 127 | +remote> |
| 128 | +``` |
| 129 | + |
| 130 | +remote 就輸入你前面步驟設定的 pcloud remote (這裡的 remote name 以 `pcloud` 為例),path 的部分,需要指定一個路徑,rclone 會在 pcloud 上面建立這個路徑的 folder, 並將這個 folder 作為 rclone 使用,因此若你平常就有在使用 pcloud 存放檔案的話,強烈建議一定要指定路徑,否則 rclone 會將整個 plcoud 的根目錄都拿來使用 |
| 131 | + |
| 132 | +這邊我指定了 `nas_backup` 這個路徑,這樣一來在之後透過這個 remote 操作備份時,rclone 就會在 pcloud 的根目錄建立 nas_backup 這個 folder 並將我們的檔案加密後放進這個 folder 中 |
| 133 | +``` |
| 134 | +Option remote. |
| 135 | +Remote to encrypt/decrypt. |
| 136 | +Normally should contain a ':' and a path, e.g. "myremote:path/to/dir", |
| 137 | +"myremote:bucket" or maybe "myremote:" (not recommended). |
| 138 | +Enter a value. |
| 139 | +remote> pcloud:nas_backup |
| 140 | +``` |
| 141 | + |
| 142 | +接著設定是否要加密檔案名稱 (預設加密)、是否要加密資料夾名稱(預設不加密),這邊依照個人偏好設定即可 |
| 143 | + |
| 144 | +接著最重要的一步:設定你的的加密金鑰 (password) |
| 145 | +``` |
| 146 | +Option password. |
| 147 | +Password or pass phrase for encryption. |
| 148 | +Choose an alternative below. |
| 149 | +y) Yes, type in my own password |
| 150 | +g) Generate random password |
| 151 | +``` |
| 152 | + |
| 153 | +可以選擇自己設定一個或是系統幫忙產一個 random password, 不論選哪一種,都請將這個加密金鑰備份好,否則將來無法解開你的備份檔案 |
| 154 | + |
| 155 | +後續還有一些進階保護的設定選項,例如是否要為你的 password 添加一個 salt、是否要加密 `rclone.conf` 等等,可根據個人需求參考官方文件去設定,本文不再贅述。 |
| 156 | + |
| 157 | +設定完成儲存後,在 rclone config 就可以看到我們成功新增了一個 crypt remote,至此 remote 的部分已經全數設定完畢,可以開始使用 rclone 備份資料了 |
| 158 | + |
| 159 | +## 使用 Docker Compose 執行備份 |
| 160 | + |
| 161 | +在這個步驟,我們要設定以下這個 docker-compose.yml 來當作我們的自動備份 task |
| 162 | +```sh |
| 163 | +version: "3.9" |
| 164 | + |
| 165 | +services: |
| 166 | + rclone-foobar: |
| 167 | + image: rclone/rclone:latest |
| 168 | + container_name: rclone-foobar |
| 169 | + environment: |
| 170 | + - TZ=Asia/Taipei |
| 171 | + volumes: |
| 172 | + - /volume1/foobar:/data:ro # backup target |
| 173 | + - /volume1/docker/rclone/config:/config/rclone # rclone.conf |
| 174 | + - /volume1/docker/rclone/logs:/logs # log files |
| 175 | + - /volume1/docker/rclone/scripts:/scripts # backup script |
| 176 | + # For Synology NAS, use the following entrypoint to run a custom script |
| 177 | + entrypoint: ["/bin/sh", "/scripts/backup-foobar.sh"] |
| 178 | +``` |
| 179 | + |
| 180 | +有幾個設定的重點,皆透過 docker volume 進行 |
| 181 | +1. 備份目標資料夾 (e.g. `/volume1/foobar`) |
| 182 | +2. `rclone.conf` 位置,把前面步驟設定 pcloud 產生的 rclone.conf 儲存在你要的地方並將 NAS 上的檔案路徑 (e.g. `/volume1/docker/rclone/config`) 正確的 map 到 container 的 `/config/rclone` 這個路徑 |
| 183 | +3. log file 存放位置:為了日後備份失敗時可以 debug, 因此可以在 NAS 上開一個 log 資料夾給 rclone 使用 |
| 184 | +4. 備份 script 路徑 (e.g. `/volume1/docker/rclone/scripts`) : 用來執行 `rclone sync` 指令,是備份主要的觸發點,將要執行的備份 script 透過 entrypoint 設定進 compose 中 |
| 185 | + |
| 186 | +範例的備份 script (`backup-foobar.sh`) 如下 |
| 187 | + |
| 188 | +```sh |
| 189 | +#!/bin/sh |
| 190 | +# This script is executed every time the container starts |
| 191 | +# Can be used with DSM scheduler to start the container daily and trigger automatic backup |
| 192 | + |
| 193 | +LOG_FILE="/logs/rclone.log" |
| 194 | +echo "=== Rclone backup started at $(date) ===" >> "$LOG_FILE" |
| 195 | + |
| 196 | +# Upload data to the encrypted remote |
| 197 | +rclone sync /data pcloud_crypt:nas_backup \ |
| 198 | + --transfers=2 \ |
| 199 | + --checkers=4 \ |
| 200 | + --exclude-from=/config/exclude_list.txt \ |
| 201 | + --log-file="$LOG_FILE" \ |
| 202 | + --log-level=INFO |
| 203 | + |
| 204 | +echo "=== Rclone backup completed at $(date) ===" >> "$LOG_FILE" |
| 205 | +``` |
| 206 | + |
| 207 | +- script 中的 `/data` 會透過 docker volume 指向你的備份目標資料夾,而 `pcloud_crypt:nas_backup` 就是剛剛我們在建立 crypt remote 時的 remote name 以及路徑 |
| 208 | +- `--transfers` 和 `--checkers` 可以根據個人的網路能力及需求設定,log 稍候可以透過 docker volume 的方式儲存在 NAS 上面以供日後 debug |
| 209 | + |
| 210 | +接著我們設定檔案排除以及 logrotate 兩個功能 |
| 211 | + |
| 212 | +#### 設定排除檔案 |
| 213 | +Synology NAS 的資料夾會有一些 synology 專用的索引檔案可以不用備份,我們可以透過 `--exclude-from` 來設定這些 ignore file list,以下附上我從網路上找到用來 ignore Synology 檔案的清單: |
| 214 | +``` |
| 215 | +@eaDir/** |
| 216 | +#recycle/** |
| 217 | +Thumbs.db |
| 218 | +desktop.ini |
| 219 | +.DS_Store |
| 220 | +._* |
| 221 | +.SynologyWorkingDirectory/** |
| 222 | +``` |
| 223 | + |
| 224 | +#### 設定 logrotate |
| 225 | +上面的 docker-compose.yml 範例,我們將 rclone 產生的 log 存在 `/volume1/docker/rclone/logs/` 中,為了必面日後 log 大小過大,因此我們利用 linux 的 logrotate 來處理 log 檔案的自動 rotate |
| 226 | + |
| 227 | +在 NAS host 上新增一個 logrotate 設定 |
| 228 | +```sh |
| 229 | +sudo vi /etc/logrotate.d/rclone |
| 230 | +``` |
| 231 | + |
| 232 | +範例設定如下,細部設定可以依照個人需求調整 |
| 233 | +``` |
| 234 | +/volume1/docker/rclone/logs/*.log { |
| 235 | + daily |
| 236 | + rotate 7 |
| 237 | + compress |
| 238 | + delaycompress |
| 239 | + missingok |
| 240 | + notifempty |
| 241 | + copytruncate |
| 242 | + size 50M |
| 243 | + maxage 14 |
| 244 | +} |
| 245 | +``` |
| 246 | + |
| 247 | +測試是否能手動 rotate |
| 248 | +```sh |
| 249 | +sudo logrotate -f /etc/logrotate.d/rclone |
| 250 | +``` |
| 251 | + |
| 252 | +### 測試 |
| 253 | +全部設定完成後,可以 ssh 進 NAS 確認 docker-compose 是否能順利執行: |
| 254 | +```sh |
| 255 | +docker-compose up |
| 256 | +``` |
| 257 | + |
| 258 | +執行完畢後,container 會自動 exit,檢查 log 無異狀並且檔案有成功上傳到 pcloud 的話就表示成功了 |
| 259 | +可以順便在 pcloud 上面看你的檔案有沒有被成功的加密 |
| 260 | + |
| 261 | +## 透過 DSM 自動化排程備份 |
| 262 | +在前面的步驟中,我們已經寫好了一個可以手動進行端對端加密備份的 docker-compose.yml 了,下一步就是要將備份自動化,融入日常的 NAS 任務中,我們要利用 DSM 的 排程任務 (Task Scheduler) 來作這件事情 |
| 263 | + |
| 264 | +### 建立 rclone user |
| 265 | +首先,為了防止 rclone 的權限過大,因此我們在 NAS 上為 rclone 建立一個獨立的 user, 來限制 rclone 能存取的資料夾以及讀寫權限,目標是只讓 rclone 可以讀我們的備份目標資料夾以及 docker 的執行權限,其他沒有要透過 rclone 備份的資料夾,該 user 無法存取 |
| 266 | + |
| 267 | +在 DSM 的控制台新增一個名為 `rclone` 的 user, 並將其加入 `docker` 這個 group,讓這個 user 可以不用透過 sudo 執行 docker (如何在 Synology 上建立 docker group 可以參考我之前寫的這篇[如何在 Synology NAS 使用 non-root user 執行 Docker command](/posts/run-docker-command-without-sudo-on-synology-nas)) |
| 268 | + |
| 269 | +資料夾權限、應用程式權限預設全部禁止存取,之後根據個人需求允許個別的資料夾權限就好 |
| 270 | + |
| 271 | +### 新增 DSM 排程任務 |
| 272 | +接著在 DSM 控制台的「任務排程表 (Task Scheduler)」建立一個任務 |
| 273 | + |
| 274 | +使用者設定 rclone |
| 275 | + |
| 276 | + |
| 277 | + |
| 278 | +指令欄位輸入 docker-compose up 指令來執行我們上面步驟寫好的 yaml,範例如下: |
| 279 | + |
| 280 | +```sh |
| 281 | +docker-compose -f /path/to/your/docker-compose.yml up |
| 282 | +``` |
| 283 | + |
| 284 | + |
| 285 | + |
| 286 | + |
| 287 | +設定好排程時間後就大功告成了,現在你的 NAS 已經實現了一個端對端加密的雲端異地備份服務 |
0 commit comments