文章目录
- 概述
- 环境准备
- Samba安装部署
- nextCloud安装部署
- docker安装
- 安装相关容器
- 配置及优化
- 创建数据库next_cloud
- 注册错误提示:nextcloud install Error while trying to initialise the database: An exception occurred while executing a query: SQLSTATE[HY000]: General error: 4047 InnoDB refuses to write tables with ROW_FORMAT=COMPRESSED or KEY_BLOCK_SIZE.
- 您的数据目录可被其他用户读取, 请更改权限为 0770 以避免其他用户查看目录。
- 视频文件不显示缩略图
- 启用缓存
- **通过不被信任的域名访问**
- 后台任务cron的配置
- 局域网上传速度优化
- 扫描手动拷贝进入的文件
- 提前生成缩略图
- 严格模式禁止http访问
- ****提示”php-imagick模块不支持SVG”****
- 您的安装没有设置默认的电话区域
- 此实例中的 php-imagick 模块不支持 SVG
- 您的网页服务器未正确设置以解析“/.well-known/caldav”, “/.well-known/carddav”
- 外网穿透部署
概述
- 目前网盘服务要么都限速, 要么都空间比较小; 对于使用来说, 十分的不方便;
- 对于一些文档, 图片以及视频想通过电视来播放, 又不想插硬盘或u盘;
- 想对自己的数字资料进行集中式管理;
刚好手中有一台树莓派, 一台带宽8M云服务器, 还有几个淘汰下来的机械硬盘; 因此准备自己搭建一个私有云; 对于大流量的访问基本也会是在内网, 外网最多偶尔看看文件, 看看照片之类的, 对于应急使用, 通过云服务器穿透的速度也基本够用了;
环境及耗材信息:
- 安装ubuntu2004的树莓派4B
- 1Tb的机械硬盘,
- 8M云服务器 - ubuntu2004
- 网线一根
注: 根据当前教程创建出来, nextcloud是samba的一个子集, 如果要完整覆盖的话, 需要自行去理清相关目录关系;
环境准备
网络
树莓派通过网线连接千兆路由器, 因为树莓派4B的wifi是百兆带宽的, 而网口是千兆的, 因此必须通过网线来连接;
否则通过wifi最大网速(即使手动设置wifi为5G)理论也就 12.5Mb/s, 实测最大峰值也就11多, 平均也就9Mb/s;
网速监控:
apt install ethstatus
# 查看 ADSL 的速度
sudo ethstatus -i eth0
# 查看 网卡 的速度
sudo ethstatus -i eth0
机械硬盘格式化及分区
机械硬盘需要插在树莓派的 usb3.0 接口上
# 1. 查看磁盘信息
fdisk -l
# 2. 开始操作待分区磁盘: /dev/sda, 进入操作命令行中
fdisk /dev/sda
# Generic
# d delete a partition
# F list free unpartitioned space
# l list known partition types
# n add a new partition
# p print the partition table
# t change a partition type
# v verify the partition table
# i print information about a partition
# w write table to disk and exit
# 通过输入n进行分区, 然后根据提示信息进行相应输入, 最后通过w保存
# 3. 格式化新建分区: /dev/sdb1
mkfs.ext4 /dev/sdb1
Samba安装部署
# 1. 安装Samba
sudo apt-get install samba samba-common
# 2. 新建一个用于共享的目录或挂载硬盘 并赋予权限
mkdir /pan
mount /dev/sdb1 /pan
chmod 777 -R /pan
# 3. 修改samba的配置文件
vim /etc/samba/smb.conf
# ==================================================================
[share] # 显示的文件名: 127.0.0.1/share
comment = NAS Storage # 说明信息
valid users = pi,root # 可访问用户
path = /pan # 共享目录
browseable = yes # 可被其他人看到资源名称(非内容)
writable = yes # 可写
create mask = 0755 # 新建文件权限 664
directory mask = 0775 # 新建目录权限 775
# ==================================================================
# 4. 设置用户密码
# samba使用的linux的用户, 但是密码是单独设立的;
smbpasswd -a <USER>
# 如果要新建一个用户
groupadd [--gid ID] <GROUP>
useradd -g <GROUP> <USER>
# 加入/移除分组
gpasswd –a <USER> <GROUP>
gpasswd –d <USER> <GROUP>
# 5. 重启samba
service smbd restart
到这里, 一个网络文件系统就已经部署完成了; 如果不需要云盘相关的一些功能, 直接使用也没有问题
nextCloud安装部署
官方文档:
Introduction - Nextcloud latest Administration Manual latest documentation
为了移植方便, 这里选择了docker的方式进行安装, 数据信息全部存储在samba共享目录下, 方便下次迁移到其他机器; 当然会占用磁盘的io了, 不过个人使用, 不想费力气去运维本地环境; 速度也够用;
docker安装
# 1. 关闭防火墙:
systemctl stop firewalld
systemctl disable firewalld
# 关闭selinux:
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0
# 3. 关闭swap:
swapoff -a # 临时关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab #永久关闭
# 4. 修改主机名称
hostnamectl set-hostname 名字
# 5. 将桥接的IPv4流量传递到iptables的链
lsmod | grep br_netfilter
systemctl start br_netfilter.service
systemctl enable br_netfilter.service
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
# 6. 前置库安装
sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
# 7. 添加docker软件源
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
apt-cache madison docker-ce
apt-cache madison docker-ce-cli
apt-cache madison containerd.io
# 8. 安装docker , 自动会安装 docker-ce-cli, containerd.io, 官方安装命令:sudo apt-get install docker-ce docker-ce-cli containerd.io
apt-get install docker-ce=5:19.03.15~3-0~ubuntu-focal
# 9. 修改相关配置
vim /boot/firmware/cmdline.txt
# 结尾追加:
vim /etc/default/grub file
# GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
apt install grub2-common
update-grub
reboot
# 10. 加速及更改驱动
cat > /etc/docker/daemon.json << EOF
{
"exec-opts":["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://l3n7ikj1.mirror.aliyuncs.com"]
}
EOF
systemctl restart docker
systemctl status docker
安装相关容器
# mariadb
docker run --name mariadb -d -p 3306:3306 \
-e MARIADB_ROOT_PASSWORD=root \
-v /pan/apps/mariadb/conf.d:/etc/mysql/conf.d \
-v /pan/apps/mariadb/data:/var/lib/mysql \
mariadb:latest
# redis
docker run --name redis -d -p 6379:6379 \
-v /pan/apps/redis:/usr/local/etc/redis \
redis
# nextcloud
docker run --name next-cloud -d -p 1080:80 \
-e MYSQL_DATABASE=next_cloud \
-e MYSQL_USER=root \
-e MYSQL_PASSWORD=root \
-e MYSQL_HOST=192.168.5.21:3306 \
-v /pan/apps/next-cloud:/var/www/html \
-v /pan/apps/next-cloud/apps:/var/www/html/custom_apps \
-v /pan/apps/next-cloud/config:/var/www/html/config \
-v /pan:/var/www/html/data \
-v /pan/apps/next-cloud/db:/var/lib/mysql \
nextcloud
对于nexcloud, 这里基于mariadb来进行构建, pg/mysql也是可以的; 同时使用redis作为缓存; 因为不使用缓存的话, 访问速度是有些限制的, 用着一点不丝滑…
到这里nextcloud基本能运行起来了, 可以在浏览器中打开或者到谷歌商店去下载一个app来连接看看.
配置及优化
创建数据库next_cloud
create schema if not exists next_cloud collate utf8mb4_unicode_ci;
注册错误提示:nextcloud install Error while trying to initialise the database: An exception occurred while executing a query: SQLSTATE[HY000]: General error: 4047 InnoDB refuses to write tables with ROW_FORMAT=COMPRESSED or KEY_BLOCK_SIZE.
docker exec -it mariadb mysql -u root -p
# 输入密码进入mysql的终端
SET GLOBAL innodb_read_only_compressed=OFF;
# 通过配置文件的方式进行配置, 否则每次容器重启均需要手动去设置
cd /pan/apps/mariadb/conf.d
touch my.cnf
vim my.cnf
# =======================
[mariadbd]
innodb_read_only_compressed = OFF
# =======================
docker restart mariadb
您的数据目录可被其他用户读取, 请更改权限为 0770 以避免其他用户查看目录。
因为我们还要能够通过samba来访问,而且是私服, 完全没必要这么设置, 自己的数据当然自己做主, 这个可以跳过
vim /pan/apps/next-cloud/config/config.php
# 在配置数组最后添加一下配置
'check_data_directory_permissions' => false,
保存后, 刷新页面即可
视频文件不显示缩略图
# 安装ffmpeg
docker exec -it --user root next-cloud sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
docker exec -it --user root next-cloud apt-get update
docker exec -it --user root next-cloud apt-get -y install ffmpeg
docker exec -it next-cloud ffmpeg
# 修改配置文件
vim /pan/apps/next-cloud/config/config.php
# =====================================================
'enable_previews' => true,
'enabledPreviewProviders' =>
array (
0 => 'OC\\Preview\\Image',
1 => 'OC\\Preview\\Movie',
2 => 'OC\\Preview\\MarkDown',
3 => 'OC\\Preview\\TXT',
),
# =====================================================
docker restart next-cloud
启用缓存
vim /pan/apps/next-cloud/config/config.php
# =====================================================
'memcache.locking' => '\OC\Memcache\Redis',
'memcache.distributed' => '\OC\Memcache\Redis',
'redis' => [
'host' => '192.168.5.21',
'port' => 6379,
],
# =====================================================
'memcache.local' => '\\OC\\Memcache\\APCu',
通过不被信任的域名访问
vim /pan/apps/next-cloud/config/config.php
# =====================================================
'trusted_domains' =>
array (
0 => 'localhost',
1 => 'cloud-nk.leiax00.cn',
2 => '192.168.5.10',
3 => '127.0.0.1',
),
# =====================================================
后台任务cron的配置
# 普通安装, 直接在cron中配置即可
crontab -u www-data -e
*/5 * * * * php -f /var/www/nextcloud/cron.php
# 容器安装, 容器名: next-cloud
crontab -u www-data -e
*/5 * * * * docker exec --user www-data next-cloud php cron.php
局域网上传速度优化
docker exec --user www-data next-cloud php occ config:app:set files max_chunk_size --value 0
扫描手动拷贝进入的文件
docker exec --user www-data next-cloud php occ files:scan --all
files files:cleanup #清除文件缓存
files:scan #重新扫描文件系统
files:transfer-ownership #将所有文件和文件夹都移动到另一个文件夹
格式: files:scan [-p|--path="..."] [-q|--quiet] [-v|vv|vvv --verbose] [--all] [user_id1] ... [user_idN]
参数: user_id #扫描所指定的用户(一个或多个,多个用户ID之间要使用空格分开)的所有文件
选项: --path #限制扫描路径 --all #扫描所有已知用户的所有文件 --quiet #不输出统计信息 --verbose #在扫描过程中显示正在处理的文件和目录 --unscanned #仅扫描以前未扫描过的文件
提前生成缩略图
# 1. 安装插件: Preview Generator
docker exec --user www-data next-cloud php occ preview:generate-all
# 添加定时任务, 对新增的/修改过的文件进行重新生成, 容器安装, 容器名: next-cloud; 每晚2点半执行
crontab -u www-data -e
30 2 * * * docker exec --user www-data next-cloud php occ preview:pre-generate
# 设置预览尺寸
docker exec --user www-data next-cloud php occ config:app:set --value="32 64 1024" previewgenerator squareSizes
docker exec --user www-data next-cloud php occ config:app:set --value="64 128 1024" previewgenerator widthSizes
docker exec --user www-data next-cloud php occ config:app:set --value="64 256 1024" previewgenerator heightSizes
严格模式禁止http访问
web使用https反向代理了http导致的, 配置文件中新增以下配置
'overwriteprotocol' => 'https',
'trusted_proxies' => array(
0 => '10.10.10.1',
)
提示”php-imagick模块不支持SVG”
管理员后台【概览】页提示“此实例中的 php-imagick 模块不支持 SVG。为了获得更好的兼容性,建议安装它。
docker exec next-cloud apt -y update
docker exec next-cloud apt -y install libmagickcore-6.q16-6-extra
您的安装没有设置默认的电话区域
# 在config.php中添加
'default_phone_region' => 'CN',
此实例中的 php-imagick 模块不支持 SVG
docker exec -it next-cloud bash
apt install libmagickcore-6.q16-6-extra
您的网页服务器未正确设置以解析“/.well-known/caldav”, “/.well-known/carddav”
由于我的环境比较复杂,
- nexcloud是在树莓派4B的docker中运行
- 通过frp的 tcp + tls 到云服务器
- K8s增加对应外部服务的Service (服务名: simple-zero, port: web12711)
- 通过k8s的ingress-nginx进行反向代理, 最终暴露到外网;
最终等效场景应该是: 反向代理 + docker部署;
解决方案如下:
# 新增如下ingress配置即可
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /remote.php/dav/
labels:
app.kubernetes.io/instance: simple-zero
name: simple-zero-nextcloud-rewrite
spec:
rules:
- host: cloud.leiax00.cn
http:
paths:
- backend:
# 配置自己的服务
service:
name: simple-zero
port:
name: web12711
path: /.well-known/carddav
pathType: Prefix
- backend:
# 配置自己的服务
service:
name: simple-zero
port:
name: web12711
path: /.well-known/caldav
pathType: Prefix
tls:
- hosts:
# 配置自己的证书
- xxx.cn
- '*.xxx.cn'
secretName: default-sct-tls
# 以上ingress配置等效于nginx中
rewrite ^/\.well-known/carddav https://$server_name/remote.php/dav/ redirect;
rewrite ^/\.well-known/caldav https://$server_name/remote.php/dav/ redirect;
# ingress配置那么多, nginx两行搞定...如果你有更好的方式, 希望你能够告诉我.......
外网穿透部署
外网穿透推荐frp来实现: FRP文档