ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Linux|运维|最新版seafile私有网盘社区版部署-2026

Linux|运维|最新版seafile私有网盘社区版部署-2026 前言Seafile是一个由北京海文互知网络有限公司开发的企业级私有云存储与协作平台专注于文件同步、共享和跨平台访问发布于2012年10月。 其产品起源于创始人清华实验室时期在开源版本基础上提供企业版解决方案2013年获得经纬中国天使轮投资。 Seafile支持Windows、Mac、Linux、Android和iOS全平台客户端提供文件同步、在线协同编辑、Wiki知识管理、细粒度权限控制及端到端加密等功能。 Seafile 在全球范围内被众多机构和企业信赖 阿里巴巴集团卡巴斯基实验室Kaspersky Lab柏林洪堡大学中国平安德国 Mainz 大学法国 Strasbourg 大学德国 Max Planck 科学院芬兰 Turku 大学Seafile 最适合以下几类用户/组织 企业与团队私有网盘对数据隐私有要求、不能使用公有云的组织政企、金融、科研、医疗跨设备文件同步个人或多设备用户希望替代 Dropbox/Google Drive数据自主可控大文件协作场景媒体制作、工程设计、科研数据——这些场景文件大、协作频繁Seafile 的块级增量同步优势明显信创/国产化环境Seafile 支持国产操作系统和数据库可作为信创替代方案​ seafile 作为技术底座很多国产化网盘、企业知识库产品基于 Seafile 做二次开发Seafile 分两个版本 社区版和专业版适用范围如下版本协议适用对象核心能力社区版Community Edition​AGPLv3 开源个人、开发者、小团队文件同步、版本控制、团队共享、基础协作专业版Professional Edition​需购买授权中大型企业全文搜索、细粒度权限、高可用集群、S3 存储集成、审计日志、防病毒、技术支持seafile专业版三用户及以下免费无需 license 文件所有专业版功能完整开放且无时间限制永久性免费不是 30 天试用管理员算 1 个用户系统安装时创建的管理员账号计入 3 个用户名额之内按用户数阶梯订阅制 用户数年费USD教育优惠USD≤ 3 用户​免费​免费9 用户​总价 $100/年​总价 $100/年10-249 用户​$48/用户/年$24/用户/年250-499 用户​$44/用户/年$22/用户/年500-749 用户​$40/用户/年$18/用户/年750-999 用户​$35/用户/年$16/用户/年1000 用户​联系销售定制联系销售定制教育行业享 50% 折扣公共机构享 25% 折扣​9 用户 $100/年的特殊优惠这是面向小企业的特别包价相当于每个用户每年约 $11比 10 用户的阶梯价便宜近 4 倍本例部署的为社区版seafile据官网所说12版本以上建议使用docker compose 编排容器化部署因此本例采用docker compose 编排容器化部署二进制部署不做过多介绍。一、环境初始化这里需要着重强调一下docker的版本docker20.10.10以上版本对SECCOMP更为友好因此在centos7操作系统下docker的版本至少是20.10.10这样的话runc版本才是1.1以上很多内核参数容器就不会拦截了docker的版本和runc的版本如下[rootlocalhost ~]# docker -v Docker version 20.10.19, build d85ef84 [rootlocalhost ~]# runc -v runc version 1.1.4 commit: v1.1.4-0-g5fd4c4d1 spec: 1.0.2-dev go: go1.18.7 libseccomp: 2.5.1如果确实只想用低版本的docker那么需要添加配置#security_opt: # - seccomp:unconfinedokdocker的安装就不在这里多余说了如果不想多余折腾用下面的阿里云源即可[docker-ce-stable] nameDocker CE Stable - $basearch baseurlhttps://mirrors.aliyun.com/docker-ce/linux/centos/7/$basearch/stable enabled1 gpgcheck1 gpgkeyhttps://mirrors.aliyun.com/docker-ce/linux/centos/gpg同时把compose容器编排也安装了yum install docker-compose-plugin docker-ce -y本例中docker compose是作为插件安装的安装路径和版本如下[rootlocalhost ~]# rpm -ql docker-compose-plugin /usr/libexec/docker/cli-plugins/docker-compose /usr/share/doc/docker-compose-plugin-2.27.1 /usr/share/doc/docker-compose-plugin-2.27.1/LICENSE /usr/share/doc/docker-compose-plugin-2.27.1/MAINTAINERS /usr/share/doc/docker-compose-plugin-2.27.1/NOTICE /usr/share/doc/docker-compose-plugin-2.27.1/README.md /usr/share/licenses/docker-compose-plugin-2.27.1 /usr/share/licenses/docker-compose-plugin-2.27.1/LICENSE /usr/share/licenses/docker-compose-plugin-2.27.1/NOTICE [rootlocalhost ~]# file /usr/libexec/docker/cli-plugins/docker-compose /usr/libexec/docker/cli-plugins/docker-compose: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), not stripped [rootlocalhost ~]# docker compose version Docker Compose version v2.27.1 [rootlocalhost ~]# ldd /usr/libexec/docker/cli-plugins/docker-compose linux-vdso.so.1 (0x00007ffc4f3de000) libresolv.so.2 /lib64/libresolv.so.2 (0x00007f5bac9da000) libpthread.so.0 /lib64/libpthread.so.0 (0x00007f5bac7be000) libc.so.6 /lib64/libc.so.6 (0x00007f5bac3f0000) /lib64/ld-linux-x86-64.so.2 (0x00007f5bacbf3000)最后一个环境问题libseccomp 2.3.1是centos7所能支撑到的最终版本但该库版本有点过低导致profile规则名单内放行了比如clone3规则但内核库libseccomp不认识该内核底层函数仍然拦截导致容器启动不成功查阅了很多资料最终还是确定了一点必须要升级此库可以从centos8源内下载后本地安装即可wget https://mirrors.aliyun.com/centos/8-stream/BaseOS/x86_64/os/Packages/libseccomp-2.5.2-1.el8.x86_64.rpm yum localinstall -y libseccomp-2.5.2-1.el8.x86_64.rpmok基础环境就搭建好了总结一下docker runtime环境libseccomp-2.5.2-1.el8.x86_64.rpm升级安装docker-compose-plugin插件安装就完事了二、正式部署seafile私有网盘首先从官网下载docker compose 容器编排 配置文件env是整个项目的环境变量可以定义开放端口MySQL的密码等等在初始化seafile-server组件的时候这些环境变量会自动注入seafile-server.yml 是compose编排文件读取env的环境变量这个文件管理三个容器分别是MySQLseafile-serverredisseadoc.yml 也是compose的编排文件这个使用的是轩辕镜像站的镜像因此nginx的配置文件后面需要修改一下否则文档功能会有问题后面会详细说明。caddy这个是https证书管理需要有DNS可解析域名一般环境变量里不使用即可# 1. 下载 .env环境变量模板 wget -O .env https://manual.seafile.com/13.0/repo/docker/ce/env # 2. 下载 seafile-server.yml核心编排文件Seafile MariaDB Redis wget https://manual.seafile.com/13.0/repo/docker/ce/seafile-server.yml # 4.可选下载 seadoc.ymlSeaDoc 在线协同文档 wget https://manual.seafile.com/13.0/repo/docker/seadoc.yml准备镜像非官方的从轩辕镜像下载的这个要一会重新适配docker pull docker.xuanyuan.run/seafileltd/sdoc-server:2.0-latest编辑.env文件需要编辑的地方全部是中文标记cat .env ################################# # Docker compose configurations # ################################# COMPOSE_FILEseafile-server.yml,seadoc.yml#docker容器编排使用哪些文件seadoc如果不想使用可以删除 COMPOSE_PATH_SEPARATOR, ## Images SEAFILE_IMAGEseafileltd/seafile-mc:13.0-latest SEAFILE_DB_IMAGEmariadb:10.11 SEAFILE_REDIS_IMAGEredis SEAFILE_CADDY_IMAGElucaslorentz/caddy-docker-proxy:2.12-alpine SEADOC_IMAGEseafileltd/sdoc-server:2.0-latest NOTIFICATION_SERVER_IMAGEseafileltd/notification-server:13.0-latest MD_IMAGEseafileltd/seafile-md-server:13.0-latest ## Persistent Storage BASIC_STORAGE_PATH/data#这个是容器持久化目录定义所有持久化文件放在/data目录下 SEAFILE_VOLUME$BASIC_STORAGE_PATH/seafile-data SEAFILE_MYSQL_VOLUME$BASIC_STORAGE_PATH/seafile-mysql/db SEAFILE_CADDY_VOLUME$BASIC_STORAGE_PATH/seafile-caddy SEADOC_VOLUME$BASIC_STORAGE_PATH/seadoc-data ################################# # Startup parameters # ################################# SEAFILE_SERVER_HOSTNAME部署服务器的IP端口我这里使用的是10086:10086 SEAFILE_SERVER_PROTOCOLhttp TIME_ZONEAsia/Shanghai #这个是国产化时区改成中国的 JWT_PRIVATE_KEY$(pwgen -s 40 1 2/dev/null || openssl rand -hex 20)#这里不改安全用的 ##################################### # Third-party service configuration # ##################################### ## Database SEAFILE_MYSQL_DB_HOSTdb SEAFILE_MYSQL_DB_USERseafile SEAFILE_MYSQL_DB_PASSWORD#自定义密码 SEAFILE_MYSQL_DB_CCNET_DB_NAMEccnet_db SEAFILE_MYSQL_DB_SEAFILE_DB_NAMEseafile_db SEAFILE_MYSQL_DB_SEAHUB_DB_NAMEseahub_db ## Cache CACHE_PROVIDERredis # or memcached ### Redis REDIS_HOSTredis REDIS_PORT6379 REDIS_PASSWORD ### Memcached MEMCACHED_HOSTmemcached MEMCACHED_PORT11211 ###################################### # Initial variables # # (Only valid in first-time startup) # ###################################### ## Database root password, Used to create Seafile users INIT_SEAFILE_MYSQL_ROOT_PASSWORDShiguang_32 ## Seafile admin user INIT_SEAFILE_ADMIN_EMAIL#自定义邮箱后面登陆就这个用户了126.com INIT_SEAFILE_ADMIN_PASSWORD#登陆密码 自定义密码 ############################################ # Additional configurations for extensions # ############################################ ## SeaDoc service ENABLE_SEADOCtrue ## Notification ENABLE_NOTIFICATION_SERVERfalse NOTIFICATION_SERVER_URL ## Seafile AI #这里没有部署大模型因此选择不接入false如果有可以配置 ENABLE_SEAFILE_AIfalse ENABLE_FACE_RECOGNITIONfalse SEAFILE_AI_LLM_TYPEopenai SEAFILE_AI_LLM_URL SEAFILE_AI_LLM_KEY # your llm key SEAFILE_AI_LLM_MODELgpt-4o-mini ## Metadata server MD_FILE_COUNT_LIMIT100000seafile-server.yml 只需要更改端口和上面的端口呼应即可env里设置的是10086因此这个文件里也改成10086[rootlocalhost ~]# cat seafile-server.yml services: db: image: ${SEAFILE_DB_IMAGE:-mariadb:10.11} #security_opt: # - seccomp:unconfined container_name: seafile-mysql restart: unless-stopped environment: - MYSQL_ROOT_PASSWORD${INIT_SEAFILE_MYSQL_ROOT_PASSWORD:-} - MYSQL_LOG_CONSOLEtrue - MARIADB_AUTO_UPGRADE1 volumes: - ${SEAFILE_MYSQL_VOLUME:-/opt/seafile-mysql/db}:/var/lib/mysql networks: - seafile-net healthcheck: test: [ CMD, /usr/local/bin/healthcheck.sh, --connect, --mariadbupgrade, --innodb_initialized, ] interval: 20s start_period: 30s timeout: 5s retries: 10 redis: image: ${SEAFILE_REDIS_IMAGE:-redis} #security_opt: # - seccomp:unconfined container_name: seafile-redis restart: unless-stopped command: - /bin/sh - -c - exec redis-server --requirepass $$REDIS_PASSWORD --save --appendonly no environment: - REDIS_PASSWORD${REDIS_PASSWORD:-} networks: - seafile-net seafile: image: ${SEAFILE_IMAGE:-seafileltd/seafile-pro-mc:13.0-latest} #security_opt: # - seccomp:unconfined ports: - 10086:80 container_name: seafile restart: unless-stopped # ports: # - 80:80 volumes: - ${SEAFILE_VOLUME:-/opt/seafile-data}:/shared environment: - SEAFILE_MYSQL_DB_HOST${SEAFILE_MYSQL_DB_HOST:-db} - SEAFILE_MYSQL_DB_PORT${SEAFILE_MYSQL_DB_PORT:-3306} - SEAFILE_MYSQL_DB_USER${SEAFILE_MYSQL_DB_USER:-seafile} - SEAFILE_MYSQL_DB_PASSWORD${SEAFILE_MYSQL_DB_PASSWORD:?Variable is not set or empty} - INIT_SEAFILE_MYSQL_ROOT_PASSWORD${INIT_SEAFILE_MYSQL_ROOT_PASSWORD:-} - SEAFILE_MYSQL_DB_CCNET_DB_NAME${SEAFILE_MYSQL_DB_CCNET_DB_NAME:-ccnet_db} - SEAFILE_MYSQL_DB_SEAFILE_DB_NAME${SEAFILE_MYSQL_DB_SEAFILE_DB_NAME:-seafile_db} - SEAFILE_MYSQL_DB_SEAHUB_DB_NAME${SEAFILE_MYSQL_DB_SEAHUB_DB_NAME:-seahub_db} - TIME_ZONE${TIME_ZONE:-Etc/UTC} - INIT_SEAFILE_ADMIN_EMAIL${INIT_SEAFILE_ADMIN_EMAIL:-meexample.com} - INIT_SEAFILE_ADMIN_PASSWORD${INIT_SEAFILE_ADMIN_PASSWORD:-asecret} - SEAFILE_SERVER_HOSTNAME${SEAFILE_SERVER_HOSTNAME:?Variable is not set or empty} - SEAFILE_SERVER_PROTOCOL${SEAFILE_SERVER_PROTOCOL:-http} - SITE_ROOT${SITE_ROOT:-/} - NON_ROOT${NON_ROOT:-false} - JWT_PRIVATE_KEY${JWT_PRIVATE_KEY:?Variable is not set or empty} - SEAFILE_LOG_TO_STDOUT${SEAFILE_LOG_TO_STDOUT:-false} - ENABLE_GO_FILESERVER${ENABLE_GO_FILESERVER:-true} - ENABLE_SEADOC${ENABLE_SEADOC:-true} - SEADOC_SERVER_URL${SEAFILE_SERVER_PROTOCOL:-http}://${SEAFILE_SERVER_HOSTNAME:?Variable is not set or empty}/sdoc-server - CACHE_PROVIDER${CACHE_PROVIDER:-redis} - REDIS_HOST${REDIS_HOST:-redis} - REDIS_PORT${REDIS_PORT:-6379} - REDIS_PASSWORD${REDIS_PASSWORD:-} - MEMCACHED_HOST${MEMCACHED_HOST:-memcached} - MEMCACHED_PORT${MEMCACHED_PORT:-11211} - ENABLE_NOTIFICATION_SERVER${ENABLE_NOTIFICATION_SERVER:-false} - INNER_NOTIFICATION_SERVER_URL${INNER_NOTIFICATION_SERVER_URL:-http://notification-server:8083} - NOTIFICATION_SERVER_URL${NOTIFICATION_SERVER_URL:-${SEAFILE_SERVER_PROTOCOL:-http}://${SEAFILE_SERVER_HOSTNAME:?Variable is not set or empty}/notification} - ENABLE_SEAFILE_AI${ENABLE_SEAFILE_AI:-false} - ENABLE_FACE_RECOGNITION${ENABLE_FACE_RECOGNITION:-false} - SEAFILE_AI_SERVER_URL${SEAFILE_AI_SERVER_URL:-http://seafile-ai:8888} - SEAFILE_AI_SECRET_KEY${JWT_PRIVATE_KEY:?Variable is not set or empty} - MD_FILE_COUNT_LIMIT${MD_FILE_COUNT_LIMIT:-100000} labels: caddy: ${SEAFILE_SERVER_PROTOCOL:-http}://${SEAFILE_SERVER_HOSTNAME:?Variable is not set or empty} caddy.reverse_proxy: {{upstreams 80}} healthcheck: test: [CMD-SHELL, curl -f http://localhost:80 || exit 1] interval: 30s timeout: 10s retries: 3 start_period: 10s depends_on: db: condition: service_healthy redis: condition: service_started networks: - seafile-net networks: seafile-net: name: seafile-netseadoc.yml 文件不需要太多修改镜像直接用轩辕的镜像就可以了只是一会要把seadoc的端口配置到nginx里即可services: seadoc: image: docker.xuanyuan.run/seafileltd/sdoc-server:2.0-latest #image: ${SEADOC_IMAGE:-seafileltd/sdoc-server:2.0-latest} container_name: seadoc #security_opt: # - seccomp:unconfined restart: unless-stopped volumes: - ${SEADOC_VOLUME:-/data/seadoc-data/}:/shared #ports: # - 80:80 environment: - DB_HOST${SEAFILE_MYSQL_DB_HOST:-db} - DB_PORT${SEAFILE_MYSQL_DB_PORT:-3306} - DB_USER${SEAFILE_MYSQL_DB_USER:-seafile} - DB_PASSWORD${SEAFILE_MYSQL_DB_PASSWORD:?Variable is not set or empty} - DB_NAME${SEADOC_MYSQL_DB_NAME:-${SEAFILE_MYSQL_DB_SEAHUB_DB_NAME:-seahub_db}} - TIME_ZONE${TIME_ZONE:-Etc/UTC} - JWT_PRIVATE_KEY${JWT_PRIVATE_KEY:?Variable is not set or empty} - NON_ROOT${NON_ROOT:-false} - SEAHUB_SERVICE_URL${SEAHUB_SERVICE_URL:-http://seafile} labels: caddy: ${SEAFILE_SERVER_PROTOCOL:-http}://${SEAFILE_SERVER_HOSTNAME:?Variable is not set or empty} caddy.1_handle_path: /socket.io/* caddy.1_handle_path.0_rewrite: * /socket.io{uri} caddy.1_handle_path.1_reverse_proxy: {{upstreams 80}} caddy.2_handle_path: /sdoc-server/* caddy.2_handle_path.0_rewrite: * {uri} caddy.2_handle_path.1_reverse_proxy: {{upstreams 80}} depends_on: db: condition: service_healthy networks: - seafile-net networks: seafile-net: name: seafile-netnginx配置文件修改主要是把seadoc的7070端口配置好配置文件注入后重启seafile-server里的nginx就可以了cat EOF | docker exec -i seafile tee /etc/nginx/sites-enabled/seafile.nginx.conf server { listen 80; client_max_body_size 10m; location / { proxy_pass http://127.0.0.1:8000/; proxy_read_timeout 310s; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $server_name; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Connection ; proxy_http_version 1.1; add_header Access-Control-Allow-Origin *; client_max_body_size 0; access_log /shared/seafile/logs/seahub.access.log seafileformat; error_log /shared/seafile/logs/seahub.error.log; } location /seafhttp { rewrite ^/seafhttp(.*)$ $1 break; proxy_pass http://127.0.0.1:8082; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 0; proxy_read_timeout 36000s; proxy_buffering off; proxy_request_buffering off; access_log /shared/seafile/logs/seafhttp.access.log seafileformat; error_log /shared/seafile/logs/seafhttp.error.log; } location /seafdav { rewrite ^/seafdav$ /seafdav/ permanent; } location /seafdav/ { proxy_pass http://127.0.0.1:8080/seafdav/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $server_name; proxy_read_timeout 1200s; client_max_body_size 0; access_log /shared/seafile/logs/seafdav.access.log seafileformat; error_log /shared/seafile/logs/seafdav.error.log; } location /:dir_browser { proxy_pass http://127.0.0.1:8080/:dir_browser; } location /media { root /opt/seafile/seafile-server-latest/seahub; } # SeaDoc 反代 location /sdoc-server/ { proxy_pass http://seadoc:7070/; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $server_name; proxy_set_header X-Forwarded-Proto $scheme; client_max_body_size 100m; } location /socket.io { proxy_pass http://seadoc:7070; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; } } EOF docker exec seafile nginx -s reload在启动前镜像拉取配置[rootlocalhost ~]# cat /etc/docker/daemon.json {registry-mirrors: [ https://docker.m.daocloud.io, https://dockerproxy.com, https://docker.mirrors.ustc.edu.cn, https://docker.nju.edu.cn, https://hub-mirror.c.163.com, https://xuanyuan.cloud, https://mirror.baidubce.com ] }以上配置好后重启dockerseadoc镜像需要单独到轩辕镜像拉取镜像准备好后就可以启动docker compose的容器组了[rootlocalhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE redis latest 0458cdd27215 13 days ago 146MB mariadb 10.11 1a3c5f4fdaa7 2 weeks ago 326MB seafileltd/seafile-mc 13.0-latest c61b3d647da4 5 weeks ago 1.65GB docker.xuanyuan.run/seafileltd/sdoc-server 2.0-latest a6cd4318bb58 8 months ago 1.14GBdocker compose 的三个编排相关文件放置在同一个目录下即可seafile-server.yml ,seadoc.yml .env 是这三个文件docker compose 的启停docker compose up -d #启动容器组 docker compose down #停止容器组 docker compose ps #查看容器组状态 docker compose restart #重启容器组输出如下[rootlocalhost ~]# docker compose ps #查看容器组状态 NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS seadoc docker.xuanyuan.run/seafileltd/sdoc-server:2.0-latest /sbin/my_init -- /s… seadoc 18 hours ago Up 17 hours 80/tcp seafile seafileltd/seafile-mc:13.0-latest /sbin/my_init -- /s… seafile 18 hours ago Up 17 hours (healthy) 0.0.0.0:10086-80/tcp, :::10086-80/tcp seafile-mysql mariadb:10.11 docker-entrypoint.s… db 18 hours ago Up 17 hours (healthy) 3306/tcp seafile-redis redis docker-entrypoint.s… redis 18 hours ago Up 17 hours 6379/tcp[rootlocalhost ~]# docker compose up -d [] Running 4/4 ✔ Container seafile-redis Running 0.0s ✔ Container seafile-mysql Healthy 10.8s ✔ Container seadoc Started 11.2s ✔ Container seafile Running[rootlocalhost ~]# docker compose down [] Running 5/5 ✔ Container seafile Removed 2.3s ✔ Container seadoc Removed 10.3s ✔ Container seafile-redis Removed 0.2s ✔ Container seafile-mysql Removed 0.2s ✔ Network seafile-net Removedok看镜像状态正常后打开浏览器输入服务器IP10086端口就可以登录seafile了新建一个sdoc文件如果该文件能正常打开表示seadoc文档系统没有问题如果不能打开请在执行一下上面的nginx配置镜像里没有自动注入只有手动注入了seafile默认是不开放注册的可以通过设置打开注册开关系统管理这里会校验一次密码okseafile社区版就这么简简单单的部署完毕了完结撒花~~~~~~~~~
返回列表