Cover

Cloudreve 安装部署详细教程

· Maintenance

序言

这篇将讲述不同方法部署 Cloudreve 的详细操作步骤和具体优劣分析以及个人实测。

之所以决定撰写这篇文章,是因为我在 Cloudreve Forum 的评论收到了批评

https://forum.cloudreve.org/d/1829/6
https://forum.cloudreve.org/d/1829/6

https://forum.cloudreve.org/d/1829/6

尽管我仍然认为论坛文章内的教程并不高效,但我深刻地自我反省。在没有做出实际建设的情况下对别人的热心予以批判是不那么正当的。因此,我决定自己撰写一篇 Cloudreve 安装教程。

更新

2022.04.27

  • 更改了样例中部署的版本
  • 去除了 Unix Socket 配置,因为这并不是很好用。

预先说明

方法一:纯 Cloudreve 环境

  • 优点:较为简单,所需时间少,适合私有云盘部署
  • 优点:轻量,对于极低配置的服务器较为友好
  • 缺点:可扩展性差,日志查询困难
  • 缺点:完全无防护,可能一打就死
  • 缺点:数据库可操作性低,数据量不宜过大
  • 缺点:一台服务器只能运行一个 web 程序(即当前的 Cloudreve)

方法二:脚本 Nginx+MySQL+Redis + Cloudreve

  • 优点:稳定,适用于十万用户级生产环境
  • 优点:数据库负载能力强
  • 优点:Session 不易丢失,用户体验好
  • 优点:日志可实时查询,可扩展性高
  • 缺点:数据库内存溢出可能使全盘皆崩
  • 缺点:依靠单服务器性能,难以实现负载均衡
  • 缺点:部署时间较长

方法三:宝塔 LNM+Cloudreve

  • 缺点:安全无保障(个人极度不信任宝塔)
  • 优点:维护便捷
  • 优点:备份机制完善
  • 优点:可扩展性高
  • 优点:适合新手

方法四:Docker 容器化运行

  • 缺点:新手直接放弃,容器对于新手通常难以理解
  • 优点:企业级架构,便于运营
  • 优点:并发无上限,可以多服务器负载运行
  • 优点:单节点故障不影响整体 SLA,系统秒级恢复
  • 优点:安全性高
  • 优点:搭配 k8s 使用可以自动分配多个应用的负载能力

服务器预操作

本文所使用的服务器为 AHdark 在本地环境部署的 VMWare 虚拟机,操作系统为 CentOS 8.5,所使用的 Cloudreve 程序为 GitHub 开源版本。

本教程更适合国内云服务器,因为教程会包含大量对国内服务器所处网络环境进行优化的步骤

更换 yum 源

目前已有的 yum 镜像源很多,本篇文章采用阿里云 yum 源为例子。其他的 yum 源仅更换相应地址即可。

如果你使用的是国内国外大厂的云服务器,请跳过此步。我相信他们一定会预配置在系统的。

此段内容来自文章:https://developer.aliyun.com/mirror/centos/

# 备份
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

# 下载新的 CentOS-Base.repo 到 /etc/yum.repos.d/

## CentOS 6
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-6.repo

## CentOS 7
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

## CentOS 8
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo

# 生成缓存
yum makecache

# 替换
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo

依赖更新

通常,预置的服务器镜像的依赖软件都较为老旧,为此我们要对其更新

yum -y update

通常第一次依赖更新所需的时间较长,请耐心等待

简单的 SSH 安全

系统预置的 SSH 通常没有较为完善的安全配置,因此我们容易被扫描到并被攻击。为此我们需要做些事以使我们的服务器不受侵害

使用密码登录较容易被暴力破解,因此我推荐你使用密钥登录

《CentOS 设置 ssh 密钥登录》

而后,我们还需要做一些基本的配置

# 备份
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup

# 打开SSH配置文件
vi /etc/ssh/sshd_config

进行以下配置

# 去除注释
LogLevel INFO

# 去除注释并修改内容
MaxAuthTries 3
MaxSessions 5

# 添加
Protocol 2

# 如果使用密钥登陆则去除注释
PubkeyAuthentication yes

# 如果仅使用密钥登陆则修改
PasswordAuthentication no

# 去除注释并修改内容
ClientAliveInterval 600
ClientAliveCountMax 3

然后重启 sshd 服务

重启 sshd 服务之前请务必确保有一个已连接的 SSH 以防止服务器失联!

systemctl restart sshd

然后重新连接,查看是否成功,不成功则恢复备份

方法一:纯 Cloudreve 环境

优劣

  • 优点:较为简单,所需时间少,适合私有云盘部署
  • 优点:轻量,对于极低配置的服务器较为友好
  • 缺点:可扩展性差,日志查询困难
  • 缺点:完全无防护,可能一打就死
  • 缺点:数据库可操作性低,数据量不宜过大
  • 缺点:一台服务器只能运行一个 web 程序(即当前的 Cloudreve)

通常个人私有云可以使用以下方式部署

操作

首先我们需要获取 cloudreve 源程序文件。你可以前往 GitHub 下载后自行上传至服务器或使用 wget 获取

GitHub

cloudreve/Cloudreve

下载

yum -y install wget
 && wget https://github.com/cloudreve/Cloudreve/releases/download/3.5.2/cloudreve_3.5.2_linux_amd64.tar.gz -O /cloudreve/cloudreve.tar.gz

解压

cd /cloudreve
tar -zxvf cloudreve.tar.gz
rm -f cloudreve.tar.gz

初始化

chmod +x cloudreve
chown root:root cloudreve
./cloudreve

请务必记住Cloudreve初次运行生成的账号密码!

记住后,按 Ctrl+C 退出程序

配置

vi conf.ini

你可以前往 Cloudreve 官方文档 获取全部有关Cloudreve配置文件的信息,或使用本文提供的简易配置

[System]
Mode = master
Listen = :80
Debug = false
SessionSecret = 23333
HashIDSalt = something really hard to guss

[CORS]
AllowOrigins = *
AllowMethods = OPTIONS,GET,POST
AllowHeaders = *
AllowCredentials = false

其中 SessionSecretHashIDSalt 字段会自动生成,无需更改。

如果你要启用 SSL 的话,请在conf.ini的后边添加以下内容

[SSL]
Listen = :443
CertPath = /path/to/fullchain.pem
KeyPath = /path/to/private.key

请务必将 CertPathKeyPath 修改为自己的SSL证书、私钥的位置。SSL证书签发可前往 freessl.cn ,不过我更推荐购买更加正规安全的SSL证书

防火墙配置

你可以查看这篇文章获取更多有关 CentOS Firewalld 的信息

https://www.ahdark.blog/som/552.shtml

在此环境,你只需要输入以下命令

# 开放端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=443/tcp --permanent

# 重载
firewall-cmd --reload

进程守护

由于使用 GIN,Cloudreve 的正常访问必须保证程序的运行

我个人推荐使用 Systemd 进行进程守护

# 编辑配置文件
vim /usr/lib/systemd/system/cloudreve.service

编辑内容如下

[Unit]
Description=Cloudreve
Documentation=https://docs.cloudreve.org
After=network.target
After=mysqld.service
Wants=network.target

[Service]
WorkingDirectory=/cloudreve
ExecStart=/cloudreve/cloudreve
Restart=on-abnormal
RestartSec=5s
KillMode=mixed

StandardOutput=null
StandardError=syslog

[Install]
WantedBy=multi-user.target
# 更新配置
systemctl daemon-reload

# 启动服务
systemctl start cloudreve

# 设置开机启动
systemctl enable cloudreve

随后你就可以通过以下方式启动、重启、关闭 Cloudreve 服务

# 启动服务
systemctl start cloudreve

# 停止服务
systemctl stop cloudreve

# 重启服务
systemctl restart cloudreve

# 查看状态
systemctl status cloudreve

解析(可选)

前往 DNS,将对应域名解析至你的 ip,即可正常访问服务

当然你也可以选择纯 ip,但我并不推荐

搭配 CDN 一定是更好的选择,但你需要进一步了解 CDN 配置,而且这一方法并不适合搭配 CDN 使用

虚拟机部署成功
虚拟机部署成功

虚拟机部署成功

方法二:脚本 Nginx+MySQL+Redis + Cloudreve

此示例使用 Oneinstack 脚本,我也同样鼓励你使用 LNMP 等脚本。

我更建议你将 MySQL、Redis 从 Cloudreve 服务器上分离以实现更高的负载能力和稳定性。

优劣

  • 优点:稳定,可用于超十万用户的生产环境(实测可行)
  • 优点:数据库负载能力强
  • 优点:Session 不易丢失,用户体验好
  • 优点:日志可实时查询,可扩展性高
  • 缺点:数据库内存溢出可能使全盘皆崩
  • 缺点:依靠单服务器性能,难以实现负载均衡
  • 缺点:部署时间较长

操作

基本 Web 环境部署

请自行参照 Oneinstack 安装方法 进行安装

MySQL 版本需要选择 5.7 及以上,推荐编译安装(消耗时间较长),请务必选择安装 Redis Server

新建 vhost

请前往 https://oneinstack.com/install/ 获取详细信息

此图并非 Cloudreve 配置图,截取自 Oneinstack 官网

vhost.sh 安装示意图
vhost.sh 安装示意图

取自 https://oneinstack.com/install/

请不要开启防盗链、伪静态!

请记得将 SSL 证书换为自己申请的合规的证书!

下载 & 解压

进入vhost目录下,在本文示例为 /data/wwwroot/172.16.89.213

示意图
示意图

cd /data/wwwroot/172.16.89.213

通过 wget 下载 cloudreve(同上文)

# 下载
yum -y install wget && wget https://github.com/cloudreve/Cloudreve/releases/download/3.5.2/cloudreve_3.5.2_linux_amd64.tar.gz -O cloudreve.tar.gz

# 解压
tar -zxvf cloudreve.tar.gz && rm -f cloudreve.tar.gz
示意图
示意图

配置 MySQL

在上文安装 MySQL 的时候 Oneinstack 会让你自己输入 mysql 密码,现在你要通过密码登录

例如:我的MySQL Root账户密码为123456

mysql -uroot -p123456

而后新建数据库和账户,请自行替换密码

CREATE DATABASE Cloudreve;
CREATE USER cloudreve@127.0.0.1 IDENTIFIED BY 'examplepassword';
GRANT ALL ON Cloudreve.* TO cloudreve@127.0.0.1;
exit;

初始化

chmod 777 cloudreve
chown root:root cloudreve
./cloudreve

此时 Cloudreve 程序会进行初始化并生成初始账密,但你并不需要记住它

随后编辑conf.ini

vi conf.ini
[System]
Mode = master
Listen = :5212
Debug = false
SessionSecret = 23333
HashIDSalt = something really hard to guss

[Database]
Type = mysql
Port = 3306
User = cloudreve
Password = examplepassword
Host = 127.0.0.1
Name = Cloudreve
TablePrefix = cr_
Charset = utf8

[CORS]
AllowOrigins = *
AllowMethods = OPTIONS,GET,POST
AllowHeaders = *
AllowCredentials = false

[Redis]
Server = 127.0.0.1:6379
Password =
DB = 0

由于 Redis Server 已包含在安装过程中,且默认无密码,直接使用即可。需要注意的是不要对外网开放 Redis 即可

重新运行程序进行数据表生成

./cloudreve

此时请记住管理员账密,但不急着登录

配置进程守护

由于使用 GIN,Cloudreve 的正常访问必须保证程序的运行

我个人推荐使用 Systemd 进行进程守护

# 编辑配置文件
vim /usr/lib/systemd/system/cloudreve.service

编辑内容如下

[Unit]
Description=Cloudreve
Documentation=https://docs.cloudreve.org
After=network.target
After=mysqld.service
Wants=network.target

[Service]
WorkingDirectory=/data/wwwroot/172.16.89.213
ExecStart=/data/wwwroot/172.16.89.213/cloudreve
Restart=on-abnormal
RestartSec=5s
KillMode=mixed

StandardOutput=null
StandardError=syslog

[Install]
WantedBy=multi-user.target

随后更新配置

# 更新配置
systemctl daemon-reload

# 启动服务
systemctl start cloudreve

# 设置开机启动
systemctl enable cloudreve

随后你就可以通过以下方式启动、重启、关闭 Cloudreve 服务

# 启动服务
systemctl start cloudreve

# 停止服务
systemctl stop cloudreve

# 重启服务
systemctl restart cloudreve

# 查看状态
systemctl status cloudreve

配置 Nginx 反代

首先编辑 Nginx vhost 对应配置文件

vi /usr/local/nginx/conf/vhost/127.0.0.1.conf
upstream cloudreve {
  server 127.0.0.1:5212;
}
server {
  listen 80;
  listen [::]:80;
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  ssl_certificate /usr/local/nginx/conf/ssl/172.16.89.213.crt;
  ssl_certificate_key /usr/local/nginx/conf/ssl/172.16.89.213.key;
  ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
  ssl_ciphers TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
  ssl_prefer_server_ciphers on;
  ssl_session_timeout 10m;
  ssl_session_cache builtin:1000 shared:SSL:10m;
  ssl_buffer_size 1400;
  add_header Strict-Transport-Security max-age=15768000;
  ssl_stapling on;
  ssl_stapling_verify on;
  server_name 172.16.89.213;
  access_log /data/wwwlogs/172.16.89.213_nginx.log combined;

  location / {
    proxy_pass http://cloudreve;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
  }

  location ~ /(\.user\.ini\.ht\.git\.svn\.projectLICENSEREADME\.md) {
    deny all;
  }
  location /.well-known {
    allow all;
  }
}

从理论上是可以实现多个 Cloudreve 后端负载均衡的,只需在 upstream {} 中加入更多 server 即可,前提是 server 及对应端口必须可用且所有 Cloudreve 必须共享 Redis 和数据库。

随后重载 Nginx

systemctl reload nginx

而后确认 Cloudreve 正常运行

Cloudreve 状态图
Cloudreve 状态图

Cloudreve 状态

Pro 需要对.sock 文件进行权限修正

chmod 777 /run/cloudreve.sock

而后按指定域名访问即可进入 Cloudreve

示例界面
示例界面

访问成功

方法三:宝塔 LNM+Cloudreve

优劣

  • 缺点:安全难以保障(个人极度不信任宝塔,尤其是删库事件以后)
  • 优点:维护便捷
  • 优点:备份机制完善
  • 优点:可扩展性高
  • 优点:适合新手

操作

环境安装

安装宝塔,可参照 https://www.bt.cn/bbs/thread-19376-1-1.html

前往【软件商店】下载安装以下软件

  • Nginx 1.18 或更高
  • MySQL 5.7 或更高(至少 5.7,否则 Cloudreve 无法运行!)
  • Redis
  • Supervisor 管理器
软件列表
软件列表

新建网站

宝塔
宝塔
宝塔建站
宝塔建站

请务必选择 utf8mb4

请不要使用 PHP

前往 github.com/cloudreve/Cloudreve/releases 下载 amd_64 安装包并上传至服务器目录下

文件列表
文件列表

初始化

在 Cloudreve 目录下打开【终端】

chmod 777 cloudreve
chown root:root cloudreve
./cloudreve

此时 Cloudreve 程序会进行初始化并生成初始账密,但你并不需要记住它

随后编辑conf.ini

[System]
Mode = master
Listen = :5212
Debug = false
SessionSecret = 23333
HashIDSalt = something really hard to guss

[Database]
Type = mysql
Port = 3306
User = 172_16_35_223
Password = 6Lf56Kf5cjEKNZGj
Host = 127.0.0.1
Name = 172_16_35_223
TablePrefix = cr_
Charset = utf8mb4

[CORS]
AllowOrigins = *
AllowMethods = OPTIONS,GET,POST
AllowHeaders = *
AllowCredentials = false

[Redis]
Server = 127.0.0.1:6379
Password =
DB = 0

由于 Redis Server 已包含在安装过程中,且默认无密码,直接使用即可。需要注意的是不要对外网开放 Redis 即可

请记得将数据库信息改为正确信息

重新运行程序进行数据表生成

./cloudreve

此时请记住管理员账密,但不急着登录

Supervisor

Supervisor添加守护进程
Supervisor添加守护进程

如图填写即可

Supervisor日志
Supervisor日志

有日志即为正常

Nginx 反代

站点管理-反向代理
站点管理-反向代理

添加反向代理配置

如图,即可

方法四:容器化运行

在 Cloudreve 3.5 发布后,Aaron 在官方文档页面更新了 Docker 部署教程,同时在Docker Hub发布了Cloudreve Image,部署变得简单了许多,因此我在 2021.04.27 完善了此方法。

2022.10.02 补充:为方便容器部署,我向 Cloudreve 提交了 通过环境变量配置应用程序 的 Pull Request (cloudreve/Cloudreve#1475)。待其审阅完毕合并主分支后,我将撰写详细的应用方法。

优劣

  • 缺点:容器对于新手通常难以理解
  • 缺点:Docker 对于服务器性能有些许损耗
  • 优点:企业级架构,便于运营
  • 优点:并发无上限,可以多服务器负载运行
  • 优点:单节点故障不影响整体 SLA ,系统秒级恢复
  • 优点:安全性高

Docker 操作

创建目录结构

确保运行之前:

  1. 手动创建 conf.ini 空文件或者符合 Cloudreve 配置文件规范的 conf.ini, 并将 <path_to_your_config> 替换为该路径
  2. 手动创建 cloudreve.db 空文件, 并将 <path_to_your_db> 替换为该路径
  3. 手动创建 uploads 文件夹, 并将 <path_to_your_uploads> 替换为该路径
  4. 手动创建 avatar 文件夹,并将 <path_to_your_avatar> 替换为该路径

或者,直接使用以下命令创建:

mkdir -vp cloudreve/{uploads,avatar} \
    && touch cloudreve/conf.ini \
    && touch cloudreve/cloudreve.db

运行

docker run -d \
    -p 5212:5212 \
    --mount type=bind,source=<path_to_your_config>,target=/cloudreve/conf.ini \
    --mount type=bind,source=<path_to_your_db>,target=/cloudreve/cloudreve.db \
    -v <path_to_your_uploads>:/cloudreve/uploads \
    -v <path_to_your_avatar>:/cloudreve/avatar \
    cloudreve/cloudreve:latest

Docker Compose 操作

创建目录结构

mkdir -vp /cloudreve/{uploads,avatar} \
&& touch /cloudreve/conf.ini \
&& touch /cloudreve/cloudreve.db \
&& mkdir -p /aria2/config \
&& mkdir -p /data/aria2 \
&& chmod -R 777 /data/aria2

创建 docker-compose.yml

请注意修改 yml 文件中的 <your_aria_rpc_token>

vi docker-compose.yml
version: "3.8"
services:
  cloudreve:
    container_name: cloudreve
    image: cloudreve/cloudreve:latest
    restart: unless-stopped
    ports:
      - "5212:5212"
    volumes:
      - temp_data:/data
      - /cloudreve/uploads:/cloudreve/uploads
      - /cloudreve/conf.ini:/cloudreve/conf.ini
      - /cloudreve/cloudreve.db:/cloudreve/cloudreve.db
      - /cloudreve/avatar:/cloudreve/avatar
    depends_on:
      - aria2
  aria2:
    container_name: aria2
    image: p3terx/aria2-pro
    restart: unless-stopped
    environment:
      - RPC_SECRET=<your_aria_rpc_token>
      - RPC_PORT=6800
    volumes:
      - /aria2/config:/config
      - temp_data:/data
volumes:
  temp_data:
    driver: local
    driver_opts:
      type: none
      device: /data
      o: bind

运行

docker-compose up -d

Comments

Send Comments

Markdown supported. Please keep comments clean.