TrueNAS 搭建nextcloud

日志

  • 2023-05-08: NAS数据库出了些问题,恢复数据重新连接nextcloud服务后发现后台任务以root无法像之前一样正常使用,于是研究了下在k3s使用www-data用户执行

前言

NextCloud是个开源免费的私有云存储网盘项目,可以搭建用于个人或团队的网盘,有大量插件可供用户选择,可实现文件云同步、在线文档、团队协作等功能。

为了便于安装和管理,此处使用容器方式

本篇是在TrueNAS SCALEk3s上安装使用,也会有docker的方式

nextcloud需要一定的硬件要求才会有良好的体验


测试环境

TrueNAS-SCALE-22.12.0

# uname -a
Linux truenas 5.15.79+truenas #1 SMP Tue Dec 13 12:40:04 UTC 2022 x86_64 GNU/Linux
# k3s -v 
k3s version v1.25.3+k3s-9afcd6b9-dirty (9afcd6b9)
go version go1.19.1
# docker -v
Docker version 20.10.18, build b40c2f6
# docker-compose --version
docker-compose version 1.25.0, build unknown

准备工作

  • 服务器(docker环境)
  • 已添加TrueCharts的目录(TrueNAS才需要)

创建应用目录

TrueNAS创建数据集

image-20230314183935655

权限推荐使用ACL模式,NFS4_RESTRICTED
image-20230314194226625

随后添加Item:

  • User: apps
  • Permissions: Full Control

有需要还可以加上smb的用户(权限Modify就好),其它保持默认。保存

image-20230314194648765

其它Linux系统

使用mkdir创建目录就行

mkdir -p ~/docker/nextcloud

安装数据库

非必要,但建议

TrueNAS可参考这篇文章

docker-compose.yml

---
version: "2.1"
services:
  mariadb:
    image: lscr.io/linuxserver/mariadb:latest
    container_name: mariadb
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Shanghai
      - MYSQL_ROOT_PASSWORD=ROOT_ACCESS_PASSWORD
      - MYSQL_DATABASE=USER_DB_NAME #optional
      - MYSQL_USER=MYSQL_USER #optional
      - MYSQL_PASSWORD=DATABASE_PASSWORD #optional
    volumes:
      - path_to_data:/config
    ports:
      - 3306:3306
    restart: unless-stopped

安装数据库后建议,创建只有nextcloud数据库权限的用户,sql语句上面超链接的文章中额外


安装

方法一:使用custom-app创建

  • Application Name*: nextcloud
    应用名,建议这个,便于后续一致

Container Image

  • Container Repository*: nextcloud
    镜像仓库名,默认仓库为dockerhub
  • Container Tag*: latest
    标签,latest为最新,便于更新

image-20230314230441016

General Settings

(可选)
添加环境变量用于数据库连接,也可以在配置步骤中进行

  • MYSQL_HOST: 数据库主机
  • MYSQL_DATABASE: 数据库名
  • MYSQL_USER: 数据库用户名
  • MYSQL_PASSWORD: 数据库用户密码

image-20230314230916314

App Configuration

取消容器探针检测: [Liveness、Readiness、Startup]

image-20230314230523222

Networking and Services

  • Target Port*: 80
    容器内的端口
  • Port*: 8080
    映射到主机端口(自定义)

image-20230314231002288

Storage and Persistence

目录挂载 添加一个App Storage

  • Type of Storage: Host Path
    Host Path为类似docker中的挂载目录-v

    • Host Path: /mnt/mypool/docker/nextcloud
      挂载准备工作的主机目录路径
    • Mount Path*: /var/www/html
      挂载到容器内的路径

image-20230314231039155

Ingress

(可选)
用于添加反向代理,在此之前需要用到traefik

  • HostName*: 反代域名
  • Paths
    • Path*: /
    • Path Type*: Prefix

image-20230314231143156

  • TLS-Settings(用于https)
    • Host*: 反代域名(与上面一致)
    • Use TrueNAS SCALE Certificate (Deprecated): 选择有效的证书
  • (Advanced) Traefik Entrypoint*: websecure
    websecure为https,web为http

image-20230314231212789

Security and Permissions

  • 勾选Show Advanced Security Settings

    • 取消勾选runAsNonRoot

(568指的是apps的用户id、组id)

image-20230314231544749

其它保持默认
保存

方法二:docker-compose

创建docker-compose.yml文件
冒号左侧为主机,右侧为容器

version: '3.2' # 对应docker版本17.04.0+

services:
  app:
    image: nextcloud:latest
    container_name: nextcloud # 容器名
    restart: unless-stopped
    ports:
      - 8080:80 # 端口
    volumes:
      - ~/docker/nextcloud:/var/www/html
    environment: # 不在这配置可以把环境变量都删去
      - MYSQL_HOST=数据库主机
      - MYSQL_DATABASE=数据库名
      - MYSQL_USER=数据库用户名
      - MYSQL_PASSWORD=数据库用户密码
    networks:
      - default

启动服务,在yml所在目录输入

docker-compose up -d

额外

redis

建议redis替代nextcloud自带的APCu

TrueNAS

创建redis的数据集/目录,确保权限

  • Container Repository*: redis
  • Container Tag*: latest
  • Extra Args: –requirepass ‘123456’
    设置redis密码
  • Port Type: TCP
  • Target Port*: 6379
  • Port*: 9111
  • Additional App Storage:
    • Host Path: /mnt/mypool/docker/redis/data
    • Mount Path*: /data

保存

docker

docker run \
-d \
--name redis \
-p 6379:6379 \
--restart unless-stopped \
-v /mnt/mypool/docker/redis/data:/data \
redis:latest --requirepass 123456

redis主机host

  • docker若是本机: localhost
  • TrueNAS: redis-custom-app.ix-redis.svc.cluster.local

配置

安装

有443端口

可直接访问https://域名

无443端口

IP:端口访问应用

上面没有设置环境变量可以在此处填写,有实际、生产作用不建议选用内置的SQLite

image-20230314204802812

安装


配置redis和无443端口完善跳转

打开config.php进行添加配置

sudo vi ~/docker/nextcloud/app/config/config.php

添加

//'memcache.local' => '\\OC\\Memcache\\APCu' // 使用 APCu 进行本地缓存,注释掉添加下面这行
'memcache.local' => '\\OC\\Memcache\\Redis',
'memcache.distributed' => '\\OC\\Memcache\\Redis', // 分布式缓存使用Redis
'memcache.locking' => '\\OC\\Memcache\\Redis', // 启用Redis缓存的文件锁
'redis' => array(
  'host' => 'redis主机', // redis主机
  'port' => 6379, // redis端口,默认为6379
  'password' => 'redis_password' // redis密码
),
'filelocking.enabled' => 'true', // 文件锁
'overwriteprotocol' => 'https', // 强制https
'default_phone_region' => 'CN', // 默认电话区域
'trusted_domains' => 
array (
    0 => '<nextcloud.exampledomain.com>', // 按需修改,无需端口
),
'overwritehost' => '<nextcloud.exampledomain.com>:<端口>', // 按需修改
'overwriteprotocol' => 'https',
'overwrite.cli.url' => 'http://<nextcloud.exampledomain.com>:<端口>', # 注意有逗号,因为是作为添加

后台任务

设置–基本设置

image-20230314212136463

官方推荐使用Cron,这需要手动添加

TrueNAS方式

System Settings-Advanced-Cron Jobs添加

  • Command*输入 (root方式)
    该命令是以root方式执行,先自己执行命令查看结果,如果提示所属问题就采用可选方法
k3s kubectl exec k3s kubectl get pods -n ix-nextcloud |grep 1/1 |awk '{print $1}'|head -n 1 -n ix-nextcloud -- php -f /var/www/html/cron.php 2>&1 /dev/null
  • Command*输入 (www-data方式 可选)
k3s kubectl exec k3s kubectl get pods -n ix-nextcloud |grep 1/1 |awk '{print $1}'|head -n 1 -n ix-nextcloud -- bash -c 'chsh -s /bin/bash www-data ; su - www-data -c "php -d memory_limit=-1 -f /var/www/html/cron.php --define apc.enable_cli=1"'

命令说明可看扩展

  • Run As User*: root
    在TrueNAS中有一些问题~~(我没去细究)~~导致这里的www-data无权限和无法给予权限,不过使用root也是正常执行(?)
  • Schedule*设置每隔5分钟

image-20230314213947879

保存,手动执行后,刷新网页

image-20230314212634679

扩展
TrueNAS创建应用时,会以k8s的方式创建,并创建每个应用独有的命名空间(namespace);每次应用启动的时候,容器pod名有随机值;容器的命名空间名为ix-应用名。

显示nextcloud容器信息命令:
# k3s kubectl get pod -n ix-nextcloud
NAME                                    READY   STATUS    RESTARTS   AGE
nextcloud-custom-app-8478545d96-qrqjw   1/1     Running   0          5d6h
# -n 为 ----namespace

只获取nextcloud容器名
# k3s kubectl get pods -n ix-nextcloud |grep 1/1 |awk '{print $1}'|head -n 1
nextcloud-custom-app-8478545d96-qrqjw
# 筛选1/1是因为有时启动或停止会出现异常,导致pod没有被删除,再次启动的时候会有两个[1/1  0/1]
# awk进行切片输出

再使用反单引号把该命令作为变量

执行多条命令用;分开:bash -c 'command1;command2'

# chsh -s /bin/bash www-data
将用户www-data的shell设置为/bin/bash

# su - www-data -c "command"
以www-data用户执行command

如果出现
Warning: Failed to set memory limit to 0 bytes (Current memory usage is 2097152 bytes) in Unknown on line 0
则是内存不够,需要设置最大内存量
# php -d memory_limit=-1

开启php的缓存APC(Alternative PHP Cache)
# --define apc.enable_cli=1

其它Linux系统方式

使用crontab进行配置

sudo vi /etc/crontab

输入

*/5 * * * * root docker exec -u 33 容器名或ID php -f /var/www/html/cron.php 2>&1 /dev/null

警告

设置-概览

刚安装完会有些警告

caldav解析

您的网页服务器未正确设置以解析“/.well-known/caldav”
可根据官方文档

  • TrueNAS的traefik
    可以先去traefik查看有没有自动生成type为redirectregex的中间件,有就直接去添加(不用输入前缀default-),没有就继续

编写nextcloud-caldav-m.yaml中间件(Middleware)

apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: nextcloud-redirectregex
spec:  
  redirectRegex:
    permanent: true
    regex: "https://(.*)/.well-known/(card|cal)dav"
    replacement: "https://${1}/remote.php/dav/"

默认命名空间为default-<name>,TrueNAS的Ingress填写中间件会使用default,所以此处不指定命名空间
执行命令

k3s kubectl apply -f nextcloud-caldav-m.yaml               
# 返回结果:middleware.traefik.containo.us/nextcloud-redirectregex created

打开traefik网页可以看见创建成功

image-20230315115711433

编辑nextcloud应用:Ingress-Traefik Middlewares
添加Name为nextcloud-redirectregex,保存

image-20230315120001796

扩展,删除中间件命令:

k3s kubectl delete middleware 中间件name -n default
# default为默认命名空间
  • nginx
    添加(若有443端口就不需要额外添加指定nginx外出端口)
location /.well-known/carddav {
    return 301 $scheme://$host:<端口>/remote.php/dav;
}

location /.well-known/caldav {
    return 301 $scheme://$host:<端口>/remote.php/dav;
}

其它问题可参照这里解决


小结

在一定配置的机器上nextcloud的使用感受还是挺不错的,把数据留在自己的NAS上,并且NAS有阵列的支持和UPS,可以确保稳定(再不行重要的文件加密上处到云盘)。

nextcloud上的一些插件也扩展了不少玩法。

也有类似有nextcloud的应用服务,比如可道云,cloudreve有兴趣可以了解一下。

参考

nextcloud

Docker系列 搭建个人云盘服务nextcloud

traefik RedirectRegex

评论

  1. haha517
    Windows Chrome
    已编辑
    2 年前
    2023-7-25 21:33:10

    感谢

  2. haha517
    Windows Chrome
    2 年前
    2023-7-25 11:07:48

    能详细介绍下通过traefik设置反向代理方法吗?我这边添加了redis,使用ip+端口访问都正常,但是转到域名就不行了

    • 博主
      haha517
      Windows Edge
      已编辑
      2 年前
      2023-7-25 17:31:05

      使用不了应该是协议不同。
      目标是redis的话,需要走traefik的tcp路由方式(不是http),其中分[有、无证书],不带证书不能指定域名(也就是任意解析到该ip的域名都可以)

      不带证书:

      1. traefik配置好tcp路由的entryPoints端口(如果已经有就不用)
      entryPoints:
        tcp:
          address: :9010
      # traefik.yml

      重启traefik后可以在traefik的面板看到tcp

      1. 配置代理
      tcp:
        routers:
          redis:
            entryPoints:
              - tcp
            rule: 'HostSNI(`*`)' # 不带证书,此处就要为*,表示任意
            service: redis
      
        services:
          redis:
            loadBalancer:
              servers:
                - address: '192.168.1.10:6379'

      随后就可以在面板-tcp中看到
      没有配置错的话,现在就可以连接了;
      解析到这个ip的域名,traefik的tcp出口的端口

      带证书就麻烦不少,建议参考
      https://blog.csdn.net/qq_33816243/article/details/127118553

      另外这些mysql、redis等服务不建议暴露在公网下。
      (现在转用unraid了,之后可能会写一篇unraid安装使用traefik的文章)

      • haha517
        jeblove
        Windows Chrome
        2 年前
        2023-7-25 21:29:35

        感谢您的回复!您这个解决方案对我来说有点太专业了,因为我对docker和kubenets了解也是从truenas scale 开始的,我使用的是truechart 的traefik,一般使用的都是带证书的ingress方案。
        在这儿之前我使用了官方的nextcloud版本,很奇怪,之前是跑通的,我不仅成功安装nextcloud,还使用nginx proxy manager 成功通过域名访问,但是它有个问题,就是truenas scale官方的nextcloud版本不能够使用redis,但经过不断折腾,现在官方的nextcloud也运行不起来了,所以我又安装了truechart 发行的nextcloud。
        我参照也truecharts官方的文档,安装cloudnative-pg,clusterissuer等软件,但是都是无法部署的状态,也试了truenas scale 12.2,和目前最新的版本,但是都无法正常部署。所以最后看到您的这个文章,我就尝试使用docker的方式来试一下,没想一到现在成功可以通过ip+port的方式安装了,但现在还是无法解决https 证书访问的方式。不知道怎么弄了,要放弃了,您提供的这个链接让我无从下手。

        • 博主
          haha517
          Windows Edge
          2 年前
          2023-7-25 21:42:57

          我加你qq聊吧

          • haha517
            jeblove
            Windows Chrome
            2 年前
            2023-7-25 21:43:52

            ok

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇