开发板上搭建nextcloud和minio服务
1. 硬件和软件准备
1.1 硬件
理论上只要有开发板就行,树莓派、香橙派等,运行Debian系列系统。
1.2 软件
1.2.1 nextcloud的docker镜像
本文创建于2025.11.16,此时的docker还是需要加速才能常速下载镜像。
这里给一个镜像加速地址:轩辕镜像 - 国内开发者首选的专业 Docker 镜像下载加速服务平台
这个地址需要收费,但是不贵。如果各位读者有更好的镜像加速地址,当然也可以替换。
基于轩辕镜像网站的方法,通过以下命令拉取镜像:
docker pull docker.xuanyuan.run/library/nextcloud:latest
1.2.2 minio服务端程序
minio的服务端笔者并未采用docker方式部署,而是在minio官方网站下载的:MinIO Download Server
需要在这个地址下载两个程序:minio和mc
其中,minio程序的地址是:minio_amd64_linux下载地址
mc客户端地址是:mc_amd64_linux下载地址
因为minio官方并未出aarch64架构的程序,因此这里下载linux amd64架构的程序。
这里简单介绍下这两个程序的区别:
minio:minio的服务器程序,运行后会提供s3服务等。
mc:minio的后台管理程序,用来进行用户、桶、权限等的管理。
2. 各个软件的配置
2.1 nextcloud服务器的配置
通过以下compose.yaml文件,可以一键启动nextcloud服务:
version: '3.8' # 兼容主流 Docker 版本volumes:nextcloud_data: # 存储 Nextcloud 应用数据、上传文件等核心数据nextcloud_config: # 独立存储配置文件(避免数据卷混乱,方便备份)nextcloud_apps: # 独立存储第三方应用(升级时不易丢失)services:nextcloud:image: nextcloud:latest # 使用官方最新稳定版(可指定具体版本如 nextcloud:28)restart: always # 容器异常时自动重启ports:- "xxxx:80" # 主机xxxx端口映射容器80端口(可修改主机端口如 80:80)volumes:- xxxx:/var/www/html/data # 核心数据独立挂载,并且会存储在xxx路径中- xxxx:/var/www/html/config # 配置文件独立挂载- xxxx:/var/www/html/apps # 应用目录独立挂载- xxxx:/var/www/html/xxx:ro # 一定要是只读,要是能写,会导致磁盘数据被删除- /etc/localtime:/etc/localtime:ro # 同步主机时区(避免时间错乱)environment:# 本地 PostgreSQL 核心连接配置(必须替换为你的实际信息)- POSTGRES_HOST=host.docker.internal # Windows/macOS 用这个;Linux 替换为 172.17.0.1 或主机内网IP- POSTGRES_DB=xxxx # 提前在本地PostgreSQL创建的数据库名- POSTGRES_USER=xxxx # 提前创建的数据库专用用户- POSTGRES_PASSWORD=xxxx # 该用户的密码(替换为实际密码)# 管理员账号预设(跳过首次访问的配置向导,直接登录)# - NEXTCLOUD_ADMIN_USER=admin # 自定义管理员用户名(建议修改为自己的账号)# - NEXTCLOUD_ADMIN_PASSWORD=your_admin_password # 管理员密码(必须强密码)# 信任域名(允许访问的域名/IP,多个用空格分隔,避免登录时的安全警告)- NEXTCLOUD_TRUSTED_DOMAINS=localhost # 替换为你的实际访问地址# 官方推荐基础优化参数#- PHP_MEMORY_LIMIT=512M # 提升PHP内存限制(默认256M,大文件上传/多用户需调高)#- UPLOAD_MAX_FILESIZE=10G # 最大上传文件大小(根据需求调整,如 2G)#- MAX_FILE_UPLOADS=20 # 单次最多上传文件数量#- APC_SHM_SIZE=128M # 缓存内存大小(优化应用响应速度)# 可选:开启日志调试(问题排查时启用,正常使用可注释)# - NEXTCLOUD_DEBUG=true# - PHP_DISPLAY_ERRORS=Onextra_hosts:- "host.docker.internal:host-gateway" # 兼容Linux系统,让容器解析到主机IPhealthcheck: # 健康检查(确保容器正常运行)test: ["CMD", "curl", "-f", "http://localhost/status.php"]interval: 30stimeout: 10sretries: 3
假设读者朋友们的将这个compose.yaml文件放在了 /home/xxx/nextcloud_docker下,那么cd到这个目录下,然后运行:
docker-compose up -d # docker-compose v1版本
# 或
# docker compose up -d # docker compose v2 版本
如何在自己的开发板上安装docker?
sudo apt install docker.io # 可选 # sudo apt install docker-compose # v1版本 # sudo apt install docker-compose-v2 # v2版本
在这个docker容器配置文件中,默认使用了postgresql数据库,这里当然也可以使用sqlite,如果你想使用sqlite,可以将数据库相关的部分删除。
如果你也使用postgresql,那么关于postgresql的配置可以参考如下命令:
安装postgresql
# 写下本文时,笔者的香橙派RV2上安装的是ubuntu24.04版本,官方仓库里的postgresql的版本只有16 sudo apt install postgres-16进入postgresql的命令行
sudo -u postgres psql成功进入后应该进入postgresql的终端环境:
psql (16.10 (Ubuntu 16.10-0ubuntu0.24.04.1)) Type "help" for help.postgres=#创建用户
CREATE USER nextcloud WITH PASSWORD 'your_pg_pw';创建数据库
CREATE DATABASE nextcloud;设置权限
-- 切换到 nextcloud 数据库 \c nextcloud-- 授予用户对 public 模式的创建、修改、查询等全部权限 GRANT ALL PRIVILEGES ON SCHEMA public TO nextcloud;-- 额外授予已存在表的权限(防止后续操作报错) GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO nextcloud; GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO nextcloud; GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO nextcloud;-- 退出 psql \q允许容器访问系统postgresql
修改 PostgreSQL 配置文件
pg_hba.conf(路径通常是/etc/postgresql/<版本>/main/pg_hba.conf),添加容器网段授权:
conf# 添加一行(允许Docker桥接网段访问,密码验证) host nextcloud nextcloud 172.17.0.0/16 md5修改
postgresql.conf监听所有地址(确保容器能连接):
conflisten_addresses = '*' # 默认为localhost,改为*重启 PostgreSQL 生效:
bash运行
sudo systemctl restart postgresql
POSTGRES_HOST选择:
- Windows/macOS:直接用
host.docker.internal(Docker 内置 DNS 解析到主机)- Linux:优先用
172.17.0.1(Docker 默认桥接网关 IP),或你的服务器内网 IP(如192.168.1.100)
2.2 !!!!一定要注意!!!!
上述配置完成后,就可以通过docker compose启动了。但是,这里面有一个非常坑的地方。
背景(笔者亲身经历,惨痛) :
nextcloud支持
External storage,这个功能能够极大扩展nextcloud的文件存储能力,支持多种文件存储(本地文件、s3、webDAV等)。笔者正好有几块硬盘,存储了非常多的资料。于是就想把这个外部存储扩展利用起来。一番操作之后,将自己
/dev/sda1磁盘,挂载到了nextcloud的容器中,并给www-data用户配置了读写权限。通过上面的compose.yaml文件中的路径映射,启动nextcloud容器后…
磁盘直接被清空了!!!
目前笔者正在回复文件,已经恢复了8个小时了…🫤
从背景故事来看,实在是够惨痛。
最核心的出问题的点有以下几个:
- 系统默认用户是
orangepi,但是通过mount命令挂载了磁盘后,给www-data配置了读写权限; - 在
compose.yaml文件中,配置的容器映射路径,未指定权限,导致容器在映射时,直接将磁盘文件抹除了。
compose.yaml文件中,出问题的地方,是如下几行:
volumes:- xxxx:/var/www/html/data # 核心数据独立挂载,并且会存储在xxx路径中- xxxx:/var/www/html/config # 配置文件独立挂载- xxxx:/var/www/html/apps # 应用目录独立挂载- xxxx:/var/www/html/xxx:ro # 一定要是只读,要是能写,会导致磁盘数据被删除- /etc/localtime:/etc/localtime:ro # 同步主机时区(避免时间错乱)
假如我在这里面是这样写的:
volumns:- /home/orangepi/2t:/var/www/html/2t # 本地的这个2t目录是我的磁盘挂载目录
那么这句话会导致,容器在启动时,检测/var/www/html/2t 这个目录不存在,就会直接创建/home/orangepi/2t目录,而这一步就会将数据清除。
这个事情当然也有解决办法:
- 如果要配置nextcloud容器对磁盘路径只读,那么在给磁盘挂载目录配置nextcloud docker用户权限时,就只给它配置只读权限;
- 如果nextcloud容器对磁盘也可写(比如用户上传文件),那么就在磁盘下再创建一个单独的文件夹,nextcloud只对这一个文件夹有写权限,而对磁盘中现有的其他文件夹依旧保持只读权限
如上面的例子,简单修改一下即可:
volumns:- /home/orangepi/2t:/var/www/html/2t:ro # 这里的ro表示read only- /home/orangepi/2t/nextcloud_data:/var/www/html/2t/nextcloud_data # nextcloud容器对2t/nextcloud_data子目录有写权限
2.3 minio
2.3.1 配置
minio配置相对简单很多,核心步骤就如下几步:
-
创建minio用户
sudo useradd -r -s /bin/false minio -
创建systemd服务文件
服务文件(路径:/etc/systemd/system/minio.service)如下:
[Unit] Description=MinIO Object Storage Documentation=https://docs.min.io Wants=network-online.target After=network-online.target[Service] Type=simple User=minio Group=minio WorkingDirectory=/home/minio# 设置 MinIO 数据目录(可多个,用空格分隔) Environment="MINIO_VOLUMES=/home/minio/minio_data"# 设置 MinIO 监听地址和端口 Environment="MINIO_OPTS=--address :<API_PORT> --console-address :<CONSOLE_PORT>"# 设置管理员账号密码(请替换为你自己的) Environment="MINIO_ROOT_USER=<ADMIN_NAME>" Environment="MINIO_ROOT_PASSWORD=<ADMIN_PASSWORD>" Environment="MINIO_REGION_NAME=<YOUR_OWN_REGION_NAME>" ExecStart=<PATH_TO_MINIO_EXECUTABLE> server $MINIO_VOLUMES $MINIO_OPTS Restart=on-failure RestartSec=5# 安全加固 NoNewPrivileges=yes ProtectSystem=strict ProtectHome=false ReadWritePaths=/home/minio/minio_data AmbientCapabilities=CAP_NET_BIND_SERVICE[Install] WantedBy=multi-user.target -
启动服务
sudo systemd daemon reload sudo systemd enable minio sudo systemd start minio # 查看minio服务 sudo systemd status minio
2.3.2 minio的mc命令行工具
-
给当前服务取别名
mc alias set myminio http://localhost:9000 admin admin123456 # myminio就是我们要取的别名 -
创建用户
./mc admin user add myminio <USERNAME> <PASSWORD> -
创建桶
mc mb myminio/mybucket -
绑定策略给用户
mc admin policy attach myminio readonly --user <USERNAME>
2.3.3 使用方法——思源笔记

这里需要先选择s3服务,然后红框中的几个字段分别按下面的规则填写:
EndPoint:我们自己的minio服务的地址AccessKey:我们创建的用户名;SecretKey:我们创建的用户名的密码Bucket:我们创建的桶的名称RegionID:在service文件中设置的MINIO_REGION_NAME环境变量的值
