在这里插入图片描述

随着数据安全与隐私保护意识的提升,越来越多的个人和组织选择自建云平台来替代公有云。Nextcloud 作为一款开源的文件同步与协作套件,不仅能实现类似网盘的文件存储与分享,还提供日历、联系人、即时通讯、在线文档编辑等协作功能,具备丰富的扩展生态。

无论是个人家庭的数据管理,还是团队与企业的文件协作,Nextcloud 都能通过灵活的部署方式(单容器、Docker Compose、内网集成数据库与文档套件)满足不同规模的需求。本文将结合实践,从基础到企业内网场景,介绍 Nextcloud 的快速部署方案与关键配置要点。

1. 什么是 Nextcloud

Nextcloud 是一个开源的文件同步与协作平台,支持自建部署,帮助个人与组织在自有基础设施上实现“类似网盘 + 在线协作”的能力。与公有云服务不同,Nextcloud 将数据主权掌握在自己手中,同时提供丰富的应用生态用于团队协作与办公自动化。

适用场景包括:个人与家庭私有云、团队文件协作、跨设备资料同步、知识库与笔记、轻量内网网盘、企业内外部文件交换与审计等。

1.1 核心特性概览

  • 文件同步与共享:桌面与移动客户端双向同步,链接分享、权限与有效期控制、文件版本与回收站等功能。
  • 协作套件:日历(CalDAV)、联系人(CardDAV)、任务、Talk 即时通信与音视频会议、白板、笔记、邮件聚合、活动流等。
  • 在线文档:可集成 Collabora Online 或 OnlyOffice 实现在线编辑文档、表格与演示文稿。
  • 外部存储与整合:对接 S3、SMB/CIFS、NFS、WebDAV、SFTP 以及对象存储,统一访问与权限控制。
  • 安全与隐私:端到端加密(可选)、服务端加密、细粒度权限、审计日志、2FA、多租户、合规模块与 DLP(需相关应用支持)。
  • 跨平台客户端:Windows、macOS、Linux、iOS、Android,以及 Web 端访问。

1.2 架构与工作原理

  • Web 与应用层:Nginx 或 Apache 作为前端,PHP-FPM 运行 Nextcloud 应用逻辑。
  • 数据库:MariaDB/MySQL 或 PostgreSQL 存储元数据与应用数据。
  • 缓存与锁管理:APCu 用于本地缓存,Redis 提供分布式缓存与事务型文件锁,减少数据库压力并避免“文件被锁定”问题。
  • 存储层:本地磁盘、网络存储或对象存储,用于保存实际文件数据与预览缩略图。
  • 协议支持:文件访问与同步使用 WebDAV;日历与联系人基于 CalDAV/CardDAV。

1.3 部署方式

  • 单机部署(入门与小型团队):一台服务器运行 Web、PHP、数据库与 Redis,架构简单、易维护。
  • Docker Compose(流行选择):将 Web、PHP、数据库、Redis 等组件容器化,便于版本管理与迁移。
  • Kubernetes(中大型与高可用):分离服务角色,搭配对象存储、Ingress 与横向扩展,满足大规模并发与多节点。
  • 托管服务或厂商方案:由第三方运营与运维,关注业务即可(需评估数据托管策略与合规要求)。

1.4 应用生态与扩展

Nextcloud有强大的拓展能力,可以在应用商店里安装应用并集成到Nextcloud里。这点和Wordpress众多的插件很相像。商店地址为https://apps.nextcloud.com ,对于局域网的部署可以下载安装包在服务器上手动进行安装。对于AI的浪潮,Nextcloud也支持部分AI应用场景, 譬如根据大模型来给照片打标签,人脸识别,语音转文字,根据你的问题提问题(类似RAG),但是我觉得AI这块它做得并不是很好。由于我没有实际使用,也就是有个人感觉。

在这里插入图片描述

2. 快速部署

2.1 单容器

适合测试与个人轻量使用,只有一个容器,数据库使用SQLite,数据持久化到卷。直接访问 http://IP:8080就可以了。

services:nextcloud:image: nextcloud:latestrestart: unless-stoppedports:- "8080:80"volumes:- ./nextcloud_data:/var/www/html

2.2 Nginx代理HTTPS

如果是云服务器,一般都是使用域名和HTTPS,也就是使用Nginx代理。

我是使用Nginx来代理我所有的应用,统一管理HTTPS的证书。这时候就不需要端口的映射,但需要跟Nginx放到同一个Docker网络中,也就是挂到 nginx-reverse-proxy 网络下。

services:nextcloud:container_name: nextcloudimage: nextcloud:latestrestart: unless-stoppedexpose:- 80volumes:- ./nextcloud_data:/var/www/htmlnetworks:- nginx-reverse-proxynetworks:nginx-reverse-proxy:external: true

容器起来后,检查是否加入到nginx-reverse-proxy 网络下。如果没有,则Nginx的配置文件会失败。

$ docker network inspect nginx-reverse-proxy | grep nextcloud"Name": "nextcloud",

我的Nginx一直是独立部署的。代理80和443端口,挂载Nginx的配置文件和证书等。配置如下:

services:nginx:image: nginx:latestcontainer_name: nginx-reverse-proxyports:- "80:80"- "443:443"volumes:- ./nginx/conf.d:/etc/nginx/conf.d:ro- ./log:/var/log/nginx- /etc/letsencrypt/live/zenseek.site/fullchain.pem:/etc/nginx/certs/fullchain.pem:ro- /etc/letsencrypt/live/zenseek.site/privkey.pem:/etc/nginx/certs/privkey.pem:ro- /etc/localtime:/etc/localtime:ronetworks:- nginx-reverse-proxyrestart: alwaysnetworks:nginx-reverse-proxy:external: true

对于Nextcloud的Nginx配置文件如下:

server {listen 443 ssl;server_name nextcloud.zenseek.site;# Helpful for large uploads and long operations.client_max_body_size 2G;proxy_read_timeout 3600;proxy_request_buffering off;ssl_certificate /etc/nginx/certs/fullchain.pem;ssl_certificate_key /etc/nginx/certs/privkey.pem;# SSL/TLS Security Settingsssl_protocols TLSv1.2 TLSv1.3;ssl_prefer_server_ciphers on;ssl_ciphers HIGH:!aNULL:!MD5;# Enable HSTSadd_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;location / {proxy_pass http://nextcloud:80;proxy_set_header X-Forwarded-Proto $scheme;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection 'upgrade';proxy_set_header Host $host;}
}

这样作为个人或家庭使用已经就足够了。在访问 https://nextcloud.zenseek.site的时候,会出现已经使用SQLite的警告。

在这里插入图片描述

2.3 使用独立数据库

正常情况下Nginx,Nextcloud,database是标配。数据库我可以使用Mysql/MariaDB/PostgreSQL。这里我使用PostgreSQL作为例子。因为应用和数据库分开了,所以应用的容器要等待数据库的容器先起来。应用和数据库在一个容器网络,应用和Nginx在一个容器网络。

services:nextcloud:image: nextcloud:latestcontainer_name: nextcloud-apprestart: alwaysdepends_on:- dbenvironment:POSTGRES_HOST: dbPOSTGRES_DB: nextcloudPOSTGRES_USER: nextcloudPOSTGRES_PASSWORD: nc_pg_pwdexpose:- 80volumes:- ./nextcloud_data:/var/www/htmlnetworks:- nginx-reverse-proxy- nextcloud-netdb:image: postgres:latestcontainer_name: nextcloud-dbrestart: alwaysenvironment:POSTGRES_DB: nextcloudPOSTGRES_USER: nextcloudPOSTGRES_PASSWORD: nc_pg_pwdvolumes:- ./db_data:/var/lib/postgresql/datanetworks:- nextcloud-netnetworks:nginx-reverse-proxy:external: truenextcloud-net:external: true

这回再部署就不会有警告的消息。部署成功后,会先设置管理员账户并选择安装应用。

在这里插入图片描述
然后可以按需安装额外的应用。

在这里插入图片描述

3 企业内网部署方案

对于有在线预览和编辑,以及多人协同编辑的场景,就需要部署OnlyOffice或是Collabora。我两个都部署了,OnlyOffice是重资产,资源消耗很大。即使家庭使用,也需要4G以上的内存了,毕竟你不可能就只跑一个Nextcloud。虽然Collabora也很消耗资源,但是比OnlyOffice轻多了。所以这个是部署在内网的服务器上,16G的内存是够用了。

Redis用于文件锁、缓存、会话。它不是用来存储文件本身的数据库,而是负责高频、易并发的“易失性”工作,降低数据库压力并提升响应速度。对于我单节点的部署主要就是使用文件锁。当多人或多个应用同时访问同一文件时,Redis 负责加锁/解锁,避免“File is locked”错误与写入冲突。没有 Redis 时会退回用数据库加锁,性能和稳定性都更差。

企业内网部署的另一大特征是没有域名,只能通过IP和端口来区分应用,且没有互联网连接。

3.1 Docker Compose File

组件上多了Redis和Collabora。Redis设置了密码。Collabora设置了允许访问的域名,在我们这就是服务器的IP。都是部署在同一台服务器,所以这个IP是相同的。而Nextcloud和Collabora都是在Nginx后面的。

services:db:image: postgres:latestcontainer_name: nextcloud-dbrestart: alwaysenvironment:POSTGRES_DB: nextcloudPOSTGRES_USER: nextcloudPOSTGRES_PASSWORD: KbIrfS28UAmce4volumes:- ./db_data:/var/lib/postgresql/datanetworks:- nextcloud-netredis:image: redis:latestcontainer_name: nextcloud-redisrestart: alwayscommand: ["redis-server", "--requirepass", "5DGlpDfc6GIMrj"]environment:- REDIS_PASSWORD=5DGlpDfc6GIMrjvolumes:- ./redis_data:/datanetworks:- nextcloud-netnextcloud:image: nextcloud:latestcontainer_name: nextcloud-apprestart: alwaysdepends_on:- db- redisenvironment:POSTGRES_HOST: dbPOSTGRES_DB: nextcloudPOSTGRES_USER: nextcloudPOSTGRES_PASSWORD: KbIrfS28UAmce4REDIS_HOST: redisREDIS_HOST_PASSWORD: 5DGlpDfc6GIMrjexpose:- 80volumes:- ./nextcloud_data:/var/www/htmlnetworks:- nginx-reverse-proxy- nextcloud-netcollabora:image: collabora/code:latestcontainer_name: collaborarestart: alwaysenvironment:- domain="10\\.10\\.10\\.10"   # replace with your Nextcloud IP or regex# - extra_params="--o:ssl.enable=false"- username=admin- password=KgJbOStIEQ1urIcap_add:- MKNODnetworks:- nginx-reverse-proxy- nextcloud-netexpose:- 9980   # internal port only; Nginx will handle HTTPSnetworks:nginx-reverse-proxy:external: truenextcloud-net:external: true

3.2 Nginx配置文件

Nextcloud的Nginx配置。这里面要把端口带进去,不然Nextcloud PHP生成的连接会将端口剥离。

server {listen 8009 ssl;server_name 10.10.10.10;ssl_certificate /etc/nginx/certs/10.10.10.10.crt;ssl_certificate_key /etc/nginx/certs/10.10.10.10.key;# SSL/TLS Security Settingsssl_protocols TLSv1.2 TLSv1.3;ssl_prefer_server_ciphers on;ssl_ciphers HIGH:!aNULL:!MD5;# Enable HSTSadd_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;location / {proxy_pass http://nextcloud-app:80/;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Host $host;proxy_set_header X-Forwarded-Proto $scheme;proxy_set_header X-Forwarded-Port $server_port;proxy_set_header X-Forwarded-Ssl on;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;# To support login forms and large payloads# client_max_body_size 128M;}
}

Collabora的Nginx配置。Collabora默认是使用HTTPS来通讯的,除非在Docker Compose配置里禁用SSL。实际中我试验了禁用SSL,Collabora直接无法访问了。经过多种测试,只有现在的配置好用。我也试验过了OnlyOffice对特殊的端口支持的不好,都会重定向回443端口。所以在内网环境,我放弃了OnlyOffice。

server {listen 8010 ssl;server_name 10.10.10.10;ssl_certificate /etc/nginx/certs/10.10.10.10.crt;ssl_certificate_key /etc/nginx/certs/10.10.10.10.key;ssl_protocols TLSv1.2 TLSv1.3;ssl_prefer_server_ciphers on;ssl_ciphers HIGH:!aNULL:!MD5;add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;# Collabora main endpointlocation / {proxy_pass https://collabora:9980;proxy_set_header Host $http_host;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";# Optional, fixes some WebSocket issuesproxy_read_timeout 36000s;proxy_buffering off;}# WebSocket endpoint (needed for Collabora real-time editing)location ~ /lool/(.*)/ws$ {proxy_pass https://collabora:9980;proxy_set_header Host $http_host;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_read_timeout 36000s;proxy_buffering off;}# Optional: prevent large file upload issuesclient_max_body_size 100M;
}

3.3 Nextcloud PHP文件

如果以为上面就算结束,那你就错了。还需要在Nextcloud的 PHP配置文件增加受信任的域,也就是白名单。对于特殊端口的,还需要设置重写规则。

文件位置在 ./nextcloud_data/config/config.php

在里面添加下面的设置,这样在生成其他链接的时候带上端口号。

  'trusted_domains' => array (0 => '10.10.10.10',),'overwrite.cli.url' => 'http://10.10.10.10','overwritehost' => '10.10.10.10:8009','overwriteprotocol' => 'https',

在这里插入图片描述
不过,受信任域的问题我依然没有解决。依然会有如下的报错。

在这里插入图片描述

3.4 集成Collabora到Nextcloud

正常我们直接在应用商店里安装 Nextcloud Office就可以了。但是在局域网没有外网的访问权限,只能下载安装包到本地,在上传到服务器上。下载完的文件是 .tar.gz的格式。将其上传到./nextcloud_data/custom_apps/ 下,然后解压到成一个文件夹,设置好所有属性,在启用应用。

tar -zxvf richdocuments-v8.7.4.tar.gz
chown -R www-data:www-data richdocuments# 进入到容器内部
docker exec -it nextcloud-app /bin/bash# 在容器内部
php occ app:enable richdocumentsroot@417f3965c025:/var/www/html# php /var/www/html/occ app:list | grep rich- richdocuments: 8.7.4

这时再回到Nextcloud的设置界面,在左侧边栏就多了一个Office的选项。选择使用自己的Collabora服务器,添加Collabora的对外地址。点击保存后就会验证链接是否好用。我这有一个警告,一直没有解决,虽然我设置了受信任域。

在这里插入图片描述
这样我们就大功告成了,可以在Nextcloud里直接打开并编辑Word, PPT, Excel的文件了。但每次打开文件都会有这个报错,点击一下打开再点别的地方就没有了。
在这里插入图片描述

📚 延伸阅读

更多内容持续更新于我的博客:https://www.zenseek.site

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/95908.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/95908.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/95908.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实践指南:利用衡石AI Data Agent实现自然语言驱动的指标开发与归因

在数字化转型的深水区,企业数据团队常面临两难困境:业务部门需要敏捷响应的指标分析,但传统BI工具依赖技术团队编写SQL,导致需求交付周期长达数周;而直接暴露底层数据又存在安全与合规风险。衡石科技推出的AI Data Age…

知微集:Python中的线程(三)

欢迎来到"一起学点什么吧"的合集「NLP知微集」。在这里,我们不愿宏大叙事,只聚焦于自然语言处理领域中那些细微却关键的“齿轮”与“螺丝钉”。我相信,真正深刻的理解,源于对细节的洞察。本期,我将为您拆解的…

动态规划入门:从记忆化搜索到动态规划

在开始对动态规划的讲解之前,我们需要先对记忆化搜索进行回顾: 什么是记忆化搜索? 在搜索过程中,当搜索树中存在大量重复的节点时,我们可以通过引入一个"备忘录"(通常是一个数组或哈希表&#…

Boost搜索引擎 网络库与前端(4)

文章目录前言一、引入网络库模块引入cpp-httplibcpp-httplib测试正式编写http_server二、前端模块三、项目的可能拓展总结前言 终于到了最后一篇喽,嘻嘻! 一、引入网络库模块 引入cpp-httplib 下载地址如下,我个人不喜欢新版本   cpp-http…

Flink反压问题

背景在使用flink的过程中,多次遇到过反压(backpressure)的问题,这通常是因为数据处理的速率超过了数据源或下游系统的处理能力导致。反压的底层剖析网络流控一个重要的概念是网络流控,如上图,不同的Consume…

Day5-中间件与请求处理

昨天搞定了异步优化,今天来解决一些实际问题。Day4的API虽然性能不错,但还缺少一些企业级应用必备的功能。 现在的问题 前端无法访问API(跨域问题)没有请求日志,出问题难以排查错误信息格式不统一缺少统一的请求处理机…

【LeetCode热题100道笔记】反转链表

题目描述 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1:输入:head [1,2,3,4,5] 输出:[5,4,3,2,1] 示例 2:输入:head [1,2] 输出:[2,1] 示例 3:…

Oracle:select top 5

在Oracle数据库中实现SELECT TOP 5功能需采用特定语法,因其原生不支持TOP关键字。以下是两种主流实现方式:‌ROWNUM结合子查询‌先通过子查询排序数据,再在外层用ROWNUM限制行数:SELECT * FROM ( SELECT * FROM 表名 ORDER BY 排序…

Kubernetes(k8s) 增量更新 po

文章目录前言k8s 增量更新 po1. 导出要新建po 的控制器配置2. 配置详解3. 重新生效前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差,实在…

基于stm32的车辆安全驾驶预警系统

若该文为原创文章,转载请注明原文出处。一、 项目背景与引言(一) 研究背景及意义道路交通安全是全球性的重大公共安全问题。据统计,绝大多数交通事故源于驾驶员的危险状态(疲劳、分心、健康突发状况)和危险驾驶行为(超…

React学习教程,从入门到精通, React 新创建组件语法知识点及案例代码(11)

React 新创建组件语法知识点及案例代码 React 是由 Facebook 开发的一个用于构建用户界面的 JavaScript 库。随着 React 的不断发展,创建组件的方式也在不断演进。本文将详细介绍 React 中创建组件的最新语法,包括函数组件(Functional Compo…

SQL Server全链路安全防护

SQL Server 的安全性是一个多层次、综合性的体系,旨在保护数据免受未授权访问、篡改和泄露。其核心安全机制可概括为以下几个方面:1. 身份验证(Authentication) Windows 身份验证: 使用 Windows 账户(域/本…

如何利用Web3提升企业竞争力

在这个信息爆炸的时代,Web3技术以其独特的去中心化、透明性和用户主权特性,成为企业提升竞争力的新战场。本文将深入探讨企业如何把握Web3的浪潮,实现业务的飞跃。 1. 把握Web3的核心价值 Web3的核心在于去中心化、透明性和用户主权。这种模式…

HOW - 在浏览器下载一个 Excel 表格文件

文章目录一、技术方案二、前端具体实现代码分析转换逻辑注意事项一、技术方案 后台返回 base64 数据 {code: 0,data: "base64;...", }前端进行数据格式转化并下载成 Excel 文件 这篇文章主要介绍第二个步骤的实现。 二、前端具体实现 代码 src/utils/transform…

【Android】Room数据库的使用

三三要成为安卓糕手 引入 Room是一个抽象层,对SQLite进行了封装,简化了SQLite数据库的操作,让开发者能以更加对象化的方式进行数据库操作;Room解决了SQLite操作繁琐,容易产生错误的问题,让开发者能以更加对…

Next.js 介绍:为什么选择它来构建你的下一个 Web 应用?

Next.js 介绍:为什么选择它来构建你的下一个 Web 应用? 作者:码力无边你好,欢迎来到我们的 Next.js 专栏!在接下来的 30 篇文章中,我们将一起踏上一段从入门到精通的旅程,深入探索这个强大而优雅…

开发环境 之 编辑器、编译器、IDE梳理

小生第一次学习编程时,懵懵搞不懂编辑器、编译器、IDE区别,虽然这对前期学习编程语言语法的影响不是很大,但是现在梳理一下,总归心里踏实些。 一、概念及区别 IDE是前面几者的集成,前面几个分别是IDE的子集。对比维度编…

高级RAG策略学习(六)——Contextual Chunk Headers(CCH)技术

Contextual Chunk Headers(CCH)技术深度解析 第一部分:理论基础与核心原理 一、核心定义:给 “文本块” 加 “上下文标签” Contextual Chunk Headers(上下文块标题,简称 CCH)本质是为文档拆分后…

人形机器人控制系统核心芯片从SoC到ASIC的进化路径

目录: 0 前言 1 人形机器人控制系统核心芯片选择ASIC而非SoC的理由 1.1 SoC的架构特征 1.2 ASIC的架构特征 1.3 SoC的优势(继承软件生态) 1.4 ASIC的优势(硬件底层算法就是应用层算法) 1.5 人形机器人控制系统核…

linux thread 线程一

thread线程是linux的重要概念。线程不能独立存在,必须在进程中存在。一个进程必须有一个线程,如果进程中没有创建新线程,进程启动后本身就有一个线程。使用getpid、getppid获取进程的进程ID和父进程ID。使用pthread_self获取到当前线程的ID。…