一、环境背景
本次项目部署于一台 Linux 服务器(IP:192.168.186.130),服务器上已预先安装好 Docker 和 Docker Compose 环境,同时运行着一个独立的 MariaDB 数据库实例。团队规模约 60 人,日常需要频繁共享和协作处理大量文件。
现有的文件存储方案是将所有业务文件集中存放在一台 Windows 电脑上,通过 Windows 自带的 SMB 共享功能对局域网开放。但随着团队人数增长,该方案暴露出权限管理粗糙、缺乏版本控制、移动端无法访问等问题,亟需一个统一的文件管理平台来整合现有资源。
二、项目目的
- 搭建一套私有云盘系统,为团队 60 人提供统一的文件访问入口,支持 Web 端、桌面客户端和移动端多平台访问。
- 不迁移现有文件,通过 SMB 协议将 Windows 共享文件夹"外挂"到 Nextcloud 中,实现零数据搬迁的平滑过渡。
- 利用 Nextcloud 的用户分组和权限管理功能,实现按部门、按角色分配文件夹的读写权限。
- 通过 Redis 缓存和 PHP 性能调优,保障 60 人并发访问时的流畅体验。
三、详细安装过程
3.1 整体架构设计
本次部署采用"外挂模式",核心思路是:Nextcloud 自身只负责系统运行和用户管理,所有业务文件仍然存放在 Windows 共享中,Nextcloud 通过 SMB 协议远程挂载访问。
整体架构包含以下组件:
- Nextcloud 主服务:Docker 容器化部署,对外提供 Web 文件管理界面。
- Redis 缓存服务:与 Nextcloud 同机部署,用于加速文件索引和用户会话。
- MariaDB 数据库:复用服务器上已有的独立实例,存储 Nextcloud 的元数据。
- Windows 共享:作为实际的文件存储后端,通过 SMB 协议被 Nextcloud 挂载。
3.2 编写 docker-compose.yml
在项目目录下创建 docker-compose.yml 文件,定义 Redis 和 Nextcloud 两个服务:
bash
version: '3.8'
services:
# Redis 缓存服务
redis:
image: redis:7-alpine
container_name: nextcloud_redis
restart: always
command: redis-server --requirepass Reids_2026 --maxmemory 512mb --maxmemory-policy allkeys-lru
volumes:
- redis_data:/data
networks:
- nextcloud_internal
# Nextcloud 主服务
app:
image: nextcloud:28
container_name: nextcloud_app
restart: always
ports:
- "8088:80"
environment:
- MYSQL_HOST=${MYSQL_HOST}
- MYSQL_PORT=${MYSQL_PORT}
- MYSQL_DATABASE=${MYSQL_DATABASE}
- MYSQL_USER=${MYSQL_USER}
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
- NEXTCLOUD_ADMIN_USER=${NEXTCLOUD_ADMIN_USER}
- NEXTCLOUD_ADMIN_PASSWORD=${NEXTCLOUD_ADMIN_PASSWORD}
- REDIS_HOST=redis
- REDIS_HOST_PORT=6379
- REDIS_HOST_PASSWORD=Reids_2026
- NEXTCLOUD_TRUSTED_DOMAINS=${TRUSTED_DOMAINS}
- PHP_MEMORY_LIMIT=512M
- PHP_MAX_CHILDREN=40
volumes:
- ./nextcloud_config:/var/www/html/config
- ./nextcloud_data:/var/www/html/data
- nextcloud_app:/var/www/html
depends_on:
- redis
networks:
- nextcloud_internal
networks:
nextcloud_internal:
driver: bridge
volumes:
nextcloud_app:
driver: local
redis_data:
driver: local
关键设计说明:
config 目录单独挂载,确保后台插件配置、Redis 设置等在容器重启后不会丢失。
PHP_MEMORY_LIMIT=512M 和 PHP_MAX_CHILDREN=40 是针对 60 人并发场景的性能调优参数。
Redis 通过内部网络 nextcloud_internal 与 Nextcloud 通信,不暴露端口到宿主机,提升安全性。
.3 编写 .env 环境变量文件
在同一目录下创建 .env 文件,存放数据库连接信息和初始管理员账号:
bash
# MariaDB 数据库配置
MYSQL_HOST=192.168.186.1
MYSQL_PORT=3306
MYSQL_DATABASE=nextcloud
MYSQL_USER=nextcloud_user
MYSQL_PASSWORD=YourStrongPassword123!
# Nextcloud 初始管理员账号
NEXTCLOUD_ADMIN_USER=admin
NEXTCLOUD_ADMIN_PASSWORD=YourNextcloudAdminPassword!
# 信任域名
TRUSTED_DOMAINS=192.168.186.1:8088 localhost
注意事项:MYSQL_HOST 必须填写 Linux 服务器的真实局域网 IP,不能写 localhost,因为容器内的 localhost 指向的是容器自身,而非宿主机。
3.4 启动服务
在终端中进入项目目录,执行以下命令启动所有服务:
bash
docker compose up -d
首次启动需要拉取 Nextcloud 和 Redis 的 Docker 镜像,耗时约 1-3 分钟。启动完成后,通过以下命令确认服务状态:
bash
docker compose ps
正常情况下,nextcloud_app 和 nextcloud_redis 两个容器的状态均应显示为 Up。
3.5 浏览器初始化
打开浏览器访问 http://192.168.186.130:8088,由于 .env 中已预配置了数据库和 Redis 连接信息,Nextcloud 会自动完成初始化,直接跳转到管理员账号设置界面。输入 .env 中配置的用户名 admin 和密码完成设置,即可进入 Nextcloud 主控制台。
3.6 安装 SMB 客户端组件
Nextcloud 官方 Docker 镜像默认不包含 smbclient 工具,因此无法直接连接 Windows 共享。需要在服务器上执行以下命令手动安装:
bash
docker exec -u 0 nextcloud_app apt-get update
docker exec -u 0 nextcloud_app apt-get install -y smbclient
3.7 配置外部存储挂载 Windows 共享
以管理员身份登录 Nextcloud,点击右上角头像进入 应用 页面,搜索并启用 External storage support(外部存储支持)插件。
进入 管理设置 -> 外部存储 页面。
点击"增加存储"下拉菜单,选择 SMB / CIFS。
填写配置信息:
目录名称:自定义一个显示名称,如"公司共享盘"。
主机(Host):填写 Windows 电脑的局域网 IP 地址。
共享名(Share):填写 Windows 上设置的共享文件夹名称。
认证:选择"用户名与密码",在下方输入 Windows 的登录用户名和密码。
5.点击保存,右侧出现绿色圆点即表示挂载成功。
四、问题总结
在整个部署过程中,共遇到以下几个典型问题:
问题一:外部存储页面没有 SMB/CIFS 选项
原因:Nextcloud Docker 镜像未预装 smbclient 组件。
解决:通过 docker exec 进入容器手动安装 smbclient,然后重启容器。
问题二:选择 SMB/CIFS 后没有出现主机输入框
原因:操作时点击的是"增加存储"旁边的复选框(该复选框的含义是"允许普通用户自行挂载外部存储"),而非下拉菜单本身。
解决:正确点击"增加存储"的下拉菜单,选择 SMB/CIFS 后,配置输入框会自动出现。
问题三:填写配置后保存出现红点报错
原因:Windows 端的安全策略阻拦了来自 Nextcloud 容器的 SMB 连接请求。
排查与解决:
将 Windows 网络配置文件从"公用网络"切换为"专用网络"。
暂时关闭 Windows 防火墙和第三方杀毒软件进行测试。
确保 Windows 登录账户设置了非空密码(Windows 不允许空密码账户进行网络共享登录)。
用户名格式调整为 .\xmadmin 或 电脑名\xmadmin,避免 Windows 无法识别单独的用户名。
清空"远程子文件夹"和"域名"输入框中的无效内容。
问题四:容器重启后配置丢失
原因:初始 docker-compose.yml 中未单独挂载 config 目录,导致后台所有设置(包括插件启用、Redis 配置等)在容器重建后恢复为默认值。
解决:在 volumes 中增加 - ./nextcloud_config:/var/www/html/config 挂载项。



