私人云盘部署方案

应用实践 | 📅 2021-03-09 | nextcloud frp docker nginx

需求来源

有些文件因为安全问题无法保存在公有云上。又因为文件比较多,且细碎,使用频率又高,所以加密上传云盘的方案也不合理。

所以就希望在家里建一个私人云盘,且使其能够在互联网访问。

需求确认

  1. 需要保证存储数据的安全性。

  2. 需要能够互联网访问存储的文件。

  3. 最好能实现多端同步。

  4. 需要数据存储在自己家里。

基本设计

基本设计

一、家里使用 树莓派 作为硬件支撑,选用 NextCloud 提供文件存储服务。为扩展存储空间,使用外接存储为树莓派扩展容量。

二、阿里云服务器提供互联网接入,使用 frp 对内网服务进行映射,使用 Nginx 对服务进行反向代理,并提供https支持。

细节选型

树莓派

我使用手上的3代板,4核心1G内存。由于只有家里人使用,作为网盘服务绰绰有余。

NextCloud

为了部署方便,采用Docker部署NextCloud。这里需要注意,镜像版本需要选择 arm32v7/nextcloud 。因为树莓派3代是armv7架构,不然运行不起来。

外接储存

由于树莓派供电较弱,外接储存必须自带电源。又为了进一步保证数据安全,最好能使用RIAD1 。
我采用奥睿科的硬盘柜,加上两块希捷2T机械硬盘,组成RIAD1 。

Nginx

Nginx要提供反向代理和HTTPS支持。为了方便,HTTPS直接使用 Let's Encrypt 提供的证书。

部署

一、首先,选内存卡烧入官方镜像。然后更新系统至最新,并安装docker:

apt update && apt upgrade -y
apt install docker.io

二、硬盘柜插入硬盘,设置RIAD1后接电启动。初始化完成后接入树莓派,在树莓派内格式化并挂载。

创建分区

fdisk /dev/sda

依次键入:

  1. n // 创建分区
  2. p // 创建主分区
  3. <Enter> // 使用默认起始位置
  4. <Enter> // 使用默认结束位置
  5. w // 写入并退出

格式化分区

mkfs.ext4 /dev/sda1

这个一路默认就行。

挂载分区

/etc/fstab 中添加一行:

/dev/sda1 /data ext4 defaults 0 0

重启系统后,硬盘会挂载到 /data/ 目录。

三、部署NextCloud

部署使用docker-compose,其配置文件如下:

version: '2'

volumes:
  nextcloud:
  db:

services:
  db:
    image: arm32v7/postgres
    restart: always
    volumes:
      - /data/nextcloud/db:/var/lib/postgresql/data
    environment:
      - POSTGRES_USER=pguser
      - POSTGRES_PASSWORD=pguserpassword
      - POSTGRES_DB=nextcloud

  app:
    image: arm32v7/nextcloud
    restart: always
    ports:
      - 8080:80
    links:
      - db
    volumes:
      - /data/nextcloud/data:/var/www/html
    environment:
      - NEXTCLOUD_TRUSTED_DOMAINS=www.你的域名.com
      - NEXTCLOUD_ADMIN_USER=username
      - NEXTCLOUD_ADMIN_PASSWORD=userpassword
      - POSTGRES_PASSWORD=pguserpassword
      - POSTGRES_DATABASE=nextcloud
      - POSTGRES_USER=pguser
      - POSTGRES_HOST=db

上面的 “NEXTCLOUD_TRUSTED_DOMAINS” 表示 NextCloud 能接受的域名,从非指定域名访问,会被拒绝。

启动后,服务暴露在树莓派的8080端口。

四、部署frp

frp分两部分,一部分是在 阿里云 上的 frp-server,一部分是在树莓派上的 frp-client 。

Server部分

配置文件(frps.ini):

[common]
bind_port = 7000
token =6666666

为了避免你的服务器成为RBQ,加一个 token 对客户端鉴权。

启动命令:

frps -c frps.ini

这命令不会后台执行,可以使用supervisor或者tmux之类的程序,让它后台执行。

Client部分

配置文件(frpc.ini):

[common]
server_addr = 66.66.66.66
server_port = 7000
token =6666666

[nextcloud]
type = tcp
local_ip = 127.0.0.1
local_port = 8080
remote_port = 6080

启动后,树莓派的 8080 端口就会映射到 阿里云服务器的 6080 端口了。当然,端口可以自行修改。

启动命令:

frpc -c frpc.ini

这命令不会后台执行,可以使用supervisor或者tmux之类的程序,让它后台执行。

五、Nginx设置

Nginx 直接安装,并设置开机启动:

apt install -y nginx 
systemctl enable nginx

然后,使用 certbot 进行https配置。(过程参考其文档 docs

再向Nginx配置(/etc/nginx/sites-enabled/defaults)中添加反向代理配置: (主要设置的是 location 部分,其他部分是 Certbot 填的)

server {
    server_name www.你的域名.com;
    location / {
        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_pass http://127.0.0.1:6080/;
    }
    listen 443 ssl; # managed by Certbot
......
}

重启 Nginx 即生效:

systemctl restart nginx

六、其他设置

如果你要使用客户端,还需要修改 NextCloud 的配置。因为 NextCloud 并不知道自己的域名是 https 的,客户端回调会出错,所以要修改配置文件(/config/config.php),添加下述配置:

  'overwriteprotocol' => 'https',

如此,便可以正常使用了。

测试

细节……略

亲测同步大量文件和大尺寸文件,都没有什么问题。
但是由于中间中转多次(frp、nginx啥的),没有什么急速体验,或许也是因为家里带宽的原因(移动的免费宽带)……
虽说如此,但是日常备份个文件,是没有问题的。