运维知识
悠悠
2025年9月11日

告别百度网盘限速!手把手教你搭建私人云盘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

哎呀,版本高了!重新装下!

image-20250910170056834

它好烦!!!

image-20250910172510538

好了!!!

image-20250910172817865

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

数据库可以三种选择。

image-20250910173621131

如果是Docker部署,由于我们已经在docker-compose.yml中配置了这些信息,初始化会自动完成。

点击完成安装后,系统会自动创建必要的数据表和配置文件。这个过程可能需要几分钟时间,耐心等待就好。

安装完成后会自动跳转到ownCloud的主界面,界面设计还是挺简洁的,和Dropbox、Google Drive这些商业产品比起来也不逊色。

image-20250910173725206

功能体验和日常使用

登录后的第一感觉就是界面很清爽,左侧是功能菜单,主要包括文件、照片、活动等模块。文件上传可以直接拖拽,这点体验很好。我试着上传了一个1G的视频文件,速度确实比百度网盘快多了,基本能跑满我的上行带宽。

文件分享功能也很实用,可以生成分享链接,还能设置密码和过期时间。我经常用这个功能和同事分享一些工作文档,比用微信传文件方便多了,而且不用担心文件过期被删除。

移动端支持也不错,ownCloud有官方的iOS和Android客户端,可以自动同步照片和文档。我在手机上安装了客户端,设置了照片自动上传,现在拍的照片都会自动备份到服务器上。

不过有一点需要注意,如果你的服务器在国外,移动端同步可能会比较慢,特别是上传大文件的时候。我后来把服务器迁移到了国内的云服务商,速度就好了很多。

image-20250910174133142

image-20250910174145311

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插件可以在线编辑文本文件,对于经常需要修改配置文件的运维人员来说很方便。支持语法高亮,基本的编辑功能都有。

image-20250910174244708

故障排查经验

Docker部署虽然简化了很多操作,但遇到问题时排查可能会稍微复杂一些。我总结了几个常见问题的解决方法:

容器启动失败:首先查看容器日志,通常能找到具体的错误信息。如果是权限问题,检查数据卷的权限设置。

数据库连接失败:检查数据库容器是否正常启动,可以用docker exec进入数据库容器测试连接。

文件上传失败:可能是PHP配置问题,需要进入ownCloud容器检查php.ini配置。

性能问题:用docker stats命令查看容器资源使用情况,如果内存或CPU使用率过高,考虑增加资源限制或优化配置。

与传统部署方式对比

经过一段时间的使用,我觉得Docker部署和传统部署各有优缺点。

Docker部署的优点:

  • 环境一致性好,不用担心依赖问题
  • 部署简单,一个命令就能启动所有服务
  • 升级方便,只需要修改镜像版本
  • 资源隔离好,不会影响其他服务

传统部署的优点:

  • 性能稍微好一些,没有容器化的开销
  • 排查问题相对简单,直接操作文件系统
  • 自定义程度更高,可以随意修改配置

对于新手来说,我更推荐Docker部署,因为踩坑的概率更小。对于有经验的运维人员,可以根据具体需求选择合适的部署方式。

总结

我对ownCloud还是很满意的。无论是传统部署还是Docker部署,都能很好地满足私有云存储的需求。Docker部署虽然多了一层抽象,但带来的便利性还是很明显的,特别是在环境管理和服务编排方面。

对于有一定技术基础的个人用户或者小团队来说,ownCloud确实是一个不错的私有云存储解决方案。当然,如果你只是想简单地存储一些文件,不想折腾,那还是用商业网盘比较省心。

搭建私有云存储这件事,技术门槛其实不算太高,主要是需要耐心和细心。遇到问题的时候多查查文档,基本都能解决。而且这个过程中还能学到不少Linux运维和Docker的知识,对于技术人员来说也算是一种收获。

如果你也想摆脱网盘限速的困扰,不妨试试搭建一个属于自己的ownCloud。虽然可能会遇到一些小问题,但解决问题的过程也是学习和成长的过程。Docker部署方式让整个过程变得更简单,即使是新手也能比较容易地搭建成功。

如果这篇文章对你有帮助,别忘了点赞转发支持一下!想了解更多运维实战经验和技术干货,记得关注微信公众号@运维躬行录,领取学习大礼包!!!我会持续分享更多接地气的运维知识和踩坑经验。让我们一起在运维这条路上互相学习,共同进步!

公众号:运维躬行录

个人博客:躬行笔记

文章目录

博主介绍

热爱技术的云计算运维工程师,Python全栈工程师,分享开发经验与生活感悟。
欢迎关注我的微信公众号@运维躬行录,领取海量学习资料

微信二维码