给localhost套上tls的翅膀

在tls成为互联网冲浪不可或缺的今天,给localhost加上tls证书也并不是什么很潮流的事情了,换句话说:所有环境尽可能保持一致才能更好的开发和debug。而且吾辈在以前也遭遇过本地http的坑:chrome会因为没有tls证书而给请求加载限速,导致nodejs的dev环境启动巨慢。。在各大浏览器厂商都歧视http的今天,我们不得不给我们最经常访问的域名加上tls的魔法了。

mkcert

作为web.dev推荐的证书生成工具当然好处不少,(谁说对了就给他)

mkcert(和类似工具)具备下列几种优势:

  • mkcert 专门用于创建与浏览器认为有效相兼容的证书。它会保持更新,来满足需求和最佳实践。因此您无需运行具备复杂配置或参数的 mkcert 命令,就可以生成正确的证书!
  • mkcert 是跨平台的工具。团队中的任何人都可以使用。

使用

1
2
mkcert -cert-file certs/local-cert.pem -key-file certs/local-key.pem \
"*.dev.localhost"

Traefik + Portainer

traefik是什么

生成一段不少于300字的对 traefik proxy 项目的功能介绍和与Nginx的对比

1
2
3
4
5
Traefik Proxy是一款高效的、现代化的反向代理服务器,它被设计成可自动化配置的,它可以检测新的服务和容器的出现,并自动地加入到服务集群中。Traefik Proxy支持多种后端服务,比如docker、Kubernetes、Mesos、Swarm等,并可以自动地为它们生成路由规则。它还支持多种协议,包括HTTP、TCP和UDP,并且支持SSL、WebSocket、DNS等特性。Traefik Proxy具有极高的可扩展性,它可以横向扩展,并且可以自动地配置和平衡集群。

与Nginx相比,Traefik Proxy具有更多的优势。首先,Traefik Proxy是自动化的,我们无需手工编写和修改配置文件,它能自动地检测和配置新的容器和服务,并自动地生成路由规则。这样,使用Traefik Proxy,我们可以轻松地管理大规模的服务集群。其次,Traefik Proxy是可编程的,并且有着可扩展的API。使用Traefik Proxy,我们可以自定义路由规则,创建并定制HTTP中间件,以及为我们自己的特殊需求来开发插件。再次,Traefik Proxy支持多种后端服务,比如docker、Kubernetes、Mesos等,这使得我们可以更好地管理多个容器和服务。此外,Traefik Proxy具有较小的内存占用和快速的性能,这保证了它具有卓越的响应时间。

在总体比较中,Traefik Proxy是一个更好的选择。它可以自动地配置和管理服务集群,支持多种后端服务和协议,并具有Out-of-the-box的可用性,可编程性和可扩展性。与此相比,Nginx可能需要更多的手动配置和调整,并且不是那么自适应。因此,如果我们需要管理服务集群,那么Traefik Proxy是更好的选择。

portainer是什么

生成一段不少于300字的对 portainer 项目的功能介绍

1
2
3
4
5
6
7
8
9
Portainer是一款基于Web的容器管理平台,该平台提供了简单、易用的UI界面,帮助用户管理单个或多个Docker环境。Portainer是一个开源项目,用户可以自由下载、使用、修改、扩展和分享该项目。

Portainer的功能非常强大,它提供了几乎所有常用的Docker管理命令,包括容器、镜像、卷、网络、服务、堆栈等。用户可以对容器进行管理,包括创建、删除、启动和停止等。用户也可以对镜像进行管理,包括搜索、下载、创建和删除等。此外,用户可以管理卷,创建和删除网络,部署和管理服务,以及管理堆栈。

Portainer提供了易用的界面,使用户能够轻松地监视和管理Docker容器和服务。用户可以轻松地访问、管理和修改Docker配置文件。Portainer还提供了多个用户支持,用户可以创建多个用户并为不同的用户配置不同的权限。因此,用户可以轻松地管理不同级别的用户。

Portainer的另一个重要特点是可扩展性。它是一个开源项目,拥有活跃的社区,新功能和改进不断涌现。用户可以根据其需求,通过开发和使用插件来扩展Portainer的功能,以满足其特定的Docker管理要求。

总之,Portainer是一款功能强大、易用和可扩展的Docker管理平台。其提供了全面而又可视化的Docker管理工具,帮助用户监视和管理单个或多个Docker环境。同时,它是一个开源项目,具有灵活的设计和可扩展性,可以满足不同的Docker管理需求。

traefik配置

首先我们需要给traefik配置mkcert生成的tls文件路径,这一步暂时没有找到如何在label直接进行配置,后面如果发现如何免除额外的yml文件会进行更新。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# dynamic_config.yaml
http:
routers:
traefik:
# traefik dashboard域名,访问链接为 https://traefik.dev.localhost/dashboard/ (末尾的/为必须)
rule: "Host(`traefik.dev.localhost`)"
service: "api@internal"
tls:
domains:
- main: "dev.localhost"
sans:
- "*.dev.localhost"

tls:
certificates:
# 路径不需要变动,这是容器内的路径
- certFile: "/etc/certs/local-cert.pem"
keyFile: "/etc/certs/local-key.pem"

然后我们就可以创建一个docker-compose.yml文件了,这部分骨架可以从portainer文档中找到:Deploying Portainer behind Traefik Proxy。因为我们是在本地使用mkcert创建的证书,所以就需要忽略certificatesresolvers部分的配置。经过改动之后的配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# docker-compose.yml
version: "3.3"

services:
traefik:
container_name: traefik
image: "traefik:latest"
command:
- "--api.dashboard=true"
- --entrypoints.web.address=:80 # 80入口
- --entrypoints.websecure.address=:443 # 443入口
- --providers.docker
- --providers.file.directory=/etc/traefik/dynamic_conf #指定动态配置文件夹路径(docker内)
- --log.level=DEBUG
ports:
- "80:80"
- "443:443"
networks:
- traefik-public # 创建的 docker network 用于把其余服务都拉到一起
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
- ./certs:/etc/certs:ro # 映射mkcert生成的文件
- ./dynamic_config.yaml:/etc/traefik/dynamic_conf/conf.yml:ro # 前面创建的动态配置文件路径
labels:
# portainer 文档中剩余的配置
- "traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)"
- "traefik.http.routers.http-catchall.entrypoints=web"
- "traefik.http.routers.http-catchall.middlewares=redirect-to-https"
- "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"

portainer:
image: portainer/portainer-ce:latest
command: -H unix:///var/run/docker.sock
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
networks:
- traefik-public # 同样配置了网络
labels:
# Frontend
- "traefik.enable=true"
- "traefik.http.routers.frontend.rule=Host(`portainer.dev.localhost`)"
- "traefik.http.routers.frontend.entrypoints=websecure"
- "traefik.http.routers.frontend.tls=true"
- "traefik.http.services.frontend.loadbalancer.server.port=9000"
- "traefik.http.routers.frontend.service=frontend"

# Edge
- "traefik.http.routers.edge.rule=Host(`edge.dev.localhost`)"
- "traefik.http.routers.edge.entrypoints=websecure"
- "traefik.http.services.edge.loadbalancer.server.port=8000"
- "traefik.http.routers.edge.service=edge"

volumes:
portainer_data:
networks:
traefik-public:
external: true

最终我们的本地文件如下:

首先创建网络:docker network create traefik-public

使用docker-compose up便可以启动服务,访问https://traefik.dev.localhost/dashboard/便可以看到traefik自带的dashboard。

访问https://portainer.dev.localhost便可以进入portainer。

通过Portainer创建和管理docker服务

我们使用一个简单的项目来进行测试,这里我选了memos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
version: "3.0"
services:
memos:
image: neosmemo/memos:latest
container_name: memos
volumes:
- memos:/var/opt/memos
networks:
- traefik-public
labels:
- "traefik.enable=true"
- "traefik.http.routers.memos.rule=Host(`memos.dev.localhost`)"
- "traefik.http.routers.memos.entrypoints=websecure"
- "traefik.http.routers.memos.tls=true"
- "traefik.http.services.memos.loadbalancer.server.port=5230"
- "traefik.http.routers.memos.service=memos"

volumes:
memos:

networks:
traefik-public:
external: true

成功访问:

参考文章

大致流程参考:

How to handle https with docker-compose and mkcert for local development

意识到需要配置network提供互联性:

Application monitoring with Traefik, Prometheus, Grafana, and Docker Compose for beginners

把两个文件优化成只有一个动态文件:

Setting Up Traefik 2 with Local SSL Certificate

作为今年开年最火热的一男(战神)带一女(拖油瓶)打僵尸的游戏,甚至现在在别的领域也有了不少的热度,那么他当然不是李三光进村记和偷盘侠,而是美末游戏和美剧了

游戏

在通关游戏之后不得不感叹顽皮狗的技术力,作为一个PS3末代的游戏哪怕在PS5上玩,也没有任何的旧世代的感觉,如果玩上最新的重制版可能就完全是次世代游戏了,这也侧面说明gameplay在这几年的衰落 bushi(包括另一个一男一女打僵尸游戏的重制版也获得了大火)。

放在2023年的今天,在经历了精神变态事件之后来第一次玩这个游戏似乎很难再所谓客观公正的评价这个游戏,但是个人感觉美末1并不是那么令我满意—-这个结局显得过于急促了,当然其实按照这个走向后面也没什么好讲的了,但是其带给我的印象甚至不如山姆亨利和艾莉离家出走的桥段。

以下是一些个人想法:

电影化叙事游戏个人来说其最大的问题在于游戏难度剧情合理性的冲突,相对另一个一男一女打僵尸的游戏的李三光可以大杀特杀来说,我感觉在末世一个老头带着一个小女孩能够这么多次突破许多壮年男性的包围圈是有点出戏的。当然可以理解的是这是其作为一个游戏必然需要的gameplay内容。然而最后火萤大楼的那场决战,从旁观者的角度来说一个老头能干掉这么多全副武装的军人还是有点离谱的(当然全被干掉也说明火萤混到这个地步一点都不怨)。

美剧

然而其实电视剧很好的解决了游戏需要gameplay的部分,在删减了大量的战斗之后这个剧本确实展现了其作为电影化叙事游戏剧本巅峰的实力。加上剧组对末世氛围的渲染和对场景道具的还原程度,个人可以给一个高分好评。

而且电视剧还对很多游戏中不能很好展现的内容做了补充,包括艾莉被咬之前的生活和怎么被咬的故事,还有某种程度上来说官方对艾莉免疫虫草菌原因的补全,都是十分值得好评的部分。

当然我最不能理解的还是花了一整集的时间来讲一个南通故事对整个剧情有什么影响。

而在看电视剧期间发现最有意思的还是在末世不同团体的人发展出的各种不同的社会形态和最后的结局了。

主要包括:

  • 原政府统治(高压统治,阶级分化腐败,部分被反抗人民推翻)
  • 军政府统治(推翻政府统治而来,结局是因为暴力仇杀被僵尸团灭)
  • 宗教统治(牧师领导,喜欢小女孩(很符合对宗教的刻板印象),最后也因为没管住吊而分崩离析)
  • 共产主义(活的最滋润的群体,滋润到腐化了乔儿被高尔夫打死)

只能说国外编剧确实敢写敢拍,当然对他们来说可能很正常罢。

总结

总的来说游戏和美剧都是值得一玩和一刷的,过段时间也会再玩一下美末的重制和高尔夫2,到时候再来锐评罢。

为什么放弃inoreader

在经过漫长的鸽期之后吾辈又回到了博客上,也只有慢节奏的生活享受得起写博客这么奢侈的消遣了。秉持着高效摸鱼(bushi)获取信息的原则一直在使用RSS订阅各种新闻源和博客,从Feedly到TTRSS再到Inoreader再到Yarr也算是经过了许多番的折腾。在订阅了Inoreader一年的基础会员快到期的时候为什么又换用(折腾)了Yarr,下面是吾辈的理由(借口 bushi)。

到期了

这是一个很现实的问题,特别是放在降本增效,开源节流大行其道的今天。虽然inoreader基础版的会员并不贵但是由于薅了腾讯云3年服务器的羊毛,作为一个高级self hosted OPS工程师,还是更倾向于使用一个能够自建的RSS工具。

基础版功能有点弱

虽然说吾辈对于RSS工具的要求没有那么高,但是在Inoreader订阅即将到期的时候却被其狠狠的伤害了一通。

惰性加载的RSS源

lazy load作为一个经典技术一直被大家所使用,但是却被inoreader用在了不应该出现的地方,因为吾辈订阅了淘宝的数据库内核月报但是却许久没有收到,在一个神秘的午后受到RSS之神的号召点开订阅源看了一下更新频率竟然是0/周,当我以为是淘宝也鸽了的时候inoreader却像感受到了什么一样一口气把之前遗漏的内容一口气全都推了过来。啊,这。。

信任危机

当信任危机出现之后就很难弥补了,毕竟我也不知道还有哪些应该在更新的内容被你lazy load了。而看了一眼PRO会员之后我就决定开始再次背上行囊寻找新的RSS工具了。

为什么放弃TTRSS

TTRSS作为一个自建RSS领域不得不提的工具,确实久经考验。在inoreader之前吾辈也是他的忠实用户,而当时抛弃他的原因有以下两个:

自建使用子路径反代有问题

当时作为一个初级self hosted OPS工程师对Nginx并没有那么的熟练,而且大学的时候TLS证书还是一个稀罕玩意儿,所以当时只签了www这一个二级域名的证书放在服务器上,于是便尝试把TTRSS放在/ttrss的子路径之上,期间历经波折甚至还fix了一波Awesome TTRSS文档错误。不过最终也没有能够完美的解决这个问题,还是有许多请求会404(比如点标题不能去原网页)。

CF 5秒盾

虽然折腾了很久的反代而且问题没有完美解决,但是也勉强能用。而真正让我放弃TTRSS转投inoreader并给他打钱的原因是某个新闻源加上了CF的5秒盾,这一下就导致了内容完全没办法看。于是在遍历了许多其他的RSS工具之后还是凉心发现投入了inoreader的怀抱。

Yarr - 简单才是最好的

第一次看到这个工具的时候觉得其过于的简单了,但是在看到作者的这个issue-yarr is feature complete之后,便勾起了我的好奇心。我倒要试试是不是complete了。

启动,导入,刷新订阅源。

虽然界面简洁,但是确实包含了全部需要的功能。

并且还有read here这么杀手级的feature,直接就给我拿下了。

沉浸式翻译插件

在ChatGPT风靡的这段时间,无意中看到了这个沉浸式双语网页翻译扩展的插件。当使用PPAP法则对这两者进行操作之后,我意识到,革命确实到了。

GPT3.5

之前很少看英文网页的原因无非是英文水平太差(queshi),而谷歌翻译也是非常的拉胯,作为翻译日常信息源来说。但是GPT3.5的翻译质量不能说原地踏步吧只能说是突飞猛击了,在整合上这个网页内翻译的插件,对于阅读英文信息源来说,只能是,诶,起飞,怎么说

革命的见证者

当然眼见为实,在read here配合上沉浸式翻译插件之后,我的阅读体验提升了九倍甚至十倍有余。

总结

当然,折腾之路永不停止,这也只是可能今年最好的方案。如inoreader的pro会员可以整合GPT翻译甚至量子速读功能的话,我也必然会继续乖乖交钱。因为GPT确实是这几年以来令我最激动并且能够带给我最多实质性收益的科技进步了。

0%