当前位置: 首页 > news >正文

开发板上搭建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的配置可以参考如下命令:

  1. 安装postgresql

    # 写下本文时,笔者的香橙派RV2上安装的是ubuntu24.04版本,官方仓库里的postgresql的版本只有16
    sudo apt install postgres-16
    
  2. 进入postgresql的命令行

    sudo -u postgres psql
    

    成功进入后应该进入postgresql的终端环境:

    psql (16.10 (Ubuntu 16.10-0ubuntu0.24.04.1))
    Type "help" for help.postgres=#
    
  3. 创建用户

    CREATE USER nextcloud WITH PASSWORD 'your_pg_pw';
    
  4. 创建数据库

    CREATE DATABASE nextcloud;
    
  5. 设置权限

    -- 切换到 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
    
  6. 允许容器访问系统postgresql

      • 修改 PostgreSQL 配置文件 pg_hba.conf(路径通常是 /etc/postgresql/<版本>/main/pg_hba.conf),添加容器网段授权:
        conf

        # 添加一行(允许Docker桥接网段访问,密码验证)
        host    nextcloud     nextcloud     172.17.0.0/16        md5
        
      • 修改 postgresql.conf 监听所有地址(确保容器能连接):
        conf

        listen_addresses = '*'  # 默认为localhost,改为*
        
      • 重启 PostgreSQL 生效:
        bash

        运行

        sudo systemctl restart postgresql
        
    1. 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个小时了…🫤

从背景故事来看,实在是够惨痛。

最核心的出问题的点有以下几个:

  1. 系统默认用户是orangepi,但是通过mount命令挂载了磁盘后,给www-data配置了读写权限;
  2. 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目录,而这一步就会将数据清除。

这个事情当然也有解决办法:

  1. 如果要配置nextcloud容器对磁盘路径只读,那么在给磁盘挂载目录配置nextcloud docker用户权限时,就只给它配置只读权限;
  2. 如果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配置相对简单很多,核心步骤就如下几步:

  1. 创建minio用户

    sudo useradd -r -s /bin/false minio
    
  2. 创建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
  3. 启动服务

    sudo systemd daemon reload
    sudo systemd enable minio
    sudo systemd start minio
    # 查看minio服务
    sudo systemd status minio
    

2.3.2 minio的mc命令行工具

  1. 给当前服务取别名

    mc alias set myminio http://localhost:9000 admin admin123456 # myminio就是我们要取的别名
    
  2. 创建用户

    ./mc admin user add myminio <USERNAME> <PASSWORD>
    
  3. 创建桶

    mc mb myminio/mybucket
    
  4. 绑定策略给用户

    mc admin policy attach myminio readonly --user <USERNAME>
    

2.3.3 使用方法——思源笔记

assets/image-20251116180823-2d31et5.png

这里需要先选择s3服务,然后红框中的几个字段分别按下面的规则填写:

  1. EndPoint:我们自己的minio服务的地址
  2. AccessKey:我们创建的用户名;
  3. SecretKey:我们创建的用户名的密码
  4. Bucket:我们创建的桶的名称
  5. RegionID:在service文件中设置的MINIO_REGION_NAME环境变量的值
http://www.dtcms.com/a/617658.html

相关文章:

  • Dubbo监控中心全解析:构建微服务可观测性的基石
  • Rust 内存优化实战指南:从字节对齐到零拷贝
  • 【数据结构】常见时间复杂度以及空间复杂度
  • 2345中国最好的网址站非凡软件站
  • C 语言希尔排序:原理、实现与性能深度解析
  • 【期末网页设计作业】HTML+CSS+JS 电影网站设计与实现 影视主题网站(附代码)
  • react 的状态管理
  • 世界上最有趣的网站外贸稳中提质韧性强
  • 简单理解:DCDC(直流 - 直流转换器)和LDO(低压差线性稳压器)
  • 电科金仓国产数据库KingBaseES深度解析:五个一体化的技术架构与实践指南
  • 2025卷【答案】
  • 防止网站被克隆买完网站怎么建设
  • 搭建Python开发环境
  • Vue 项目实战《尚医通》,预约挂号底部医生排班业务,笔记39
  • Firefly 结构与样式参考:AI 重构品牌广告工作流
  • 在 Ubuntu 22.04 上安装和配置 Nginx 的完整指南
  • 网站开发需要的技能线上网站建设需求
  • 如何实现中药饮片采购的高效联动以提升行业透明度?
  • Redis(127)Redis的内部数据结构是什么?
  • 十七:Spring Boot依赖 (2)-- spring-boot-starter-web 依赖详解
  • Protocol Buffers (Protobuf) 详解
  • 沁水网站建设吉林省 网站建设
  • 正能量晚上看的网站2021网站优化客户报表
  • 智慧交通自动驾驶场景道路异常检测数据集VOC+YOLO格式8302张6类别
  • 内联函数(Inline Functions)详细讲解
  • CentOS Stream 8 通过 Packstack 安装开源OpenStack(V版本)
  • 企业实训|自动驾驶中的图像处理与感知技术——某央企汽车集团
  • 电子商城网站建设流程外链系统
  • 数据分析笔记10:数据容器
  • 基于Django的博客系统