应用实践 | 📅 2021-03-09 | nextcloud frp docker nginx
有些文件因为安全问题无法保存在公有云上。又因为文件比较多,且细碎,使用频率又高,所以加密上传云盘的方案也不合理。
所以就希望在家里建一个私人云盘,且使其能够在互联网访问。
需要保证存储数据的安全性。
需要能够互联网访问存储的文件。
最好能实现多端同步。
需要数据存储在自己家里。
一、家里使用 树莓派 作为硬件支撑,选用 NextCloud 提供文件存储服务。为扩展存储空间,使用外接存储为树莓派扩展容量。
二、阿里云服务器提供互联网接入,使用 frp 对内网服务进行映射,使用 Nginx 对服务进行反向代理,并提供https支持。
我使用手上的3代板,4核心1G内存。由于只有家里人使用,作为网盘服务绰绰有余。
为了部署方便,采用Docker部署NextCloud。这里需要注意,镜像版本需要选择 arm32v7/nextcloud 。因为树莓派3代是armv7架构,不然运行不起来。
由于树莓派供电较弱,外接储存必须自带电源。又为了进一步保证数据安全,最好能使用RIAD1 。
我采用奥睿科的硬盘柜,加上两块希捷2T机械硬盘,组成RIAD1 。
Nginx要提供反向代理和HTTPS支持。为了方便,HTTPS直接使用 Let's Encrypt
提供的证书。
一、首先,选内存卡烧入官方镜像。然后更新系统至最新,并安装docker:
apt update && apt upgrade -y
apt install docker.io
二、硬盘柜插入硬盘,设置RIAD1后接电启动。初始化完成后接入树莓派,在树莓派内格式化并挂载。
创建分区:
fdisk /dev/sda
依次键入:
<Enter>
// 使用默认起始位置<Enter>
// 使用默认结束位置格式化分区:
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啥的),没有什么急速体验,或许也是因为家里带宽的原因(移动的免费宽带)……
虽说如此,但是日常备份个文件,是没有问题的。