告别百度网盘限速!手把手教你搭建私人云盘ownCloud,速度飞起来
最近遇到客户需要用私有云盘来保存资料,正好借这个机会研究了一下ownCloud。说实话,用了这么多年百度网盘、腾讯微云这些,每次下载都被限速搞得心态爆炸,现在终于可以摆脱这种痛苦了。
ownCloud这个开源的云存储解决方案其实已经存在很多年了,但很多人可能还不太了解。简单来说,它就是一个可以自己部署的"网盘",功能上和我们平时用的那些商业网盘差不多,但是数据完全掌握在自己手里,而且速度只受限于你的服务器带宽和硬盘性能。
我记得第一次接触ownCloud还是在2021年,当时公司就是用这个来做公司的云盘服务。
环境准备和基础配置
我这次选择在Rocky Linux release 8.10(依旧是我们的老演员rocky8)上部署ownCloud,服务器配置是4核8G内存,500G SSD硬盘。其实对于个人使用来说,2核4G就完全够用了,我之前在一台1核2G的VPS上跑过,除了上传大文件时会有点慢,日常使用完全没问题。
首先更新一下系统包:
yum update -y
然后安装必要的软件包。ownCloud需要Apache/Nginx、PHP和MySQL/MariaDB的支持,我选择了Apache + MariaDB的组合:
yum install -y httpd mariadb-server mariadb php php-mysql php-gd php-xml php-mbstring php-zip php-curl php-json php-intl
启动并设置开机自启:
systemctl start httpd mariadb
systemctl enable httpd mariadb
配置MariaDB的时候要注意,运行mysql_secure_installation来设置root密码和删除一些不必要的默认配置。我一般会把root密码设置得复杂一点,毕竟这关系到数据安全。
mysql_secure_installation
接下来创建ownCloud专用的数据库和用户:
mysql -u root -p
CREATE DATABASE owncloud;
CREATE USER 'owncloud'@'localhost' IDENTIFIED BY 'your_password_here';
GRANT ALL PRIVILEGES ON owncloud.* TO 'owncloud'@'localhost';
FLUSH PRIVILEGES;
EXIT;
PHP环境调优(精益求精)
这里有个坑我当时踩过,就是PHP的默认配置对于文件上传来说限制太严格了。你想想,如果要上传几个G的视频文件,结果PHP只允许2M的上传大小,那不是白搭吗?
编辑/etc/php.ini文件,修改以下参数:
upload_max_filesize = 2G
post_max_size = 2G
max_execution_time = 300
max_input_time = 300
memory_limit = 512M
还有一个容易忽略的地方是时区设置,如果不设置正确的时区,文件的修改时间会显示错乱:
date.timezone = Asia/Shanghai
修改完配置后记得重启Apache:
systemctl restart httpd
ps:如果觉得手动配置lnmp环境太麻烦,也可以安装小皮面板一键部署。(偷懒才是推动科技进步的强大动力!!!)
传统方式下载和安装ownCloud
去ownCloud官网下载最新版本的安装包,我下载的是10.11.0版本。不过要注意一点,ownCloud从版本10开始就不再完全免费了,企业版需要付费。但对于个人用户和小团队来说,社区版的功能已经完全够用。
cd /tmp
wget https://download.owncloud.com/server/stable/owncloud-10.10.0.tar.bz2
tar -xjf owncloud-10.10.0.tar.bz2
mv owncloud /xp/www/192.168.198.130
设置正确的文件权限,这个很重要,权限设置不对的话后面会遇到各种奇怪的问题:
#这里记得修改下网站目录
chown -R www:www /xp/www/192.168.198.130/owncloud
chmod -R 755 /xp/www/192.168.198.130/owncloud
我之前就因为权限问题折腾了半天,ownCloud界面一直提示无法写入配置文件,后来发现是SELinux在作怪。如果你的系统开启了SELinux,需要额外设置一下:
setsebool -P httpd_can_network_connect on
semanage fcontext -a -t httpd_exec_t "/var/www/html/owncloud(/.*)?"
restorecon -R /var/www/html/owncloud
哎呀,版本高了!重新装下!
它好烦!!!
好了!!!
Docker方式部署ownCloud
现在越来越多人喜欢用Docker来部署应用,确实方便很多。我后来也尝试了用Docker来部署ownCloud,发现比传统方式简单不少,特别是环境隔离做得很好,不会和宿主机的其他服务产生冲突。
首先安装Docker,CentOS 7上安装Docker还是很简单的:
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
systemctl start docker
systemctl enable docker
安装docker-compose,这个工具可以让我们用一个配置文件来管理多个容器:
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
创建一个目录来存放Docker配置文件:
mkdir -p /opt/owncloud
cd /opt/owncloud
创建docker-compose.yml文件,这个配置文件定义了ownCloud和数据库的容器:
version: '3.8'
services:
owncloud:
image: owncloud/server:10.11
container_name: owncloud_server
restart: always
ports:
- "8080:8080"
depends_on:
- mariadb
- redis
environment:
- OWNCLOUD_DOMAIN=localhost:8080
- OWNCLOUD_DB_TYPE=mysql
- OWNCLOUD_DB_NAME=owncloud
- OWNCLOUD_DB_USERNAME=owncloud
- OWNCLOUD_DB_PASSWORD=owncloud_password
- OWNCLOUD_DB_HOST=mariadb
- OWNCLOUD_ADMIN_USERNAME=admin
- OWNCLOUD_ADMIN_PASSWORD=admin_password
- OWNCLOUD_MYSQL_UTF8MB4=true
- OWNCLOUD_REDIS_ENABLED=true
- OWNCLOUD_REDIS_HOST=redis
healthcheck:
test: ["CMD", "/usr/bin/healthcheck"]
interval: 30s
timeout: 10s
retries: 5
volumes:
- owncloud_data:/mnt/data
mariadb:
image: mariadb:10.6
container_name: owncloud_mariadb
restart: always
environment:
- MYSQL_ROOT_PASSWORD=root_password
- MYSQL_USER=owncloud
- MYSQL_PASSWORD=owncloud_password
- MYSQL_DATABASE=owncloud
command: ["--max-allowed-packet=128M", "--innodb-log-file-size=64M"]
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-u", "root", "--password=root_password"]
interval: 10s
timeout: 5s
retries: 5
volumes:
- mysql_data:/var/lib/mysql
redis:
image: redis:6
container_name: owncloud_redis
restart: always
command: redis-server --requirepass redis_password
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 5
volumes:
- redis_data:/data
volumes:
owncloud_data:
mysql_data:
redis_data:
这个配置文件看起来有点复杂,但其实逻辑很清楚。我们定义了三个服务:ownCloud主服务、MariaDB数据库和Redis缓存。每个服务都有自己的数据卷,这样即使容器重启,数据也不会丢失。
启动所有服务:
docker-compose up -d
第一次启动可能需要下载镜像,会花一些时间。启动完成后可以查看容器状态:
docker-compose ps
如果一切正常,应该能看到三个容器都在运行状态。
现在可以通过浏览器访问http://your_server_ip:8080来访问ownCloud了。由于我们在docker-compose.yml中已经设置了管理员账号,可以直接用admin/admin_password登录。
Docker方式部署的好处是环境隔离得很好,而且升级也很方便,只需要修改镜像版本号然后重新启动就行了。不过有一点需要注意,就是数据备份要记得备份Docker的数据卷。
反向代理配置
如果你想用域名访问ownCloud,而且不想在URL后面加端口号,可以配置一个反向代理。我一般用Nginx来做反向代理:
yum install -y nginx
创建Nginx配置文件:
server {
listen 80;
server_name your_domain.com;
location / {
proxy_pass http://localhost:8080;
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 2G;
proxy_request_buffering off;
}
}
启动Nginx:
systemctl start nginx
systemctl enable nginx
这样就可以直接通过域名访问ownCloud了,不需要加端口号。
Web界面初始化配置
现在可以通过浏览器访问http://your_server_ip/owncloud(传统部署)或者http://your_server_ip:8080(Docker部署)来进行初始化配置了。第一次打开会看到一个设置页面,需要填写管理员账号信息和数据库连接信息。
如果是传统部署方式,管理员用户名我一般设置为admin,密码要设置得复杂一些。数据库配置部分填写刚才创建的数据库信息:
- 数据库用户:owncloud
- 数据库密码:刚才设置的密码
- 数据库名:owncloud
- 数据库主机:localhost
数据库可以三种选择。
如果是Docker部署,由于我们已经在docker-compose.yml中配置了这些信息,初始化会自动完成。
点击完成安装后,系统会自动创建必要的数据表和配置文件。这个过程可能需要几分钟时间,耐心等待就好。
安装完成后会自动跳转到ownCloud的主界面,界面设计还是挺简洁的,和Dropbox、Google Drive这些商业产品比起来也不逊色。
功能体验和日常使用
登录后的第一感觉就是界面很清爽,左侧是功能菜单,主要包括文件、照片、活动等模块。文件上传可以直接拖拽,这点体验很好。我试着上传了一个1G的视频文件,速度确实比百度网盘快多了,基本能跑满我的上行带宽。
文件分享功能也很实用,可以生成分享链接,还能设置密码和过期时间。我经常用这个功能和同事分享一些工作文档,比用微信传文件方便多了,而且不用担心文件过期被删除。
移动端支持也不错,ownCloud有官方的iOS和Android客户端,可以自动同步照片和文档。我在手机上安装了客户端,设置了照片自动上传,现在拍的照片都会自动备份到服务器上。
不过有一点需要注意,如果你的服务器在国外,移动端同步可能会比较慢,特别是上传大文件的时候。我后来把服务器迁移到了国内的云服务商,速度就好了很多。
Docker部署的优势和注意事项
用Docker部署ownCloud确实有不少好处,最明显的就是环境一致性。我之前在不同的服务器上部署过传统方式的ownCloud,经常遇到PHP版本不兼容、扩展缺失等问题,用Docker就完全避免了这些麻烦。
另外,Docker的资源隔离也做得很好。我在同一台服务器上还跑着其他服务,用Docker部署的ownCloud不会和它们产生冲突。而且如果哪天不想用了,直接删除容器就行,不会在系统里留下一堆垃圾文件。
不过Docker部署也有一些需要注意的地方。比如日志查看,需要用docker logs命令:
docker logs owncloud_server
如果要进入容器内部排查问题,可以用exec命令:
docker exec -it owncloud_server /bin/bash
数据备份也需要特别注意,Docker的数据卷位置和传统部署不一样。可以用这个命令查看数据卷的实际位置:
docker volume inspect owncloud_owncloud_data
高级配置和优化
用了一段时间后,我发现有些地方还可以进一步优化。比如启用HTTPS,毕竟涉及到文件传输,安全性还是很重要的。
如果是Docker部署,可以在docker-compose.yml中添加SSL配置,或者在前面加一个Nginx反向代理来处理SSL。我比较推荐后者,因为证书管理会更方便一些。
申请SSL证书可以用Let's Encrypt,免费而且配置简单:
yum install -y certbot python2-certbot-nginx
certbot --nginx -d your_domain.com
配置完SSL后,记得修改docker-compose.yml中的OWNCLOUD_DOMAIN环境变量:
- OWNCLOUD_DOMAIN=your_domain.com
然后重启容器:
docker-compose restart owncloud
对于经常需要处理大量小文件的场景,Redis缓存的作用就很明显了。我们在docker-compose.yml中已经包含了Redis服务,ownCloud会自动使用它来缓存数据。
如果觉得默认的性能还不够,可以调整一些参数。比如增加Redis的内存限制:
redis:
image: redis:6
container_name: owncloud_redis
restart: always
command: redis-server --requirepass redis_password --maxmemory 256mb --maxmemory-policy allkeys-lru
扩展和插件管理
ownCloud有一个应用市场,里面有很多实用的插件。Docker部署的ownCloud同样支持安装这些插件,操作方式和传统部署一样。
我安装了几个比较有用的插件:
Calendar应用可以管理日程,支持CalDAV协议,可以和手机的日历应用同步。安装后可以在ownCloud界面里直接管理日程,很方便。
Contacts应用用来管理联系人,同样支持CardDAV协议。我把手机通讯录同步到ownCloud上,这样换手机的时候就不用担心联系人丢失了。
External Storage插件很实用,可以挂载外部存储,比如FTP、SFTP、Amazon S3等。我用它挂载了公司的FTP服务器,这样就可以在ownCloud界面里直接访问FTP上的文件了。
Text Editor插件可以在线编辑文本文件,对于经常需要修改配置文件的运维人员来说很方便。支持语法高亮,基本的编辑功能都有。
故障排查经验
Docker部署虽然简化了很多操作,但遇到问题时排查可能会稍微复杂一些。我总结了几个常见问题的解决方法:
容器启动失败:首先查看容器日志,通常能找到具体的错误信息。如果是权限问题,检查数据卷的权限设置。
数据库连接失败:检查数据库容器是否正常启动,可以用docker exec进入数据库容器测试连接。
文件上传失败:可能是PHP配置问题,需要进入ownCloud容器检查php.ini配置。
性能问题:用docker stats命令查看容器资源使用情况,如果内存或CPU使用率过高,考虑增加资源限制或优化配置。
与传统部署方式对比
经过一段时间的使用,我觉得Docker部署和传统部署各有优缺点。
Docker部署的优点:
- 环境一致性好,不用担心依赖问题
- 部署简单,一个命令就能启动所有服务
- 升级方便,只需要修改镜像版本
- 资源隔离好,不会影响其他服务
传统部署的优点:
- 性能稍微好一些,没有容器化的开销
- 排查问题相对简单,直接操作文件系统
- 自定义程度更高,可以随意修改配置
对于新手来说,我更推荐Docker部署,因为踩坑的概率更小。对于有经验的运维人员,可以根据具体需求选择合适的部署方式。
总结
我对ownCloud还是很满意的。无论是传统部署还是Docker部署,都能很好地满足私有云存储的需求。Docker部署虽然多了一层抽象,但带来的便利性还是很明显的,特别是在环境管理和服务编排方面。
对于有一定技术基础的个人用户或者小团队来说,ownCloud确实是一个不错的私有云存储解决方案。当然,如果你只是想简单地存储一些文件,不想折腾,那还是用商业网盘比较省心。
搭建私有云存储这件事,技术门槛其实不算太高,主要是需要耐心和细心。遇到问题的时候多查查文档,基本都能解决。而且这个过程中还能学到不少Linux运维和Docker的知识,对于技术人员来说也算是一种收获。
如果你也想摆脱网盘限速的困扰,不妨试试搭建一个属于自己的ownCloud。虽然可能会遇到一些小问题,但解决问题的过程也是学习和成长的过程。Docker部署方式让整个过程变得更简单,即使是新手也能比较容易地搭建成功。
如果这篇文章对你有帮助,别忘了点赞转发支持一下!想了解更多运维实战经验和技术干货,记得关注微信公众号@运维躬行录,领取学习大礼包!!!我会持续分享更多接地气的运维知识和踩坑经验。让我们一起在运维这条路上互相学习,共同进步!
公众号:运维躬行录
个人博客:躬行笔记