--- 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/)