更新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)
- 修改监听80端口的server模块中url rewrite部分以及proxy_set_header部分
location / {
rewrite ^ https://domain.com:10002$request_uri? permanent;
}
.
.
.
proxy_set_header Host $host:10002;
- 根据443端口监听部分放置ssl证书和私钥文件
ssl_certificate /shared/ssl/fullchain.cer;
ssl_certificate_key /shared/ssl/private.key;
- 访问https://domain.com:10002,以管理员账号登录,点击右上角头像进入“系统管理”,输入密码后左侧点击“设置”
修改以下部分 (如果修改错误的话,会无法正常使用网页界面和下载/上传文件)
SERVICE_URL https://domain.com:10002
FILE_SERVER_ROOT https://domain.com:10002/seafhttp
- 修改/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 利用存储去重技术来减少存储资源的利用。 简单来说,这包含如下两层含义:
- 不同版本的文件或许会共享一些数据块。
- 不同的资料库也或许会共享一些数据块。
垃圾回收程序将会清理如下两种无用数据块:
- 未被资料库所引用的数据块即数据块属于被删除的资料库。
- 设置了历史长度限制的资料库的过期数据块。
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
- 默认支持保存文件历史,方便回滚
主要缺点:
- 数据基于分块存储,意味着不能在服务器上直接查看&备份原始文件
- 基于分块存储,随着使用会不可避免地产生垃圾数据块
版权属于:Zakikun
本文链接:https://blog.zakikun.com/archives/18.html
本文采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。
您可以自由的转载和修改,但请务必注明文章来源并且不可用于商业目的。