seafile13推荐的配置文件(docker+caddy)

seafile的.env文件

# ==========================================
# Seafile 13.0 精简版 .env 配置文件
# ==========================================

SEAFILE_SERVER_HOSTNAME=YOUR-domain
SEAFILE_SERVER_PROTOCOL=https
INIT_SEAFILE_ADMIN_EMAIL=YOUR-email
INIT_SEAFILE_ADMIN_PASSWORD=YOUR-PASSWORD
JWT_PRIVATE_KEY=32位以上
INIT_SEAFILE_MYSQL_ROOT_PASSWORD=YOUR-PASSWORD
SEAFILE_MYSQL_DB_PASSWORD=YOUR-PASSWORD
SEAFILE_SERVER_PROTOCOL=https
SEAFILE_VOLUME=/data/seafile-data
SEAFILE_MYSQL_VOLUME=/data/seafile-mysql/db
REDIS_PASSWORD=YOUR-PASSWORD
SEAFILE_REDIS_IMAGE=redis
CACHE_PROVIDER=redis
SEAFILE_MYSQL_DB_HOST=db
REDIS_HOST=redis

EMAIL_USE_TLS = True
EMAIL_HOST = 'YOUR_EMAIL_SERVRE'
EMAIL_HOST_USER = 'email' 
EMAIL_HOST_PASSWORD = 'YOUR-PASSWORD'
EMAIL_PORT = 587
DEFAULT_FROM_EMAIL = 'from-email'
SERVER_EMAIL = 'sever-email'

# 数据库连接与命名配置 (Seafile 初始化脚本强制要求)
SEAFILE_MYSQL_DB_HOST=db
SEAFILE_MYSQL_DB_PORT=3306
SEAFILE_MYSQL_DB_USER=seafile
SEAFILE_MYSQL_DB_CCNET_DB_NAME=ccnet_db
SEAFILE_MYSQL_DB_SEAFILE_DB_NAME=seafile_db
SEAFILE_MYSQL_DB_SEAHUB_DB_NAME=seahub_db

seafile的docker-compose.yml

services:
  db:
    image: mariadb:10.11
    container_name: seafile-mysql
    restart: unless-stopped
    environment:
      - MYSQL_ROOT_PASSWORD=${INIT_SEAFILE_MYSQL_ROOT_PASSWORD}
      # 新增:专为 mysqladmin 提供的环境变量,用于健康检查免密认证
      - MYSQL_PWD=${INIT_SEAFILE_MYSQL_ROOT_PASSWORD}
      - MYSQL_LOG_CONSOLE=true
      - MARIADB_AUTO_UPGRADE=1
    volumes:
      - ${SEAFILE_MYSQL_VOLUME}:/var/lib/mysql
    networks:
      - seafile-net
    healthcheck:
      # 修复:直接测试,它会自动读取 MYSQL_PWD 进行认证
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root"]
      interval: 20s
      timeout: 5s
      retries: 5
      start_period: 30s

  redis:
    image: ${SEAFILE_REDIS_IMAGE:-redis}
    container_name: seafile-redis
    restart: unless-stopped
    environment:
      # 新增:专为 redis-cli 提供的环境变量,用于健康检查免密认证
      - REDISCLI_AUTH=${REDIS_PASSWORD}
    # 修复:使用数组写法注入 compose 变量,避免密码中的特殊字符导致解析失败
    command: ["redis-server", "--requirepass", "${REDIS_PASSWORD}"]
    networks:
      - seafile-net
    healthcheck:
      # 修复:直接 ping,它会自动读取 REDISCLI_AUTH 进行认证
      test: ["CMD", "redis-cli", "ping"]
      interval: 20s
      timeout: 5s
      retries: 5

  seafile:
    image: ${SEAFILE_IMAGE:-seafileltd/seafile-mc:13.0-latest}
    container_name: seafile
    restart: unless-stopped
    ports:
      - "127.0.0.1:8080:80"
    volumes:
      - ${SEAFILE_VOLUME}:/shared
    env_file:
      - .env
    environment:
      - SEAFILE_SERVER_LETSENCRYPT=false
    # 强制等待 db 和 redis 完全健康后再启动
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_healthy
    networks:
      - seafile-net
    # Seafile 前端健康检查
    healthcheck:
      test: ["CMD", "curl", "-fsS", "http://localhost/"]
      interval: 30s
      timeout: 10s
      retries: 5
      start_period: 60s # 给 Seafile 服务足够的启动时间

networks:
  seafile-net:
    name: seafile-net

caddy的docker-compose.yml文件【我使用了cloudflare的DNS验证API】

{
	email YOUR-email
}

YOUR-domain {
    tls {
        dns cloudflare {env.CF_API_TOKEN}
    }
    encode gzip
    # 1. 自动补全尾部斜杠(模仿官方手册的 rewrite)
    redir /seafdav /seafdav/

	# 1. 开启访问日志
    # 日志会保存在 /data/caddy/data 目录下,限制单文件50MB,保留3份
    log {
        output file /data/access.log {
            roll_size 50mb
            roll_keep 3
        }
    }
    # 2. 增加基础安全响应头 (防止网页被恶意嵌套和嗅探)
    header {
        Strict-Transport-Security "max-age=31536000;"
        X-Content-Type-Options nosniff
        X-Frame-Options SAMEORIGIN
    }
    # 2. WebDAV 专项转发
    # 注意:这里不要用 handle_path,要保留前缀
    reverse_proxy /seafdav/* seafile:8080 {
        header_up Host {host}
        header_up X-Real-IP {remote_host}
        header_up X-Forwarded-For {remote_host}
        header_up X-Forwarded-Proto {scheme}
    }

    # 3. 基础界面转发
    reverse_proxy seafile:80
}

启动:

alias re-sea="(cd /data/seafile && docker compose down && docker compose up -d) && (cd /data/caddy && docker compose down && docker compose up -d)"
source /root/.bashrc
re-sea