我原本在 Windows 裝好了 Docker,想要直接用官方提供的 Linux 版 Cronicle 容器。
一開始看著文件照做,結果一路踩坑:Port 被佔用、容器一直 Restart、JSON 壞掉、Shell Script 無法執行,最後還遇到 Email 發不出去。
這篇文章就是把整個過程完整記錄下來。
在 Windows 上要跑 Cronicle,流程大致如下:
建立一個專案資料夾:
mkdir C:\cronicle && cd C:\cronicle
建立一份 docker-compose.yml
:
services:
cronicle:
image: soulteary/cronicle:latest
container_name: cronicle
ports:
- "13012:3012" # 改成不會衝突的 Port
environment:
- TZ=Asia/Taipei
volumes:
- ./data/data:/opt/cronicle/data:rw
- ./data/logs:/opt/cronicle/logs:rw
- ./data/plugins:/opt/cronicle/plugins:rw
restart: unless-stopped
啟動容器:
docker compose up -d
開啟瀏覽器進入管理介面:
http://localhost:13012
預設帳密是 admin / admin
,建議第一次登入就立刻修改。
後來我需要讓 Cronicle 自動備份自己,所以額外新增了兩個 volume:
scripts
→ 放備份腳本backups
→ 存放備份輸出更新後的 docker-compose.yml
:
services:
cronicle:
image: soulteary/cronicle:latest
container_name: cronicle
ports:
- "13012:3012"
environment:
- TZ=Asia/Taipei
volumes:
- ./data/data:/opt/cronicle/data:rw
- ./data/logs:/opt/cronicle/logs:rw
- ./data/plugins:/opt/cronicle/plugins:rw
- ./scripts:/opt/cronicle/scripts:ro
- ./backups:/opt/cronicle-backup:rw
restart: unless-stopped
在 Windows 上建立對應的資料夾:
mkdir C:\cronicle\scripts -ea 0
mkdir C:\cronicle\backups -ea 0
這樣 Cronicle 的備份腳本就可以放在 C:\cronicle\scripts
,執行後備份檔會自動出現在 C:\cronicle\backups
。
一開始我用 docker compose up -d
,馬上爆錯:
Ports are not available: exposing port TCP 0.0.0.0:3012
查了一下,原來 3012 已被另一個程式或舊容器佔用。
👉 解法有兩個:
netstat -ano | findstr :3012
tasklist /fi "PID eq <PID>"
docker stop cronicle && docker rm cronicle
ports:
- "13012:3012"
Port 問題解掉後,容器又進入 Restarting (1) 狀態。
原因有幾種:
volumes
資料夾結構錯誤我把 docker-compose.yml
改成官方建議的結構:
volumes:
- ./data/data:/opt/cronicle/data:rw
- ./data/logs:/opt/cronicle/logs:rw
- ./data/plugins:/opt/cronicle/plugins:rw
然後先手動建立資料夾:
mkdir C:\cronicle\data\data -ea 0
mkdir C:\cronicle\data\logs -ea 0
mkdir C:\cronicle\data\plugins -ea 0
果然,容器不再自動重啟了。
有一次我直接修改容器內的 /opt/cronicle/conf/config.json
,結果因為 JSON 多了一個逗號,整個 Cronicle 啟不來。
錯誤訊息:
SyntaxError: Unexpected token in JSON
👉 最快的解法:
直接把壞掉的檔刪掉,Cronicle 會自動重建一份乾淨的。
cp /opt/cronicle/sample_conf/config.json /opt/cronicle/conf/config.json
docker restart cronicle
為了避免之後再手動進容器修改,我把 config.json
拉出來掛到主機上。
步驟如下:
從容器把原始檔拉到本地:
docker cp cronicle:/opt/cronicle/conf/config.json ./conf/config.json
在 docker-compose.yml
裡新增掛載:
- ./conf/config.json:/opt/cronicle/conf/config.json:ro
下次需要修改,只要在本地編輯 conf/config.json
,然後 docker compose up -d
重啟就能套用。
這樣做的好處是方便管理版本,也不怕誤動容器內的檔案。
我寫了一支簡單的 shell script,讓 Cronicle 自己每天凌晨備份:
#!/bin/sh
BACKUP_DIR="/opt/cronicle-backup"
SOURCE_DIR="/opt/cronicle/data"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/cronicle_backup_${TIMESTAMP}.tar.gz"
mkdir -p "${BACKUP_DIR}"
tar -czf "${BACKUP_FILE}" -C "${SOURCE_DIR}" .
find "${BACKUP_DIR}" -type f -name "*.tar.gz" -mtime +7 -delete
再把它掛到容器:
- ./scripts:/opt/cronicle/scripts:ro
- ./backups:/opt/cronicle-backup:rw
在 Cronicle UI 建立一個 Shell Script Job:
#!/bin/sh
/opt/cronicle/scripts/cronicle_backup.sh
最後備份檔就會自動出現在 C:\cronicle\backups\
了。
某次 Job 報錯:
Failed to send e-mail for job ... ECONNREFUSED 127.0.0.1:25
這代表 Cronicle 嘗試用 本機 port 25 寄信,但我沒有 SMTP server。
👉 解法是修改 config.json
改用外部 SMTP,例如 Gmail:
{
"smtp_hostname": "smtp.gmail.com",
"smtp_port": 587,
"mail_options": {
"secure": false,
"auth": {
"user": "your-email@gmail.com",
"pass": "your-app-password"
}
}
}
一路下來,我的心得是:
#!/bin/sh
包裝最穩。現在我的 Cronicle 在 Windows Docker 上跑得很穩,每天會自動備份,Job 出錯也能發通知。