2025-04-17 23:20:00
使用浏览器保存密码,是我十年以来从使用傲游浏览器开始的习惯。得益于导出和导入的便捷,我换过很多浏览器,这些密码依然被完整的迁移到了我现在使用的 edge 浏览器上,且 edge 安卓版也支持作为密码管理器给应用填充密码,至此我都没有更换密码管理器的想法。
前阵子有博主给我推荐了 keepass,加上浏览器保存的四百多个密码中绝大多数使用的同一个密码,一旦泄露一个,被撞库的后果不堪设想,于是我有了更换密码管理器,且使用这玩意生成复杂密码的念头。
但是阴差阳错,keepass 太丑,我的服务器又可以一键部署 bitwarden,所以我最终选择了后者。
一开始我并不是很愿意自己托管数据,一方面是 bitwarden 的官方服务够用,且一定程度够安全,自托管可能会面临更多的维护和容灾时间成本,所以我注册了官方的账户。
登陆后,我从 edge 导出了保存的密码——虽然需要输入系统密码,但是如柚子所言,浏览器保存的数据是很容易被导出或窃取的。导出完毕,我便删掉了浏览器保存的密码数据,决心使用 bitwarden 一条路走到黑。
起先体验还不错,但是没多久我就遇到了一个问题。在单位电脑上为某网站创建的账户使用了 bitwarden 生成的复杂密码,并且保存在了该应用中。而在家中的电脑上想自动填充时,却发现浏览器插件提示没有填充项目,即使我在本地一再点了同步密码库。
此时我意识到很可能是在单位时,该账户密码并未成功被同步到 bitwarden 的云端。
因此,我决心自部署该项目。
在 1panel 中一键部署 bitwarden 是非常轻松的一件事,让我踩坑的点在于后续的配置中。
根据官方文档和碎月的建议,我决定使用域名的子目录来反向代理该服务,一定程度上减少它被恶意扫描和爆破的风险。理论上使用子目录反代很简单,只需要添加一条环境变量,在反代中添加该路径即可。
但问题来了:1.环境变量没有生效,2.反代只支持添加域名但不能包含路径。
针对问题2,我和碎月进行了较长的辩(嘴)论(硬)。我认为,一个域名都已经解析到目录 A 了,难道还能反代到目录 B 吗?
即,example.com
对应网站的目录是 /opt/www/sites/
,bitwarden 安装的路径是 opt/docker/bitwarden/
,那么example.com/bit/
是无法解析到后者的。还好碎月有耐心,让我明白了只需要在已解析域名的反向代理中添加前端请求路径和后端代理地址即可。
问题2解决了,问题1困扰了我好久。我添加的三个环境变量如下:
# 指定域名和子目录 |
我首先在该服务目录下的 .env
中写入环境变量,重启服务,没生效;
在 docker-compose.yml
中硬写变量再重启,也没生效,碎月也不知道何故,为此,我还去 1panel 的项目中提了一个 issue (丢脸)。1panel 官方工作人员回复了我,并确认该情况不是 bug。在我多次尝试后发现了问题所在:修改 docker-compose.yml
后我没有点重建!!!
不爱使用 docker 的我,最终为自己的无知感到了羞愧。
由于在应用商店更新应用会导致非持久化目录下的文件丢失(或覆写),所以我一直在考虑把 .env
添加到持久化目录中,在 docker-compose.yml
里指定路径,还是把环境变量硬写在 docker-compose.yml
里,最终我选择了后者。
为此,我和 deepseek 之间也有一段小小的插曲,因为允许它说脏话,所以我被它骂了,虽然后来它服软——因为我的环境变量里并不包含重要的敏感信息。
因为升级时可以勾选自定义docker-compose.yml
,所以把环境变量写在这里要方便得多。
虽然服务器已经稳定运行好几年了,我时不时会添加快照,但把鸡蛋放在同一个篮子里并非明智之举,所以我通过 1panle 的定时任务每天都会把 bitwarden 的数据同步到 onedrive 中,以免哪天需要恢复。如果你也选择自托管,我强烈建议使用脚本每天备份数据!
自部署的服务无论是增删还是同步都超级方便快捷,除了保存网站或应用的登陆密码之外,我终于把此前明文写在 onenote 中的银行登录密码给迁移到了 bitwarden 的“备注”功能之中。
但是体验也有不那么好的点,在安卓端或浏览器插件中无法批量管理密码(可能是出于安全),只能在服务端的网页上批量操作。此外,在安卓端的自动填充有时会有延迟,比如在浏览器中点好几次都不会及时显示自动填充,在 APP 上创建密码也不会及时弹窗询问是否保存。但大体上使用没什么问题。
自托管 bitwarden 让我尝到了甜头,于是最近这些天我在折腾另一件让我苦恼的事,甚至今天水这一篇文也是为了后面的记录做铺垫。
最近我的 onenote 频繁闪退(其实也不算闪退,有退出动画那样时不时自动关闭)。为此,我决定找一个平替,期间尝试了包括但不限于知名的 notion、obsidian、joplin,以及 google play 上的很多如 notesnook、anytype、standard notes、appflowy、silentnotes等等几十款笔记应用,没有一个近乎完美符合我的需求。
需求如下:免费或者开源,非国产,多端同步,支持自托管或加密同步到如 onedrive 或 webdav,支持单篇笔记加密,界面好看不臃肿,支持剪藏更好。下一篇再来详细谈谈我的简单评测。
2025-04-06 21:00:00
见我走进来,杰仿佛被定格了一般,右手攥着白毛巾,左手握着酒杯,愣了好一会才继续。酒杯搁在吧台的声音清脆悦耳,他冷冷地问了一句:“你怎么来了?”
我冲他强笑,没有搭话,径直在他面前坐下来。他转身取出一支啤酒,揭开盖子,摆在我面前,然后又自顾自擦起酒杯。
“半年了,杰。”
听见我开口,他又停下手里的动作,盯着我,喉结滚动,脸上晕开一阵委屈的神情。他轻轻给了我一拳,像个小女生一样:“你还知道半年了啊!”
“快乐吗,最近?”
他又放下酒杯,给自己开了一瓶啤酒,坐下来,反问我:“你觉得呢?”
要不是这么多年的相处,我断然无法接受现在这种有些暧昧的气氛。曾经我有过杰终于长大的错觉,可更多时候他的反应让我怀疑,孤独的杰是不是永远也长不大。没有联系的半年,像流水一样逝去,哗哗啦啦,带走了此前漫长的梦境。这半年我开始适应新的工作环境,开始尝试一些新鲜的事情,开始有真正想要走出去看看这个世界的念头,在我的三十岁,也是杰的三十岁。可我对他这半年的煎熬一无所知。
即使他没说,鼠没说,我也知道,像他这么拧巴的人,一定过得很辛苦。
“我去过她的婚礼。”他咽下酒,讲起这半年发生的事。
去年国庆节假期,他的前任真的结婚了。得知这个消息之前,他就从一直舍不得删掉的她的微信签名里看到三个字:好好爱。她终于有新的人了,他这样想。别人宛转告诉他,她要结婚了,杰也决定开始新生活的心又开始动摇起来。后来他在酒店的门口看见了前任和新郎官的婚纱照,两个人都笑得很灿烂,简直是郎才女貌。杰很想进去看看婚礼仪式,又害怕碰到前任的父母,在门口踌躇的时候,新郎父亲胸前戴着红花走过来搭讪,他又灰溜溜地走了。没有写份子,没有喝喜酒,也没有见到她最美的那一面。
杰回家后捂着被子睡了两三天,一睡醒脑海里就是种种回忆,然后又哭,哭得喘不上气的时候,再点燃一支烟,努力让自己心情平复下来。
“人总要和过去和解的不是吗?”
他若有所思地点点头,随即可能觉得不对:“同自己和解吧?”
“杰,我也非常理解你……”我低下头,脑海里挥之不去的过往又像被快放的电影一样不停闪过,“那时候我不应该那样绝情的跟你说话,我知道你很难受……我知道你也跟我一样在上班的时候忍不住会想到以前,会忍不住想哭,会对一切都失去兴趣。但是我们是大人了,总要跨过这道坎。小孩子才有人帮忙收拾烂摊子,我们没有。”
杰的眼里闪过一丝落寞,本就黯淡的瞳孔,再也找不到少年时的那种光芒。他或许有意岔开沉重的话题,又问我怎么突然来找他。
“鼠跟我谈起了你。”我没有说谎,但这并不是唯一的理由。我想,我总不能就因为这事就失去多年以来每个夏天都和我一起喝酒聊天的朋友,更何况,他那么像我。
“鼠也跟我谈起了你。”他咧嘴一笑。看着他的脸,我想起每次过人脸识别门禁的时候,我就越发觉得自己真的开始变老了,而我二十四五岁的时候,还天真的以为自己能一直保持那副模样永远不会变得沧桑。现在我们俩都像在沼泽中挣扎最终幸存下来的人一样,浑身都是泥泞和密密麻麻的伤痕。
杰会开始他的新生活吗,我不知道。或许像鼠曾经引用的加缪的那句话一样,生活无所谓新旧,无论怎样的方式,都是这一生的必经之路,只管去经历,不要再期待结果。
2025-04-04 16:30:00
前阵子偶然在雨月空间站了解到腾讯出了一个云原生构建项目 CNB,一开始以为只是另一个国产的 gitee,但是深入体验后才发现它比半死不活的 gitee 高明得很多,非常接近 github。借用评论区的简要概括:云原生开发是 github codespace,云原生构建是 github actions,制品库是 github registry。
CNB 还是很大方地提供了免费额度,详情见云原生构建定价,实际云开发使用体验也非常不错。自从我换电信宽带后,基本无法直接向 github 推代码,既然如此,那我是不是也可以将我的博客自动化迁移到 CNB 上呢?
1.注册一个 CNB 的账号,目前只支持使用微信登陆;
2.创建一个组织,实测非常见字符可以直接创建,但是短字符或常用字符需要域名验证。因为支持 .cool 域名验证,所以我创建了组织“hin”;
3.创建仓库,和 github 一样,你可以创建公开和私有仓库,此外,github 中的私钥等环境变量在 CNB 中得通过创建秘钥仓库来实现;
4.在这里创建访问令牌,以便拉取和推送代码,场景和权限范围还是非常细致的。特别提醒:记得保存生成的令牌!
如果你要推送 hexo 博客到腾讯云 cos,那么你可以使用 hexo-cos-demo 这个模板;如果你要推送到自己的服务器,则可以使用 hexo-rsync-remote这个模板。这两个模板都自带云原生开发环境,可以一键上手。
起初考虑到我的 hexo 以及主题版本都太低,至少有两年没更新了,所以我选择了创建空白仓库,复制原 github 仓库文件和代码,参考案例编写环境。
强烈建议:创建私密仓库,以免配置文件中的一些密钥泄露!!!
仓库根目录创建.ide/Dockerfile
文件,参考内容如下:
# 帮助文档地址: https://docs.cnb.cool/zh/vscode/quick-start.html |
拉取和推送项目的操作和使用 github 一样,不再赘述。在第一次拉取私密仓库或者推送时,需要登陆,在登陆框填写此前创建的令牌即可。
我复制了此前 hexo 文件夹下的 source
、themes
等文件夹,以及 _config.yml
、package.json
等文件,然后 git push
到仓库。
点击右上角的橙色“云原生开发”,很快就会创建好环境,可以选择使用 WebIDE,也可以使用 VSCode 等 IDE 打开。为了方便,我就直接选择了网页版的 IDE。
打开网页版的 IDE 就可以在网页上使用 vscode 进行代码编写、拉取和推送等操作了。IDE 自带了腾讯的代码助手,但是我没使用过它。
和 github codespace 一样,你可以直接在网页版 IDE 中使用 hexo s
这样的命令来在线运行和调试。
此外,建议你使用子模块的方式引入 hexo 主题,以便于后续主题的更新和修改。和在 github 一样,在当前仓库创建 .gitmodules
文件即可,内容参考:
[submodule "themes/butterfly"] |
在网页 IDE 中测试没有问题后,即可开始下一步了。
新建仓库,类型选择密钥仓库,参考文档在仓库里创建一个env.yml
文件,内容参考如下:
# 密钥仓库 env.yml |
详细的参数说明参考官方的 rsync 文档。此外,一定要记得粘贴私钥内容有两个要点:
1.在 yml 中,多行内容要用|
来表明;
2.由于 yml 对格式非常敏感,所以私钥的每一行都需要缩进两个空格而不是 Tab。
一开始我没注意到第二点,导致尝试推送静态文件到服务器时登陆失败,虽然构建日志中也提供满血版 deepseek 帮忙分析日志,但这也为我明明格式正确却无法连接到服务器埋下了另一个伏笔。
在 hexo 仓库(不是密钥仓库)中创建一个名为 .cnb.yml
的文件,它的作用和 .github/workflows/main.yml
是一样的,写法上稍有不同,参考代码如下:
main: |
到此我们要做的事已经基本完成。当这个文件创建之后,云原生构建便会自动开始。起初,我的每一次构建都在上传到服务器这一步失败了,原因是服务器拒绝了连接。后来查看服务器日志才发现,因为之前失败次数达到设定的值,IP 已经被 fail2ban 给拉黑了。
其实这个过程我尝试并失败过很多次,比如 hexo s
的时候发现有标签报错呀,我一直很纳闷,明明主题里有这个标签。后来偶然发现,我的主题是以子模块的方式引入的,在 CNB 仓库里没有声明子模块,导致浪费了很多时间。
其实自从腾讯云的 webify 基本没什么存在感之后,我对 CNB 的期待也不会太高,不知道哪一天这个项目也会被腾讯给淡忘。但是就目前来说,拉取和推送代码快速,云端 IDE 方便,配置给得也很大方,后面试试用来编译 openwrt 的固件都是值得一试的,我们切用且珍惜吧。
2025-03-24 20:40:00
提示:本文是一篇牢骚记录,没有美感可言!
其实在上上周的时候我就知道这个结局,当时也决定如果猜想属实,就写点东西发发“bia”言(即阴阳怪气的话),心中有些愤懑总是不吐不快的。
由于想评职称,所以很需要这次赛课的机会。在方案公布之初我就在组内说了我的想法,大家也都非常支持我。因为只有一个名额,为此,上上周,我们两个年级搞了校级公开课,有许多评委老师打分。语文学科共四人参加,上完课我就猜到,抉择应该是发生在我和另一位老师乙之间。
评课时,书记由于有事没能参加,把打分结果交给了我的备课组长。我们得知书记个人给乙打的分数最高,虽然她的课堂并不完整,但是确有一定的感染力。而那天教务处没有公布最终的决定,只是口头说“保持一点神秘”。
上周,学校举办了集团校的复赛,我和乙,以及另外三个学校的老师共五人参加。复赛的课题刚好是我初赛上的那一课,我根据此前评课老师的建议,改进了自己的教学思路和策略。当天无生试讲的五人中,我的发挥并不是特别好,也有一点失误。乙依然表现得很老成,根本不像一个刚参加工作的人,不过她的课完全没契合到这次赛课的主题“Ai 促进教学”。回想起两年前,我还在支教的时候,集团校复赛,我没有契合赛课主题所以没能进入决赛,而今乙也犯了我当初一样的失误。另外三人中,除了有一人确实很优秀,另外两人都是打酱油的,但由于名额,他们三人中有两人必定会参加决赛,即使上得很烂。
试讲完毕,评委现场统计了分数,我最高,乙比我少一点。三选二确定后,教科室却说我们学校谁去决赛依然由领导决定——此时我就已经有更强烈的预感了。
今天得到消息,领导果然选择了乙。说实话看到这个结果的时候我满脑子的不理解,前年我的失误如今在乙的身上却被抹去,并且领导如果早有钦定的人选,又何必要我们两次比试,甚至不在意我们当场就知道分数这回事呢?
于是我发了一篇 bia 言在工作群里,言之不尽,皆在字间:
初,工部遴墨家传人。初试日,余制璇玑仪,测星象则紫微显曜,量地脉则金针自鸣。同试者河东柳生呈木牛流马,亦得主官赞赏。
吏部侍郎亲执量尺曰:”静候钧旨。”越七日复试,余更迭七稿,终成浑天仪,铜蟾吐珠应四时节气。柳生亦有新作,而榫卯尚有松隙。主官评议余为甲等,柳生次之。然礼炮三响,黄门朗声道:”柳生承古法,当入尚方监。”
是夜值雨,浑天仪自转不休,铜珠坠地成卦,乃”火泽睽”象。其言:”但使黄金台未圮,何须匠石运斤风。”
2025-03-22 20:40:00
老谢是我今天参加工会活动时跟我同组的一个男生。
从今年初开始,我就决心勇敢去参加一次工会组织的单身活动。因为从未想过在一次活动中脱单,便一直以来都声称去“见见世面”,加之想去看看其他大龄单身男女青年的状况以及他们如何向彼此搭讪,所以这一次活动我非常积极报了名。
如天气预报显示的一样,今天的天气并不是很好。臭烘烘的大巴行驶在山间小路时,突如其来的雨点砸在车窗上,顺着风向在玻璃上残留下一道道痕迹,主持人在大巴上主持的小活动确实带动了一些人的热情,但车窗渐渐被水汽掩盖,外面的风景变成模糊而迅速奔驰的绿色,也没有人去关注它。
到达活动场地后,第一个环节便是简单的自我介绍,单身男女围坐成一个 U 字型,等待话筒传到自己手上。有些人只是简单两句介绍就结束了,也有人絮絮叨叨说了很多,此时我还不认识老谢,也可能那时他尚未显山露水。
自我介绍完了之后,就是随机分组。女生围成一个圈,男生在外围围成一个更大的圈,随着主持人喊开始,男女朝着不同的方向走动,主持人报出小组人数时,大家一窝蜂把周围的人往自己身边抓。我感到有一股巨大的力量把我拉扯到一个初步成型的小组中,伸手过来的人便是老谢。他穿着一件黑色羽绒服,内搭藏青色卫衣,个子不高,冲锋头,瘦削的脸上还残留着较多的痘印。他手忙脚乱地把我往那边揽,睁大眼睛,张扬的笑容,一边还喊着“快来快来”。
就这样,我一个社恐也成功有了自己的组织,六男六女,总共四个小组,开始了一些互动性还算不错的游戏。我对组内其他人都没有太深的印象,只记得老谢。中午吃饭时,主持人说按小组来坐,但是一张桌子也就八个座位,所以每个小组事实上还是被分开了。我站在桌旁左顾右盼都没找到老谢的身影,直到他吃完饭一边抹嘴一边快速走过我才发现他。
下午的第一个环节是学习竹编,两两一组,主持人要求男女生搭配,我,老谢和组内的其他男生都磨磨蹭蹭,不敢大胆去找女生组队,但最终他们都找到了自己的搭子,我却和另一个无人组队的男生组成了摆烂组。老谢和他的搭子按照视频终于编织出了一条小船,我和临时搭子谁也没有动手,坐等旁边的男女组合把他们编织的小船送一个给我们交差。
第二个环节是蒙眼喂食,除了一对男女自告奋勇挑战之外,大家都按兵不动。主持人开始随机抽序号,两次老谢都大摇大摆走上去,在椅子上坐下,喜气洋洋的表情一度让我觉得像被李云龙安排看仓库的王有胜。此时,我们组另外的男生大声喊:“老谢,不是你!喊的9号男生!”老谢的表情变得惊讶,随即潇洒地离开座位,就当什么也没发生过。
第二次上前坐在椅子上,旁边的男生说:“老谢怎么又上去了!”但不知是否真的叫了他,这一次他没有再离开。随机匹配的两个女生,蒙上眼睛,转圈之后,一个女生径直往前走,精准的把蛋糕喂在了另一个男生的嘴里。等到老谢面前的女生向前走时,周围又开始起哄,故意说相反的方向,看着那个女生走偏,老谢也紧张得大喊起来:“左边左边!”那个女生还是朝另一个男生走去了,在接近投喂的时候,老谢却大笑鼓掌,身体弯曲得快要趴在自己的膝盖上,一边大声喊:“好!好!”好在工作人员没有捣乱,指导女生调整方向,女生伸出手时,老谢起身一口把蛋糕吃了下去,像打了胜仗一样离开了座位。
后面又围成圈发言时,我问老谢被女生喂食是一种什么样的体验。老谢激动地说:“感觉自己他妈的像个熊猫一样,被人围观,尴尬死了!”他重复了两遍,说完我俩也没再就这个话题继续讨论了。
以上便是我今天看到的老谢,在参加活动的人里唯一让我印象深刻的人。
2025-03-08 23:40:00
刚放下碗筷,微信电话响起,是鼠打来的视频电话。
他在天台上,背后是一片低矮的民房,看起来天气不错,日照当空。虽然有一把遮阳伞,他站在荫蔽处,正悠闲地喝着啤酒。一大口灌下去,锁骨跳动,余光瞥见我接通了电话,瞬间从咧嘴绽开笑容。
“最近还好吗?”
“万幸!包工联系了安保,现在我们已经转移到了科卢韦齐。”他举着手机往四周扫视了一圈,镜头又定格在他瘦削的脸上,他的头发凌乱,脸上一点也没有往日的干净,黝黑的肌肤和深陷的眼窝看起来就像营养不良。
“目前安全吗?”我心疼,又歉疚上次没能关心他的处境。
“刚填完大使馆发的务工人员信息,不知道会不会安排撤侨,现在每天期待的就是战火不要烧过来。”他顿了顿,又喝了一口啤酒,把易拉罐丢在地上,发出叮叮当当的声响,“挣不挣钱无所谓了,你懂的,活着才重要。”
听到鼠又一次跟我感叹,回想起我生活在自己和平安定的国家似乎从未考虑过这回事,也没有过特别的感受,一时间心里又心疼起不远万里去挣钱的鼠。上大学时我们在一个宿舍,我,鼠和杰,从未对活着有过什么深刻的想法。那些青春岁月里的敏感,自卑以及对未来的迷茫都已烟消云散,被时光早早抛在脑后。
“杰给你打电话了吗?”鼠突然问我。
“嗯?”我有些疑惑,从去年十月和杰闹掰,到现在已有近半年不曾联系。
“他前阵子也给我打过电话,大概是在你去南天湖看雪后不久,我和他聊到了你。”
“老实说,我也没想到我们仨都毕业这么久了,并没有像其他人一样终于有一个自己的家庭。当他为前任嫁人这种事感到痛苦的时候,我真不知道该怎么宽慰他。”我依然对去年十一那天的事感到有些烦闷,但仔细一想,我对杰还是太苛刻了。
上大学时他在一次喝醉后搂着我和鼠痛哭,他从小没有父母,顽强的靠着自己和社会的帮助一点点长大。甚至在临近毕业时,我所抱怨的父母的安排,在杰看来也是一种可望不可即的温暖。我无法将自己带入进去换位思考,像他这样的人,表面上看起来很坚韧,背地里一定捂着被子偷偷哭过好多回吧。从小没有享受过父母的关怀,长大后好不容易遇到一个可以接纳和喜欢他的女孩子,得知对方要嫁人后,内心又会是怎样的一种绝望呢?
“不要对杰太苛刻啦!你知道的,在他看来,他就是世界上最不幸的人,所以任何一点温暖的消逝都会带走他好不容易建立起来的信心。”
“我知道,鼠。”我突然间不知道该说点什么。从某种程度上来说,我也并没有比杰快乐多少。那时候我也曾沉湎于对过往的怀念中无法自拔,越是想要尽快逃出去,越是容易让人觉得轻浮。直到终于可以坦然面对回忆的时候,又失去了向往美好未来的冲动——假设未来是美好的。
“你最近如何?”鼠丢掉烟头,眯起眼睛又盯着我,“原来国内天都黑了啊!”
“老样子,假期结束,又开始连轴转忙碌起来,我依然羡慕朝九晚五的工作。”我切换镜头,对准窗外的夜景,好在有周末,可以稍微停下来欣赏一下窗外的万家灯火。
“可曾遇到有意思的人?”
“哪个意思?”
鼠哈哈大笑起来:“有趣的人!嗯……我知道你已经对爱情不抱希望了,即使心动,也没有勇气去表露出来。”
“要是工作不会占据生活的大多数时间,我倒是愿意去认识一些有意思的人,一起去听演出,吃美食,看遍世界的大好河山!”
“你说,这会是我们这个年纪的人新的梦想吗,和二十岁时的梦想相比,看起来再平凡不过,却好像更难去实现了。就像你曾说的那样,买房子可比结婚简单多了。”
我沉默,虽然鼠和我生活在不同的国家,接触的人群各不相同,生活上也有时差,但是他每一次和我说的话,都能很轻易引起我的共鸣,因此我也常常会哑口无言。
我看着在国外无处安定的鼠,他看着我在国内每天都能见到的万家灯火,一个白天,一个黑夜,两个都在漂泊的灵魂面面相觑,最终把话题谈得沉重。
“那也像你说的那样,得先活着。鼠,祝你平安!”