树莓4B+samba+nextcloud搭建nas私有云

概述

  1. 目前网盘服务要么都限速, 要么都空间比较小; 对于使用来说, 十分的不方便;
  2. 对于一些文档, 图片以及视频想通过电视来播放, 又不想插硬盘或u盘;
  3. 想对自己的数字资料进行集中式管理;

刚好手中有一台树莓派, 一台带宽8M云服务器, 还有几个淘汰下来的机械硬盘; 因此准备自己搭建一个私有云; 对于大流量的访问基本也会是在内网, 外网最多偶尔看看文件, 看看照片之类的, 对于应急使用, 通过云服务器穿透的速度也基本够用了;

环境及耗材信息:

  1. 安装ubuntu2004的树莓派4B
  2. 1Tb的机械硬盘,
  3. 8M云服务器 - ubuntu2004
  4. 网线一根

注: 根据当前教程创建出来, 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”

由于我的环境比较复杂,

  1. nexcloud是在树莓派4B的docker中运行
  2. 通过frp的 tcp + tls 到云服务器
  3. K8s增加对应外部服务的Service (服务名: simple-zero, port: web12711)
  4. 通过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文档

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值