debian + nextcloud 想说爱你不容易
前言
在我心目中一直有一个完美的 NAS,它与众不同最时尚(跳舞一定棒),既能满足我的折腾欲望,又可以丰富日常生活,传传照片听听音乐岂不美哉。然鹅从N年前买 Gen8 然后弃坑到今年重拾起来接盘蜗牛并折腾了好久黑裙,总感觉差点意思(在这里不得不吐槽 DS Photo 的渣体验,直接劝退),个中纠结踩坑不足为外人道也。
直到前两天,决定转开源 NAS,先是试了下水 freenas,准备装 nextcloud 试试,结果被插件安装不上劝退,然后重拾了我最爱的 debian。
啊~回到了熟悉的 debian 怀抱,一切都变得那么顺其自然,无论是磁盘挂载、远程登录、安装软件等(一开始我还哼哧哼哧装了 OMV,最后发现并不是我想要的,于是就纯命令行了)。
本文会记录为了达到最佳体验,折腾中的方方面面,值友们请自取所需,不必墨守成规一步步来。
一、公网 IP + 动态解析
要达到最佳体验,肯定还是公网 IP 最好。无论是转发式还是打洞式的内网穿透(包括白裙的 quickconnect),体验都比不上有一个公网 IP。我因为用的联通光纤所以问题非常简单:打 10010 要求改成公网 IP,搞定。
最早用联通和电信的光纤都是有公网 IP 的,不过后来联通鸡贼了,给用户默认是 10.xx.xx.xx 的内网地址,不过还好打客服就能改回去,客服很痛快,看起来也不是第一次被提这个要求了,很快就搞定了
至于动态解析我是采用的阿里云 DNS。道理很简单,就是通过调用 API 来更新解析记录。最早在折腾 Gen8 年代,我就写过一个脚本,后来还封成插件挂到了 KoolShare 上(没错第一版 aliddns 就是我写的)。不过因为 KoolShare 的插件运行机制有问题经常挂掉,所以后来就还是直接走脚本了。
当然,阿里云 DNS 其实是动态解析里的 hard 模式,easy 模式还是很多的,很多路由器都自带这个功能,好不好用另说,肯定没这么折腾。这里简单做个对比:
第三方 ddns
优点:非常简单,基本不需要花钱
缺点:通常不支持 https,有时更新慢,不可靠阿里云 DNS
优点:稳定,可靠,几年不用操心,支持 https
缺点:流程复杂,需要专业知识较多
那么下面我们就简单概括下阿里云 DNS 做动态解析的过程和原理:
第一步 拥有一个自己的域名
是的!这是一切的前提。当然这不会花太多钱。只要不选主流的 .com/.net/.cn 域名,你只需要花一顿盒饭的钱,就能买下一个域名 1 年的使用权。具体报价可以参考这里。
建议一次性买断10年,.press 只要 ¥149,.site/.website/.space 也只要 ¥179。
第二步 设置 DNS 解析
如果以前没有在阿里云买过域名,新注册的域名需要过实名认证才能开通解析。实名认证也很简单,支付宝扫一下就可以了。
接下来打开云解析控制台,应该可以看到你的域名,已经可以解析了。
自动更新 IP 就是通过调用云解析的 API 来设置域名的解析。API 认证通过 AccessKey 实现,我们可以打开阿里云的 AccessKey 界面,创建新的 AccessKey,记录下 key 和 secret,用在下一步的脚本里。
第三步 自动更新 IP
不愿意折腾脚本的同学可以看下自己的路由器应用市场有没有 aliddns。没有的话也没关系,可以自己在路由器上或者 nas 服务器上布置一个定时脚本。定时脚本的功能就是定时的取本机的公网 IP,跟 DNS 服务器设置的 IP 对比,如果不匹配,就更新一下。
脚本的内容可以从这里得到,你需要手动修改一些配置并进行测试。具体的如何远程登录、编辑或上传文件到路由器或服务器等在这里不再赘述。
需要注意两点:
这个脚本是在路由器的 shell 环境里测试通过的,在别的平台上没有详细测试过,或许会有兼容性问题。如果你想移植到别的平台,或者用其它语言改写,可以联系我
路由器的文件系统一般是只读的 squashfs,也就是说直接将文件上传到普通目录是不允许的,或者断电会丢失。这时候需要配合 jffs 分区或者外部存储(如 u 盘、SD 卡等)来进行持久化存储。
测试成功后,需要设置定时触发脚本。一般有 crontab 等方法。需要注意的是,一般路由器的 crontab 也是断电不可保存的,所以需要使用系统的定时脚本等功能。
二、安装 debian
debian 的安装教程很多,在这也不再赘述。我推荐的方案是网络安装,只装系统基础组件和 ssh server。作为一个装 debian 老手,在这里只告诉你们一点人生的经验:
选择镜像
安装的时候一定要选好镜像,可以预先测一下速度,看国内的哪个镜像最快。可选的镜像有:
分区的时候建议把 /boot、/home、/var 都分割出去,方便系统重装。以一个 128G 的启动盘为例,可以大致这样去分割:
EFI:100M
boot:1G
根目录:20G
swap: 8G
home: 60G
var: 20G
安装必须软件
安装完成后,一些趁手的工具是必要的,下面是一些系统默认不会装的软件,且都不大,可以自行无脑安装:
系统管理、脚本:
sudo、screen、curl文件系统支持:
exfat-fuse、exfat-utils、ntfs-3g
编辑器:
vim多媒体处理:
imagemagick、ufraw-batch、ffmpeg、exiftool
NAT 穿透
很多时候服务器放在路由器的后面,为了让服务在外网可以访问,需要做 NAT 穿透配置。在这里我只想说:DMZ 大法好!只需要在路由器里设置一下服务器的内网 IP,就可以一键转发所有服务了
三、安装 nextcloud
致到此还没被劝退的值友一句话:恭喜你终于坚持到了这一步,下面的步骤可能更麻烦!nextcloud 虽然架构简单,但是要玩转还是需要一些功夫,我们一步步来看一下:
安装 nginx
虽然网上的教程倾向于使用 Apache,但是我建议使用 nginx,毕竟效率更高,配置逻辑更简单,而且对 HTTP/2 支持更好:
sudo apt-get install -y nginx-light
安装完成后,可以试试访问下服务器的 80 端口是否启动成功。nginx 要想达到最佳效果,需要设置 worker thread 等,但默认设置已经很好用了,所以在这里就不再赘述。
申请 HTTPS 证书
很久很久以前,这是一个可以当恐怖故事讲的事情,但是现在不用了,我们有 letsencrypt ! letsencrypt 是一个免费证书提供网站,网上有很多教程。通过上一步安装的 nginx 可以完成你的域名的所有权认证,从而发给你证书,不过这个对我不适用,因为联通不允许 80 端口提供服务。所以我使用了 DNS 认证方法。
讲真,证书的申请是一件非常麻烦的事情,需要生成私钥、创建证书签发请求、签名等步骤,非常适合劝退初学者。不过现在好了,letsencrypt 提供一个命令行工具 certbot 来完成所有工作:
apt-get install -y certbot
certbot certonly --manual --preferred-challenges dns -d kyrios.site
上面的命令会本地生成私钥和签发所需的文件,并向服务器请求签发。服务器会随机生成一段文本,并让你设置到你的 DNS 服务器上
下面,打开阿里云的云解析控制台,在域名里添加一条 TXT 记录,子域名为 _acme-challenge,值为上面的验证文本:
使用其它 DNS 提供商的同学可以用相应的方法进行设置。
设置成功后,可以在另一个终端通过命令行验证一下:
nslookup -q=txt _acme-challenge.kyrios.site
验证通过后,按回车继续证书生成过程。生成好的证书会放在 /etc/letsencrypt/ 下面。建议将证书拷贝到其它目录以供使用和备份:
cp -R /etc/letsencrypt/archive/kyrios.site/ /var/www/
我们在 nginx 默认服务器里改一下配置,试试能不能通过浏览器验证:
配置成功后,运行 systemctl reload nginx.service,如果启动成功,可以访问下 https://你的域名:8443 试下是否配置成功了,证书是否有效:
如果你的机器和 nas 在同一子网内,因为域名解析的地址是路由器的外网地址,所以相当于请求从路由器的外网接口上走了一圈又回到内网,这种技术叫 NAT loopback,有的路由器是不支持的。如果你发现内网无法 ping 通路由器的外网 IP,可以在机器上改 hosts 文件,将你的域名解析改为 nas 服务器的内网地址。当然,如果使用 OpenWrt 等智能路由器,也可以在路由器上设置一下 DNS 解析强制覆盖,让内网环境内始终解析为内网 IP
安装数据库
nextcloud 使用 mysql 存储文件索引等信息,当然在 debian 里面我们需要安装 mariadb。运行以下命令安装 mariadb:
安装数据库服务
apt-get install -y mariadb-server优化数据库安全性
mysql_secure_installation创建数据库
CREATE DATABASE nextcloud;添加数据库用户
CREATE USER nextcloud@localhost identified by 'nextcloud';设置数据库用户权限
GRANT ALL PRIVILEGES on nextcloud.* to nextcloud@localhost;
FLUSH privileges;
安装 php
废话不多说:
apt-get install -y php php-cgi php-fpm php-curl php-apcu php-gd php-imagick php-intl php-mbstring php-mysql php-xml php-zip
当前的 php 版本是 7.3,所以生成的配置文件在 /etc/php/7.3/ 下面。我们需要修改以下配置:
/etc/php/7.3/fpm/pool.d/nextcloud.conf:
[nextcloud]
user =www-data
group =www-data
listen = /run/php/php7.3-fpm-nextcloud.sock
listen.owner =www-data
listen.group =www-data
listen.mode = 0600pm = ondemand
pm.max_children = 25
pm.process_idle_timeout = 10s
chdir = /var/www/nextcloud
php_value[include_path] = ".:/usr/share/php:/var/www/nextcloud"
php_value[upload_max_filesize] =1024M
php_value[post_max_size] =1024M
php_value[expose_php] = Off
php_value[default_socket_timeout] = 300
php_value[max_execution_time] = 300
php_value[memory_limit] = 512M
php_value 也可以通过 php.ini 进行配置,不过我们写在了一起,方便维护
然后,修改 nginx 配置文件,让你的域名指向 php:
/etc/nginx/sites-available/nextcloud:
server {
listen 8080;
listen 8443 ssl http2;
server_name kyrios.site;
ssl_certificate /var/www/kyrios.site/cert1.pem;ssl_certificate_key /var/www/kyrios.site/privkey1.pem;
root /var/www/nextcloud;location / {
index index.php;
}
location ~ .php {fastcgi_intercept_errors on;
fastcgi_split_path_info ^(.+.php)(/.+)$;
fastcgi_pass unix:/run/php/php7.3-fpm-nextcloud.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi.conf;
}
}
然后,分别重启 php-fpm 和 nginx:
systemctl restart php7.3-fpm.service ; systemctl reload nginx.service
如果 php-fpm restart 不成功,有可能是之前的 sock 文件是其它用户创建的,www-data 用户无法修改。手动删除文件即可
安装 nextcloud
终于到了这一步!由于 nextcloud 网上安装教程非常多,我们这里就不浪费大家流量贴一堆图片了,简述下安装过程。由于软件版本随时可能升级,请大家自行下载最新版
下载安装脚本
cd /var/www/
wget https://download.nextcloud.com/server/releases/nextcloud-17.0.1.zip
unzip nextcloud-17.0.1.zip
chown -Rwww-data:www-data nextcloud访问你的域名完成安装
修改 /var/www/nextcloud/config/config.php 完成优化
修改 dbhost 为 'localhost:/run/mysqld/mysqld.sock' 通过本地 socket 连接数据库
修改 loglevel 为 4 减少日志内容
添加字段 'memcache.local' => 'OCMemcacheAPCu'
添加字段 'enabledPreviewProviders' => array(
'OCPreviewPNG',
'OCPreviewJPEG',
'OCPreviewGIF',
'OCPreviewBMP',
'OCPreviewXBitmap',
'OCPreviewMP3',
'OCPreviewTXT',
'OCPreviewMarkDown',
'OCPreviewMovie',
),
检查安装
完成配置后,可以打开 nextcloud 的设置->概览页面,看看有没有一些没配好的或可以优化的选项。具体的优化选项可以根据自己的需求进行配置
四、安装插件
nextcloud 配置好后,一些好用的插件就可以安排上了。这里分享一个插件安装的技巧:如果在设置界面安装超时,可以手动下载后,解压到 nextcloud 的目录中。以 music 为例:
wget https://github.com/paulijar/music/files/3876662/music_0.11.1_nc-signed.tar.gz
tar zxf music_0.11.1_nc-signed.tar.gz -C /var/www/nextcloud/apps/
Music
在线听音乐必备,可以对音乐文件进行索引
Camera RAW Previews
单反/微单用户必备,可以在线浏览 ARW、RAF 等文件格式。注意服务器必须安装 ufraw-batch 软件包才能正常工作。
Preview Generator
离线生成预览工具,导入一大票文件后,通过这个插件可以主动生成缩略图,提升访问体验。具体使用方式是:
cd /var/www/nextcloud/; sudo -uwww-data ./occ preview:generate-all [--path xxx]
可以手动指定要更新的路径以加快扫描,如 --path kyrios/files/Photos
OwnBackup
将 nextcloud 的数据库表备份到文件
五、最后...再来一点人生经验
写到这里,基本上就可以用了,下面再分享一些最佳实践:
批量导入文件
如果图片或其它文件太多,一张张上传效率太低,我们可以通过文件操作批量导入进去:
将文件拷贝到 nextcloud 的 files 中,如:
cp -R /media/usb/xxxx /media/storage/nextcloud/data/kyrios/files/Photos/修改权限,将刚拷入的文件所有权改为www-data:
chown -Rwww-data:www-data /media/storage/nextcloud/data/kyrios/files/Photos/修改文件修改时间
nextcloud 通过文件的修改时间来对文件进行索引,不会读取图片、视频的 EXIF 信息,我们可以用 exiftool 来将文件的修改时间改为 EXIF 中的创建时间:
exiftool "-FileModifyDate<createDate" /media/storage/nextcloud/data/kyrios/files/Photos/更新 nextcloud 索引
cd /var/www/nextcloud/; sudo -uwww-data ./occ files:scan kyrios
这里 files:scan 命令可以指定用户或者路径,如 kyrios/files/Photos.重新生成缩略图
如上,不再赘述
其它
由于我用的时间也不太久,暂时只有这些内容,欢迎值友们补充分享,我会加到这里
o铜锣烧o
校验提示文案
龙飞1
校验提示文案
值友6792946351
校验提示文案
hsysml
校验提示文案
万千11000
校验提示文案
哒哒的梦想
校验提示文案
ashhell
校验提示文案
BusyBox
校验提示文案
nickluchen
校验提示文案
tinyhuang
校验提示文案
njack
校验提示文案
angliny
校验提示文案
BusyBox
校验提示文案
BusyBox
校验提示文案
棠溪2022
很多时候服务器放在路由器的后面,为了让服务在外网可以访问,需要做 NAT 穿透配置。在这里我只想说:DMZ 大法好!只需要在路由器里设置一下服务器的内网 IP,就可以一键转发所有服务了———-纠正一下,这个不叫NAT穿透。应该叫NAT
校验提示文案
黑夜呐喊
校验提示文案
黑发挥发灰
校验提示文案
scnypdmax
校验提示文案
csmkaka
感谢大神分享
校验提示文案
scnypdmax
校验提示文案
东皓雪
校验提示文案
疯狂的蜂鸟
校验提示文案
乔治他爹
校验提示文案
哒哒的梦想
校验提示文案
昕扬
校验提示文案
njack
校验提示文案
万千11000
校验提示文案
寂寞的解药
校验提示文案
龙飞1
校验提示文案
哇咔咔的小白
校验提示文案
棉猴哦
校验提示文案
nandtll
校验提示文案
tinyhuang
校验提示文案
ashhell
校验提示文案
李斌
校验提示文案
nickluchen
校验提示文案
叫兽_sk
校验提示文案
scnypdmax
校验提示文案
csmkaka
感谢大神分享
校验提示文案
scnypdmax
校验提示文案