Files
nexus/wiki/sources/minio-zipline-自托管图床应用安装教程.md
2026-04-22 08:02:59 +08:00

166 lines
6.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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 → MinIOS3 → 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/)