Files
nexus/wiki/sources/minio-zipline-自托管图床应用安装教程.md

6.2 KiB
Raw Blame History

title, type, tags, date
title type tags date
MinIO + Zipline 自托管图床应用安装教程 source
docker
image
minio
n8n
nas
synology
zipline
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
  • PostgreSQLZipline 的元数据数据库
  • 群晖 NASSynology NAS部署 Docker 的硬件平台
  • n8n:工作流自动化工具,通过 Zipline API 实现图片上传
  • Synology Hyper Backup:群晖备份套件
  • pg_dumpPostgreSQL 逻辑备份工具

Connections

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

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

Reference URLs