6.2 KiB
6.2 KiB
title, type, tags, date
| title | type | tags | date | |||||||
|---|---|---|---|---|---|---|---|---|---|---|
| MinIO + Zipline 自托管图床应用安装教程 | source |
|
2025-12-29 |
Source File
Summary (用中文描述)
- 核心主题:在 Synology NAS 上通过 Docker Compose 部署 MinIO + Zipline 自托管图床解决方案
- 问题域:家庭/小型办公环境需要自托管的图片存储服务,替代云服务(图床)
- 方法/机制:
- MinIO 作为 S3 兼容对象存储后端,提供高性价比的本地存储
- Zipline 作为图片上传 UI 和 API 服务层,支持 n8n 工作流集成
- PostgreSQL 作为 Zipline 的元数据存储
- 使用
mc命令行工具设置 Public Bucket 匿名访问 - pg_dump 实现 PostgreSQL 逻辑备份脚本
- Synology Hyper Backup 配合定时任务实现增量归档
- 结论/价值:零成本、完全自控的图床方案,适合技术用户家庭部署
Key Claims (用中文描述)
- MinIO + Zipline 架构将存储性能与元数据管理分离,MinIO 存储性能仅受 NAS 硬盘/SSD 限制,Zipline 仅处理 metadata
- Docker Compose
depends_on+condition: service_healthy实现服务启动顺序保障,避免竞态条件 - pg_dump 逻辑备份是 Synology NAS 环境的标准热备份方案,零停机、迁移能力强
- "脑体分离"(PostgreSQL 元数据 + MinIO 文件实体)是图床系统的核心架构特征,备份必须同时覆盖两者
Key Quotes
"Zipline 将元数据存在 Postgres,将文件实体存在 MinIO,你的备份方案必须确保这两者在时间点上是(尽可能)一致的。" — 备份策略核心挑战
"docker exec $PG_CONTAINER pg_dump -U $PG_USER -d $PG_DB | gzip > $BACKUP_DIR/db_$DATE.sql.gz" — 热备份标准命令
Key Concepts
- 图床:托管图片/媒体文件的服务,通过 URL 直接访问
- S3-兼容对象存储:MinIO 实现的 S3 API 兼容对象存储
- Docker堆栈:多容器 Docker Compose 编排,多服务依赖管理
- 逻辑备份:通过 pg_dump 导出 SQL,而非物理文件备份
- 数据一致性:分布式存储系统中元数据与文件实体的时间点一致性
- 匿名访问策略:MinIO mc anonymous 命令设置 bucket 公共读写权限
Key Entities
- MinIO:开源 S3 兼容对象存储,MinIO + Zipline 架构的存储后端
- Zipline:开源图床应用,提供前端上传 UI 和 REST API
- PostgreSQL:Zipline 的元数据数据库
- 群晖 NAS(Synology NAS):部署 Docker 的硬件平台
- n8n:工作流自动化工具,通过 Zipline API 实现图片上传
- Synology Hyper Backup:群晖备份套件
- pg_dump:PostgreSQL 逻辑备份工具
Connections
- Zipline ← depends_on ← MinIO(S3 存储)
- Zipline ← depends_on ← PostgreSQL(元数据)
- n8n ← calls ← Zipline API(图片上传)
- pg_dump ← backup ← PostgreSQL
- Synology Hyper Backup ← backup ← MinIO 数据目录
- Docker堆栈 ← orchestrates ← MinIO + Zipline + PostgreSQL
Contradictions
- 与 rsync增量备份 冲突:
- 冲突点:数据库备份方式
- 当前观点:pg_dump 逻辑备份(SQL 文件,可跨平台迁移)
- 对方观点:rsync 增量备份(文件级同步,适合 Docker 卷)
- 协调:两者互补——pg_dump 备份元数据,rsync/Hyper Backup 备份文件实体
Architecture
[DSM Docker UI]
│
├── MinIO (9000 API, 9001 Console)
│ └── /volume1/docker/zipline-stack/minio/minio_data
│
├── PostgreSQL (Zipline DB)
│ └── /volume1/docker/zipline-stack/zipline/pg_data
│
└── Zipline (暴露 3333)
├── 前端上传 UI
└── n8n API 上传
Zipline → MinIO(S3) → NAS 存储
Docker Compose Key Config
services:
minio:
image: minio/minio:latest
command: server /data --console-address ":9001"
ports:
- "9000:9000" # API
- "9001:9001" # Console
environment:
MINIO_ROOT_USER: admin
MINIO_ROOT_PASSWORD: Abcd_1234
postgres:
image: postgres:16
environment:
POSTGRES_USER: zipline
POSTGRES_PASSWORD: zipline
POSTGRES_DB: zipline
zipline:
image: ghcr.io/diced/zipline:latest
depends_on:
minio:
condition: service_healthy
postgres:
condition: service_healthy
environment:
DATABASE_URL: postgres://zipline:***@postgres:5432/zipline
STORAGE_ENGINE: s3
S3_BUCKET: zipline-bucket
S3_ENDPOINT: http://minio:9000
S3_ACCESS_KEY: admin
S3_SECRET_KEY: Abcd_1234
S3_FORCE_PATH_STYLE: "true"
mc (MinIO Client) Anonymous Access Commands
# 设置别名
mc alias set local http://192.168.3.17:9000 admin StrongPasswordHere
# 创建 bucket
mc mb local/zipline-bucket
# 设置公共读写权限
mc anonymous set public local/zipline-bucket
# 匿名权限类型
# - download: 仅下载(GET)
# - upload: 仅上传(PUT)
# - public: 读写
# - none: 禁用匿名访问
Backup Script
#!/bin/bash
BACKUP_DIR="/volume1/docker/zipline-stack/backups"
PG_CONTAINER="zipline_postgres"
PG_USER="zipline"
PG_DB="zipline"
RETENTION_DAYS=30
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p "$BACKUP_DIR"
# pg_dump 逻辑备份(热备份)
docker exec "$PG_CONTAINER" pg_dump -U "$PG_USER" -d "$PG_DB" | gzip > "$BACKUP_DIR/db_$DATE.sql.gz"
# 清理旧备份
find "$BACKUP_DIR" -name "db_*.sql.gz" -mtime +$RETENTION_DAYS -delete