166 lines
6.0 KiB
Markdown
166 lines
6.0 KiB
Markdown
---
|
||
title: "MinIO + Zipline 自托管图床应用安装教程"
|
||
type: source
|
||
tags: [docker, image, minio, n8n, nas, synology, zipline]
|
||
date: 2025-12-29
|
||
---
|
||
|
||
## Source File
|
||
- [[raw/Home Office/MinIO + Zipline 自托管图床应用安装教程.md]]
|
||
|
||
## 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
|
||
|
||
```yaml
|
||
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
|
||
|
||
```bash
|
||
# 设置别名
|
||
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
|
||
|
||
```bash
|
||
#!/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
|
||
```
|
||
|
||
## Reference URLs
|
||
- [Docker Volume Documentation](https://docs.docker.com/storage/volumes/)
|
||
- [MinIO Docker Persistence](https://min.io/docs/minio/linux/operations/install-deploy-manage/deploy-minio-single-node-single-drive.html)
|
||
- [Synology ACL Settings](https://kb.synology.com/en-global/DSM/tutorial/How_to_manage_ACL_settings_on_your_Synology_NAS)
|
||
- [MinIO mc anonymous](https://min.io/docs/enterprise/aistor-object-store/reference/cli/mc-anonymous/)
|