我在用的一些Self-Hosted服务

2年前到现在一直在把一些在线服务东西改为自托管,增加可控性。

下面是清单(可能也有遗漏,后面会补充):


文件同步:Syncthing
存储云盘:NextCloud
即时消息:Mattermost
密码管理:BitWarden
对象存储:MinIO
代码仓库:Gitea

我所使用的设备(按照接入顺序):

No.设备用途/说明
1烽火光猫HG260电信光纤配送的接入网关,联系电信客服改为桥接拨号。
2新路由3拨号主路由和无线AP。
MTK7621A的芯片,也是一款比较经典的路由,刷了OpenwWRT 18.06.1。
跟其他人不同的是我没有在路由上增加更多的功能,是因为路由的性能其实比较弱鸡,再跑其他服务容易死机。
3猫盘CatDrive旁路由和主力网关。
一款矿渣产品,50多块购入,刷了Armbian(Debian 10)系统,把这个作为旁路由,家里所有其他设备的网关都指到了这台设备。
这台设备自带SATA接口,买了一块SSD装上去,作为备份机,备份工具用的是rclone和restic。
这台设备还搭建了WireGuard服务,在主路由做了WireGuard的端口映射,在外网可以随时连到家里的内网。
4华擎Beebox N3150一台低功耗NUC,尺寸12cm x 12cm左右。
外接一块10TB的WD移动硬盘,作为主力存储,用的是ZFS文件系统。

安装的是 Ubuntu 18.04 操作系统,服务以Docker的方式运行。

DDNS做了三个作为冗余备份:
1、cloudflare,通过dns-lexicon写脚本进行更新;
2、dynu,shell脚本更新;
3、duckdns,shell脚本更新;

服务访问方式:
之前的方案是直接对外暴露端口,后来看到有人说通过端口直接访问自己的NAS被上海电信封停封停宽带,于是改为通过Wireguard接入到内网访问大部分的服务。

Syncthing是不受内外网影响的,它自己有节点发现机制。


A Byte of Serverless

最近1个月业余时间在玩Serverless多一点,这里做一下记录。

现在的服务开发趋势基本沿着这样的路径在发展:
服务化(SOA) -> 微服务(Microservices) -> 服务网格(Service Mesh) -> Function Service (Serverless)
看下面的图片会更直观一些(文末会附带一些阅读资源,内容更完善):


Serverless直接从字面可以看出来,服务开发者无需关心服务器运维,只需要做好服务功能开发,高可用、服务容量扩展都无需关心,大大降低开发者的负担。

把一个个服务以函数的方式暴露出来。
前台的应用拼装调用函数实现服务。

厂商

基本上主流的云服务都提供了Serverless服务,这里说一下我实际操作过的几家。

国内厂商:
1、阿里云 函数计算FC
2、腾讯云 无服务器云函数SCF

国际厂商:
1、Amazon AWS Lambda
2、Google Cloud Functions
3、Google Cloud Run

独立Serverless提供商
1、now.sh / zeit.co

语言支持

PHP:阿里云、腾讯云、zeit.co
Python:全支持
Nodejs:全支持
Java:全支持
Go:Google Cloud、zeit.co
其他还有一些语言支持这里不展开说明。
之前Serverless的一个问题就是语言版本相对比较滞后,但就目前看下来,主流服务商基本都可以用到较新的版本,比如Python 3.6,Nodejs 10.x 等。

开发工具包

Serverless现阶段的一个问题就是跟厂商的云服务强绑定,如果说是你的服务是基于AWS来构建,那后面想要迁移到其他云服务并不是件容易的事情,需要改造你的应用代码调用新的厂商的后端服务。但代码基本的运行环境是一样的,这个不用担心。
对于服务依赖的问题:
1、有个基于Nodejs的Serverless程序开发框架,对上层应用层抽象,下层把云服务进行封装,适配不同的云厂商(目前支持8家);
对于环境依赖的问题:
1、今年发布的Google Cloud Run采用的方案是部署Docker镜像,这种借助了Docker来解决环境适配的问题。

Serverless服务开发我自己是主要使用了Python 3.6,下面列举一下相关工具包:
1、https://github.com/Miserlou/Zappa AWS Lambda部署工具
我写的小服务是部署在AWS Lambda,所以我对Zappa有实践经验,下面两个木有。
2、https://github.com/serverlessplus 腾讯云
3、https://github.com/aliyun/fun 阿里云

now.sh / zeit.co

特别单独说说一下这家独立厂商,结合了github的玩法比较有趣,授权github之后,push代码到github的仓库,会自动部署代码到zeit服务器,推荐大家玩一下。

其他

关于服务计费:Serverless真正实现了“按需付费”,应用程序触发执行的时候才计费。对比目前的云服务器,即使你的应用程序无人访问,也需要支付托管费用,这点上Serverless优势很大。
关于服务扩容:无需关心。
冷启动问题:Serverless由于不是常驻服务,如服务没有预热,冷启动的时候响应速度会稍慢(0.x秒),所以这里常见的方案是设置一个定时触发器将应用程序warmup,缓解冷启动速度慢的问题。


我开发的小服务

ProgressBar(进度条):https://progressbar.net/
功能是计算当前时刻年月日的百分比进度。
是偶然的一个机会在Twitter看到一个号:https://twitter.com/ProgressBar201X 得到启发,于是做了这样的一个小服务。
基于Python 3.6开发,开发框架是Flask,使用Zappa部署在Amazon AWS Lambda里。
====
机器人提醒:这个是工作上的小工具,对接了企业微信的群机器人接口,发群消息。使用的是PHP开发,用的是阿里云函数计算。

尾声

最近Python、Nodejs都用了不少,几种语言换着写的有点精神分裂了:P

新的玩具:之前一直计划弄个软路由来着,但NUC只有单个网口。昨天买了一个USB的千兆网卡,后面打算把NUC配置一下路由功能,这样NUC就真的变为:
路由、存储、影音播放一体化的终极设备了。

阅读资源

https://serverless.ink/
http://jolestar.com/serverless-faas-current-status-and-future/
https://amio.github.io/serverless-zhcn/
https://jimmysong.io/posts/what-is-serverless/
https://martinfowler.com/articles/serverless.html
https://aws.amazon.com/cn/blogs/china/iaas-faas-serverless/
https://aws.amazon.com/cn/blogs/china/lambda-serverless/

将斐讯N1盒子改造成游戏机

斐讯N1在矿难之后价格一路下滑最低到60多包邮,去年11月左右我在拼多多上75包邮买下,也算是第一次正式使用拼多多,当时拼多多股价还在20USD左右,之后看涨拼多多,目标价翻倍。

斐讯N1本质上是一个电视盒子,默认是安卓系统,可以直接接到电视上使用。
基本硬件配置:
SoC:S905d
内存:2G
网口:千兆
USB:2个2.0接口
HDMI:1个
存储:8G eMMC
这个盒子的硬件配置秒杀树莓派

Armbian
几年前有个俄罗斯队大神balbes150成功把armbian移植到Amlogic S805/S905方案的电视盒子上,一下子扩展了这类电视盒子的玩法,其他相关的衍生发行版也都实现了在电视盒子上运行。
所以理论上所有基于Amlogic S805/S905系列的电视盒子都可以改造成游戏机。

原计划是刷Armbian系统然后作为主力网关设备,并且规划了如下一些功能:
1、家庭网络接入网关
2、Syncthing主节点
3、离线下载
4、电话语音短信网关
5、游戏模拟器
6、视频、音乐播放服务器
7、NAS存储

第一次尝试:
1、降级Bootloader(这个是必须的步骤)
2、将5.74版本4.20内核的Armbian刷入到U盘
3、启动到U盘系统(我们没有将系统刷入到内部的eMMC存储),接HDMI显示器,启动成功,发现网络不通,网上找了一些资料以及加了群问了一下别人没找到解决方案,于是打算使用5.44版本的Armbian

第二次尝试:
1、刷入5.44版本3.14内核的Armbian
2、apt安装retroarch,启动retroarch极度卡顿,应该是GPU驱动未加载,硬件加速有问题
3、加群问人以及网上找资料未找到解决方案

第三次
1、找了SX05RE这个三合一镜像(Lakka、CoreElec、ES)刷入运行很流畅
2、这个发行版来历:OpenElec -> LibreElec -> CoreElec -> SX05RE
3、CoreElec是专门为S805/S905定制的LibreElec版本
4、SX05RE是在CoreElec基础上整合了游戏模拟器
5、有线、无线、蓝牙全部正常
6、调整定位,N1盒子只用作游戏机

硬件外设:
1、游戏手柄原打算买一个山寨版的PS3手柄,偶然在一个论坛看到有人推荐HORI这个牌子,下单买了一个HORI的蓝牙PS3手柄,70;
2、另外又额外买了2个USB接口的红白机经典手柄,2个手柄21块包邮;
3、感叹一下,我爱中国制造。

系统设置:
1、我安装是系统包,不带游戏,从网上找了几个经典游戏ROM:魂斗罗、打坦克、超级玛丽、泡泡龙,通过网络共享放到ROMS目录之后重启即可;
2、中文游戏名”口口”问题:替换ES主题文件夹里字体为中文字体即可。

参考链接:
刷机教程:https://www.mivm.cn/phicomm-n1-unofficial/
SX05RE使用指南:https://vipiu.net/archives/2018/05/22/426.html

家庭网关的配置记录

主要的诉求:

1、能够在外部网络随时接入到家里的内网、访问家里的各种设备;

2、家里的一些家电也带网络控制功能(所谓的智能家电),后续希望能够通过这个小网关实现电器自动控制和调节。

家庭网络情况:

上海电信500M(下行)/50M(上行)。

电信接入设备:烽火通信SDN网关,型号是 HG2821T-U,电信目前新开户以及升级上来的网络都是采用这种SDN网关,目前网上暂未找到成熟的方案进入设备进行一些配置。好在电信提供了APP跟网关设备绑定之后可以设置DMZ和UPnP,但是第一次在APP设置之后未生效,重启网关也无效。无奈拨打了电信的报修电话,电信工作人员上门之后给出的解决方案是换设备改桥接,当天工作人员换了三台设备都没有成功,约了第二天再换设备来处理,不过当天晚上的时候再试DMZ和UPnP倒是能用了。

网关接入设备:

NanoPi 2 Fire,2016年初以99元的价格购入,当时玩了一个月,安装了Ubuntu Mate,原计划是把这个小板子作为自己的开发环境使用,无奈IO性能太差,之后一直在角落里吃灰。后来买了一台ASRock的Beebox N3150作为开发机使用至今,N3150这里不展开说明。

NanoPi 2 Fire采用了三星S5P4418 SoC,1G内存,千兆网口,板子尺寸大概三分之二个信用卡大小,这个配置相对来说很不错,但是SoC发热比较大,正好有个闲置的USB风扇,对着吹用来降温。

技术方案选择:

1、VPN方案:WireGuard

2、电信网关设置DMZ到NanoPi 2 Fire

3、在操作系统镜像折腾上耗费了比较多的时间,NanoPi官方最新的镜像是4.4内核,刷到板子里不能用,发现原来新的镜像是适配新板子,对老版本的板子没有兼容。老版本的镜像是3.4内核,由于WireGuard最低需要3.10内核支持,一开始打算移植3.4内核的东西至3.16内核(LTS),也买好了串口线接入以备内核调试,尝试了2天最终还是放弃,主要原因是涉及的东西比较多,自己也不擅长这块,进展缓慢,时间投入不值得,不过对嵌入式系统的启动机制倒是了解的比较清楚以及对内核源码的结构加深了印象。最后选择了DietPi作为系统镜像而非官方镜像,DietPi官方没有提供NanoPi 2 Fire的镜像,有NanoPi M2的,查了一下资料发现NanoPi M2跟NanoPi 2 Fire的配置除了WiFi和蓝牙模块其他基本一样,尝试刷入M2的镜像到NanoPi 2 Fire,顺利启动。DietPi的镜像十分精简,镜像压缩包只有几十兆,十分推荐使用,DietPi也有树莓派的镜像。总结一下:国产板子的性价比很好,但是后续支持以及生态上还是差的比较多,出现问题自己研究解决比较痛苦,如有可能还是选择用户多的板子。

4、由于缺乏了原生内核支持,WireGuard的技术实现方案上选择了wireguard-go,目前使用下来良好。同时wireguard-go在比如MacOSX等没有原生内核支持的操作系统也可以使用。

待续。接下来记录一下折腾Home Assistant的东西。

apparmor的坑

将mysql的datadir修改了个路径,mysqld死活启动不了,可以dmesg看一下是否是路径被apparmor拦截了:

type=1400 audit(1390890338.307:153): apparmor=”DENIED” operation=”open” parent=4033 profile=”/usr/sbin/mysqld” name=”/srv/app/mysql/ibdata1″ pid=4415 comm=”mysqld” requested_mask=”rw” denied_mask=”rw” fsuid=105 ouid=105

mysql的错误日志会提示无法访问plugin表:

/usr/sbin/mysqld: Can’t find file: ‘./mysql/plugin.frm’

解决方法:
/etc/apparmor.d/usr.sbin.rsyslogd 把新的datadir路径加进去即可。

lxc & aufs & docker

将rootfs放置于aufs上可以节省不少空间(template):

create a linux container named “p1” with template “ubuntu” on a 32bit pc
1. mkdir -p /var/lib/lxc/p1/rw /var/lib/lxc/p1/rootfs
2. mount -t aufs -o br=/var/lib/lxc/p1/rw:/var/cache/lxc/saucy/rootfs-i386 none /var/lib/lxc/p1/rootfs
3. lxc-create -t ubuntu -n p1