1. 编辑配置文件

version: '3.0'
services:
  db:
    image: mariadb:10.6
    container_name: seafile-mysql
    environment:
      - MYSQL_ROOT_PASSWORD=password  # Requested, set the root's password of MySQL service.
      - MYSQL_LOG_CONSOLE=true
    volumes:
      - /data/seafile/db:/var/lib/mysql  # Requested, specifies the path to MySQL data persistent store.
    networks:
      - seafile-net

  memcached:
    image: memcached:1.6.18
    container_name: seafile-memcached
    entrypoint: memcached -m 256
    networks:
      - seafile-net

  elasticsearch:
    image: elasticsearch:7.16.2
    container_name: seafile-elasticsearch
    environment:
      - discovery.type=single-node
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms1g -Xmx1g"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    mem_limit: 2g
    volumes:
      - /data/seafile/elasticsearch:/usr/share/elasticsearch/data  # Requested, specifies the path to Elasticsearch data persistent store.
    networks:
      - seafile-net

  seafile:
    image: docker.seafile.top/seafileltd/seafile-pro-mc:latest
    container_name: seafile
    ports:
      - "80:80"
#     - "443:443"  # If https is enabled, cancel the comment.
    volumes:
      - /data/seafile/data:/shared   # Requested, specifies the path to Seafile data persistent store.
      - /data/seafile/deps/seafile-controller:/opt/seafile/seafile-pro-server-10.0.9/seafile/bin/seafile-controller:rx
      - /data/seafile/deps/seaf-server:/opt/seafile/seafile-pro-server-10.0.9/seafile/bin/seaf-server:rx
      - /data/seafile/deps/licenseparse.py:/opt/seafile/seafile-pro-server-10.0.9/seahub/seahub/utils/licenseparse.py:rx      
    environment:
      - DB_HOST=db
      - DB_ROOT_PASSWD=password  # Requested, the value should be root's password of MySQL service.
      - TIME_ZONE=Asia/Shanghai # Optional, default is UTC. Should be uncomment and set to your local time zone.
      - SEAFILE_ADMIN_EMAIL=13502886986@139.com # Specifies Seafile admin user, default is 'me@example.com'
      - SEAFILE_ADMIN_PASSWORD=password     # Specifies Seafile admin password, default is 'asecret'
      - SEAFILE_SERVER_LETSENCRYPT=false   # Whether to use https or not
      - SEAFILE_SERVER_HOSTNAME=192.168.182.53 # Specifies your host name if https is enabled
    depends_on:
      - db
      - memcached
      - elasticsearch
    networks:
      - seafile-net

networks:
  seafile-net:

要调整 Elasticsearch 目录的权限,否则会提示无权限运行

mkdir /data/seafile/elasticsearch
chmod 777 /data/seafile/elasticsearch

最后通过容器启动云盘服务

docker-compose -f docker-compose.yml up

2. 更多配置项

2.1. 使用 Let's encrypt SSL 证书

如果把 SEAFILE_SERVER_LETSENCRYPT 设置为 true,该容器将会自动申请一个 letsencrypt 机构颁发的 SSL 证书,并开启 https 访问:

seafile:
    ...
    ports:
        - "80:80"
        - "443:443"
    ...
    environment:
        ...
        - SEAFILE_SERVER_LETSENCRYPT=true
        - SEAFILE_SERVER_HOSTNAME=seafile.example.com
        ...

使用SSL 证书用来持久化存储 Seafile 数据的目录为 /opt/seafile/seafile-data,创建 /opt/seafile/seafile-data/ssl 目录,然后拷贝证书文件和密钥文件到ssl目录下。
按照如下示例修改 Nginx 的配置文件/opt/seafile-data/nginx/conf/seafile.nginx.conf。不要更改该配置文件的文件名。

server {
    listen 80;
    server_name example.seafile.com default_server;
    location / {
        rewrite ^ https://$host$request_uri? permanent;
    }
}
 
server {
    listen 443;
    ssl on;
    ssl_certificate      /shared/ssl/your-ssl-crt.crt;
    ssl_certificate_key  /shared/ssl/your-ssl-key.key;
    ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;
    server_name example.seafile.com;
    ...

重新加载 Nginx 的配置文件。

docker exec -it seafile /usr/sbin/nginx -s reload

2.2. 查找日志

Seafile 容器中 Seafile 服务本身的日志文件存放在 /shared/logs/seafile 目录下,可以在宿主机上 Seafile 容器的卷目录中找到这些日志,例如:/data/seafile/data/logs/seafile
同样 Seafile 容器的系统日志存放在 /shared/logs/var-log 目录下,或者宿主机目录 /data/seafile/data/logs/var-log。

2.3. 增加新的管理员

确保各容器正常运行,然后执行以下命令:

docker exec -it seafile /opt/seafile/seafile-server-latest/reset-admin.sh

根据提示输入用户名和密码,您现在有了一个新的管理帐户。

seatable 新添加管理用户的方式和 seafile 不同,通过 seatable.sh superuser 的命令创建

3. 日常维护

3.1. 修改容器核心文件

替换容器中的核心启动文件。

  1. 查看启动的容器运行情况,记录对应的容器 ID 或名称
  2. 先停止云盘服务
  3. 删除或移动原有的核心启动文件
  4. 复制对应的核心文件到指定位置
  5. 启动云盘服务
  6. 保存为独立的本地镜像(后续启动就可以直接引用本地镜像了,已调整好的配置也不会改变)

以上操作时确保云盘容器处于正常运行状态

docker ps
docker exec -ti 36d7a9333316 /opt/seafile/seafile-pro-server-10.0.5/seahub.sh stop
docker exec -ti 36d7a9333316 /opt/seafile/seafile-pro-server-10.0.5/seafile.sh stop
docker exec -it 36d7a9333316 /bin/bash
rm /opt/seafile/seafile-pro-server-10.0.5/seafile/bin/seaf-server
rm /opt/seafile/seafile-pro-server-10.0.5/seafile/bin/seafile-controller
exit
docker cp /tmp/seaf-server \
36d7a9333316:/opt/seafile/seafile-pro-server-10.0.5/seafile/bin/seaf-server
docker cp /tmp/seafile-controller 、
36d7a9333316:/opt/seafile/seafile-pro-server-10.0.5/seafile/bin/seafile-controller
docker exec -ti 36d7a9333316 /opt/seafile/seafile-pro-server-10.0.5/seafile.sh start
docker exec -ti 36d7a9333316 /opt/seafile/seafile-pro-server-10.0.5/seahub.sh start
docker commit -m "seafile-pro-10.0.5" 36d7a9333316 seafile-pro:10.05
docker save -o seafile-pro-10.0.5.tar seafile-pro:10.0.5

3.2. 备份数据库

seafile 数据卷路径是 /data/seafile/data,备份数据存放到 /data/seafile/data/seafile-backup 目录下。先创建一个类似以下 /data/seafile/data/seafile-backup 的目录结构:

  • /data/seafile/data/seafile-backup
  • ---- databases/  用来存放 MySQL 容器的备份数据
  • ---- data/  用来存放 Seafile 容器的备份数据

要备份的数据文件:

  • /opt/seafile-data/seafile/conf  # configuration files
  • /opt/seafile-data/seafile/seafile-data # data of seafile
  • /opt/seafile-data/seafile/seahub-data # data of seahub

建议每次将数据库备份到一个单独的文件中。至少在一周内不要覆盖旧的数据库备份。

cd /data/seafile/data/seafile-backup/databases
docker exec -it seafile-mysql mysqldump  -uroot -p** --opt ccnet_db > ccnet_db.sql
docker exec -it seafile-mysql mysqldump  -uroot -p** --opt seafile_db > seafile_db.sql
docker exec -it seafile-mysql mysqldump  -uroot -p** --opt seahub_db > seahub_db.sql

3.3. 备份 Seafile 资料库数据

#直接复制整个数据目录
cp -R /opt/seafile/seafile-data/seafile  /opt/seafile-backup/data/
cd /opt/seafile/seafile-backup/data && rm -rf ccnet
#使用 rsync 执行增量备份
rsync -az /opt/seafiel/seafile-data/seafile /opt/seafile-backup/data/
cd /opt/seafile/seafile-backup/data && rm -rf ccnet

3.4. 恢复数据库

docker cp /data/seafile/data/seafile-backup/databases/ccnet_db.sql \
seafile-mysql:/tmp/ccnet_db.sql
docker cp /data/seafile/data/seafile-backup/databases/seafile_db.sql \
seafile-mysql:/tmp/seafile_db.sql
docker cp /data/seafile/data/seafile-backup/databases/seahub_db.sql \
seafile-mysql:/tmp/seahub_db.sql
docker exec -it seafile-mysql /bin/sh \
-c "mysql -uroot -p** ccnet_db < /tmp/ccnet_db.sql"
docker exec -it seafile-mysql /bin/sh \
-c "mysql -uroot -p** seafile_db < /tmp/seafile_db.sql"
docker exec -it seafile-mysql /bin/sh \
-c "mysql -uroot -p** seahub_db < /tmp/seahub_db.sql"

3.5. 恢复 seafile 数据

cp -R /opt/seafile-backup/data/* /opt/seafile-data/seafile/

3.6. 应用新镜像

参照完成自定义镜像的配置后将新镜像保存到本地并离线到另一台容器主机上加载后,如果直接使用步骤1的容器配置文件加载容器是无法正常启动的。

主要原因是新保存的离线镜像文件是以启动后的镜像为模板生成的(也就是说已经存在了配置文件),而新加载的离线容器是不存在配置文件的,并且它不会自动生成配置文件(因为新镜像不是初始镜像)。

如果新配置的镜像无法正常启动,可以按照以下的方式重新调整

  1. 修改 yml 配置文件中 seafile 的镜像为官方原始镜像
  2. 启动容器镜像。此时容器会通过官网镜像自动生成对应的配置文件
  3. 停止容器,修改镜像配置文件为新的离线镜像
  4. 启动离线镜像,此时新镜像就应用正常了

3.7. 通过 wget 下载文件

正常情况下通过 wget 直接下载分享的文件后,保存到本地的文件会以“index.html”保存,可以通过以下的方式下载

wget --content-disposition "url?raw=1" (or dl=1)

3.8. 关闭 seafile 自带的 PDF 预览

找到  __init__.py 的 PREVIEW_FILEEXT 中的 PDF 这个字段注释掉即可

docker exec -it seafile sh
cd /opt/seafile/seafile-pro-server-12.0.11/seahub/seahub/utils
vim __init__.py
PREVIEW_FILEEXT = {
# PDF: (‘pdf’, ‘ai’),

3.9. 清理 Session

使用以下命令清理 Seahub 数据库中过期的会话记录:

cd seafile-server-latest
./seahub.sh python-env python3 seahub/manage.py clearsessions
提示:如果是docker部署,需要进入docker容器内的   /opt/seafile/seafile-server-latest 目录执行命令。

3.10. 使用clean_db_records 命令清理 seahub_db‘

使用以下命令可以同时清理 Activity、sysadmin_extra_userloginlog、FileAudit、FileUpdate、FileHistory、PermAudit、FileTrash 表中 90 天前的记录:

./seahub.sh python-env python3 seahub/manage.py clean_db_records

如果你愿意,也可以手动清理这些表,如下所示。

3.10.1. 文件活动 (Activity)

使用以下命令清理活动记录:

use seahub_db;
DELETE FROM Activity WHERE to_days(now()) - to_days(timestamp) > 90;
DELETE FROM UserActivity WHERE to_days(now()) - to_days(timestamp) > 90;

3.10.2. 登录

使用以下命令清理登录记录:

use seahub_db;
DELETE FROM sysadmin_extra_userloginlog WHERE to_days(now()) - to_days(login_date) > 90;

3.10.3. 文件访问

使用以下命令清理文件访问记录:

use seahub_db;
DELETE FROM FileAudit WHERE to_days(now()) - to_days(timestamp) > 90;

3.10.4. 文件更新

使用以下命令清除文件更新记录:

use seahub_db;
DELETE FROM FileUpdate WHERE to_days(now()) - to_days(timestamp) > 90;

3.10.5. 权限

使用以下命令清理权限更改审核记录:


use seahub_db;
DELETE FROM PermAudit WHERE to_days(now()) - to_days(timestamp) > 90;

3.10.6. 文件历史

使用以下命令清理文件历史记录:

use seahub_db;
DELETE FROM FileHistory WHERE to_days(now()) - to_days(timestamp) > 90;

3.11. 清理过期的资料库数据

自 6.2 版本起,我们提供了清理 Seafile 数据库中过期资料库记录的命令,例如在资料库被删除后未立即删除的记录。这是因为用户可能会恢复已删除的资料库,所以在删除资料库时不能立即清除这些记录。

./seahub.sh python-env python3 seahub/manage.py clear_invalid_repo_data

该命令在 10.0 版本中得到了改进,包括:

  • 它会以小批量方式清理无效数据,避免在短时间内占用过多数据库资源。
  • Dry-run 模式:如果你只想查看有多少无效数据可以被删除,而不实际删除任何数据,可以使用 dry-run 选项,例如:
./seahub.sh python-env python3 seahub/manage.py clear_invalid_repo_data --dry-run=true

3.12. 清理资料库同步 Token

在 Seafile 数据库中有两个与资料库同步令牌相关的表:

  • RepoUserToken 包含用于资料库同步的认证令牌。注意,每个客户端(包括同步客户端和 SeaDrive)都会生成一个单独的令牌。
  • RepoTokenPeerInfo 包含关于每个客户端令牌的更多信息,例如客户端名称、IP 地址、最后同步时间等。

当你有许多同步客户端连接到服务器时,这两个表可能会包含大量记录。其中许多记录可能已不再使用。你可以通过以下 SQL 清理在最近一段时间未使用的令牌:

delete t,i from RepoUserToken t, RepoTokenPeerInfo i where t.token=i.token and sync_time < xxxx;

xxxx 是 UNIX 时间戳,表示要删除该时间之前的令牌。为了安全起见,你可以先检查将要删除多少令牌:

select * from RepoUserToken t, RepoTokenPeerInfo i where t.token=i.token and sync_time < xxxx;

4. 集成 onlyoffice

【可选】集成 onlyoffice,在 docker-compose 的配置文件中增加以下的内容

services:
...
  oods:
    image: onlyoffice/documentserver:latest
    container_name: seafile-oods
    ports:
      - "127.0.0.1:9000:80"
    volumes:
      - ./seafile-oods/DocumentServer/logs:/var/log/onlyoffice
      - ./seafile-oods/DocumentServer/data:/var/www/onlyoffice/Data
      - ./seafile-oods/DocumentServer/lib:/var/lib/onlyoffice
      - ./seafile-oods/DocumentServer/local-production-linux.json:/etc/onlyoffice/documentserver/local-production-linux.json
    networks:
      - seafile-net
    environment:
      - JWT_ENABLED=true
      - JWT_SECRET=fddafxkloiuioujklss # 保护文档不被未经授权访问
...

新建需要的目录,配置自动保存功能

cd /opt/seafile
mkdir -p seafile-oods/DocumentServer/
vim seafile-oods/DocumentServer/local-production-linux.json
{
  "services": {
    "CoAuthoring": {
      "autoAssembly": {
        "enable": true,
        "interval": "5m"
      }
    }
  },
  "FileConverter": {
    "converter": {
      "downloadAttemptMaxCount": 1
    }
  }
}

编辑seafile配置文件并加入对应的配置

vim /opt/seafile/seafile-data/seafile/conf/seahub_settings.py
ENABLE_ONLYOFFICE = True
VERIFY_ONLYOFFICE_CERTIFICATE = True
ONLYOFFICE_APIJS_URL = 'https://onlyoffice.example.com/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')
ONLYOFFICE_JWT_SECRET = 'fddafxkloiuioujklss'

调整 Nginx 配置

upstream docservice {
    server 127.0.0.1:9000;
}

map $http_host $this_host {
    "" $host;
    default $http_host;
}

map $http_x_forwarded_proto $the_scheme {
     default $http_x_forwarded_proto;
     "" $scheme;
}

map $http_x_forwarded_host $the_host {
    default $http_x_forwarded_host;
    "" $this_host;
}

map $http_upgrade $proxy_connection {
    default upgrade;
    "" close;
}

server {
    listen 80;
    server_name onlyoffice.example.com; # 与ONLYOFFICE_APIJS_URL对应
    client_max_body_size 0;

    location / {
        proxy_pass http://docservice;
        proxy_http_version 1.1;
        proxy_read_timeout 3600s;
        proxy_connect_timeout 3600s;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $proxy_connection;
        proxy_set_header X-Forwarded-Host $the_host;
        proxy_set_header X-Forwarded-Proto $the_scheme;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

5. 参考

  • 无标签

0 评论

你还没有登录。你所做的任何更改会将作者标记为匿名用户。 如果你已经拥有帐户,请登录