po4j 项目简介

po4j 项目的存在就是为了简化文档翻译的维护工作。po4a 将内容的翻译从文档的结构中拆解出来。

当执行 po4a 的时候,你只需要提供一个配置和一个待翻译的文档(称为 master documents),之后会产生一个 POT 文件(又被称为 translation template) 这个文件中包含了所有可以翻译的字符串,po4a 会生成一个特殊的格式来方便翻译人员进行翻译。

这些 POT 文件可以被特定的编辑器进行编辑,比如 GNOME Translation Editor,KDE 的 Lokalize 或者 Poedit ,也可以非常容易地整合到在线的文档本地化平台上,比如 [[Weblate]] 或 [[pootle]]。翻译的结果是一系列的 PO 文件,每一种语言一个。

当你在执行 po4a 命令的时候同时提供了 master documents 和 PO 文件,它会将文档的翻译(在 PO 文件中)根据文档的格式插入到原始的文档中。

如果 master documents 改变了,那么 po4a 会相应的更新 PO 和 POT 文件,这样翻译人员可以轻易的检查到修改,跟更新其工作。

概念

PO 文件

根据原始文件得到的各种语言版本的待翻译文件,包含原始语言和被翻译的目标语言。

PO 文件是纯文本文件,可以用任何编辑器打开,也可以用专用的编辑器比如 Poedit 打开

PO 文件格式详解

PO 文件的正文内容由 msgidmsgstr 成对组成,前者是原文,后者是译文。

使用举例

po4a-gettextize --format <format> --master <master.doc> --po <translation.pot>
po4a-updatepo --format <format> --master <new_master.doc> --po <old_doc.XX.po>
po4a-translate --format <format> --master <master.doc> --po <doc.XX.po> --localized <XX.doc>

说明:

  • po4a-gettextize 命令负责将原始文档拆分到 PO 文件中
  • po4a-updatepo 命令负责更新 PO 文件,使得 PO 文件可以跟随原始文件的修改而修改。
  • po4a-translate 命令负责将翻译完成的 PO 文件合并到翻译后的文件中

更加详细的使用可以参考这个提交

在线的翻译平台

  • [[Weblate]]
  • [[Transifex]]
  • [[Crowdin]]

reference


2021-09-08 po , po4j , po4j-project , poedit , weblate

Kubernetes 学习笔记

Kubernetes (简称 k8s)是 Google 基于其内部容器调度平台 Borg 的经验开发的一个开源的容器编排和管理平台。2014 年开源,并作为 CNCF(云原生计算基金会)的核心发起项目。旨在简化容器化应用的部署、扩展和管理。它提供了一种便捷的方式来组织、调度和管理容器化应用程序,并能够自动化地处理应用程序在集群中的部署、扩展、故障恢复和负载均衡等任务。

设计的目的是在主机集群之间提供一个能够自动部署、扩展、应用容器的可运营的平台。Kubernetes 通常结合 docker 容器一起工作。

Kubernetes 使用了一种称为 Pods 的抽象概念来组织应用程序的容器。Pod 是一个或多个相关容器的组合,它们共享同一个网络命名空间、存储卷以及其他资源。这样,它们可以共享网络配置、文件系统和其他依赖关系,从而更好地协同工作。

Kubernetes 还提供了一种称为 Replication Controller 的机制,用于自动扩展和管理 Pod 实例。Replication Controller 可以根据设置的规则自动复制和删除 Pod 实例,以适应负载变化,并确保应用程序始终处于所需的状态。

此外,Kubernetes 还提供了一种称为 Service 的机制,用于将后端 Pod 实例暴露给外部访问。Service 可以为后端 Pod 实例提供负载均衡、服务发现和稳定访问地址等功能。

Kubernetes 还支持水平扩展、滚动更新、故障恢复等功能,使得应用程序的部署和管理变得更加简单和可靠。它还提供了丰富的 API 和命令行工具,以便管理员和开发者可以方便地管理和监控集群中的应用程序。

功能:

  • 自动化容器部署、复制
  • 随时扩展或收缩容器规模
  • 组织容器成组,提供容器间的负载均衡
  • 更新和回滚容器版本

Terminology

  • API Server: 对外提供 RESTful 接口,系统管理指令的统一入口,对资源的操作都要交给 API Server 再提交给 etcd
  • schedule: 调度 pod 到 Node
  • controller manager: 每一个资源对应一个控制器
  • etcd: 高可用的 key-value 存储,k8s 用来存储各个资源的状态

Master

Kubernetes 中的 Master 节点指的是集群控制节点,负责整个集群管理和控制。

Master 节点上运行着关键进程:

  • Kubernetes API Server(kube-apiserver),提供 HTTP Rest 接口,所有资源的增删改查操作入口
  • Kubernetes Controller Manager(kube-controller-manager),所有资源对象的自动化控制中心
  • Kubernetes Scheduler(kube-scheduler),负责资源调度(Pod 调度)的进程

Node

Kubernetes 集群中除去 Master 之外的节点被叫做 Node 节点(Agent),工作负载节点,执行 Master 分配的工作。当 Node 节点宕机时,工作负载会自动转移到其他节点。

Node 节点运行的关键进程:

  • kubelet,负责 Pod 对应容器的创建、启动、停止等
  • kube-proxy, 实现 Kubernetes Service 的通信和负载均衡
  • Docker Engine(docker),Docker 引擎,负责本机容器创建和管理

可以使用如下命令查看集群中 Node:

kubectl get nodes

查看具体信息:

kubectl describe node kubernetes-minion1

Pods

k8s 最小调度单元,Pod 中运行业务相关的容器

  • Kubernetes 中最小的部署单元
  • 包含一个或多个容器,可以被一起编排(schedule)
  • 每一个 pod 都有一个唯一的 IP 地址
  • Pod 中的每一个容器可以通过 localhost 相互通信

Label

Label 是 key=value 键值对,附加到资源对象上,Node,Pod,Service,RC 等等。资源对象可以定义任意数量 Label,同一个 Label 也可以被添加到任意数量的资源对象上。

Replication Controller

Replication Controller(后简称 RC),定义了场景,声明某种 Pod 的副本数量在任意时刻都符合预期值。

定义包括几部分:

  • Pod 期待的副本数 (replicas)
  • 筛选目标 Pod 的 Label Selector
  • Pod 副本数量小于预期数量的时候,用于创建新 Pod 的模板(template)

Service

Service 就是「微服务」

  • Service 定义服务的访问入口
  • Service 与后端 Pod 副本集群之间通过 Label Selector 实现无缝对接
  • 服务之间通过 TCP/IP 通信,形成灵活的弹性网络
apiVersion: v1
kind: Service
metadata:
  name: tomcat-service
spec:
  ports:
  - port: 8080
  selector:
    tier: frontend
  • 定义了名为 tomcat-service 的 Service
  • 端口 8080
  • Label 是 tier=frontend 的 Pod 实例都属于它

然后创建:

kubectl create -f tomcat-server.yaml

Namespace

Namespace 命名空间,用于实现多租户的资源隔离。

kubectl get namespace

在 Kubernetes 中,所有对象都使用 manifest(yaml 或 json)来定义,比如一个简单的 nginx 服务可以定义为 nginx.yaml,它包含一个镜像为 Nginx 的容器:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80

2021-09-02 kubernetes , k8s , k3s , docker , container , cncf , google , borg , deployment

我们该如何讨论死刑

前两天被朋友问及「是否支持死刑」,我首先抛出了我的观点,我是不支持死刑的,但这些天我一直在思考这个问题,在当时我给朋友的理由是,站在一个审判者的角色,我无法确定我拥有全部的知识和信息来判处一个人死刑,即使证据足够充分,我依然会保持非常怀疑的态度。

但我觉得上述理由还不足以支撑起我的全部观点,所以陆陆续续回顾了我曾经看过的一些书中关于「死刑」讨论,以及综合这几年的新闻,和看过的电视剧,整理一下我的观点。

每当讨论起死刑,总会有不同的观点,有人支持有人不支持,而辩论的双方都可以罗列很多论据。

支持死刑的人会认为死刑有巨大的威慑作用,而错杀的几率微乎其微,为什么要用纳税人的钱长期供养一个终身监禁的罪犯。

而支持废除死刑的人则会认为政府没有权力剥夺一个人的生命;死刑并不能遏制犯罪;如果一旦执行死刑,冤死人的生命无法挽回;监禁一个人一生,比死刑更加有利于惩罚的目的。

所以我就以我微不足道的一些经验梳理一下我对死刑的看法。

死刑对于威慑犯罪有用吗?

和大多数支持废除死刑的人观点类似的在于,我也认为死刑不能有效的遏制犯罪。因为犯罪与否与这个社会是否承认死刑并没有直接的联系,而是和整个社会有关系。想要犯下滔天罪行的人是不会在杀人之前考虑是否会被判处死刑的。

截至目前,我没有看到任何证据可以证明死刑对于威慑犯罪有效,有死刑的地方杀人犯罪就会减少吗?对此我是有疑问的。

如果死刑是合法 如何处理审判中的程序滥用

在大部分的情况下,对于大部分的嫌疑犯而言,很难直接找到证据证明其杀人,那么举证和求证的过程如何保证对嫌疑人是公平的变非常重要。

在一个司法成熟的国家中尚且存在判决错误的案件,在一个严格要求程序正义的社会里面,依然会存在司法机构伪造证据陷害弱势边缘人物的情况下,我们如何能保证判决的每一个死刑都是没有出错的。

在台湾,士兵江国庆因为强奸女童而被枪毙,但是后来证明是冤案1,在美国甚至有美剧拍过社会是如何将一个弱势者推上杀人犯的位置的—-《制造杀人犯》。

如果死刑可以被执行,那么就必须通过指定周密的法律来确保审判机关正确的实施。如果量刑的标准是不稳定的,并且执行过程也没有严格的程序正义,那么对任何一个司法制度都只会是一场灾难。

之前在看《生活在宋朝》的时候,就看到在宋代,即使要判决一个人死刑,也需要层层的审判,被判决的人甚至可以喊三次冤,那么就必须层层上报审判三次,并且如果一旦司法官将完全无罪之人判有罪,那么一旦案发,受害人所承受的罪刑将全部还施制造冤案的司法官。譬如一名无辜者被故意判了死刑,以后冤案若被发现,则故意错判的法官也将被判死刑。当然站在如今再去看宋朝的司法审判不免有一些荒唐和残忍,但也可以看到古人对死刑的谨慎。

死刑的量刑标准

上面提到如果可以允许死刑,那么死刑犯的审判必然需要比普通的案件有更加详细的审判,美国的司法体系中,陪审团必须在做出是否有罪之后,再对嫌疑人进行一次审判,是否执行死刑。

民意是否可以成为裁决死刑的依据?

民意是否可以称为裁决死刑的依据,我认为的答案当然是不行。民意是不可量化的概念,任何一方确定的民意标准都可能在实践的过程中被反证推翻。并且往往在案件发生的时候是民意最为高涨的时刻,而往往这个时刻也正是人最容易犯错的时候。

最近有一部韩剧叫做[[恶魔法官]],讲述一个将法庭向全国人民公开,由全民公投而决定是否有罪的超现实主义故事。如果对于一个嫌疑犯,80% 的人投票让他死,那就必须判处死刑吗?当然不是。

强奸犯可以判处死刑吗?

强奸犯是否可以判决死刑?很多年前对于儿童性侵曾经有过一段非常热烈的讨论,赞同对强奸犯执行死刑的人不在少数。辩论的双方都有着非常具体的论据,支持者认为,奸淫幼童者即使没有杀人,但和毁人一生没有区别,对社会安定伤害极大,不杀不足以平民愤。而反对者坚持只对杀人犯适用死刑,对没有杀人意图,没有导致死亡结果,对其处以极刑不够人道。

这同样是一个量刑标准的问题,什么样的罪犯可以判处死刑,这本身就是一个非常复杂的问题。

是否允许对未成年人实施死刑

如果允许对未成年人实施死刑,那么是否太过于残忍,《联合国儿童权利公约》都不支持对青少年适用无释放可能的终身监禁,更何况是死刑。并且还带来另外一个问题,如何定义未成年人,如果可以对 17,18 岁的未成年人实施死刑,那么 14 岁或 15 岁的孩子犯下了滔天大罪,是否需要判处死刑?那如果再是 5 岁的孩子呢?

那如果不允许对未成年人实施死刑,那么对多少岁以下的人犯罪,才需要动用终身监禁的刑罚呢?

死刑是否可以裁决弱智

而美国的司法实践中,认为「无死者,无死刑」,但这仅限于对个人的犯罪,如果是对国家的犯罪,比如叛国、间谍、贩毒、实施恐怖袭击,假设这些人没有造成直接死亡,那也可以判决死刑。

最后

刑事司法的目的从来都不是谋求给人定罪,或者追求永恒的司法稳定,其核心原则乃是寻求事实真相。然而事实的真相往往扑朔迷离,而但一旦罪犯被执行死刑,事实就屈居第二位了。人们往往以为把罪犯处以极刑就是最大的惩罚,而往往是把人杀死了,而那些受伤害的人却得不到更多的补偿。

一个无辜的人可能被执行死刑,这就足以成为启动证据听证程序的充分理由。我们是在错误中吸取教训,过去不那么残酷与异常的刑罚,今时今日获取已经被视为残酷与异常。

有一句话叫‘判决之外,法官无语’,你把判决书写好,把道理说好,之后就不要再多说”。

这又让我想起了之前看到过的和法官何帆的对话。

“判决一个人死刑的话,会不会有心理负担?”我问[[何帆]]。 “如果有心理负担的话,那说明这个人不该死。如果你觉得这个人不该死,又判他死刑,那就有问题了。”何帆答道。

reference


2021-09-01 death , punishment , 刑法 , 法律

Docker Compose 中使用环境变量

通常在使用 Docker compose 的时候会设置很多的环境变量来控制容器的使用。

很多情况下我们会直接写到 docker-compose.yml 文件中类似于下面 environment 中的:

version: "3"
services:
  flarum:
    image: mondedie/flarum:stable
    container_name: flarum
    volumes:
      - ./flarum/extensions:/flarum/app/extensions
      - ./flarum/assets:/flarum/app/public/assets
      - ./flarum/storage/logs:/flarum/app/storage/logs
      - ./flarum/nginx:/etc/nginx/flarum
    ports:
      - 8888:8888
    environment:
      - UID=1000
      - GID=1000
      - DEBUG=false
      - FORUM_URL=https://forum.domain.tld
      - UPLOAD_MAX_SIZE=20M
      - DB_HOST=
      - DB_PORT=3306
      - DB_USER=
      - DB_PASS=123456
      - DB_NAME=

同样也可以使用 .env 文件来设定。Compose 会自动寻找 compose 文件同级目录的 .env 文件,并自动使用 .env 文件中的环境变量值覆盖 shell environment 中的内容。

Docker 使用环境变量

配置可以包含 environment variables,Compose 会使用 Shell 的环境变量值作为这些配置值。

假设 Shell 中配置了 POSTGRES_VERSION=9.3,那么如果有配置:

  db:
    image: "postgres:${POSTGRES_VERSION}"

当执行 docker-compose up 的时候,会自动将环境变量的值替换。上面的例子中就会自动使用 9.3 版本的配置。

如果环境变量没有配置,那么 Compose 会用一个空字符串替换。

如果要配置默认的环境变量,可以使用一个 .env 文件,Compose 会自动寻找项目目录下的该文件(和 docker-compose.yml 文件同级目录),Shell 环境变量中的值会覆盖 .env 文件中的。

$VARIABLE${VARIABLE} 两种语法都支持。

  • ${VARIABLE:-default} 如果 VARIABLE 没有设置或是空,那么结果是 default
  • ${VARIABLE-default} 只有当 VARIABLE 没有设置的时候才为 default

同样的,可以使用如下的语法强制要求用户设置:

  • ${VARIABLE:?err} 如果 VARIABLE 没有设置,或者为空,那么会抛出移除信息 err
  • ${VARIABLE?err} 如果 VARIABLE 没有设置,会抛出 err

使用 --env-file 选项

在命令行中指定 --env-file 路径。

docker-compose --env-file ./config/.env.dev up

和上一行命令等价的是,也可以使用 env_file 选项来将 env 文件配置到 docker-compose.yml 文件中:

web:
  env_file:
    - web-variable.env

环境变量优先级

上面提到了多种环境变量使用的方式,Compose 在选择环境变量时按照如下的优先级:

  • docker-compose.yml 文件中的 environment 设置
  • Shell 中指定的环境变量
  • 环境文件 .env
  • Dockerfile
  • Variable is not defined

也就是说 compose 文件中定义的 environment 优先级是最高的。

reference


2021-08-29 docker , dockerfile , environment-variable , shell , linux

哪吒监控安装及简单使用说明

哪吒监控是一个使用 Go 和 Vue 实现的服务器监控探针,UI 简洁,可以自定义 CSS,一行命令就可以将新的服务器添加到监控面板。之前一直使用 nodequery,这个服务由于作者已经不再更新所以网站已经无法登录。

在没有遇到哪吒监控之前一直都是使用的 Netdata cloud 来监控 VPS,虽然 Natdata 非常强大,数据非常详细,后台界面也非常有设计感,还带邮件告警通知,但是 Netdata Cloud 后台访问速度实在有点慢,并且我没有找到办法在一个界面查看所有的网络状态。所以用哪吒监控相互弥补一下。

GitHub 地址:https://github.com/naiba/nezha

哪吒监控特性:

  • 支持 HTTP,TCP,Ping 监控报警
  • 监控报警:CPU、内存、硬盘、带宽、实时流量
  • 服务监控:HTTP,SSL 证书,Ping,TCP 端口
  • 自定义布局,LOGO,颜色,统计代码
  • 定时任务:备份、服务重启,定期运维

部署哪吒探针 Dashboard

可以使用官方提供的一键脚本,但我害怕这个脚本设定的环境对我不透明,所以我选择把里面的内容提取成 docker-compose 的配置,可以在这里 查看。

修改一下配置,直接 docker-compose up -d 即可。

部署 Agent 客户端

Agent 客户端,可以在哪吒监控的后台通过添加新的节点,然后复制脚本执行即可。

备份和恢复

数据都存储在 /opt/nezha 文件夹中,打包文件夹,在新环境解压。然后执行安装脚本即可。

问题

如果出现首页服务器随机掉线的问题,需要通过服务器时间。

执行 ntpdate 0.pool.ntp.org 同步面板部署服务器的时间。

常用的命令

哪吒监控 管理脚本使用方法:
--------------------------------------------------------
./nezha.sh                            - 显示管理菜单
./nezha.sh install_dashboard          - 安装面板端
./nezha.sh modify_dashboard_config    - 修改面板配置
./nezha.sh start_dashboard            - 启动面板
./nezha.sh stop_dashboard             - 停止面板
./nezha.sh restart_and_update         - 重启并更新面板
./nezha.sh show_dashboard_log         - 查看面板日志
./nezha.sh uninstall_dashboard        - 卸载管理面板
--------------------------------------------------------
./nezha.sh install_agent              - 安装监控Agent
./nezha.sh modify_agent_config        - 修改Agent配置
./nezha.sh show_agent_log             - 查看Agent日志
./nezha.sh uninstall_agent            - 卸载Agen
./nezha.sh restart_agent              - 重启Agen
./nezha.sh update_script              - 更新脚本
--------------------------------------------------------

Nezha 监控存在的问题

因为存储历史的数据可能会占用非常多的磁盘,所以 Nezha 监控目前只能显示这个时刻各个机器的资源占用,而不能查看单台机器历史资源的使用情况。

reference


2021-08-28 uptime , vps , monitor , open-source , go , grpc , 服务器探针 , 服务器监控

使用 Archive Box 制作自己的互联网存档

在很多年前,我经常听到一句话—-互联网是有记忆的—-当然这么多年过去了,见过了无数的网站关停,也见到了中文互联网上无处不在的删贴,而常常上一秒才看过的内容之后便再也找不到。我的 WizNote 笔记中曾经摘录的豆瓣书评、影评,当我想再去看一下作者的状态的时候,大多评论已经找不到了。有的时候拿着网页 URL,还能从 Internet Archive 找到有幸被保存下来的珍贵文字,但那些还没有被爬虫,或Google索引的文章就这样从互联网上消失了。而这些被删除的内容里面有一些内容却值得被记住,那些发人深省的话值得被再一次阅读。

而这两天正好买了hosthatch 2核8G的VPS,在调查可以部署哪些服务的时候看到了 Archive Box。这是一个可供个人搭建的互联网存档,它可以用来记录网页链接、媒体资源等等,只需要提供一个链接便可以得到截图,PDF,影评,视频等等内容。完全可以还原当时的网页情况。

Docker install

Archive Box 使用 Python 编写,所以可以直接用 pip 安装,不过个人还是推荐用官方提供的镜像 Docker 安装。

使用 Docker compose 来安装,可以参考我的配置 或直接参考官方的文档

添加存档

在网页中添加

Archive Box 在启动之后会提供一个 HTTP 服务,我配置了一个域名 https://box.einverne.info 在界面上使用 + 号即可添加。

在手机上快速添加网址

虽然官方已经提供了非常多的添加方式,包括命令行,网页,桌面版,甚至 Python API,但是目前 RESTful 的接口暂时还是 alpha 阶段,所以在手机上目前也只能用网页版来保存。

如果有发现更好的方法欢迎告知。

查看存档

我使用 Docker 安装,将其数据映射到了 ${DATA_PATH} 目录中,然后使用 Syncthing 同步了,这样在这个目录中直接访问 index.html 即可在本地打开备份的网页。

延伸阅读

  • Hunchly,这是一款可以自动记录访问过的所有网页的工具,非常强大但是需要付费。

2021-08-27 archive , web-archive , archive-box , docker , linux , notes

使用 Poste 自行搭建邮件服务器

自建邮件服务器一直是我想做的事情,之前因为写了一个发送电子书到 Kindle 的 kindlepush bot ,要用到邮件服务器,当时为了不折腾,调研了 一番 就直接用了 [[Mailgun]],每个月 10000 封的邮件也足够了,但是云服务提供商就是那样不好,说改就改,直接把免费的发送额度取消了,虽然到现在为止量不大的情况下还可以继续用,但一旦量超就会发不出去,所以早之前想要 自己 通过 [[Postfix]] 和 [[Dovecot]] 来搭建一个[[邮件服务器]],但后来发现安装和维护成本太高了,所以就搁置了,但一直都想尝试搭建一个自己的邮件服务器,一来可以通过自己的域名邮箱发送邮件,而来也不会受到发送邮件数量的限制。一直在观察可用的可以 自行搭建的邮件服务器 ,发现了 [[Poste]]。

Poste 是一个用 Go 语言实现的可以自行搭建的[[邮件服务器]]程序,提供了后台管理,可以实现邮件收发,容量控制,邮件过滤等等工具。还提供了统计分析,SSL,邮件转发,邮件别名,通过 ClamAV 支持邮件病毒扫描等等功能。

Poste 使用 [[Haraka]] + [[Dovecot]] + [[SQLite]] 的组合实现。Haraka 是一个高性能的 [[SMTP]] 服务器,Dovecot 是一个开源的 IMAP 和 POP3 服务器,SQLite 是一个单文件的高性能关系型数据库。

Poste 运行大概需要 800MB 左右空间,只支持 64 位操作系统。 Poste 可以支持 Docker 安装,但是提供了 Free、Pro 和 Pro+ 版本,都需要按年订阅。

Poste 支持以下特性:

  • SPF、DKIM、DMARC、SRS 的原生实现,带有简单的向导
  • 用于检测木马、病毒、恶意软件的防病毒引擎 ( ClamAV )
  • 内置垃圾邮件过滤器( RSPAMD )
  • HTTPS 上的 Webmail 客户端(Roundcube)
  • 通过 Sieve 脚本进行电子邮件重定向、自动回复和其他过滤(电子邮件所有者管理,每个操作都可以编写脚本)
  • 用于限制邮箱空间或电子邮件数量的配额
  • 系统管理员、域管理员、电子邮件所有者具有不同权限的 Web 管理。
  • 内置 Microsoft 产品的自动发现功能,Thunderbird…
  • 帮助正确设置域和邮件服务器的诊断
  • SMTP - 端口 25、465 (TLS)、587
  • POP3 - 端口 110、995 (TLS)
  • IMAP - 端口 143、993 (TLS)
  • SSL TLS 无处不在,没有个人数据、电子邮件、登录信息通过互联网未加密。
  • 默认情况下,所有密码都存储为加盐 SHA512 哈希(5000 轮)。攻击者将很难破解您的密码。
  • 整个邮件服务器容器由 Docker 与其他应用程序隔离。

Prerequisite

准备工作:

  • 一台拥有独立 IP 的 VPS,IP 地址最好能够通过 Poste 提供的黑名单检测
    • 内存建议在 2G 以上
    • IP 没有被拉入黑名单,可以通过 链接1链接2 来查看
    • 25 端口开放,可以通过 telnet smtp.aol.com 25 命令来查看,如果能连接上并返回一些值表示 25 端口是可用的
  • VPS 服务提供商需要支持添加 rDNS,需要通过 IP 解析到邮件域名
  • 一个可以管理 DNS 的域名
  • Docker

DNS 解析配置

检查所有 Poste 需要的 DNS 配置。

以域名 domain.com 和 IP 1.1.1.1 为例,修改 domain.com 的 DNS 记录

类型 名称 内容 TTL
A mx 1.1.1.1 Auto
CNAME mail mx.domain.com Auto
CNAME smtp mx.domain.com Auto
CNAME pop mx.domain.com Auto
CNAME imap mx.domain.com Auto
MX @ mx.domain.com 优先级 10
TXT @ v=spf1 mx ~all Auto
TXT _dmarc.domain.com v=DMARC1; p=none; pct=100; rua=mailto: admin@DOMAIN.com; ruf=mailto: admin@DOMAIN.com Auto
TXT s20220321670._domainkey 安装完成后设置 AUTO

完成上面的配置之后可以通过 Poste 提供的检测服务检测:

其中涉及的知识可以通过维基百科搜寻 [[SPF]]、[[DMARC]]、[[DKIM]],或者参考这篇电子邮件是如何工作的

添加 SPF/DKIM/PTR 解析,可提高邮件可信度,从而降低邮件进入垃圾箱的几率。

DMARC 记录不是必须的,但是配置上会对于邮件送达有帮助。

设置 PTR 反向解析

PTR 全称 Pointer Record,是电子邮件系统中的一种数据类型,RFC 1035 定义。A 记录解析域名到 IP 地址,PTR 记录解析 IP 地址到域名。PTR 在 VPS 后台通常被称为 [[reverse DNS]],反向域名解析。

PTR 记录,是电子邮件系统中的邮件交换记录的一种;另一种邮件交换记录是 A 记录(在 IPv4 协议中)或 AAAA 记录(在 IPv6 协议中)。PTR 记录常被用于反向地址解析。

域名解析到 IP 被称为正向解析,而 IP 指向到域名,则被称为反向解析,反向解析需要在主机服务商处进行操作,具体请咨询主机服务商。

一般的 VPS 都可以直接在后台面板添加 PTR 反向解析,如果遇到问题可以直接开 ticket 咨询,配置将 IP 指向到邮件服务器域名,如 mail.your-domain.com

安装

使用 docker 命令:

docker run -d \
    -p 880:80 -p 8443:443 -p 25:25 -p 110:110 -p 143:143 -p 465:465 -p 587:587 -p 993:993 -p 995:995 -p 4190:4190 \
    -e TZ=Asia/Shanghai \
    -v /data/mail-data:/data \
    --name "mailserver" \
    -h "mail.your-domain.com" \
    --restart=always \
    -t analogic/poste.io

或者使用 docker-compose:

version: '3'
services:
  poste:
    image: analogic/poste.io
    hostname: mail.domain.com
    container_name: poste
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./data:/data
      - ./nginx/log:/var/log/nginx/
    restart: always
    ports:
      - "25:25"
      - "80:80"
      - "110:110"
      - "143:143"
      - "443:443"
      - "465:465"
      - "587:587"
      - "993:993"
      - "995:995"
      - "4190:4190"
    environment:
      - DISABLE_CLAMAV=TRUE
      - HTTPS=OFF

官方文档在此: https://poste.io/doc/getting-started

如果你使用 [[traefik]] 来做反向代理,可以使用我的配置

端口解释:

  • 25,SMTP server for incoming emails
  • 110, POP3 server (STARTTLS required)
  • 143, IMAP server (STARTTLS required)
  • 443,Administration and webmail HTTPS server
  • 587, Submission server(STARTTLS SMTP server for clients)
  • 993, IMAP server(implicit TLS)
  • 995, POP3 server(implicit TLS)
  • 4190,Sieve server(optional)

设置 DNS 说明:

  • 设置 A 记录,mail.domain.com 指向服务器 IP
  • 设置 CNAME,将 smtp.domain.com, pop.domain.com, imap.domain.com 指向 mail.domain.com
  • 配置 MX 记录,指向 mail.domain.com
  • 配置 TXT 记录,v=spf1 mx ~all

等待一会儿 Poste 启动之后 docker-compose logs -f 查看日志。然后访问域名 mail.domain.com,可以看到初始化配置:

  • Mailserver hostname
  • Administrator email
  • Password

提交成功之后就可以进入 Poste 的管理后台。

设置 TLS SSL

在侧边栏 System settings 中可以申请 Let’s Encrypt 证书。

假如您的邮件域名为 mail.domain.com,需要对这个域名申请 SSL 证书,在其它服务商申请 SSL 证书。

获得 SSL 证书后,打开 poste 后台 - System settings - TLS Certificate - 选择证书文件进行上传。

SSL 提供商会自动将中级证书合并到了证书文件(比如腾讯云),因此中级证书那个选项可以和证书一致,然后点保存,保存后需要重启容器生效:docker restart mailserver

配置 DKIM

在 Virtual Domains 中点击域名获取 DKIM Key。然后将值配置到 DNS 解析。

登录与管理

启用 SSL 后,可通过域名进行访问:https://mail.domain.com/,默认是登录 webmail,可以在 webmail 发信、收信等操作。

如果需要登录系统管理,可将地址修改为 https://mail.your-domain.com/admin/login

注意这里默认安装的时候已经可以直接访问 https,如果你使用 Nginx ,或 [[traefik]] 等等方向代理,需要自行配置证书。

客户端

配置邮件客户端访问。

SMTP 25,465,587 smtp.domain.com.com IMAP 993,143 imap.domain.com.com POP 995,110 pop.domain.com.com

邮件客户端可以根据上面的配置添加账号。

邮件发送测试

个人建议

在准备自建邮件服务之前,有一些注意事项需要知晓,以下是一些个人经验总结:

  • 使用可信度、流行度较高的域名后缀,如 .com/.net/.org,尽量避免使用不常用的后缀
  • 使用英文字母的域名,尽量避免使用纯数字域名
  • 域名注册时间越长越好,最低注册时间建议大于 7 天
  • 使用一个干净的 IP,可通过 https://poste.io/dnsbl 查询
  • 找一个支持配置 PTR(rDNS)的主机托管商,VPS 后台配置 PTR 反向解析

进阶

在 Poste.io 的基础上扩展了一些功能 dirtsimple/poste.io:

相关自建方案

  • [[Mailu]]

2021-08-26 poste , linux , email , smtp , pop , email-host , email-server , mail-server

又一个简单漂亮的静态个人导航站 Homer

Homer 是一款简单漂亮的静态个人导航站,通过简单的 YAML 配置就可以快速生成一个个人导航站。

homer

特性:

  • 支持通过 YAML 配置
  • 支持 PWA
  • 支持搜索
  • 支持分组
  • 自定义主题
  • 快捷键支持,/ 搜索,Escape 退出搜索,Enter 打开第一个匹配,Alt/Option + Enter 在新标签页打开

安装

Docker 命令:

docker run -d \
  --name homer \
  -p 8080:8080 \
  -v </your/local/assets/>:/www/assets \
  --restart=always \
  b4bz/homer:latest

docker-compose 配置见 GitHub

配置

Homer 通过 YAML 配置:

---
title: "Homelab Dash"
subtitle: "always-on"
documentTitle: "Homelab Dash"
logo: "logo.png"

columns: 3
header: true
footer: false
connectivityCheck: false

theme: default
colors:
  light:
    highlight-primary: "#3367d6"
    highlight-secondary: "#4285f4"
    highlight-hover: "#5a95f5"
    background: "#f5f5f5"
    card-background: "#ffffff"
    text: "#363636"
    text-header: "#ffffff"
    text-title: "#303030"
    text-subtitle: "#424242"
    card-shadow: rgba(0, 0, 0, 0.1)
    link-hover: "#363636"
  dark:
    highlight-primary: "#1B3E88"
    highlight-secondary: "#1b4d9e"
    highlight-hover: "#2b579e"
    background: "#121212"
    card-background: "#1D1D1D"
    text: "#eaeaea"
    text-header: "#f7f7f7"
    text-title: "#fafafa"
    text-subtitle: "#f5f5f5"
    card-shadow: rgba(0, 0, 0, 0.4)
    link-hover: "#ffdd57"

links:
  - icon: "far fa-edit"
    url: "http://files.svr2:9800/files/homer/config.yml"
    
  - icon: "fab fa-docker"
    url: "http://files.server:9800/files/compose.yml"
    
  - name: 2
    icon: "fab fa-docker"
    url: "http://files.svr2:9800/files/compose.yml"
    
  #- icon: "fas fa-file-download"
#    url: "http://torrent.svr2/"
    
  - icon: "fas fa-fire"
    url: "http://prometheus.server" # Prometheus
    
  - icon: "fas fa-wifi"
    url: "http://routerlogin.net"

  - icon: "fas fa-satellite-dish"
    url: "http://satellite.lan"

  - icon: "fas fa-cloud-download-alt"
    url: "http://qbt-oc1.svr2/" # qBittorrent (oracle1)
    
  - icon: "fas fa-project-diagram"
    url: "http://oracle1:81/" # Nginx proxy manager
    
 # - icon: "fas fa-shield-alt"
 #   url: "http://oracle1:3000" # AdGuard Home
    
#   - icon: "fas fa-traffic-light"
#     url: "http://oracle1:90/" # Traefik
    
  - icon: "fas fa-play-circle"
    url: "http://oracle1:31337/" # Kitana
    
#  - name: "Page 2"
#    icon: "fas fa-columns"
#    url: "#additionnal-page"

services:
  - name: "Media"
    icon: "fas fa-film"
    items:
    
      - name: Radarr
        subtitle: "Movie collection manager"
        url: "http://radarr.server/"
        logo: "assets/homer-icons/png/radarr.png"

      - name: Radarr4K
        subtitle: "Manage 4K movies"
        url: "http://radarr4k.server/"
        logo: "assets/img2/4k-film-2.svg"
        tag: oc1

      - name: Sonarr
        subtitle: "TV shows automator"
        url: "http://sonarr.server/"
        logo: "assets/homer-icons/svg/sonarr.svg"

      - name: Overseerr
        subtitle: "Media discovery tool"
        url: "http://overseerr.server/"
        logo: "assets/homer-icons/svg/overseerr.svg"
        tag: oc1
        

      - name: Flood
        subtitle: "Beautiful torrent GUI"
        url: "http://flood-torrent.server/"
        logo: "assets/homer-icons/png/flood.png"
        
    #   - name: Petio
    #     subtitle: "Plex companion"
    #     url: "http://petio.svr2/"
    #     logo: "https://raw.githubusercontent.com/petio-team/petio/master/frontend/public/favicon/android-icon-192x192.png"
    #     tag: oc1

      - name: Tautulli
        subtitle: "Plex graps & stats"
        url: "http://tautulli.server/"
        logo: "assets/homer-icons/png/tautulli.png"

  - name: Hosted
    icon: "fas fa-rocket"
    items:

      - name: Speedtest tracker
        subtitle: "Automated speed tests"
        url: "http://speedtest.svr2/"
        logo: "assets/custom/speedtest-tracker.png"

      - name: Code-server
        subtitle: "Browser-based editor"
        url: "http://code.server/"
        logo: "assets/custom/code-server.png"

      - name: Mealie
        subtitle: "Pantry for recipes"
        url: "http://mealie.server/"
#        logo: "assets/homer-icons/png/mealie.png"
        logo: "assets/custom/food-2.png"

      - name: Nextcloud
        subtitle: "Cloud-hosted file storage"
        url: "https://agneev.duckdns.org/"
        logo: "assets/homer-icons/png/nextcloud.png"
        tag: oc1

      - name: Home Assistant
        subtitle: "Next-gen smart home"
        url: "http://assistant.server:8123/"
        logo: "assets/custom/home-assistant.png"
        
      - name: Homebridge
        subtitle: "HomeKit all things"
        url: "http://homebridge.svr2/"
        logo: "assets/homer-icons/png/homebridge.png"
        
  - name: Manage
    icon: "fas fa-user-shield"
    items:
    
      - name: AdGuard Home
        subtitle: "Network ad-blocker"
        url: "http://adguard.svr2/"
        logo: "assets/homer-icons/svg/adguardhome.svg"

      - name: Portainer
        subtitle: "Advanced Docker GUI"
        url: "http://portainer.svr2/"
        logo: "assets/homer-icons/png/portainer.png"

      - name: Grafana
        subtitle: "Visualized stats"
        url: "http://grafana.server/"
        logo: "assets/homer-icons/png/grafana.png"
        
      - name: Chronograf
        subtitle: "Metrics visualizations"
        url: "http://chronograf.server"
        logo: "assets/homer-icons/png/chronograf.png"
        
    #   - name: Smokeping
    #     subtitle: "Graph network latency"
    #     url: "http://smokeping.svr2/smokeping/?target=DNSPing"
    #     logo: "assets/custom/monitor.png"
    
      - name: Router
        subtitle: "Stats from router Netdata"
        url: "http://routerlogin.net:19999#menu_net_submenu_brwan;theme=slate"
        logo: "assets/homer-icons/png/netdata.png"

      - name: Nginx manager
        subtitle: "Main network proxy"
        url: "http://npm.svr2/nginx/proxy"
        logo: "assets/homer-icons/png/nginxproxymanager.png"
        
    #   - name: Pi-hole
    #     subtitle: "DNS blackhole"
    #     url: "http://pihole.svr2/admin"
    #     logo: "assets/homer-icons/png/pihole.png"
    #     tag: oc1
        
  - name: "Files"
    icon: "fas fa-hdd"
    items:
        
      - name: aria2
        subtitle: "Ultra-fast HTTP downloader"
        url: "http://aria.server/"
        logo: "assets/homer-icons/png/ariang.png"
        
    #   - name: Plexdrive
    #     subtitle: "Encrypted cloud drive"
    #     url: "http://plexdrive.svr2:9800/files/plexdrive/"
    #     logo: "assets/homer-icons/png/plexdrive.png"

      - name: File Browser
        subtitle: "Browse files on NAS server"
        url: "http://files.server:9800/files/"
        logo: "assets/homer-icons/svg/filebrowser.svg"
        
      - name: qBittorrent
        subtitle: "Best torrent client"
        url: "http://qbittorrent.server/"
        logo: "assets/homer-icons/png/qbittorrent.png"
        
      - name: Scrutiny
        subtitle: "Visualized SMART data"
        url: "http://scrutiny.server/"
        logo: "assets/homer-icons/png/scrutiny.png"

  - name: "Server"
    icon: "fas fa-server"
    items:

      - name: InfluxDB
        subtitle: "Modern metrics recorder"
        url: "http://influxdb.server"
        logo: "assets/custom/influxdb.png"
        
    #   - name: Uptime-kuma
    #     subtitle: "Status monitoring"
    #     url: "http://uptime.svr2/"
    #     logo: "https://github.com/louislam/uptime-kuma/raw/master/public/icon.svg"
        
      - name: always-on
        subtitle: "Netdata on DNS server"
        url: "http://netdata.svr2:19999/"
        logo: "assets/homer-icons/png/netdata.png"

      - name: falcon
        subtitle: "Netdata on media server"
        url: "http://netdata.server/"
#        logo: assets/img2/server-folder.svg
        logo: "assets/custom/netdata-alt.png"
        
      - name: NPM (falcon)
        subtitle: "Docker net reverse proxy"
        url: "http://npm.server/nginx/proxy/"
        logo: "assets/homer-icons/png/nginxproxymanager.png"

    #   - name: Cockpit
    #     subtitle: "Server manager"
    #     url: "http://cockpit.server:9090/"
    #     logo: "assets/homer-icons/png/cockpit.png"

  - name: "Tools"
    icon: "fas fa-toolbox"
    items:
        
      - name: Prowlarr
        subtitle: "Indexer manager"
        url: "http://prowlarr.server/"
        logo: "assets/homer-icons/svg/prowlarr.svg"

      - name: Bazarr
        subtitle: "Subtitles for all media"
        url: "http://bazarr.svr2/"
        logo: "assets/homer-icons/svg/bazarr.svg"
        tag: oc1

    #   - name: Node-RED
    #     subtitle: Programming tool
    #     url: "http://node-red.server/"
    #     logo: "assets/homer-icons/png/nodered.png"

      - name: Jackett
        subtitle: "All indexers in one place"
        url: "http://jackett.svr2/"
        logo: "assets/homer-icons/png/jackett.png"
        tag: oc1
        
      - name: OpenSpeedTest
        subtitle: "LAN speed tests"
        logo: "assets/homer-icons/png/openspeedtest.png"
        url: "http://openspeedtest.svr2:8200/"
        

更多的配置可以参考 官网

services:
  - name: "Media"
    icon: "fas fa-cloud"
    items:
      - name: "Plex"
        logo: "assets/tools/plex.png"
        subtitle: "TV Shows & Movie Collection"
        tag: "app"
        url: "http://192.168.68.137:32400/web/index.html"
        target: "_blank" # optional html a tag target attribute
      - name: "Netflix"
        logo: "assets/tools/netflix.png"
        subtitle: "Streaming Service"
        tag: "app"
        url: "https://netflix.com"
      - name: "Youtube"
        logo: "assets/tools/youtube.png"
        tag: "app"
        url: "https://youtube.com" 
  - name: "Downloads"
    icon: "fas fa-cloud-download-alt"
    items:
      - name: "Sonarr"
        logo: "assets/tools/sonarr.png"
        subtitle: "TV Show Indexer"
        tag: "app"
        url: "http://192.168.68.137:8989/"
        target: "_blank" # optional html a tag target attribute
      - name: "Radarr"
        logo: "assets/tools/radarr.png"
        subtitle: "Movie Indexer"
        tag: "app"
        url: "http://192.168.68.137:7878/"
      - name: "NZBGet"
        logo: "assets/tools/nzbget.png"
        subtitle: "Usenet Downloader"
        tag: "app"
        url: "http://192.168.68.137:6789/"

Icons

FontAwesome 搜索 Icon。

或者看看这里的 SuperTinyIcons 或者 homer-icons

  • [[homepage]] 是一个使用 JavaScript 编写,使用 YAML 作为配置的个人页面。

reference


2021-08-26 homer , navigation , website , docker , linux

macOS 间歇性休息提醒应用:Time out

前些天偶然间获知了一款叫做 Time out 的应用,他实现的功能特别简单,就是可以定时(15 分钟,50 分钟)来提醒使用 macOS 的用户起来休息一下,或者看看远方,不过它使用的方式有些一些强制,当时间到了之后电脑屏幕会缓缓升起一个屏保,虽然可以跳过,但会强制让使用者注意到时间的片段。之前,我曾经多次尝试番茄时钟工作法 ,但我常常发现,无法很好的遵守自己定下的阶段小任务,要不是任务比较大无法拆分,要不就是无法整理出思路卡顿很久,番茄时钟推荐的细分任务是 25 分钟一个小片段,但往往发现无法在单一一个 25 分钟内完成,于是一拖再拖,然后可能就在电脑前一坐就是几个小时。然后整个一天之后就非常疲惫。

U2mc

特性

Time out 的界面非常简单,功能用一句话也能说明,就是可以设置提醒间隔。免费版可以设置两个间隔时间点,默认的是每 15 分钟休息 15 秒,每 50 分钟休息 10 分钟。届时屏幕会强制升起屏幕保护。

  • 自定义时间间隔
  • 自定义屏幕保护内容
  • 记录软件的使用数据(赞助之后获得)
  • 记录间隔数据

最后

Time out 已经被收录在了 [[Setapp]] 中了,订阅了 Setapp 的用户可以直接下载使用,而其他用户也可以在作者的官网 或者 App Store 中下载使用。


2021-08-24 macos , mac , mac-app , mac-appli time-out , timer , mac-application

HostHatch VPS 测评及使用

两个礼拜前买过一个月 A400 互联 的 VPS,但是因为其提供商不是非常靠谱,所以尽管在使用,但还只是用作流量转发,并没有把重要的数据放在上面。这两天在 LowEndTalk 上正好看到 HostHatch 扩展新加坡业务,发布新机器 2核4G 1T流量的机器只需要 35$ 一年,而且两年付还可以得到两倍的内存,空间和流量,所以就立即下了一单。

2 CPU cores (50% dedicated, burstable up to 200%)
4 GB RAM
20 GB NVMe SSD
1 TB bandwidth
$35 per year
Pay for two years - get doubled RAM, storage, and bandwidth

中间还发生了一点小小问题,因为付款的 Paypal 很久没有使用,付款之后 HostHatch 没有处理,开了 Ticket 之后回复说因为 Paypal on-hold 了这笔订单需要等待 24 小时,等 Paypal 处理之后 HostHatch 才会开始处理。所以等待的期间我又用信用卡下了一单,然后过了一天,我突然发现账号下面有两台机器。不过也好,两台机器做个主备。

机器性能

bench 的结果:

----------------------------------------------------------------------
 CPU Model             : Intel(R) Xeon(R) CPU E5-2690 v2 @ 3.00GHz
 CPU Cores             : 2
 CPU Frequency         : 3000.000 MHz
 CPU Cache             : 16384 KB
 Total Disk            : 39.0 GB (18.0 GB Used)
 Total Mem             : 7976 MB (2120 MB Used)
 Total Swap            : 1023 MB (5 MB Used)
 System uptime         : 24 days, 17 hour 59 min
 Load average          : 0.21, 0.12, 0.10
 OS                    : Ubuntu 18.04.5 LTS
 Arch                  : x86_64 (64 Bit)
 Kernel                : 4.15.0-20-generic
 TCP CC                : cubic
 Virtualization        : Dedicated
 Organization          : AS63473 HostHatch, LLC
 Location              : Singapore / SG
 Region                : Singapore
----------------------------------------------------------------------
 I/O Speed(1st run)    : 495 MB/s
 I/O Speed(2nd run)    : 731 MB/s
 I/O Speed(3rd run)    : 715 MB/s
 Average I/O speed     : 647.0 MB/s
----------------------------------------------------------------------
 Node Name        Upload Speed      Download Speed      Latency     
 Speedtest.net    3295.69 Mbps      2583.03 Mbps        0.65 ms     
 Shanghai   CU    219.87 Mbps       629.33 Mbps         214.01 ms   
 Guangzhou  CT    18.45 Mbps        113.17 Mbps         229.08 ms   
 Guangzhou  CU    424.10 Mbps       587.32 Mbps         203.09 ms   
 Hongkong   CN    2560.67 Mbps      1094.98 Mbps        33.92 ms    
 Tokyo      JP    294.63 Mbps       614.84 Mbps         74.30 ms    
----------------------------------------------------------------------

YABS 的结果:

# ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #
#              Yet-Another-Bench-Script              #
#                     v2021-06-05                    #
# https://github.com/masonr/yet-another-bench-script #
# ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #

Wed Aug 25 00:46:05 BST 2021

Basic System Information:
---------------------------------
Processor  : Intel(R) Xeon(R) CPU E5-2690 v2 @ 3.00GHz
CPU cores  : 2 @ 2999.998 MHz
AES-NI     : ✔ Enabled
VM-x/AMD-V : ❌ Disabled
RAM        : 3.9 GiB
Swap       : 1024.0 MiB
Disk       : 18.7 GiB

fio Disk Speed Tests (Mixed R/W 50/50):
---------------------------------
Block Size | 4k            (IOPS) | 64k           (IOPS)
  ------   | ---            ----  | ----           ----
Read       | 237.97 MB/s  (59.4k) | 1.78 GB/s    (27.9k)
Write      | 238.59 MB/s  (59.6k) | 1.79 GB/s    (28.0k)
Total      | 476.57 MB/s (119.1k) | 3.58 GB/s    (55.9k)
           |                      |
Block Size | 512k          (IOPS) | 1m            (IOPS)
  ------   | ---            ----  | ----           ----
Read       | 2.85 GB/s     (5.5k) | 2.87 GB/s     (2.8k)
Write      | 3.00 GB/s     (5.8k) | 3.07 GB/s     (2.9k)
Total      | 5.85 GB/s    (11.4k) | 5.94 GB/s     (5.8k)

iperf3 Network Speed Tests (IPv4):
---------------------------------
Provider        | Location (Link)           | Send Speed      | Recv Speed
                |                           |                 |
Clouvider       | London, UK (10G)          | 1.11 Gbits/sec  | 412 Mbits/sec
Online.net      | Paris, FR (10G)           | 1.37 Gbits/sec  | 993 Mbits/sec
WorldStream     | The Netherlands (10G)     | 788 Mbits/sec   | 638 Mbits/sec
Biznet          | Jakarta, Indonesia (1G)   | 3.41 Gbits/sec  | 2.55 Gbits/sec
Clouvider       | NYC, NY, US (10G)         | 628 Mbits/sec   | 562 Mbits/sec
Velocity Online | Tallahassee, FL, US (10G) | 476 Mbits/sec   | 238 Mbits/sec
Clouvider       | Los Angeles, CA, US (10G) | 930 Mbits/sec   | 908 Mbits/sec
Iveloz Telecom  | Sao Paulo, BR (2G)        | busy            | 348 Mbits/sec

Geekbench 5 Benchmark Test:
---------------------------------
Test            | Value
                |
Single Core     | 593
Multi Core      | 1191
Full Test       | https://browser.geekbench.com/v5/cpu/9485985

使用

数据库

因为看 LET 上对 HostHatch 的评价还好,并且这是一家长期做生意的提供商,所以我就陆陆续续把其他平台上的 MySQL 数据迁移过来了,并且正好两台机器配置了一下Master Master Replication

应用

和之前在 A400 的机器一样,用 Docker 来管理各个服务。基本上也是同步一下数据,更改一下配置就可以起来。

❯ docker ps -a
CONTAINER ID   IMAGE                                    COMMAND                  CREATED        STATUS                    PORTS                                                                      NAMES
5c9f15d2f6fd   cflask_simple_worker                     "/bin/sh -c 'celery …"   4 days ago     Up 6 hours                                                                                           cflask_simple_worker_1
b9d05a0aab65   cflask-production                        "/bin/bash shell_scr…"   4 days ago     Up 6 hours                0.0.0.0:5000->5000/tcp, :::5000->5000/tcp                                  cflask_flask-prod_1
fe5babd77ff8   technosoft2000/calibre-web               "/bin/bash -c /init/…"   2 weeks ago    Up 2 days                 8083/tcp                                                                   calibre-web
27bb97742691   funkwhale/all-in-one:1.1.4               "/init"                  2 weeks ago    Up 2 days                 80/tcp                                                                     funkwhale
9f167b8f1a27   umputun/remark42:latest                  "/init.sh /srv/remar…"   2 weeks ago    Up 2 days (healthy)       8080/tcp                                                                   remark42
966776d9c62c   luminoleon/epicgames-claimer             "python3 -u main.py …"   2 weeks ago    Up 2 days                                                                                            epic
11f2ab0251a3   gogs/gogs:0.12.3                         "/app/gogs/docker/st…"   4 weeks ago    Up 2 days                 3000/tcp, 0.0.0.0:10022->22/tcp, :::10022->22/tcp                          gogs
2490f033f39d   wordpress:latest                         "docker-entrypoint.s…"   4 weeks ago    Up 2 days                 80/tcp                                                                     wordpress_blog
8f11b6177487   kmb32123/youtube-dl-server:latest        "python -u ./youtube…"   4 weeks ago    Up 2 days                 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp                                  youtube-dl-server_youtube-dl-server_1
ed9cc80eac6a   ghcr.io/naiba/nezha-dashboard            "/dashboard/app"         4 weeks ago    Up 2 days                 80/tcp, 0.0.0.0:5555->5555/tcp, :::5555->5555/tcp                          nezha_dashboard_1
6654066f6c09   wallabag/wallabag                        "/entrypoint.sh wall…"   4 weeks ago    Up 2 days (healthy)       80/tcp                                                                     wallabag
406190504fd3   phpmyadmin/phpmyadmin                    "/docker-entrypoint.…"   4 weeks ago    Up 2 days                 80/tcp                                                                     phpmyadmin_phpmyadmin_1
8c902e165528   chevereto:latest                         "docker-php-entrypoi…"   7 weeks ago    Up 2 days                 80/tcp                                                                     chevereto
fcca09be33e6   redis:4-alpine                           "docker-entrypoint.s…"   7 weeks ago    Up 2 days                 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp                                  redis
b7c7844143ed   fengkx/postgres:13-alpine                "docker-entrypoint.s…"   2 months ago   Up 2 days (healthy)       0.0.0.0:5432->5432/tcp, :::5432->5432/tcp                                  postgres
129bede6f06c   linuxserver/bookstack                    "/init"                  2 months ago   Up 2 days                 80/tcp, 443/tcp                                                            bookstack
6901eecc15c8   diygod/rsshub                            "dumb-init -- npm ru…"   2 months ago   Up 2 days                 1200/tcp                                                                   rsshub_rsshub_1
9229265c93de   yourls                                   "docker-entrypoint.s…"   2 months ago   Up 2 days                 80/tcp                                                                     yourls
4f935d65a3fc   hurlenko/filebrowser                     "/filebrowser --root…"   2 months ago   Up 2 days                 8080/tcp                                                                   filebrowser
8ab377d558e3   wordpress:latest                         "docker-entrypoint.s…"   2 months ago   Up 2 days                 80/tcp                                                                     wordpress
4fa2aad47f10   miniflux/miniflux:latest                 "/usr/bin/miniflux"      3 months ago   Up 2 days                 8080/tcp                                                                   miniflux
47b8ad4f0d41   netdata/netdata                          "/usr/sbin/run.sh"       3 months ago   Up 2 days (healthy)       0.0.0.0:19999->19999/tcp, :::19999->19999/tcp                              netdata
87f802cee469   f6f2296798e9                             "docker-entrypoint.s…"   3 months ago   Up 2 days                 6379/tcp                                                                   rsshub_redis_1
37898721ec5b   browserless/chrome:1.43-chrome-stable    "./start.sh"             3 months ago   Up 2 days                 3000/tcp                                                                   rsshub_browserless_1
79e7d9774b63   b4bz/homer                               "/bin/sh /entrypoint…"   3 months ago   Up 2 days                 8080/tcp                                                                   homer
f505c56e7a24   jrcs/letsencrypt-nginx-proxy-companion   "/bin/bash /app/entr…"   3 months ago   Up 2 days                                                                                            letsencrypt-nginx
97486b8aa958   jwilder/nginx-proxy                      "/app/docker-entrypo…"   3 months ago   Up 2 days                 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   nginx-proxy

可以看到即使跑了这么多应用,内存连一半都没有用完。CPU 也不过刚刚 1/4,性能还是挺满意的。

hosthatch monitor

日常可以注册一下 HostHatch,通常会在论坛或者邮件中通知有优惠。

reference

  • [[HostHatch]]

2021-08-24 vps , linux , hosthatch , management , ubuntu

电子书

本站提供服务

最近文章

  • 2024 年台北之行 去年的时候就得知了海外的大陆人可以通过官方网站申请入台证,从而可以在海外直接入境台湾,所以 4 月份女朋友过来日本之后就通过线上系统申请了入台证,入台证申请通过并付费之后是只有 3 个月有效期的,因为我们申请的比较晚,所以有效期的三个月正好落在了最热的 7,8,9 月份,但考虑到暑假有假期,我们还是决定硬着头皮买了机票。
  • macOS 上的多栏文件管理器 QSpace QSpace 是一个 macOS 上的多窗口平铺的文件管理器,可以作为 Finder 的代替,在 Windows 上曾经用过很长时间的 [[Total Commander]],后来更换到 Linux Mint 之后默认的文件管理器自带多面板,反而是用了很多年 macOS ,才意识到原来我缺一个多窗口,多面板的文件管理器。
  • Dinox 又一款 AI 语音转录笔记 前两天介绍过 [[Voicenotes]],也是一款 AI 转录文字的笔记软件,之前在调查 Voicenotes 的时候就留意到了 Dinox,因为是在小红书留意到的,所以猜测应该是国内的某位独立开发者的作品,整个应用使用起来也比较舒服,但相较于 Voicenotes,Dinox 更偏向于一个手机端的笔记软件,因为他整体的设计中没有将语音作为首选,用户也可以添加文字的笔记,反而在 Voicenotes 中,语音作为了所有笔记的首选,当然 Voicenotes 也可以自己编辑笔记,但是语音是它的核心。
  • Emote 又一款 AI 语音笔记应用 继发现了 Voicenotes 以及 Dinox 之后,又发现一款语音笔记 Emote,相较于前两款应用,Emote 吸引我的就是其实时转录的功能,在用 Voicenotes 的时候时长担心如果应用出现故障,没有把我要录下来的话录制进去,后期怎么办,而 Emote 就解决了这个问题,实时转录的功能恰好作为了一个声音录制的监听。
  • 音流:一款支持 Navidrome 兼容 Subsonic 的跨平台音乐播放器 之前一篇文章介绍了Navidrome,搭建了一个自己在线音乐流媒体库,把我本地通过 [[Syncthing]] 同步的 80 G 音乐导入了。自己也尝试了 Navidrome 官网列出的 Subsonic 兼容客户端 [[substreamer]],以及 macOS 上面的 [[Sonixd]],体验都还不错。但是在了解的过程中又发现了一款中文名叫做「音流」(英文 Stream Music)的应用,初步体验了一下感觉还不错,所以分享出来。