1. 为什么我选择在 CentOS 7 上自建网盘
把文件放在别人的服务器上,用久了总会遇到几个绕不开的坎:免费容量说砍就砍、下载速度被限制得死死的、分享链接莫名其妙失效、隐私条款悄悄更新。我自己就吃过好几次亏,早年存的一批设计素材,某天打开链接直接提示“文件已过期”,连申诉入口都找不到。从那以后我就下定决心,重要资料必须握在自己手里。
Cloudreve 是我对比过一圈之后留下来的方案。它是一套用 Go 语言写的开源网盘系统,支持本地存储、对象存储、远程存储多种后端,自带用户管理、分享链接、离线下载、WebDAV、多用户配额这些功能,界面也做得相当清爽。最关键的是,它对服务器配置要求不高,一台 1 核 2G 的小机器就能跑得很稳,这对个人用户和小团队来说非常友好。
CentOS 7 虽然已经进入维护末期,但市面上大量存量服务器还在跑这个系统,很多运维同学手头的机器就是 CentOS 7。我写这篇东西,就是想把我在 CentOS 7 上从零部署 Cloudreve 的完整过程、踩过的坑、以及后续调优的经验,原原本本记录下来。不管你是刚接触 Linux 的新手,还是想给团队搭一套内部文件共享系统的老手,都能照着走一遍。
这篇文章会覆盖环境准备、依赖安装、数据库配置、Cloudreve 部署、反向代理、开机自启、常见故障排查这几个核心环节。我会把每一步为什么这么做讲清楚,参数怎么算、配置怎么写、哪里容易翻车,都掰开揉碎说。你不需要有很深的 Linux 功底,只要能照着敲命令、看得懂基本的配置文件,就能跟着做完。
2. 部署前的整体设计与方案选型
2.1 为什么用 Cloudreve 而不是别的方案
自建网盘的选择其实不少,Nextcloud、Seafile、可道云、FileRun 都有人用。我最终选 Cloudreve,主要基于几个现实考量。
第一是资源占用。Nextcloud 功能确实全,但它是 PHP 写的,跑起来对内存和 CPU 的胃口不小,1 核 2G 的机器上经常卡顿,还得配 Redis、配 cron、调 PHP-FPM,折腾成本高。Cloudreve 是 Go 编译的单一二进制文件,启动就是一瞬间的事,内存占用常年稳定在几十兆,小机器跑起来毫无压力。
第二是部署复杂度。Seafile 需要单独部署 Python 环境、配置 Seahub、处理各种依赖,出问题排查起来链路很长。Cloudreve 解压即用,配置文件就一个conf.ini,改完重启就生效,对新手极其友好。
第三是功能匹配度。我要的核心功能就是:多用户、容量配额、分享链接、WebDAV 挂载、离线下载。Cloudreve 这几项全都原生支持,而且 WebDAV 可以直接把网盘挂载到本地当磁盘用,这个体验非常爽。
第四是存储后端灵活。Cloudreve 支持本地磁盘、七牛、阿里云 OSS、腾讯云 COS、又拍云、OneDrive、S3 兼容存储等多种后端。我一开始用本地存储,后来文件多了就切到了对象存储,配置改几行就行,迁移成本很低。
提示:如果你的需求是团队协作、在线文档编辑、日历通讯录这类重办公场景,Nextcloud 可能更合适。但如果你的核心诉求是“稳定地把文件存起来、方便地分享出去”,Cloudreve 是更轻更省心的选择。
2.2 系统环境与硬件规划
CentOS 7 的默认软件源里,很多包的版本都比较老,比如 PHP 是 5.4,MySQL 是 5.5,Nginx 压根没有。所以部署前必须先把软件源理清楚,否则后面装依赖会各种报错。
我的硬件规划是这样的:最低配 1 核 1G 可以跑起来,但建议 1 核 2G 起步,因为 MySQL 本身就要吃掉几百兆内存。硬盘方面,系统盘 20G 足够,数据盘根据你的存储需求单独挂载,我建议数据目录和系统目录分开,这样重装系统时数据不会丢。
系统版本我用的 CentOS 7.9,这是 7 系列的最后一个版本,相对最稳定。内核版本 3.10,虽然老,但跑 Cloudreve 完全够用。
软件栈我选的是 Nginx + MySQL 5.7 + PHP 7.4 的组合。这里有个关键点:Cloudreve 本身是 Go 程序,不需要 PHP 运行,但它的离线下载功能依赖 Aria2,而 Aria2 的 Web 控制面板需要 PHP 环境。如果你不需要离线下载,PHP 可以完全不装。我为了功能完整,还是把 PHP 装上了。
数据库方面,Cloudreve 支持 SQLite、MySQL、PostgreSQL。SQLite 适合单用户或者极小规模使用,零配置,一个文件搞定。但多用户场景下 SQLite 的并发写入会成为瓶颈,所以我还是推荐 MySQL。MySQL 5.7 在 CentOS 7 上安装成熟,资料多,出问题好查。
2.3 网络与域名规划
自建网盘如果要对外访问,域名是必须的。一方面 IP 地址不好记,另一方面 HTTPS 证书需要绑定域名。我建议提前准备好一个域名,解析到服务器 IP。
端口规划上,我习惯把 Cloudreve 本体跑在 5212 端口(这是它的默认端口),然后用 Nginx 反向代理到 80 和 443。这样做的好处是:Cloudreve 不需要 root 权限就能跑,Nginx 负责处理 SSL、静态资源缓存、大文件上传的超时控制,分工明确。
防火墙方面,CentOS 7 默认用的是 firewalld。需要放行 80、443 端口,5212 端口只在本地监听,不对外暴露。这样即使 Cloudreve 有漏洞,外部也直接访问不到它的原始端口。
注意:如果你的服务器在国内,域名解析后需要完成备案才能通过 80/443 访问。如果只是内部使用,可以跳过域名直接用 IP 加端口访问,但 HTTPS 就没法配了。
3. 核心环境搭建与依赖安装实操
3.1 系统初始化与软件源配置
拿到一台全新的 CentOS 7 机器,我第一件事是更新系统并配置软件源。CentOS 7 自带的 yum 源速度慢、包又老,必须换成国内镜像源。
# 备份原有源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak # 下载国内镜像源(以阿里云为例) curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo # 清理并重建缓存 yum clean all yum makecache # 更新系统 yum update -y这里有个细节:yum update会更新内核,如果服务器上有正在运行的关键业务,建议先确认再执行。我一般在新机器上直接更新,老机器上会谨慎一些。
更新完之后,安装 EPEL 源和 Remi 源。EPEL 提供了很多 CentOS 官方源里没有的包,Remi 则提供了较新版本的 PHP。这两个源是后续安装 Nginx、PHP 7.4 的基础。
yum install -y epel-release yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm yum install -y yum-utils装完 Remi 源之后,需要启用 PHP 7.4 的模块流:
yum-config-manager --enable remi-php74这一步很关键,如果不启用,yum install php装的还是 5.4 版本,后面 Aria2 面板会跑不起来。
3.2 安装 Nginx 与 MySQL 5.7
Nginx 我直接从 EPEL 源装,版本是 1.20 左右,够用且稳定。
yum install -y nginx systemctl start nginx systemctl enable nginxMySQL 5.7 在 CentOS 7 的官方源里没有,需要先添加 MySQL 官方的 yum 源。这里要注意,MySQL 官方源在国内下载速度可能很慢,可以换成国内镜像。
# 下载 MySQL 5.7 的源配置包 wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm rpm -ivh mysql57-community-release-el7-11.noarch.rpm # 安装 MySQL 服务端 yum install -y mysql-community-server # 启动并设置开机自启 systemctl start mysqld systemctl enable mysqldMySQL 5.7 首次启动会生成一个临时 root 密码,需要从日志里找出来:
grep 'temporary password' /var/log/mysqld.log拿到临时密码后,登录并修改:
mysql -uroot -p登录后第一件事是改密码,MySQL 5.7 默认有密码强度校验,太简单的密码会报错。我一般先改一个符合要求的复杂密码,然后调整密码策略,再改成自己习惯的密码。
ALTER USER 'root'@'localhost' IDENTIFIED BY 'TempPass123!'; SET GLOBAL validate_password_policy=LOW; SET GLOBAL validate_password_length=6; ALTER USER 'root'@'localhost' IDENTIFIED BY 'yourpassword'; FLUSH PRIVILEGES;然后创建 Cloudreve 专用的数据库和用户。这里我不建议直接用 root 连 Cloudreve,权限太大,万一出问题影响面广。
CREATE DATABASE cloudreve CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'cloudreve'@'localhost' IDENTIFIED BY 'StrongPass123!'; GRANT ALL PRIVILEGES ON cloudreve.* TO 'cloudreve'@'localhost'; FLUSH PRIVILEGES;字符集一定要用utf8mb4,因为 Cloudreve 支持 emoji 和特殊字符的文件名,用utf8会存不进去。
3.3 安装 PHP 7.4 与必要扩展
PHP 只用于 Aria2 的 Web 面板,所以不需要装太多扩展,但有几个是必须的:php-fpm、php-cli、php-common、php-json、php-mbstring、php-curl。
yum install -y php php-fpm php-cli php-common php-json php-mbstring php-curl php-gd php-xml systemctl start php-fpm systemctl enable php-fpm装完之后验证一下版本:
php -v如果显示的是 7.4.x,说明 Remi 源生效了。如果还是 5.4,检查一下yum-config-manager --enable remi-php74是否执行成功。
PHP-FPM 的默认运行用户是apache,但 CentOS 7 上可能没有这个用户。需要检查/etc/php-fpm.d/www.conf里的user和group配置,改成nginx或者www-data。我一般改成nginx,和 Nginx 保持一致,避免权限问题。
# 编辑 www.conf vi /etc/php-fpm.d/www.conf # 找到并修改这两行 user = nginx group = nginx改完重启 PHP-FPM:
systemctl restart php-fpm3.4 安装 Aria2 与离线下载组件
Aria2 是 Cloudreve 离线下载功能的核心。CentOS 7 的 EPEL 源里有 Aria2,直接装就行。
yum install -y aria2装完之后,需要配置 Aria2 的 RPC 模式,让 Cloudreve 能通过接口调用它。我一般创建一个专用目录来放配置文件和下载缓存。
mkdir -p /var/www/aria2 cd /var/www/aria2 # 创建配置文件 cat > aria2.conf << EOF enable-rpc=true rpc-allow-origin-all=true rpc-listen-all=false rpc-listen-port=6800 rpc-secret=your_aria2_token continue=true input-file=/var/www/aria2/aria2.session save-session=/var/www/aria2/aria2.session save-session-interval=60 max-concurrent-downloads=5 max-connection-per-server=16 split=16 min-split-size=10M max-overall-download-limit=0 max-overall-upload-limit=1K disable-ipv6=true dir=/var/www/aria2/downloads EOF # 创建 session 文件和下载目录 touch /var/www/aria2/aria2.session mkdir -p /var/www/aria2/downloads这里的rpc-secret是 Aria2 的访问令牌,相当于密码,一定要改成一个随机字符串。rpc-listen-all=false表示只监听本地,外部访问不到,安全性更高。
然后创建 systemd 服务来管理 Aria2:
cat > /etc/systemd/system/aria2.service << EOF [Unit] Description=Aria2 Service After=network.target [Service] User=nginx ExecStart=/usr/bin/aria2c --conf-path=/var/www/aria2/aria2.conf Restart=on-failure [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl start aria2 systemctl enable aria2Aria2 的 Web 控制面板我用的是 AriaNg,它是一个纯静态的 HTML 页面,下载下来放到 Nginx 的网站目录里就能用。这个面板不是必须的,但有了它,你可以直接看到下载进度、管理任务,比在 Cloudreve 后台看要直观得多。
4. Cloudreve 部署与反向代理配置
4.1 下载与初始化 Cloudreve
Cloudreve 的官方发布页在 GitHub 上,下载对应架构的压缩包。CentOS 7 一般是 x86_64 架构,下载cloudreve_xxx_linux_amd64.tar.gz。
# 创建安装目录 mkdir -p /var/www/cloudreve cd /var/www/cloudreve # 下载(版本号根据实际情况替换) wget https://github.com/cloudreve/Cloudreve/releases/download/3.8.3/cloudreve_3.8.3_linux_amd64.tar.gz # 解压 tar -zxvf cloudreve_3.8.3_linux_amd64.tar.gz # 赋予执行权限 chmod +x cloudreve解压后目录里有一个cloudreve二进制文件和一个conf.ini配置文件。首次运行会自动生成数据库和初始管理员账号。
# 首次运行,生成初始配置 ./cloudreve运行后终端会输出初始管理员账号和密码,一定要记下来。然后按Ctrl+C停止,接下来修改配置文件。
4.2 配置文件详解与数据库切换
默认的conf.ini用的是 SQLite,我们要改成 MySQL。打开配置文件:
[System] Mode = master Listen = :5212 SessionSecret = your_session_secret HashIDSalt = your_hashid_salt [Database] Type = mysql Host = 127.0.0.1 Port = 3306 User = cloudreve Password = StrongPass123! Name = cloudreve TablePrefix = cd_ [Redis] Server = 127.0.0.1:6379 Password = DB = 0几个关键点说明一下:
SessionSecret和HashIDSalt是安全相关的随机字符串,首次运行会自动生成,不要手动改,改了会导致已有登录状态失效。
Listen = :5212表示监听所有网卡的 5212 端口。如果你只想本地访问,可以改成127.0.0.1:5212,然后通过 Nginx 代理。
TablePrefix是表前缀,默认cd_,如果你一个数据库要跑多个应用,改一下前缀避免冲突。
Redis 是可选的,但强烈建议开启。Cloudreve 用 Redis 做缓存和会话存储,开了之后后台响应速度明显提升。CentOS 7 装 Redis 很简单:
yum install -y redis systemctl start redis systemctl enable redisRedis 默认只监听本地,不需要额外配置。如果你不装 Redis,把[Redis]段删掉或者留空,Cloudreve 会自动降级用内存缓存。
改完配置后,重新运行 Cloudreve:
./cloudreve这次它会连接 MySQL 并自动建表。看到启动成功的日志后,就可以用之前记下的管理员账号登录了。
4.3 Nginx 反向代理与 HTTPS 配置
Cloudreve 直接跑在 5212 端口上,用 IP 加端口访问也能用,但体验不好,而且没法上 HTTPS。用 Nginx 反代是标准做法。
先创建一个 Nginx 配置文件:
server { listen 80; server_name your-domain.com; # 强制跳转 HTTPS(配好证书后启用) # return 301 https://$server_name$request_uri; location / { proxy_pass http://127.0.0.1:5212; 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-Proto $scheme; # 大文件上传关键配置 client_max_body_size 2048m; proxy_connect_timeout 300s; proxy_send_timeout 300s; proxy_read_timeout 300s; proxy_buffering off; } }这里有几个参数是踩过坑之后总结出来的:
client_max_body_size 2048m控制客户端上传文件的最大体积,默认是 1M,不改的话传大文件直接报 413 错误。我设成 2G,你可以根据实际需求调整。
proxy_read_timeout 300s是代理读取超时时间,默认 60 秒。上传大文件时如果超过 60 秒没数据传输,Nginx 会断开连接。设成 300 秒比较稳妥。
proxy_buffering off关闭代理缓冲,对于大文件上传下载来说,关闭缓冲可以减少内存占用,避免 Nginx 把整个文件缓存到内存里。
配置 HTTPS 需要证书。我用的是 Let's Encrypt 的免费证书,通过 certbot 自动申请和续期。
yum install -y certbot python2-certbot-nginx certbot --nginx -d your-domain.comcertbot 会自动修改 Nginx 配置,加上 443 端口的监听和证书路径。续期是自动的,certbot 会创建一个定时任务,每天检查一次,快到期时自动续。
注意:certbot 申请证书时需要验证域名所有权,确保你的域名已经正确解析到服务器 IP,并且 80 端口可以从外网访问。
4.4 开机自启与进程守护
Cloudreve 本身没有提供 systemd 服务文件,需要自己写一个。这样服务器重启后 Cloudreve 会自动启动,不用手动去拉。
cat > /etc/systemd/system/cloudreve.service << EOF [Unit] Description=Cloudreve Service After=network.target mysql.service redis.service [Service] User=nginx WorkingDirectory=/var/www/cloudreve ExecStart=/var/www/cloudreve/cloudreve Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl start cloudreve systemctl enable cloudreve这里User=nginx表示用 nginx 用户运行 Cloudreve,避免用 root 跑带来安全风险。但要注意,/var/www/cloudreve目录的属主也要改成 nginx,否则 Cloudreve 没有权限写数据库文件和日志。
chown -R nginx:nginx /var/www/cloudreve chown -R nginx:nginx /var/www/aria2Restart=on-failure表示进程异常退出时自动重启,RestartSec=5表示重启前等待 5 秒。这两个配置能保证 Cloudreve 在崩溃后自动恢复,不用人工干预。
5. 常见问题排查与性能调优实录
5.1 上传大文件失败与超时问题
这是自建网盘最高频的问题。表现是上传到一半卡住,或者直接报错“上传失败”。原因通常有三个层面:Nginx 限制、PHP 限制、Cloudreve 自身限制。
Nginx 层面,前面已经说了client_max_body_size和proxy_read_timeout。但还有一个隐藏参数:proxy_request_buffering。默认是on,表示 Nginx 会先把整个请求体缓冲到磁盘再转发给后端。上传大文件时,这个缓冲过程会占用大量磁盘 IO,导致超时。建议关掉:
proxy_request_buffering off;PHP 层面,如果你用了 AriaNg 面板,PHP 的上传限制也要改。编辑/etc/php.ini:
upload_max_filesize = 2048M post_max_size = 2048M max_execution_time = 3600 max_input_time = 3600 memory_limit = 512M改完重启 PHP-FPM。
Cloudreve 层面,它本身对上传大小没有硬限制,但如果你用的是本地存储,要确保存储目录所在的分区有足够空间。另外,Cloudreve 的上传是分片上传,如果分片大小设置不合理,也会影响大文件上传的稳定性。这个在后台管理面板的“存储策略”里可以调,一般保持默认即可。
5.2 数据库连接失败与字符集问题
Cloudreve 启动时报“数据库连接失败”,排查顺序是这样的:
先确认 MySQL 服务是否在跑:systemctl status mysqld。然后确认用户名密码是否正确:用mysql -ucloudreve -p手动登录试试。再确认数据库是否存在:SHOW DATABASES;。
如果都正常,但 Cloudreve 还是连不上,检查conf.ini里的Host是不是127.0.0.1。有些环境下 MySQL 只监听localhost的 socket,不监听 TCP,这时候要么改成localhost,要么在 MySQL 配置里开启 TCP 监听。
字符集问题表现为文件名乱码或者 emoji 存不进去。检查数据库和表的字符集:
SHOW VARIABLES LIKE 'character_set%'; SHOW CREATE TABLE cd_files;如果发现不是utf8mb4,需要手动改:
ALTER DATABASE cloudreve CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ALTER TABLE cd_files CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;MySQL 5.7 的配置文件/etc/my.cnf里也要加上:
[mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci改完重启 MySQL 生效。
5.3 反向代理后获取不到真实 IP
Cloudreve 后台看到的登录 IP 全是127.0.0.1,这是因为 Nginx 反代之后,Cloudreve 拿到的是 Nginx 的 IP。需要在 Nginx 配置里加上X-Real-IP和X-Forwarded-For头,前面已经配了。但 Cloudreve 还需要在配置文件里开启信任代理:
[System] Mode = master Listen = :5212 SessionSecret = xxx HashIDSalt = xxx TrustedProxies = 127.0.0.1TrustedProxies填 Nginx 的 IP,如果是本机就是127.0.0.1。这样 Cloudreve 就会从X-Forwarded-For头里取真实 IP。
5.4 性能调优与资源监控
Cloudreve 跑起来之后,我一般会观察几个指标:CPU 占用、内存占用、磁盘 IO、网络带宽。
CPU 方面,Cloudreve 本身很轻,空闲时几乎不占 CPU。但如果开了离线下载,Aria2 在下载时会吃 CPU,尤其是多任务并发时。可以通过max-concurrent-downloads限制并发数。
内存方面,Cloudreve 主进程一般占 50-100M,MySQL 占 300-500M,Redis 占 10-20M,Nginx 占 10M 左右。总共 1G 内存的机器跑起来会有点紧,建议 2G 起步。
磁盘 IO 方面,如果用的是机械硬盘,大量小文件读写会很慢。建议数据目录放在 SSD 上,或者用对象存储后端,把 IO 压力转移出去。
网络带宽方面,自建网盘最大的瓶颈往往是上行带宽。家用宽带的上行通常只有几十兆,多人同时下载会卡。如果对速度要求高,可以考虑把存储后端切到对象存储,利用对象存储的 CDN 加速。
我常用的监控命令:
# 查看 Cloudreve 进程资源占用 top -p $(pgrep cloudreve) # 查看磁盘 IO iostat -x 1 # 查看网络连接 ss -tlnp | grep 52125.5 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| 上传大文件报 413 | Nginx 限制 | 查看 Nginx 错误日志 | 调大client_max_body_size |
| 上传中途断开 | 超时设置过短 | 查看 Nginx 和 PHP 超时日志 | 调大proxy_read_timeout和max_execution_time |
| 数据库连接失败 | 配置错误或服务未启动 | 手动登录 MySQL 测试 | 检查conf.ini和 MySQL 状态 |
| 文件名乱码 | 字符集不是 utf8mb4 | 查看数据库字符集 | 修改数据库和表字符集 |
| 后台 IP 全是 127.0.0.1 | 未配置信任代理 | 检查TrustedProxies | 添加 Nginx IP 到信任列表 |
| 离线下载无速度 | Aria2 未启动或配置错误 | 检查 Aria2 服务状态 | 重启 Aria2 并检查 RPC 配置 |
| 页面打开慢 | 未开 Redis 或缓存失效 | 检查 Redis 连接 | 安装并配置 Redis |
| 证书续期失败 | 80 端口被占用 | 检查 Nginx 配置 | 确保 80 端口可访问 |
提示:排查问题时,日志是最好的朋友。Cloudreve 的日志在
cloudreve.log,Nginx 的日志在/var/log/nginx/,MySQL 的日志在/var/log/mysqld.log。遇到问题先看日志,比盲目搜索快得多。
6. 数据安全与日常维护经验
6.1 备份策略:别等丢了才后悔
自建网盘最大的风险不是被攻击,而是数据丢失。硬盘会坏、系统会崩、手会抖。我见过太多人搭完网盘就不管了,直到某天硬盘报警才慌。
我的备份策略是“三二一”原则的简化版:至少两份备份,一份本地一份异地。本地备份用 rsync 定时同步到另一块硬盘,异地备份用对象存储或者另一台服务器。
Cloudreve 的数据分两部分:数据库和文件。数据库存的是元数据(用户、文件索引、分享链接),文件存的是实际内容。两者必须一起备份,只备份文件不备份数据库,恢复后文件索引全丢了,等于没备份。
数据库备份用 mysqldump:
mysqldump -ucloudreve -p cloudreve > /backup/cloudreve_$(date +%Y%m%d).sql文件备份用 rsync:
rsync -avz --delete /var/www/cloudreve/uploads/ /backup/uploads/我一般写一个脚本,每天凌晨 3 点跑一次,保留最近 7 天的备份。脚本内容:
#!/bin/bash BACKUP_DIR=/backup DATE=$(date +%Y%m%d) # 备份数据库 mysqldump -ucloudreve -p'StrongPass123!' cloudreve > $BACKUP_DIR/db_$DATE.sql # 备份文件 rsync -avz --delete /var/www/cloudreve/uploads/ $BACKUP_DIR/uploads/ # 删除 7 天前的备份 find $BACKUP_DIR -name "db_*.sql" -mtime +7 -delete加到 crontab 里:
0 3 * * * /bin/bash /root/backup.sh6.2 安全加固:别让网盘变成公共厕所
自建网盘暴露在公网上,安全必须重视。我踩过的坑包括:弱密码被爆破、后台路径被扫描、分享链接被恶意爬取。
第一道防线是强密码。Cloudreve 的管理员密码一定要复杂,不要用admin123这种。我一般用 16 位以上的随机字符串,包含大小写、数字、特殊符号。
第二道防线是改后台路径。Cloudreve 默认后台路径是/admin,很容易被扫描到。可以在 Nginx 里做一个路径重写,把/admin映射到一个随机路径:
location /my-secret-admin-path/ { proxy_pass http://127.0.0.1:5212/admin/; proxy_set_header Host $host; }这样外部访问/admin会 404,只有知道随机路径的人才能进后台。
第三道防线是限制分享链接的访问频率。Cloudreve 本身没有频率限制功能,但可以在 Nginx 层面做:
limit_req_zone $binary_remote_addr zone=share:10m rate=10r/s; location /s/ { limit_req zone=share burst=20 nodelay; proxy_pass http://127.0.0.1:5212; }这表示每个 IP 每秒最多 10 个请求,突发允许 20 个。超过就返回 503,能有效防止爬虫批量抓取分享链接。
第四道防线是定期更新。Cloudreve 的更新频率不低,新版本会修复安全漏洞。我一般每个月检查一次更新,有安全相关的更新立刻升级。升级很简单,下载新版本二进制文件,替换旧的,重启服务即可。数据库结构如果有变化,Cloudreve 会自动迁移。
6.3 存储扩容与迁移方案
用了一段时间之后,文件越来越多,本地硬盘满了,这时候就需要扩容或者迁移。
最简单的扩容是加一块硬盘,挂载到新的目录,然后在 Cloudreve 后台添加一个新的存储策略,把新文件存到新硬盘上。但这样老文件和新文件分散在两块盘上,管理起来麻烦。
更好的方案是迁移到对象存储。Cloudreve 支持多种对象存储后端,配置好之后,新上传的文件直接进对象存储,老文件可以手动迁移或者保持本地。对象存储的好处是容量无限、不怕硬盘坏、自带 CDN 加速。缺点是流量要花钱,但个人使用量不大,费用通常可以接受。
迁移步骤大致是:在对象存储服务商那里创建一个 Bucket,拿到 AccessKey 和 SecretKey,然后在 Cloudreve 后台“存储策略”里添加一个新的策略,选择对应的存储类型,填入密钥和 Bucket 信息。然后把默认存储策略切换到新的,新文件就会走对象存储。
老文件的迁移,Cloudreve 提供了一个“迁移”功能,可以在文件管理里选中文件,选择迁移到目标存储策略。但大批量迁移会比较慢,建议在低峰期操作。
注意:迁移之前一定要先备份数据库,迁移过程中不要中断服务。如果迁移失败,至少还能回滚。
6.4 日常维护清单
我给自己列了一个日常维护清单,每周花十分钟过一遍,能避免大部分突发故障。
- 检查磁盘空间:
df -h,确保数据盘使用率不超过 80% - 检查服务状态:
systemctl status cloudreve nginx mysqld redis aria2 - 检查日志有无异常:
tail -100 /var/www/cloudreve/cloudreve.log - 检查备份是否成功:
ls -lh /backup/ - 检查证书有效期:
certbot certificates - 检查系统更新:
yum check-update
这套流程跑下来,基本能保证网盘稳定运行。我有一台机器跑了两年多,除了几次主动升级,没有出现过意外宕机。
7. 我个人的一些使用体会
Cloudreve 在 CentOS 7 上的部署,说难不难,说简单也不简单。难点不在 Cloudreve 本身,而在于 CentOS 7 的环境配置——软件源老、依赖版本低、各种默认配置需要调整。但只要把环境理顺了,Cloudreve 的部署就是解压、改配置、启动三步的事。
我用这套方案给好几个朋友搭过网盘,最小的机器是 1 核 1G,跑起来也没问题,只是不能开太多并发。最常用的配置是 2 核 4G,挂一块 500G 的数据盘,够十几个人小团队用。
如果你问我最值得注意的一点是什么,我会说是备份。技术上的问题都能解决,数据丢了就真没了。我见过太多人把重要文件往自建网盘一扔就不管了,这是对自己数据的不负责任。
另外一个小技巧:Cloudreve 的 WebDAV 功能非常实用。你可以在本地用 RaiDrive、NetDrive 这类工具把网盘挂载成磁盘,直接拖拽文件,体验和本地硬盘几乎一样。配置方法是在 Cloudreve 后台开启 WebDAV,然后在本地客户端填入地址https://your-domain.com/webdav,用户名密码就是 Cloudreve 的账号密码。挂载之后,你可以用任何本地软件直接读写网盘文件,不用再打开浏览器上传下载。
这个功能我用了之后就回不去了,强烈推荐你试试。