天空 Blond - Quassel
type: channel
link: https://skyblond.info/tag/Quassel/
items: 【歪门邪道】在纯IPv6服务器上搭建Quassel Core

【歪门邪道】在纯IPv6服务器上搭建Quassel Core
type: item
date: 2023-06-02T22:33:00+08:00
description: 突然想起来我在Hetzner那里还有一台闲置的纯IPv6服务器。想来想去，闲着也是闲着，不如拿来挂IRC。本文记述在这台服务器上搭建Quassel core的艰难坎坷。太长不看：IPv4的命还长着呢。IRC虽然我还年轻，但我觉得IRC这个东西挺酷的。尽管IRC并不是去中心化的，也不能发送文本之外的内容，但它可以self-host啊。如果我没记错的话，能够self host并且能做到不需要购买商业许可的聊天方案里，就只有Element/Matrix和IRC了，其他像是什么Threema OnPerm这些基本都要支付授权费。而即便是现代化的Element/Matrix，我认为在用户体验上也不是很能打IRC。当然，Element/Matrix在功能上更复杂，也更注重安全，同时还能够在不同服务器间互联，但从我的体验来说，Matrix这一套使用下来还是多多少少有一些恼人的Bug，十分影响体验；而IRC赢就赢在了功能简单，虽然打不过Matrix，但用起来没有问题，而且很纯粹。高情商：纯粹；低情商：简陋。总之，Matrix我也有在用，但是目前为止我个人更偏向IRC一些。但是IRC有一个致命的缺点，因为他太简单了，服务器甚至不会为你存储消息。也就是说，如果别人发消息时你没在线，那你就收不到消息了。这里我就不多费笔墨在介绍IRC协议上了。IRC协议作为一个已经发布了35年的经典协议，而且现今仍在使用，我想网络上一定有不少介绍和入门资料。Quassel既然IRC服务器不给我们存储消息，那我们就找一个服务器替我们挂机就是了。在众多IRC客户端中，Quassel是一个采用分离结构的IRC客户端。它分为Quassel Core和Quassel Client。其中Core的部分负责与IRC服务器交互，而Client则负责与Core交互。Core会一直在服务器上运行，与IRC服务器保持连接、接收指定频道的消息并将其存储到数据库中。而Client则运行在PC上，与Core交互，接收来自IRC的消息，也可以从数据库中调取以往的消息。如果你更倾向于在浏览器中使用IRC，你可以尝试诸如Convos等网页客户端。Convos支持在服务端持久化保存收到的消息，同时提供了一个十分易用的网页界面。我个人更喜欢在PC上以应用程序的方式使用IRC，所以我选择Quassel。安装废话不多说，我们不妨切入主题，直接说安装的部分。Quassel Core可以在没有任何依赖的情况下独立运行，此时数据存入SQLite数据库。这个数据库对于少量数据还可以应付，如果是长期使用积累下来的IRC消息，在数据量很大的情况下官方也有提示，使用SQLite数据库可能会导致拉取过往消息时出现超时或失败的情况。官方推荐使用PostgreSQL作为数据库。听人劝吃饱饭，我也决定使用PostgreSQL数据库。此外，我还想使用TLS加密Quassel Client与Core之间的通讯，我原本想使用Tailscale，但我又想使用公网访问，想来想去发现Quassel Core没办法在一个端口上提供两个不同的TLS证书，最终还是以公网访问为主，通过增加DNS的A记录指向Tailscale的IP来实现tailscale访问。具体的安装流程如下：安装Docker使用Docker安装PostgreSQL安装Quassel Core（在我的电脑上）安装Quassel Client并配置Quassel Core虽然在Docker中使用PostgreSQL数据库并不是生产环境的最佳实践，但从安全角度来说可能是最方便的。我在映射端口时可以直接把数据库端口映射到127.0.0.1上，而无需使用防火墙或修改数据库配置来实现。数据库的数据会映射到宿主机上，所以完全不需要担心数据丢失的问题。Docker我真是万万没想到，安装docker的环节都需要拿来说一下。我的服务器使用的是Ubuntu 2204LTS，安装Docker的过程遵照官方文档就是了，这个没什么可说的。意外发生在安装之后的验证阶段：docker run hello-world这一条命令本是用来验证Docker已经安装成功并且能够正常运行的。可是我一个回车按下去，却得到了一行错误：docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp 44.205.64.79:443: connect: network is unreachable.不知道为什么，Ubuntu上安装docker的默认仓库是registry-1.docker.io，而这个仓库是不支持IPv6访问的，我的服务器又没有v4地址，那肯定会网络不可达。我去网络上搜索了一圈，发现Docker hub其实早…