日志
2023-05-08
: NAS数据库出了些问题,恢复数据重新连接nextcloud服务后发现后台任务
以root无法像之前一样正常使用,于是研究了下在k3s使用www-data
用户执行
前言
NextCloud
是个开源免费的私有云存储网盘项目,可以搭建用于个人或团队的网盘,有大量插件可供用户选择,可实现文件云同步、在线文档、团队协作等功能。为了便于安装和管理,此处使用容器方式
本篇是在
TrueNAS SCALE
的k3s
上安装使用,也会有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创建数据集
权限推荐使用ACL模式,
NFS4_RESTRICTED
随后添加
Item
:
- User:
apps
- Permissions:
Full Control
有需要还可以加上smb的用户(权限Modify就好),其它保持默认。保存
其它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为最新,便于更新
General Settings
(可选)
添加环境变量用于数据库连接,也可以在配置
步骤中进行
- MYSQL_HOST: 数据库主机
- MYSQL_DATABASE: 数据库名
- MYSQL_USER: 数据库用户名
- MYSQL_PASSWORD: 数据库用户密码
App Configuration
取消容器探针检测: [Liveness、Readiness、Startup]
Networking and Services
- Target Port*: 80
容器内的端口 - Port*: 8080
映射到主机端口(自定义)
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
挂载到容器内的路径
- Host Path: /mnt/mypool/docker/nextcloud
Ingress
(可选)
用于添加反向代理,在此之前需要用到traefik
- HostName*: 反代域名
- Paths
- Path*: /
- Path Type*: Prefix
- TLS-Settings(用于https)
- Host*: 反代域名(与上面一致)
- Use TrueNAS SCALE Certificate (Deprecated): 选择有效的证书
- (Advanced) Traefik Entrypoint*: websecure
websecure为https,web为http
Security and Permissions
-
勾选Show Advanced Security Settings
- 取消勾选
runAsNonRoot
- 取消勾选
(568指的是apps的用户id、组id)
其它保持默认
保存
方法二: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
安装
配置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>:<端口>', # 注意有逗号,因为是作为添加
后台任务
设置–基本设置
官方推荐使用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分钟
保存,手动执行后,刷新网页
扩展
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网页可以看见创建成功
编辑nextcloud应用:Ingress-Traefik Middlewares
添加Name为nextcloud-redirectregex
,保存
扩展,删除中间件命令:
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有兴趣可以了解一下。
感谢
能详细介绍下通过traefik设置反向代理方法吗?我这边添加了redis,使用ip+端口访问都正常,但是转到域名就不行了
使用不了应该是协议不同。
目标是redis的话,需要走traefik的tcp路由方式(不是http),其中分[有、无证书],不带证书不能指定域名(也就是任意解析到该ip的域名都可以)
不带证书:
重启traefik后可以在traefik的面板看到tcp
随后就可以在面板-tcp中看到
没有配置错的话,现在就可以连接了;
解析到这个ip的域名,traefik的tcp出口的端口
带证书就麻烦不少,建议参考
https://blog.csdn.net/qq_33816243/article/details/127118553
另外这些mysql、redis等服务不建议暴露在公网下。
(现在转用unraid了,之后可能会写一篇unraid安装使用traefik的文章)
感谢您的回复!您这个解决方案对我来说有点太专业了,因为我对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 证书访问的方式。不知道怎么弄了,要放弃了,您提供的这个链接让我无从下手。
我加你qq聊吧
ok