如何基于 Docker 在服务器上部署 Seafile Community 版本

3,805 阅读6分钟

如何基于 Docker 在服务器上部署 Seafile Community 版本

软硬件环境

  • BCC Ubuntu 16.04
  • Seafile Community v6.3.4
  • Docker v18.09.1

什么是 Seafile

安全、可靠、快速的企业云盘 Seafile 是一款开源的企业云盘,注重可靠性和性能。支持 Windows, Mac, Linux, iOS, Android 平台。支持文件同步或者直接挂载到本地访问。

以上文案来自于官网,Seafile 官网

Seafile 有个开源的服务器部署版本,而且是支持 Docker 部署的,本着熟悉熟悉 Docker 的初衷,我踏上了折腾的不归路。

如何在服务器端部署 Seafile

大概可以分为以下步骤:

  1. 在服务器 Ubuntu 16.04 上安装并配置好 Docker
  2. 基于 Docker 部署 Nginx 服务器
  3. 基于 Docker 部署 Seafile Community version
  4. 开始使用吧~

在服务器 Ubuntu 16.04 上安装并配置 Docker

官方文档:Get Docker CE for Ubuntu

  • 卸载旧版本的 Docker,如果没有安装过,可忽略
sudo apt-get remove docker docker-engine docker.io containerd runc
  • 安装必备套件
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
  • 添加 Docker GPG Key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
  • 添加 Docker 的 repository
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
  • 开始安装 Docker CE
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
  • 检查 Docker CE 是否安装成功。如果运行成功,说明安装无误
sudo docker run hello-world
  • (可选)免 sudo 使用 Docker
  • (可选)配置阿里云的 Docker 镜像加速
  • (可选)使用 Docker 中国官方镜像加速

如何免 sudo 使用 Docker

sudo groupadd docker    # 新增 docker group
sudo gpasswd -a $USER docker        # 将 docker 添加到 docker group 中
sudo service docker restart         # 重启 docker 服务
newgrp - docker                 # 切换当前会话到新的 group

使用阿里云的 Docker 镜像加速器

使用阿里云的 Docker 镜像加速器,避免由于某些神秘原因导致的镜像下载过慢

  • 进入阿里云管理控制台,选择「容器镜像服务-镜像中心-镜像加速器」
  • 复制加速器地址,地址类似于:Xxxxx.mirror.aliyuncs.com
  • 配置镜像加速器。针对Docker客户端版本大于 1.10.0 的用户,可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://frsj7mun.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

使用 Docker 中国官方镜像加速

通过 Docker 官方镜像加速,中国区用户能够快速访问最流行的 Docker 镜像。

Docker 中国官方镜像加速

基于 Docker 部署 Nginx 服务器

服务器的端口号是有限的,而且默认都是使用 80 端口或 443 端口,使用 Docker 通过 Nginx 实现反向代理,配置多域名及多端口号。

将一级或者二级域名绑定在服务器 IP 上,

下载 Nginx 镜像

docker pull nginx

创建并启动 Nginx 容器

docker run –-name=nginx -p 80:80 -p 443:443 -v /nginx/conf.d:/etc/nginx/conf.d -d nginx

上述命令会创建一个名为 nginx 的容器,端口映射为 80-80、443-443,文件夹映射为本机 /nginx/conf.d/ 映射到镜像的 /etc/nginx/conf.d 文件夹,-d 表示在后台运行容器

配置 Nginx 的反向代理

  • 将域名(假定为 wangyongf.com)解析到服务器的 IP 上
  • 基于上述命令创建的容器,将虚拟目录映射到了容器内 Nginx 的配置文件目录,因此可以在服务器的 /nginx/conf.d 目录下创建容器的 Nginx 配置文件
cd /nginx/conf.d
sudo vim seafile.wangyongf.com.conf
  • 写入配置,内容如下:
server {
    listen       80;
    server_name wangyongf.com;      # 要解析进来域名
    location / {
       proxy_pass http://SERVER_LOCAL_IP:8001;  # 服务器本地ip:Seafile容器对外的端口号
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

服务器本地IP可以在云服务管理控制台看到,也可以在命令行直接查看。

请求的转发流程:

请求转发流程

基于 Docker 部署 Seafile Community version

官方文档:用 Docker 部署 Seafile 服务

快速运行 Seafile 服务容器

docker run -d --name seafile \
  -e SEAFILE_SERVER_HOSTNAME=seafile.wangyongf.com \
  -v /opt/seafile-data:/shared \
  -p 8001:80 \
  seafileltd/seafile:latest

自定义管理员用户名和密码

docker run -d --name seafile \
  -e SEAFILE_SERVER_HOSTNAME=seafile.wangyongf.com \
  -e SEAFILE_ADMIN_EMAIL=me@wangyongf.com \
  -e SEAFILE_ADMIN_PASSWORD=a_very_secret_password \
  -v /opt/seafile-data:/shared \
  -p 8001:80 \
  seafileltd/seafile:latest

启用 Seafile Docker 版本基于 Let's encrypt 的 SSL

docker run -d --name seafile \
  -e SEAFILE_SERVER_LETSENCRYPT=true \
  -e SEAFILE_SERVER_HOSTNAME=seafile.wangyongf.com \
  -e SEAFILE_ADMIN_EMAIL=me@wangyongf.com \
  -e SEAFILE_ADMIN_PASSWORD=a_very_secret_password \
  -v /opt/seafile-data:/shared \
  -p 8001:80 \
  -p 8002:443 \
  seafileltd/seafile:latest

修改 Seafile 服务的配置

Seafile 服务的配置会存放在 /shared/seafile/conf 目录下,你可以根据 Seafile 手册修改配置。

修改之后需要重启容器:

docker restart seafile

You're all set!

到了这里,应该配置 OK 了。我在文章里也提到了很多的官方文档,如果遇到了问题,可以查阅官方文档,或者借助 Google/Baidu

建议开启 Seafile 的 https 配置,如果只是安装玩玩,那么无所谓,如果是真的自己使用,最好启用 https,否则你的文件不太安全呀呀呀呀。

Docker Nginx 启用 Seafile 服务的 https

本文中讨论的都是基于 Docker 部署的 Nginx 服务,和服务器上直接安装可能会有些区别。

上文中也说了,Seafile 的 Docker 官方镜像可配置启用 https,但实际上,也可以在 Nginx 层就启用 https,然后反向代理的时候使用 http 亦可,我在实践的时候就是采用的这种方式。

Nginx Docker 层启用 seafile.wangyongf.com 的操作步骤如下(我的操作步骤):

  • 在服务器使用 apt 安装 Nginx 并配置 seafile.wangyongf.com 域名,使用 certbot 自动配置 lets-encrypt 证书
  • 将上述 certbot 自动生成 Nginx 配置移植到 /nginx/conf.d/seafile.wangyongf.com.conf 中,此时配置文件大概长这样:
server {
	listen 443 ssl;
	listen [::]:443 ssl ipv6only=on;
	server_name seafile.wangyongf.com;
	root /var/www/html;

	# ssl configurations
	ssl_certificate /ssl/live/seafile.wangyongf.com/fullchain.pem;
	ssl_certificate_key /ssl/live/seafile.wangyongf.com/privkey.pem;
	include /ssl/options-ssl-nginx.conf;
	ssl_dhparam /ssl/ssl-dhparams.pem;

	location / {
		proxy_pass http://SERVER_LOCAL_IP:8001;
	}
	error_page 500 502 503 504 /50x.html;
	location = /50x.html {
		root /usr/share/nginx/html;
	}
}
server {
	if ($host = seafile.wangyongf.com) {
		return 301 https://$host$request_uri;
	}

	listen 80;
	listen [::]:80;

	server_name seafile.wangyongf.com;
	return 404;
}

可以看到,上述配置有几点:

  1. 启用了 ssl
  2. http 会被重定向到 https
  3. ssl 证书配置的是 /ssl/ 目录

为什么证书是 /ssl/ 目录呢,其实这个目录是我自定义的,你也可以随便叫什么别的目录,上文中我们提到,这个配置是在 /nginx/conf.d/ 下,是 Docker Nginx 的配置文件,容器内是访问不到宿主文件的,只能通过文件映射,因此必须将宿主上的ssl证书映射到容器中,对的,上述 /ssl/ 就是映射的虚拟目录,其对应的是宿主上的 /etc/letsencrypt 目录。

因此,如果要使用上述的 Nginx 配置,Docker Nginx 容器需要新增一个 /etc/letsencrypt/ssl 的目录映射,但是貌似 Docker 容器在创建完成之后无法再修改映射目录?(如果可以,欢迎留言告诉我~),我就基于现有的容器重新建了个容器,使用如下命令:

docker stop nginx
docker commit nginx seafile-nginx
docker run –-name=nginx -p 80:80 -p 443:443 -v /nginx/conf.d:/etc/nginx/conf.d -v /etc/letsencrypt:/ssl -d nginx

如何检查 Nginx 配置文件是否正确

sudo nginx -t (-c /etc/nginx/conf.d/default.conf)

PS

之后,也可以使用类似的方式使用 Nginx 的反向代理部署其他的 Docker 服务

开始使用吧~

到了这里,应该没什么问题了,Seafile 应该已经是 https 可访问状态了,这个时候,你可以下载个移动客户端,按照官方教程配置好,然后就开始愉快地使用 Seafile 吧~

参考资料

  1. 玩转 docker 入门(4) docker 通过nginx实现反向代理 配置多域名以及多端口号
  2. Docker容器进入的4种方式
  3. Docker 命令大全
  4. 用 Docker 部署 Seafile 服务
  5. Docker更改容器端口映射
  6. Install Let's Encrypt to Create SSL Certificates
  7. Automatically enable HTTPS on your website with EFF's Certbot, deploying Let's Encrypt certificates.