VPS折腾记(三):搭建个人网盘Seafile

博客第一篇文章提到,有一些私人文件,不想放到百度网盘等公共网盘去,因此一直想搭建一个属于自己的私人网盘。别想歪,我只是想放一些密码文件之类的。

从安全性上来说,我个人更倾向于搭建家庭NAS:买个NAS放家里,安全、随时扩容,而且文件实打实存在硬盘上,真是实现私人网盘最好的方式。当然问题也有,主要就是价格偏高、网速受限于家里的网络,而且得时刻放家里开着机。以后有条件的话,首选还是建个NAS(想起上次跟飞哥聊到5G的应用,两人第一个想到的就是组个NAS,随时远程访问,手机就不需要太大的内存了😄)。

偏题了……说回来,VPS第一用途除了搭墙当然是搭一个自己用的私人网盘,查了一圈,开源的不开源的各种私人网盘应用太多了,让人眼花缭乱。随便举例子,就是OwnCloudNextCloudSeafile三大品牌,其他还有像h5aiCloudreve可道云等等。

综合考虑下来,决定使用Seafile作为自己的网盘系统,Seafile功能丰富,支持webdavOffice Online历史回溯大文件上传下载即时同步等,而且开源免费(pro版三账号内免费),页面也还挺好看。

安装Seafile

之前说过了,尽量用docker安装,省心省力,有空写写docker,按照官方教程进行部署,先安装docker-compose,下载docker-compose.yml,运行docker-compose up -d就行了。

1
2
3
4
5
6
7
8
# 安装docker-compose,ubutnu
apt install docker-compose -y
# 假设已经下载了docker-compose.yml
mkdir seafile
mv docker-compose.yml seafile
# vim docker-compose.yml
# 启动
docker-compose up -d

配置文档需要说明一下。

首先需要修改的是以下几项配置(按官方教程,也可以不改):

  1. MySQL root 用户的密码 (MYSQL_ROOT_PASSWORD and DB_ROOT_PASSWD)
  2. 持久化存储 MySQL 数据的 volumes 目录 (volumes)
  3. 持久化存储 Seafile 数据的 volumes 目录 (volumes)

然后修改SEAFILE_ADMIN_EMAILSEAFILE_ADMIN_PASSWORD为管理员账号和密码1

为了开机自动启动seafile,对每个容器都配置restart: always。对小白来说,就是在docker-compose.yml中每一句image:XXXX上面或者下面加一行restart: always,再运行docker-compose up -d即可。

至此,可以用ip地址或者域名(如有解析)访问seafile网盘2

配置nginx反向代理

我在VPS中同时跑着不同的应用,想用不同的子域名去访问不同的应用,如用www.callmsn.top访问博客,用seafile.callmsn.top访问网盘等,可以用nginx反向代理3

  1. 修改docker-compose.yml,将

    1
    2
    3
    
    ports:
      - "80:80"
      - "443:443"

    改为

    1
    2
    
    ports:
      - "8000:80"

    这表示,外部访问8000端口会被指向docker的80端口4

  2. 运行docker-compose up -d使之生效5

  3. 安装nginx,将配置nginx。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    
    apt install nginx -y
    vim /etc/nginx/conf.d/seafile.conf
    # seafile.conf内容
    server {
      listen 80;
      server_name www.example.com; # 改成自己的域名或者ip
      location / {
      proxy_pass http://127.0.0.1:8000; # 代理到8000
      }
    }
    # 重启nginx,使配置生效
    nginx -s reload

配置https

可以按照官方教程配置,也可以像我一样,直接在nginx中配置,不需要改docker-compose.yml

由于我域名是在阿里云上买的,所以直接到阿里云上申请证书,下载备用。
配置seafile.conf,下面是我的配置文档,供参考。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
server {
    listen       80;
    server_name  pan.callmsn.top;
    rewrite ^ https://$http_host$request_uri? permanent;    #强制将http重定向到https
    server_tokens off;
}
server {
    listen 443;
    ssl on;
    ssl_certificate /etc/nginx/ssl/pan/pan.pem;        #pem 文件路径
    ssl_certificate_key /etc/nginx/ssl/pan/pan.key;    #key 文件路径
    server_name www.example.com;  # 域名
    ssl_session_timeout 5m;
    ssl_session_cache shared:SSL:5m;

    # Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
    ssl_dhparam /etc/nginx/ssl/dhparam.pem;

    proxy_set_header X-Forwarded-For $remote_addr;

    location / {
        proxy_pass         http://127.0.0.1:8000;
        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 https;
    }
}

注意,需要先把下载的pemkey文件放到/etc/nginx/ssl/pan文件中,并运行openssl dhparam -out dhparam.pem 2048生成dhparam.pem放到/etc/nginx/中。


  1. 如果担心安全问题,可以在第一次运行docker-compose up -d后把这两行删掉。
    [return]
  2. 登录时发现头像无法显示,原因是头像的网址是在8000端口上,进行seafile内部docker exec -it seafile bash修改conf/ccnet.conf,或者直接修改/opt/seafile-data/seafile/conf/ccnet.conf中的SERVER_URL,把端口去掉即可。
    [return]
  3. 注意,nginx安装在系统里,而不在docker中。
    [return]
  4. 使用ufw管理端口的朋友需要注意,docker绕开ufw直接管理端口,所以即便是ufw deny 8000还是可以访问ip:8000,解决方法挺多的,可以修改/etc/default/docker文件,添加DOCKER_OPTS="-iptables=false"并重启系统,也可以直接把端口映射改成- "127.0.0.1:8000:80",只允许本地访问8000端口。
    [return]
  5. 不能用docker-compose restart
    [return]