什麼是 Zipline?
Zipline 是一套用 TypeScript 開發、被稱為「next-generation ShareX server」的自架檔案上傳與分享服務。它不只是單純的圖床,而是把檔案託管、螢幕截圖上傳、短網址、程式碼分享整合在同一套服務裡:
適合的使用情境
如果你原本習慣用 ShareX 截圖後丟去 Imgur 或雲端硬碟,或是團隊需要一個內部的檔案/連結分享站,Zipline 幾乎是目前自架方案裡功能最完整、上手也最快的選擇——用 Docker 幾分鐘就能部署起來。
最近想架一個私有圖床/檔案分享服務,選了 Zipline。剛好主機上已經有一個共用的 PostgreSQL 容器在跑,所以這篇記錄怎麼讓 Zipline 接到既有的資料庫,而不是額外再開一個 PostgreSQL 容器,最後再用 Caddy 把服務掛到子網域上。
環境說明
本篇的 PostgreSQL 與 Zipline 是同一台主機上的兩個獨立 Docker Compose 專案,PostgreSQL 對外開了 5434 port。因為同機,所以會透過 Docker network 直接互通,而不是打主機 IP。
前置條件
- 主機上已經有一個獨立跑的 PostgreSQL 容器(本文用
postgres:18.4-bookworm) - 該 PostgreSQL 的 compose 檔已建立一個外部可共用的 network,例如
pg-network - 已安裝 Docker 與 Docker Compose
既有的 PostgreSQL compose 大致長這樣:
services:
postgres:
image: postgres:18.4-bookworm
container_name: postgres18
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER:-admin}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-changeme}
ports:
- "5434:5432"
volumes:
- /volume1/docker/postgres:/var/lib/postgresql
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-admin}"]
interval: 10s
timeout: 5s
retries: 5
networks:
- pg-network
networks:
pg-network:
name: pg-network重點是 networks.pg-network 有給 name,這樣其他 compose 專案才能用 external: true 接進來。
建立資料庫帳號
先連進 PostgreSQL,幫 Zipline 建一個專用帳號跟資料庫:
psql -U admin -p 5434 -h localhostCREATE USER zipline WITH PASSWORD 'your_password_here' CREATEDB;
CREATE DATABASE zipline OWNER zipline;別忘了 CREATEDB
Zipline 第一次啟動時,migration 流程會嘗試自己建立資料庫,如果帳號沒有 CREATEDB 權限,會直接在啟動階段噴錯:permission denied to create database。就算資料庫其實已經手動建好了,這個權限還是建議保留,避免版本升級時的自動遷移流程再次卡住。
Zipline 的 Docker Compose
因為 PostgreSQL 是別的專案管理的,Zipline 這邊的 compose 只需要一個 service,並且加入既有的 pg-network:
services:
zipline:
image: ghcr.io/diced/zipline:latest
restart: unless-stopped
ports:
- '7652:3000'
env_file:
- .env
environment:
- DATABASE_URL=postgres://${POSTGRESQL_USER:-zipline}:${POSTGRESQL_PASSWORD}@postgres:5432/${POSTGRESQL_DB:-zipline}
volumes:
- './uploads:/zipline/uploads'
- './public:/zipline/public'
- './themes:/zipline/themes'
healthcheck:
test: ['CMD', 'wget', '-q', '--spider', 'http://0.0.0.0:3000/api/healthcheck']
interval: 15s
timeout: 2s
retries: 2
networks:
- pg-network
networks:
pg-network:
name: pg-network
external: true幾個重點:
.env 設定
POSTGRESQL_USER=zipline
POSTGRESQL_PASSWORD=your_password_here
POSTGRESQL_DB=zipline
# Zipline 必填,用來簽發 session 等用途
CORE_SECRET=改成一段隨機字串CORE_SECRET 是 Zipline 啟動時的必填項,缺少的話會在 config 驗證階段直接失敗:
ERROR config.validate CORE_SECRET: Invalid input: expected string, received undefined可以用以下指令產生一段隨機字串:
openssl rand -base64 32啟動
docker compose up -d
docker compose logs -f看到類似訊息就代表資料庫連線與 migration 都順利完成:
[INFO db] connecting to database
[INFO server] starting zipline mode="production" version="4.6.5"啟動後可以先用容器內部指令確認健康狀態:
docker exec zipline-zipline-1 wget -q --spider http://0.0.0.0:3000/api/healthcheck && echo "✓ Zipline 健康狀態正常"用 Caddy 反向代理到子網域
假設要把服務掛在 demo.sao-x.com,並且對外用 7652 port,Caddyfile 大概長這樣:
demo.sao-x.com {
reverse_proxy localhost:7652
}如果 Caddy 跟 Zipline 不是同一台主機,localhost 記得換成 Zipline 所在主機的實際 IP。設定完重新載入 Caddy:
caddy reload之後就能透過 https://demo.sao-x.com 存取 Zipline,Caddy 會自動處理 HTTPS 憑證。
完成畫面
部署完成後,登入管理後台,首頁大致會像這樣:
![]()
小結
整體流程其實不複雜,卡關的地方主要有兩個:一是資料庫帳號權限不足導致 migration 失敗,二是忘記设定 CORE_SECRET 造成啟動時的 config 驗證失敗。只要把這兩點顧好,加上 Docker network 讓兩個獨立的 compose 專案互通,就能很輕鬆地讓 Zipline 共用既有的 PostgreSQL,不用額外再開一個資料庫容器。