前言
假期屯了不少书,准备给自己一个充实的假期。好多东西想学习,airflow、superset、scrapy等,另外还想学习rocky linux,还有之前的kvm和pve的内容也想巩固。为了想法落地考虑利用时间搭建自己的homelab。
另外,我终于有机会把这个学期学的内容进行实践了,目前的规划是给旧笔记本安装fedora,给小mini主机安装pve。新的小mini主机就作为服务器使用了。
fedora的安装还是很简单的,调整一下AHCI就能找到硬盘了。可是即使如此我也安装了两遍。问题出在密码上,新安装之后密码无法进入,第二次安装的时候注意到了原来是输入密码的时候输入法是大写状态。DELL电脑的win系统开机就会风扇狂转,现在安装了fedora之后,变得特别安静(下载软件的时候还是会有一点点声音)。
然后就是重新搭建基础
家里的旧电脑有点多了,显示器只有一台(多了桌子也放不了),要让我的mac重新能支持双屏幕估计要等到下次升级了。经过多次思考后决定让mini主机安装PVE:
第一点,如果我用fedora服务器,每次还要安装sshd和vnc,考虑到这麻烦情况,还不如直接用http控制电脑;
第二点,考虑到要做的本地项目组件众多已经有点复杂了,越早熟悉虚拟化平台能够越早启动项目。
第三点,如果可以把远程开发环境搞好,以后就有了坚实的homelab基础了。
安装PVE
长时间的调研准备,开始工作居然拖了这么久。这里要说一下,全新的mini主机自带win11 pro,什么都还没有安装开机风扇就想个不停,虽然我现在不能明确问题所在,不过,这个情况让我对win依然是不太有好感。
先不要考虑ip地址的设置,一把点安装。PVE安装时间意外漫长,检查了一下,居然卡在了“create LVs 3%”,没有想到一开始就这么不顺利。也有提示说不用管它,这是正常现象,果然多等了一会儿,后面安装就非常快了。安装成功了,然后就是要考虑ip地址接入的问题了,找根网线把机器接入到网络中,修改interface文件和hosts文件,把ip地址设置到静态。
1 | vi /etc/network/interfaces |
安装操作系统的时候意外顺利。
一天下午的时间,我就安装了pve,fedora,rocky linux,感觉是挺充实的,并且由于之前阅读的关系,kvm的书籍让我重新理解了网络的模型,可以在配置上更加得心应手。
1 | sudo dnf install qemu-guest-agent |
创建好base镜像,系统配置乱了随时回来。
修正系统时间
既然要折腾,就肯定有小修小补,比如,发现时间错误了,要改一下时间。pve的时间是错误的,而虚拟机的时间是正确的(date -R)。先尝试用hwclock解决了,一个有意思的现象,根据命令行修改时间之后,我的登录直接退出了!应该是系统根据这个时间判断登录时间的,非常透明和“干净”的感觉!查了一些文档,果然如果条件允许的话还是试试ntp服务吧。
安装fedora服务器
把dell xps改装成了小型服务器,合上盖子不休眠真的很容易配置。
1 | sudo vi /etc/systemd/logind.conf |
然后就是配置虚拟机和插件:
1 | dnf install cockpit-navigator cockpit-machines |
一个小型的服务器也准备好了,至此我的书架上有了linux、macos、win三个小型的环境,另外还有个pve主机可以一步一步继续学习了。
安装airflow
开始安装体验,官方的文档有很详细的安装教程,不过我还是想先从podman开始。
1 | dnf install podman |
并没有成功,podman ps
发现容器退出了,使用podman logs -l
返回的内容居然是“airflow command error”,不得不说,非常诡异。最后尝试使用helloworld测试一下podman是否装好。
1 | podman run hello-world |
看到输出的一瞬间我明白了。airflow的错误输出正是由于logs命令运行正常,是我没有对airflow做正确的配置。这个错误虽然很小,但是也非常有趣,容器内部和外部环境形成了“隔层”,但是内部程序是不知道的,他努力的发出声音也是因为没有配置好,但是这个声音的渠道被我听到了,是不是就构成了一种“穿透”。形式上就是,我输出podman日志的预期看到了容器的日志,从而担心整个podman环境出现了什么问题。我觉得这也是奎因第二类问题的一种体现。
如果用容器运行airflow不是最默认的方式肯定是有原因的,尝试没有配置好的话,就按照最默认的方式来吧。
干净的系统居然没有pip,需要自己安装python -m ensurepip --default-pip
。
基础硬件设施解决之后发现,其实很多开源软件直接安装即可,容器化并不能让每个问题都简单,甚至有时在不熟悉的情况下会复杂化。
安装superset
这次学老实了,先跟着教程走。superset感觉是个“纯”的python包,如果考虑后续使用,也许可以借鉴一下jupyterhub的安装经验。
配置防火墙启动:superset run -h 0.0.0.0 -p 8088 --with-threads --reload --debugger
启动之后发现无法登录,依然是仔细看日志,然后在社区找到处理方案,这里提一下,这个社区的处理方案,提问人提问的方式太棒了非常详细。最终采用了两个配置建议(包括“TALISMAN_ENABLED”),最终见到了欢迎页面。中间一度很多错误,让我转向了docker部署,不过最终还是解决了。(原因是忘记运行superset init
命令了)
1 | [Unit] |
1 | source /home/peter/venv/bin/activate |
最后就注册成服务,可以随意使用了。其中有个点,如果User配置为root,账号密码不可用。这样让人非常在意账号密码存在哪里?还是说执行初始化的时候和用户关联了?
配置casdoor
嗯,突然配置这个东西,确实有些跳跃。不过类似于游戏技能树一样,这个模块配置好可以很大程度上解决登录问题。
首先,还是看看rocky上怎么安装docker吧,毕竟,podman还是有些问题,生产环境中docker用的更多一点。
经过测试,casdoor确实可以在内网部署https服务,使用acme.sh申请证书。
1 | sudo docker compose restart casdoor |
配置这个重点是要生成证书,这样要学习一下acme.sh了。curl https://get.acme.sh | sh -s [email protected]
acme.sh结合cloudflare可以很容易的生成证书。主要都是证书的安装细节和注册脚本了。根据需要要安装cron:sudo dnf install crontabs
无论如何,安装sso的服务端都还是简单的,下一步就是考虑如何把用户端配置好,配置流程如下:
- SSO_CLIENT_ID和SSO_CLIENT_SERCRET是在SSO服务端生成的;
- 应用的实际生成地址需要提供给SSO作为callback;
- 使用命令行注入ca.cer的位置;export NODE_EXTRA_CA_CERTS=/real/path/ca.cer;
- 把sso中应用公钥的信息提供给应用。
注册到这里就出错了,node无法识别le的证书,本来node就没有le的证书,这里更换zerossl证书试试(之后依然要重新注入)。
最后还是选择了注册zerossl的账号,至此,我终于了解了证书的运作机制,并了解了acme.sh工具的使用。可以参考的教程还是很多的.
经过一通操作,至少在自己的实验环境搞定了。然后把app和sso都准备一份部署工具,等完全部署好,就可以了。
其中使用一个fetch函数可以验证证书有没有配置好。
1 | fetch('https://door.tcub.site') |
node当然需要专门安装:
1 | dnf module list nodejs |
以casdoor为中心,就能很大程度上解决用户管理的问题了。
不过,casdoor的角色配置也是有技巧的,有两个问题要解决:
- 如何限制用户的权限范围,比如只能登录指定应用;
- 如果防止用户登录casdoor本身这个系统;
- 如何使应用登录无缝化;
实际使用起来,还是有些注意事项的:
- 如果防止应用用户和系统用户混乱(主要是昂志用户登录cas系统,这种情况下,需要建立新的组织,应用需要重新配置);
- 新建组织的情况下,只有组织中有应用的情况才能添加用户成功;
修改好了应用信息之后,需要重新发布一下就可以了。docker build -t video:v7 .
troubleshoot
早起发现无法正常生成域名的证书,“明明昨天还是正常的呀”然后一看昨天的证书其实也是不正常的。却少必要的公共证书。经过一个小时的波折,冷静了下来,法相原来是dns_cf的key的问题。之前的key只是访问一个域名的(或者至少zone_id只能指向一个域名)。
zone_id可以在dns管理对应域名的信息页面找到。令牌的话,在个人信息(右上角)里:My Profile->API Tokens->use DNS:edit_template就可以获得了。
troubleshoot 2
系统可能需要安装ca证书才能访问目标服务器,主要是使用update-ca-certificates命令。不同系统安装方式不一样,这里记录一个ubuntu的例子。对于php74容器运行的php网站,需要进入容器更新证书才能实现sso通信。
1 | docker exec -i container_id bash #进入容器 |
开始配置homelab
假期开始,终于有足够的时间配置属于我的homelab了,服务器也就位了。借助pve和cloudflare尝试构建homelab。之前我一直担心,cf的tunnel是不是不够快?现在想到我的homelab我突然明白了,如果我自己用就没有这个问题了。首先试试authentik
首先,尝试用podman部署一下authentik。sudo dnf install podman
安装podman。然后就是一系列命令:
1 | sudo dnf install python3 |
使用podman失败了,但是不清楚可能的原因,所以,还是老老实实装docker吧。
1 | sudo dnf remove docker docker-client docker-client-latest docker-common docker-latest \ |
根据教程进行安装到是很快,利用cf的tunnel也很容易把服务发布出去,不过证书和配置应用搞不好就没有那么简单了。毕竟这个compose文件都没有看太懂。
自己的小homelab运行一两天就会发现进程号到了几十、几百万,估计还是哪里有泄漏。果然很多事情是自己实践之后才能发现的。
有了自己的homelab之后发现vscode更加好用了,然后再次意识到,还是使用证书访问更加方便。
1 | ssh-keygen -t rsa -b 4096 |
node网站镜像化
一个简单的node网站,是用的时候确实有问题的情况,直接发布镜像会方便一些,但是网站在使用了prisma的orm之后就需要在发布前建立数据库。建立数据库可能会用到的一些脚本如下:
1 | npx prisma db push |
ubuntu系统的磁盘管理
ubuntu默认安装的情况下会使用lvm,当然lvm不是问题,但是他会预留太多空间,导致默认的硬盘很容易就满了。这个时候就可以通过调整磁盘获得空间。
1 | sudo df -Th |
总体来说,lvm还是提高了整体的灵活性。
建立首页
终于来到了首页阶段,到目前为止,homelab的服务和连接已经非常多了,如果能有一个好的首页就好了,先动起来,随手找到了一个首页项目,先把各种连接汇总吧。经过考虑zfile和authentik也许可以发布出去,其他的服务暂时还是放到家庭内网里比较好,必要的时候可以通过蒲公英访问。最终效果很好~可以非常方便的整理常用的访问链接了。
小结
随着第一天来到办公室,我也意识到假期结束了~买的很多书都没有看~不过我的homelab建设倒是很成功了。有个让我欣慰的点,我看到remix.run框架来到了2.7了,非常快的速度!感觉2.0还在昨天,新的开始加油~