更新1:建议数据库不要使用windows版,内建到Docker内作为独立容器运行

环境

物理主机系统: Windows server 2019 Datecenter (v1809, 17763.805)
Docker: Docker for windows 2.2.0.3 (Engine: 19.03.5, Compose: 1.25.4)
Mariadb: Docker (mariadb:latest)
Nginx: Docker (nginx:latest)
Seafile: Pro专业版(docker.seafile.top/seafileltd/seafile-pro-mc:latest)
#可选
Onlyoffice-documentserver: Docker镜像(onlyoffice/documentserver:latest)
Docker for windows

安装是全自动创建Docker Host的Hyper-V虚拟机

Mariadb Docker

此处采用compose 3.0+让容器间通过同一个虚拟子网实现互通

docker network create shared

Mariadb Compose (db.yml)
version: "3"

services:

  mariadb:
    image: mariadb:latest
    container_name: mariadb
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --innodb-flush-method=fsync            #设置服务器字符集, 服务器连接排序规则, 以及innodb引擎flush方式
    environment:
      - MYSQL_ROOT_PASSWORD=password  # 必须, 设置root账号的密码
      - MYSQL_LOG_CONSOLE=true
    volumes:
      - /C/Docker/mariadb:/var/lib/mysql  # 必须, 持久化存储数据文件
      - /C/Docker/mariadb-conf/my.cnf:/etc/my.cnf #外挂my.cnf方便配置Mariadb
    restart: unless-stopped
    networks:
      - default
# 一并部署phpmyadmin方便通过Web操作
  phpmyadmin:
    image: phpmyadmin/phpmyadmin:4.9.4
    container_name: phpmyadmin
    environment:
      - PMA_ARBITRARY=1      # 允许pma访问不同数据库
      - PMA_HOST=mariadb    # 默认连接的数据库, 在同一子网内直接用service name代替
    restart: unless-stopped
    expose:
      - '80'
    networks:
      - default

networks:
  default:
    external:
      name: shared                #关键, 两个容器使用shared网络

保存, 加 -d 参数后台运行

docker-compose -f .\db.yml up -d

主体搭建部署

官方文档

使用Docker Compose可以一键搭建,具体参数自己酌情修改

注意:经过我个人一个月的使用, elasticsearch数据如果外挂到windows系统,可能会因为文件系统权限或其他我未知的原因不停产生error,导致log不断蚕食硬盘空间,建议内置

Seafile Compose (seafile.yml)
version: "3"

services:

  memcached:
    image: memcached:1.5.6
    container_name: seafile-memcached
    restart: unless-stopped
    entrypoint: memcached -m 256
    networks:
      - default                                        #定义默认网络

  elasticsearch:
    image: seafileltd/elasticsearch-with-ik:5.6.16
    container_name: seafile-elasticsearch
    restart: unless-stopped
    environment:
      - discovery.type=single-node
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms1g -Xmx1g"
    deploy:
      resources:
        limits:
          memory: 2048M                                #限制最大内存
    volumes:
      - elasticsearch-data:/usr/share/elasticsearch/data
    networks:
      - default                                        #定义默认网络

  seafile:
    image: docker.seafile.top/seafileltd/seafile-pro-mc:latest
    container_name: seafile
    restart: unless-stopped
    ports:
      - 10002:443                                #转发10002端口到seafile的443端口
    volumes:
      - D:/Docker/seafile/data:/shared                 #外挂Seafile主要的配置和数据文件
    environment:
      - DB_HOST=mariadb                                #数据库IP, 若容器互通自行修改对应名
      - DB_ROOT_PASSWD=rootpassword                    #数据库root密码
      - TIME_ZONE=Asia/Shanghai                        #时区, 默认不用修改
      - SEAFILE_ADMIN_EMAIL=example@gmail.com        #初始化seafile管理员账号
      - SEAFILE_ADMIN_PASSWORD=password                #初始化seafile管理员账号密码
      - SEAFILE_SERVER_LETSENCRYPT=false            #是否启用内建letsencrypt(自动申请、更新、部署证书)
      - SEAFILE_SERVER_HOSTNAME=domain.com            #seafile服务器域名(会影响后续配置文件生成)
    depends_on:
      - memcached
      - elasticsearch
    networks:
      - default                                        #定义默认网络

networks:
  default:
    external:
      name: shared                                #默认网络接入shared网络
  
volumes:
  elasticsearch-data:                            #将elasticsearch的数据内置并持久化

保存, 加 -d 参数后台运行

docker-compose -f .\seafile.yml up -d

出现如下信息,就可以通过 http://domain.com:10002 访问seafile的网页界面

Starting seahub at port 8000 ...
Seahub is started
Done.
启用HTTPS访问

Seafile的镜像默认会生成持久化的nginx配置文件 (在/shared/nginx/seafile.nginx.conf)

  1. 修改监听80端口的server模块中url rewrite部分以及proxy_set_header部分
location / {
        rewrite ^ https://domain.com:10002$request_uri? permanent;
    }
.
.
.
proxy_set_header Host $host:10002;
  1. 根据443端口监听部分放置ssl证书和私钥文件
ssl_certificate      /shared/ssl/fullchain.cer;
ssl_certificate_key  /shared/ssl/private.key;
  1. 访问https://domain.com:10002,以管理员账号登录,点击右上角头像进入“系统管理”,输入密码后左侧点击“设置”

修改以下部分 (如果修改错误的话,会无法正常使用网页界面和下载/上传文件)

Seafile-系统设置

SERVICE_URL                https://domain.com:10002
FILE_SERVER_ROOT        https://domain.com:10002/seafhttp
  1. 修改/shared/seafile/conf/seahub_settings.py,添加以下内容
USE_X_FORWARDED_HOST = True
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

至此,Seafile基本上就可以正常通过HTTPS访问使用

可选配置修改

官方文档

启用webdav

修改/shared/seafile/conf/seafdav.conf

[WEBDAV]
enabled = true
port = 8080
fastcgi = true
share_name = /seafdav
配置seafile.conf

可添加以下内容

[fileserver]
## Seafile tcp 端口 (不要修改该设置)
port = 8082

#设置用于服务 http 请求的线程数,默认值是10个线程
worker_threads = 30

# 取消上传文件大小限制, 默认最大为200M.
max_upload_size=0

# 取消下载文件大小限制, 默认最大为200M.
max_download_dir_size=0

#定义索引中并发线程的数量
#max_indexing_threads = 2

#Web界面上传文件时块大小(MB)
#fixed_block_size=2

#当用户上传文件时,文件服务器分配一个令牌来授权上传操作.该令牌默认有效期1小时,通过WAN上传大型文件时,上传时间可能会超过1小时,您可以将令牌到期时间更改为更大的值.
web_token_expire_time=3600

#从Web界面下载文件夹为zip存档时windows可能不支持UTF-8
windows_encoding = iso-8859-1

[database]
#连接池大小,默认100
max_connections = 200

[library_trash]
#资料库回收站清理周期
expire_days = 30

[history]
#对所有的资料库设置一个默认的文件历史保留天数
keep_days = 7
配置seahub_settings.py

官方文档

#启用断点续传
#限制:
#只支持重新上传;文件更新和文件夹上传无法断点续传
#只支持 Chrome, Firefox, IE 10+
ENABLE_RESUMABLE_FILEUPLOAD = True

# 开启邮件提醒服务 (用户重置密码, 管理员增加新用户, 管理员重置用户密码, 用户发送分享外链和上传外链)
# 启用587端口 TLS连接
#EMAIL_USE_TLS = True
# 启用465端口 SSL连接
#EMAIL_USE_SSL = True
EMAIL_USE_TLS = False
EMAIL_HOST = 'smtp.domain.com'            # smpt 服务器
EMAIL_HOST_USER = 'username@domain.com'    # 用户名和域名
EMAIL_HOST_PASSWORD = 'password'            # 密码
EMAIL_PORT = '25'                        # 端口
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
SERVER_EMAIL = EMAIL_HOST_USER

可选部分

集成Onlyoffice-documentserver
部署Onlyoffice documentserver

官方文档

(推荐) 或者将Onlyoffice-documentserver集成到同一个Compose文件中

Compose File (seafile-onlyoffice.yml)

version: "3"

services:

  memcached:
    image: memcached:1.5.6
    container_name: seafile-memcached
    restart: unless-stopped
    entrypoint: memcached -m 256
    networks:
      - default

  elasticsearch:
    image: seafileltd/elasticsearch-with-ik:5.6.16
    container_name: seafile-elasticsearch
    restart: unless-stopped
    environment:
      - discovery.type=single-node
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms1g -Xmx1g"
    deploy:
      resources:
        limits:
          memory: 2048M
    volumes:
      - elasticsearch-data:/usr/share/elasticsearch/data
    networks:
      - default

  seafile:
    image: docker.seafile.top/seafileltd/seafile-pro-mc:latest
    container_name: seafile
    restart: unless-stopped
    ports:
      - 10002:443
    volumes:
      - D:/Docker/seafile/data:/shared
    environment:
      - DB_HOST=192.168.9.13
      - DB_ROOT_PASSWD=password
      - TIME_ZONE=Asia/Shanghai
      - SEAFILE_ADMIN_EMAIL=example@gmail.com
      - SEAFILE_ADMIN_PASSWORD=password
      - SEAFILE_SERVER_LETSENCRYPT=false
      - SEAFILE_SERVER_HOSTNAME=domain.com
    depends_on:
      - memcached
      - elasticsearch
      - onlyoffice-document-server
      - onlyoffice-redis
    networks:
      - default

  onlyoffice-document-server:
    container_name: onlyoffice-documentserver
    image: onlyoffice/documentserver:latest
    stdin_open: true
    restart: unless-stopped
    environment:
      - ONLYOFFICE_HTTPS_HSTS_ENABLED=True                                    #启用HSTS
      - SSL_CERTIFICATE_PATH=/var/www/onlyoffice/Data/certs/fullchain.cer    #指定证书路径
      - SSL_KEY_PATH=/var/www/onlyoffice/Data/certs/private.key                #指定私钥路径
      - REDIS_SERVER_HOST=onlyoffice-redis
      - REDIS_SERVER_PORT=6379
    deploy:
      resources:
        limits:
          cpus: '0.50'                        #限制最大CPU占用率
          memory: 2048M                        #限制最大内存
    volumes:
      - D:/Docker/onlyoffice/DocumentServer/logs:/var/log/onlyoffice
      - D:/Docker/onlyoffice/DocumentServer/data:/var/www/onlyoffice/Data
      - D:/Docker/onlyoffice/DocumentServer/lib:/var/lib/onlyoffice
    ports:
      - 10005:443                            #服务访问端口, 80 HTTP, 443 HTTPS
    depends_on:
      - onlyoffice-redis
    networks:
      - seafile-net

  onlyoffice-redis:
    container_name: onlyoffice-redis
    image: redis
    restart: unless-stopped
    networks:
      - seafile-net
    expose:
      - '6379'

networks:
  default:
    external:
      name: shared                            #接入shared网络
  
volumes:
  elasticsearch-data:

通过访问https://domain.com:10005可以查看Document Server运行状况,显示Document Server is running表示成功

配置seahub_settings.py

添加以下内容

# 开启 Only Office 服务
ENABLE_ONLYOFFICE = True
VERIFY_ONLYOFFICE_CERTIFICATE = True
ONLYOFFICE_APIJS_URL = 'https://domain.com:10005/web-apps/apps/api/documents/api.js'
ONLYOFFICE_FILE_EXTENSION = ('doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx', 'odt', 'fodt', 'odp', 'fodp', 'ods', 'fods')
ONLYOFFICE_EDIT_FILE_EXTENSION = ('docx', 'pptx', 'xlsx')
重启Seahub

如果/shared/seafile/conf/seahub_settings.pyc已存在,删除该文件,运行命令重启Seahub (Seafile的网页端界面服务)

docker exec -it seafile /opt/seafile/seafile-server-latest/seahub.sh restart

数据备份

官方文档

数据库备份
通过计划任务 + PowerShell + 容器内shell脚本备份 (数据库在容器内运行)

/var/lib/mysql/backup.sh

#!/bin/bash
#创建backup目录并备份多个数据库
mkdir -p /var/lib/mysql/backup
cd /var/lib/mysql/backup
for i in ccnet_db seahub_db seafile_db;
do
    mkdir -p $i
    mysqldump --user=root --password=password $i > ./$i/$i"_"$(date +%Y%m%d_%H%M%S).sql
done

D:\database_backup\mariadbdump.ps1

#运行shell脚本, 复制.sql到备份盘, 清理backup目录
docker exec -it mariadb /var/lib/mysql/backup.sh
Copy-Item -Recurse -Path "C:\Docker\mariadb\backup\*" -Destination "D:\database_backup"
docker exec -it mariadb rm -r /var/lib/mysql/backup

设置Windows自带的计划任务,操作-启动程序-PowerShell,添加参数 D:\database_backup\mariadbdump.ps1

通过bat备份 (数据库在Windows系统上运行)
@title MySQL backup start
@echo off
setlocal enabledelayedexpansion
@color 0a
:: --------------------参数设置------------------------
:: 设置时间变量
set "Ymd=%date:~0,4%_%date:~5,2%_%date:~8,2%_%time:~0,2%_%time:~3,2%_%time:~6,2%"
:: 要备份的数据库名称,多个用空格分隔
set DATABASES=ccnet_db seafile_db seahub_db
:: HOST IP
set HOST=127.0.0.1
:: PROT 端口
set PROT=3306
:: MySQL 用户名
set USERNAME=root
:: MySQL 密码
set PASSWORD=password
:: MySQL Bin 目录,加 \
:: 如果可以直接使用 mysqldump(安装时添加 MySQL Bin 目录到了环境变量),此处留空即可
set MYSQL=
:: WinRAR 自带命令行工具的可执行文件路径,长文件名注意用 Dos 长文件名书写方式
set WINRAR=C:\Progra~1\WinRAR\Rar.exe
:: 备份天数
set DT=30
:: 备份放置的盘,加 \
set BACKUP_PATH=D:\
:: my.ini路径,加\
set MYINI=C:\mysql-winx64\
:: 备份放置的路径,加 \
set FILE=mysql_backup\
:: --------------------开始备份------------------------
for %%D in (%DATABASES%) do (
     if exist %BACKUP_PATH%%FILE%%%D (
        echo 目录%BACKUP_PATH%%FILE%%%D已存在,无需创建
    ) else (
        echo 创建%BACKUP_PATH%%FILE%%%D  
        md %BACKUP_PATH%%FILE%%%D
    )
    :: 备份
    mysqldump --opt --single-transaction=TRUE --user=%USERNAME% --password=%PASSWORD% --host=%HOST% --protocol=tcp --port=%PROT% --default-character-set=utf8 --single-transaction=TRUE --routines --events "%%D" > "%BACKUP_PATH%%FILE%%%D\%%D_%Ymd%.sql"
)
:: --------------------结束备份------------------------
@echo on
资料库数据备份

备份以下文件夹

/shared

数据恢复

恢复资料库数据

根据Seafile的部署volume,将/shared文件夹复制到对应路径

恢复数据库

建议使用命令行

mysql -u[username] -p[password] ccnet-db < ccnet-db.sql.2013-10-19-16-00-05
mysql -u[username] -p[password] seafile-db < seafile-db.sql.2013-10-19-16-00-20
mysql -u[username] -p[password] seahub-db < seahub-db.sql.2013-10-19-16-01-05

资料库修复&文件导出

官方文档

Seafile 服务器包含了 seafile-fsck 工具来帮助你恢复这些毁坏的对象(类似于git-fsck工具)。这个工具将会进行如下三项工作:

1. 检查 Seafile 内部对象的完整性,并且删除毁坏的对象。
2. 恢复所有受影响的资料库到最近一致,可用的状态。
3. 导出数据库。
seafile-server-latest/seaf-fsck.sh [--repair|-r] [repo_id_1] [repo_id_2] ...

seaf-fsck 有检查资料库完整性和修复损坏资料库两种运行模式。


检查资料库完整性

执行 seaf-fsck.sh 不加任何参数将以只读方式检查所有资料库的完整性。

seafile-server-latest/seaf-fsck.sh [library-id1] [library-id2] ...

修复损坏的资料库

fsck 修复损坏的资料库有如下两步流程:

1. 如果记录在数据库中的资料库当前状态无法在数据目录中找出,fsck 将会在数据目录中找到最近可用状态。
2. 检查第一步中可用状态的完整性。如果文件或目录损坏,fsck 将会将其置空并报告损坏的路径,用户便可根据损坏的路径来进行恢复操作。

执行如下命令来修复所有资料库:

seafile-server-latest/seaf-fsck.sh --repair

大多数情况下我们建议你首先以只读方式检查资料库的完整性,找出损坏的资料库后,执行如下命令来修复指定的资料库:

seafile-server-latest/seaf-fsck.sh --repair [library-id1] [library-id2] ...

seaf-fsck 会自动将改资料库的所有同步客户端解除同步。用户需要重新同步该资料库。seaf-fsck 也会在资料库的历史中添加一个损坏文件和目录的列表,便于用户找到损坏的路径。


将资料库导出到文件系统

4.2.0版本以后,您可以使用seaf-fsck将资料库中的所有文件导出到外部文件系统(如Ext4)。该程序不依赖于 seafile 数据库。只要你有 seafile-data 目录,你可以随时将文件从seafile导出到外部文件系统。

命令语法是

seafile-server-latest/seaf-fsck.sh --export top_export_path [library-id1] [library-id2] ...

参数 top_export_path 是放置导出文件的目录。每个资料库将导出为导出目录的子目录。如果不指定资料库的ID,将导出所有库。

目前只能导出未加密的资料库,加密资料库将被跳过。

垃圾清理&回收

Seafile 利用存储去重技术来减少存储资源的利用。 简单来说,这包含如下两层含义:

  • 不同版本的文件或许会共享一些数据块。
  • 不同的资料库也或许会共享一些数据块。

垃圾回收程序将会清理如下两种无用数据块:

  1. 未被资料库所引用的数据块即数据块属于被删除的资料库。
  2. 设置了历史长度限制的资料库的过期数据块。
Dry-run 模式

如果仅为了查看有多少垃圾可以回收而不进行删除操作,用 dry-run 选项:

seafile-server-latest/seaf-gc.sh --dry-run [repo-id1] [repo-id2] ...

删除垃圾数据块

运行垃圾回收程序,不加 --dry-run 选项来删除垃圾数据块:

seafile-server-latest/seaf-gc.sh [repo-id1] [repo-id2] ...

如果在参数中指定资料库 ID, 则程序只检查和删除指定的资料库。

正如前面所说,有两种类型的垃圾数据块可被回收,有时仅删除第一类无用数据块(属于删除的资料库)便可达到回收的目的,这种情况下,垃圾回收程序将不会检查未被删除的资料库,加入 “-r” 选项便可实现这个功能:

seafile-server-latest/seaf-gc.sh -r

结语

主要优点:

  • Seafile基于C语言,运行速度和稳定性都比基于PHP的NextCloud要好
  • 用户可创建加密数据库,所有数据在服务器加密
  • 数据在服务器上被分块存储,支持增量同步
  • 支持在线预览mp4电影,在线编辑txt、Markdown
  • 默认支持保存文件历史,方便回滚

主要缺点:

  • 数据基于分块存储,意味着不能在服务器上直接查看&备份原始文件
  • 基于分块存储,随着使用会不可避免地产生垃圾数据块
最后修改:2022 年 03 月 16 日
个人分享,随意打赏