Clientexec 汉化

之前购买 RackNerd 的机器看到有赠送 [[Clientexec]] 的授权就顺手申请了一个。ClientExec 是一套为主机商开发的客户管理,支持,财务系统。借助 ClientExec 的强大能力可以快速构建一个共享空间,VPS,域名分售系统。

因为正好有授权在,所以就在 RackNerd 的机器上面安装了一下。安装的过程倒是比较简单,但就是这套系统实在太复杂,从绑定的插件到,支付系统,到后台语言都比较麻烦,所以这一篇文章简单地讲述一下我汉化 Clientexec 的过程,这里面也有很多的坑。

获取英文语言字符串

如果要在 Clientexec 中新增语言包,可以通过源代码 language 路径下的语言包进行修改。

在安装完成的 Clientexec 的目录下,拷贝原来的英文语言。

/language/core-en.po
/language/core-en.mo

简体中文的语言编码代号是 zh,所以需要拷贝得到:

core-zh.po
core-zh.mo

这个语言代号,可以从 /library/Zend/Locale/Data/Translation.php 文件中得到,在数组 $languageTranslation 中搜索 Chinese 就可以看到。

nBlg

得到了对应的原始英文内容之后,就可以开始着手翻译,有很多的方式可以进行翻译。

翻译 Po 文件

po 和 mo 文件

这里需要补充一下 po 和 mo 文件的相关前提知识。 PO 和 MO 文件是 GNU gettext 工具包中使用的翻译文件格式,用于本地化软件应用程序和网站。PO 文件是 Portable Object 的缩写,它是一个文本文件,包含原始字符串和它们的翻译。MO 文件是 Machine Object 的缩写,它是一个二进制文件,包含已翻译的字符串,可用于更快地加载和使用翻译。Clientexec 是 PHP 编写的,也是通过这种方式进行国际化,多语言。

通常,开发者在开发过程中在源代码中使用原始字符串,并使用 GNU gettext 提供的工具来提取这些字符串并创建 PO 文件。然后,翻译者可以使用 PO 文件中的原始字符串并提供它们的翻译。一旦翻译完成,MO 文件将由 GNU gettext 编译器从 PO 文件生成。在软件运行时,应用程序将使用 MO 文件中的翻译来显示正确的本地化字符串,这使得软件能够在不同的语言环境下运行。

翻译 PO 文件

有很多的方式可以去翻译 po 文件

  • 我最开始的时候是傻乎乎的使用 [[Poedit]] 桌面客户端手工进行翻译。直接打开 po 文件进行翻译
  • 然后想着效率太低了,想能不能用 [[Crowdin]] 这个共享协作的翻译平台进行翻译,创建项目,然后网站上也提供了很多翻译的选项,直接 cmd+Enter 倒也是能快速翻译,但是我觉得还是太慢了,翻译了半天才 2%
  • 然后我想到这不就是从一个语言到另一个语言的翻译么,能不能找找免费的翻译工具翻译,[[DeepL]] 免费提供一个月 50 万字的额度,但是注册失败了,然后我想到之前用 GoldenDict 的时候用 Python 调用 Google Translator 用了很久。现在只要写一个读取 po 文件,然后调用 Google Translator 的方法,翻译完成之后再写回文件即可

需要注意的是 PO 文件有一个头部的「注释」,在文件的开头,因为我把文件上传到了 Crowdin,然后再下载下来的,所以 Crowdin 修改了这些注释,最好的方式是保持和原来一致,否则 Clientexec 可能无法识别。

从 PO 文件生成 MO 文件

有如下的方法:

  • Poedit 软件内能直接从 PO 文件生成 MO 文件
  • 或者可以通过在线的工具 localise

nHkw

  • Choose source file 中选择需要转换的 PO 文件
  • 然后在 To 中选择 Gettext MO(binary)
  • 然后点击 Convert
  • 保存到本地 并命名为 core-zh.mo

MO 文件是 Clientexec 用来加载使用的二进制文件,其中包含了翻译文字。

上传到 Clientexec 并在后台设置

将现在得到的两个文件:

core-zh.po
core-zh.mo

上传到 Clientexec 的 language 文件夹下。这个地方要注意的是,如果这两个文件没有足够的权限,后台即使设置了也会没有效果。

chmod 755 core-zh.po core-zh.mo

最后在 Clientexec 后台设置 -> Localization 中,首先启用 Chinese,然后将站点设置成中文即可。最后的成果

reference


2023-04-01 clientexec , billing , webhosting , racknerd , language , python

在命令行下使用 GitHub Copilot CLI

GitHub Copilot CLI 是一个让 GitHub Copilot 来在命令行环境下使用自然语言提示命令行的工具。

如果要使用 GitHub Copilot CLI ,那么必需能够访问 GitHub Copilot,并且还需要通过 waitlist。另外需要注意的是 GitHub Copilot CLI 目前还是在试验中(technical preview),有一些 corner case 或者还有一些平台支持可能不完善,并且 CLI 补充的任何命令请在完全知晓是什么内容和作用的情况下再执行。

最新教程

GitHub Copilot 已经发布正式版本,可以直接通过官方的 gh 命令来使用。

gh auth login
gh extension install github/gh-copilot
gh extension upgrade github/gh-copilot

几个子命令

# 解释命令
gh copilot explain "sud apt update"
# 执行命令
gh copilot suggest
gh copilot suggest "show process"

设置 alias

echo 'eval "$(gh copilot alias -- zsh)"' >> ~/.zshrc

然后就可以执行

ghce
ghcs

参考官方文档

安装

使用 npm 全局安装:

npm install -g @githubnext/github-copilot-cli

然后将 github-copilot-cli 添加到 PATH,然后使用下面的命令授权

github-copilot-cli auth

然后按照命令行的提示在网页授权。一旦授权,token 会保存在用户设备本地,为后续的请求使用。这个命令正常只会在第一次使用的时候执行。

更新命令

npm install -g @githubnext/github-copilot-cli

设置 alias

正常情况下可以直接执行 github-copilot-cli 来使用,但是更建议使用 ??, git?, gh? 这样的方式。

可以在 Shell 的配置 .zshrc.bashrc 中添加

eval "$(github-copilot-cli alias -- "$0")"

使用

GitHub Copilot CLI 会将自然语言转变成 shell 命令,在安装之后可以通过如下三种方式使用:

  • ?? 将自然语言变成命令
  • git? 将自然语言变成 git 命令
  • gh? 将自然语言变成 GitHub CLI 命令

s8dN

GitHub Copilot CLI 的三种模式均以相同方式工作 —- 编写自然语言查询来声明您想要的内容,然后 GitHub Copilot CLI 将尝试构建一个命令或命令序列来执行它。

如果满意 Copilot 建议的命令,只需要求 GitHub Copilot CLI 运行它即可。

GitHub Copilot CLI 还会逐步解释建议命令的作用。 当学习新命令时尤其需要注意:shell 非常强大,您可能会无意中做出您不打算进行的破坏性的变化。在运行命令之前,一定要确保您理解建议命令的作用。像所有 AI 系统一样,GitHub Copilot CLI 不是完美的,可能会犯错误。

Shell 使用注意事项

因为直接使用 Shell ,而有一些关键的符号在 Shell 中有其自身的含义,所以有一些需要特别注意的内容。

有一些符号可能在提交到 GitHub Copilot CLI 之前就被 Shell 处理了,所以避免使用如下的符号,或者使用 \ 转义,或者将符号放到单引号 '...' 中。

  • 查询中的单引号 ',双引号 ",或者问号,感叹号,通常会造成 shell 的语法错误,如果遇到这种情况,按 Ctrl-c,然后重新查询即可
  • 括号,包括 () [], {} 也可能造成语法错误
  • * 号,会匹配文件或文件夹,这会导致敏感的文件名出现在查询中
  • | 管道符,将被解释为 shell pip,并将查询解释为单独的命令。造成查询 Copilot 失败
  • 小心,避免在任何变量前使用 $ ,这会导致 Shell 将其扩展成一个变量值,并且可能无意之间将敏感的环境变量传给 GitHub Copilot 查询
  • Warp 是我去年介绍的一款使用 Rust 编写的终端,Warp 也提供了类似的通过 AI 支持的命令行补全,如果感兴趣也可以去体验一下。
  • 另外还有一些 Zsh 插件也可以借助 OpenAI Codex 的能力提供命令自动补全的能力,比如 Zsh Codex 但是该项目有一段时间没有更新了。
  • [[AI Shell]]

2023-03-31 github , github-copilot , cli , linux , shell , zsh , ai , artificial-intelligence

Chatwoot 开源的客户支持工具:在网站上加上聊天对话框

Chatwoot 是一个 [[Ruby]] 编写的,开源的,可自建的即时消息的客户支持工具 [[Business Messaging Platform]],可以嵌入到网页,集成 Telegram,电子邮件,帮助企业提供在线的客户服务支持。Chatwoot 开始于 2016 年。

在接触到 Chatwoot 之前,陆陆续续了解过 [[crisp.chat]],tawk.to。而我昨天稍微了解了一下这个行业之后就发现原来对企业的在线实时聊天的服务已经竞争非常充分了。只简单的了解了一下就发现超过 10 家公司在做类似的事情,并且还有非常多的公司以开源的方式在进行。

比如已经作为商业产品在运作的:

  • [[Intercom]]
  • [[tawk.to]]
  • [[crisp.chat]]
  • [[Drift]]
  • [[HelpCrunch]]
  • [[Zendesk]]
  • [[Help Scout]]
  • [[Freshdesk]]
  • [[chatfuel]]
  • [[airchat]]
  • [[PubNub]]
  • [[Kustomer]]

等等

以开源的方式在进行的有:

  • 文本介绍的重点 [[chatwoot]]
  • [[papercups]]
  • [[Chaskiq]]

这么多相类似的产品,大部分的商业产品所面向的客户都不太一样,有面向大客户的,比如 Intercom,Zendesk 等等,也有面向垂直电子商务的,也有面向创业公司的。

但总之上面的这些都不是本文的重点,下面就重点放在 Chatwoot 的使用上面。

gihv4qRa64

Installation

Chatwoot 官方提供了很多种方式安装,还包括很多云服务提供商可以一键安装。但是我选择用 Docker(docker-compose) 安装。详情配置见这里

git clone git@github.com:einverne/dockerfile.git
cd dockerfile/chatwoot
cp env .env
# modify .env
docker compose run --rm rails bundle exec rails db:chatwoot_prepare
docker compose up -d

默认配置下 Chatwoot 是只监听本地的 localhost:3000 端口,所以还需要前台用 Nginx 做一下反向代理。

server {
  server_name <yourdomain.com>;

  # Point upstream to Chatwoot App Server
  set $upstream 127.0.0.1:3000;

  # Nginx strips out underscore in headers by default
  # Chatwoot relies on underscore in headers for API
  # Make sure that the config is set to on.
  underscores_in_headers on;
  location /.well-known {
    alias /var/www/ssl-proof/chatwoot/.well-known;
  }

  location / {
    proxy_pass_header Authorization;
    proxy_pass http://$upstream;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Ssl on; # Optional

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_http_version 1.1;
    proxy_set_header Connection “”;
    proxy_buffering off;

    client_max_body_size 0;
    proxy_read_timeout 36000s;
    proxy_redirect off;
  }
  listen 80;
}

如何实时接受消息

因为我使用 HestiaCP 作为服务器面板,这里还遇到一个小坑,因为默认的 HestiaCP 模板文件stpl 配置最下方有一个 Nginx 配置1

    proxy_hide_header Upgrade;

也就是说默认情况下会隐藏请求头。这导致了我在安装完 chatwoot 之后,发送消息,管理后台以及前端小插件,iOS 客户端都不能实时收到新消息,必需整页刷新才能收到新消息,这导致我 Debug 了好久。虽然在之前安装 VS Code Server 在线版 的时候就遇到过一次,但还是掉进了这个坑里面。

Agent

通过 Chatwoot 的 Agent API 可以自行编写回答机器人。如果接入了 OpenAI,Rasa 等聊天机器人就可以快速的搭建一套智能客服了。

配置 SMTP

邮件发送是现代应用中必不可少的一部分,Chatwoot 也天然支持 SMTP 邮件发送。

Super Admin

可以访问,<chatwoot-installation-url>/super_admin

升级 Chatwoot

因为使用 Docker Compose 安装 Chatwowat,所以升级非常简单。

docker-compose pull
docker-compose up -d

docker exec -it $(basename $(pwd))-rails-1 sh -c 'RAILS_ENV=production bundle exec rails db:chatwoot_prepare'

reference


2023-03-31 chatwoot , open-source , online-chat , customer-engagement , support , real-time-support

自建邮件服务器 Mailcow 配置通过 MXRoute 发送邮件

之前写过一篇文章是如何使用 Mailcow 自架邮件服务器,自那个时候开始以及使用自己架设的邮件服务器快一年左右的时间了,因为是自己使用,收件是没有什么问题,发件的话用 mail-tester.com 测试也能拿 10 分,但一直是没有作为主力发件服务器去使用的,主要还是怕会进入垃圾箱。但是最近看到 [[MXRoute]] 有春季打折,15 美元一年 25 GB 空间,就订购了一个想试试看。

有了这两个前提之后,我就像能不能让我的收件通过 Mailcow,邮件直接到我的服务器,然后发件的时候通过 MXRoute 发送,毕竟 MXRoute 的发件 IP 地址要比我自己的服务器 IP 地址要可信得多,送达率可能也比我自己的服务器要高。然后我简单地了解了一下发现 Mailcow 是自带 Relay (邮件中继服务) 功能的。

那这一篇文章就讲讲怎么在 Mailcow 中配置使用 MXRoute 来发送邮件。

初始 Mailcow 配置

在 Mailcow 中首先要完成正常的域名添加,然后再新增 Mailbox 邮箱。因为这个部分比较简单,直接在 Mailcow 后台操作,然后根据 Mailcow 后台的 DNS 配置,修改域名对应的 MX 记录,SPF 记录,DKIM 记录,DMARC 记录即可。

假如我想要配置一个博客评论的邮箱,比如 no-reply@blog.einverne.info,那么首先要在 Mailcow 后台添加 blog.einverne.info 的域名,然后配置如下的 DNS 记录。

ON6L

然后在 Mailbox 中添加 no-reply@blog.einverne.info 的邮箱。此时使用 Mailcow 的后台也是可以对此邮箱进行发件和收件的。但这个时候走的都是此服务器。

MXRoute 配置

首先完成MXRoute 的基础配置,当然这个地方需要注意的是必需要好好理解一下几个 DNS 记录的作用,不要完全照着 MXRoute 发过来的配置直接修改。

首先也需要在 MXRoute 后台添加域名 blog.einvenre.info,然后新增一个邮箱 no-reply@blog.einverne.info

Configure the account as a catchall for the domain. In cPanel, this is under Forwarders / Aliases → Add Domain Forwarder. Not sure where it is in DirectAdmin as I don’t have any DirectAdmin accounts to test with. The reason it needs to be a catchall is so it can be used to send mail from any address at the domain.

然后下面重要的部分配置就需要注意了。

  • 首先把域名的 MX 记录设置成自己的邮件服务器的地址,MX 记录指向自己的邮件服务器地址
  • 然后修改域名的 [[SPF]] 记录,同时授权自己的邮件服务器 IP 和 MXRoute 的 IP
  • 最后同时添加 Mailcow 的 DKIM 和 MXRoute 的 DKIM 记录

假如自己的 Mailcow 邮件服务器的 IP 地址是 198.52.100.1, IPv6 的地址是 2001:db8::1,那么配置可以像如下这样:

v=spf1 ip4:198.52.100.1 ip6:2001:db8::1 include:mxroute.com -all

如果不清楚 SPF 记录 是什么,可以参考之前的文章,解释了邮件是如何工作的。

或者,如果不想在 SPF 记录中直接使用 IP 地址,也可以使用 mx 来代替配置具体的 IP 地址,不过需要注意的是需要配置额外的 MX 记录(指向一个域名或 IP),如果配置的 MX 记录是域名,那么还需要注意配置 A 记录将域名解析到邮件服务器。如果配置 MX 域名,那么可能会产生一次额外的 DNS 查询,不过个人是推荐这么做的,因为邮件服务器的 IP 地址更换了,只需要修改域名的 A 记录值就可以了。

v=spf1 a mx include:mxroute.com ~all

最后为了让邮件送达率更高,还需要配置 [[DKIM]],在 DNS 记录中需要同时配置 Mailcow 和 MXRoute 的 DKIM 记录。

一般情况下 DKIM 记录 key 是

dkim._domainkey.example.com

值就是网站提供的类似:

v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC...

这里可以看到的是 DKIM 记录的 key,Mailcow 一般是

dkim._domainkey.example.com

而 MXRoute 一般是

x._domainkey.example.com

同时把这两个记录添加到 DNS 记录中。

完成上面的 DNS 配置之后就可以进入 Mailcow 后台配置了。

Mailcow 配置邮件中继

在 Mailcow 后台,点击 System -> Configuration (顶部菜单) → Routing 标签。

OPn3

然后找到页面中的 「Add sender-dependent transport」

O8KY

然后在这个地方添加 MXRoute Host,邮箱的用户名和密码。

添加完成之后,可以点击 「test」进行测试。输入自己邮箱的地址,然后保留 To Address 地址为默认的 null@hosted.mailcow.de 然后保证测试的结果中得到了 250 OK 。

O3Gp

然后在顶部菜单 E-Mail -> Configuration -> Domains,找到对应的域名,点击 Edit。

OJRN

在编辑界面中找到「Sender-dependent transports」,在下拉菜单中选择刚刚配置的 Relay 邮箱。

现在任何通过 Webmail 或者邮件客户端通过此域名发送的邮件都是通过 MXRoute 来发送的。

上面的功能演示的是在 Mailcow 中配置邮件中继,但是这个功能底层还是依赖的 Postfix 的标准功能 sender_dependent_relayhost_maps ,所以用户可以在其他程序比如 Mail-in-a-box 等等中进行相同的配置,或者用户也可以手动直接修改 Postfix 配置。

reference


2023-03-30 mxroute , mailcow , email-server , email-hosting , sendmail , postfix , mailu , email-template

ClientExec 安装及入门使用

ClientExec 是一套为主机商开发的客户管理 [[Web Hosting Billing]],支持,财务系统。借助 ClientExec 主机服务器商可以快速开始自己的业务,在线售卖虚拟主机,共享主机,域名等等服务。

ClientExec’s online business administration software is an innovative solution for automating daily business administration tasks. This software provides solutions for the most common tasks of administration, and can be accessed online from any web browser.

  • 开发语言:PHP
  • 安装环境:PHP+MySQL
  • 授权协议:商业授权,需付费使用,如果购买了 [[RackNerd]] 的 VPS,可以申请一个免费的授权。
  • 官方网站:http://www.clientexec.com/

ClientExec 的特性:

  • 支持主机控制面板
  • cPanel/WHM
  • License Defender
  • 可以和 [[Plesk]] 等面板联动
  • Teamspeak
  • DirectAdmin
  • ISPManager
  • TCAdmin (beta)
  • InterWorx-CP

Preview

clientexec

安装 ClientExec

安装 Clientexec 之前首先查看系统最低要求

  • PHP 7.2.5~7.4.x, 8.1.x 注意因为 8.0 没有 ionCube 支持所以不行
  • PHP Memory Limit 128M
  • PHP Extensions 开启如下扩展
    • GD
    • cURL
    • Multibyte String
    • PDO
    • SOAP
    • MySQLi
    • imap
    • iconv
  • ionCube Loader 12.0 及以上

安装 Nginx,PHP,MySQL 环境,可以使用 [[CloudPanel]], [[aapanel]],HestiaCP 这样的界面,也可以使用 [[lnmp]] 这样没有 Web 界面的一键配置脚本。

因为我是使用 LNMP 一键脚本进行地安装,有两个 Addon 需要安装一下

./addons install ionCube
./addons install imap

然后创建 vhost

lnmp vhost add

根据自己的域名填写内容。

将要安装的内容拷贝到 /home/wwwroot/domain/ 下,然后访问域名。

遇到如下问题,手工添加一下 crontab

FAILED - couldn't use the system's shell binary. Please continue with this installation and when you're done, please manually create the following crontab entry through your hosting control panel:

* * * * *  -q /home/wwwroot/xxx.einverne.info/cron.php

升级 Clientexec

点击页面下方的版本升级,自动升级,需要开启在 php.ini 中开启 shell_exec

我使用 LNMP,所以找到 /usr/local/php/etc/php.ini,然后找到 shell_exec 将其从禁用函数中移除。

/etc/init.d/php-fpm restart

使用

add server 可以售卖服务器上的资源

cPanel 初始化

package 套餐

创建售卖的套餐

  • Basic
  • Standard
  • Pro
  • Bronze
  • Silver
  • Gold

最后

最后的最后,欢迎访问 EV Hosting 订购使用。

  • [[WHMCS]]
  • [[Web Hosting Billing]]

reference

  • [[如何创建 ClientExec 售卖的套餐]]
  • [[2023-04-01-clientexec-language-chinese Clientexec 汉化]]
  • [[如何修改 ClientExec 的 Logo]]
  • [[2023-04-04-clientexec-smtp-config 记录一下 Clientexec 中配置 SMTP 时的一些问题]]

2023-03-29 clientexec , vps , shared-web-hosting

macOS 上轻便的 Docker 容器以及 Linux 运行环境:OrbStack

今天早上在 Twitter 上连续看到三个人在同一时间推荐了一款在 macOS 上运行的 Docker 容器和 Linux 虚拟机 —- OrbStack

GitHub:https://github.com/orbstack

而 macOS 上的 Docker Desktop 原本就是饱受诟病,慢,重,资源消耗巨大。 OrbStack 的出现就是为了解决这个问题。

macOS 从 2020 年发布 Big Sur 开始,提供了虚拟化的框架,开发者可以在 macOS 上构建基于 Intel/ARM 的 Linux 环境。macOS 上的 [[Parallels Desktop]] 和 [[Docker Desktop]] 都在使用这个框架,但这二者都比较重。

OrbStack 使用

下载安装的过程特别简单。可以看到如下的界面可以在 macOS 上快速,轻便的创建 Docker 容器和 Linux 环境。

OfKw

执行一下测试的容器:

docker run -it -p 80:80 docker/getting-started

然后再访问 http://localhost/ 即可看到最基础的 Docker 教程。

在这个界面中也可以对容器进行简单的管理。 Ou7c

在系统的资源管理器中可以看到 OrbStack 几乎不怎么占用 CPU 和内存。

CPU 消耗

OS4r

内存消耗

O4Rd

相关命令

OrbStack 也提供了一些管理命令 orbctl,可以直接在命令行使用。

orbctl help

OrbStack 在创建了 Ubuntu 等 Linux 镜像之后也可以使用 SSH 连接

orb -m ubuntu -u root
orb -m ubuntu -u root uname -a

orb 命令还提供了其他一些特性,比如可以在虚拟机中 push 或 pull 来传输文件。

目前的一些局限

OrbStack 虚拟的 Linux 是不支持 GUI 的,不过这也不妨碍,我想大部分开发应该只会使用命令行去管理 Linux 运行环境吧。大致猜想 OrbStack 应该只是用 Docker 开启了一个 Linux 的容器,所以不支持图形化界面也是可以理解的。

alternative

  • colima 也是 macOS 上的一款容器运行时。
  • lima 也是 macOS 上的一款 Linux 虚拟机应用。

总结

总之如果你之前饱受 Docker Desktop 慢的问题困扰,或者之前经常使用 Virtual Box,[[VMware Fusion]] 等虚拟化工具在 macOS 上虚拟化 Linux 运行环境,不妨来试试这一款轻量的 OrbStack。


2023-03-28 orbstack , docker , macos , linux , virtual-machine , virtual-box

防止 SSL 证书泄露网站 IP

有些网站虽然已经使用 [[Cloudflare]] 等等服务做前置 CDN,隐藏了服务器 IP 地址,但是依然会被 censys.io 扫描出 IP 来。

原因

在使用 Nginx 作为 Web 服务器的事后,如果网站开启了 SSL,直接访问 IP 加 443 端口,Nginx 的设计上会有一个小小的特性「BUG?」,Nginx 会正常返回,并携带一个包含域名信息的证书。于是通过这个 BUG 就使得 IP 和 域名产生了对应关系。如果全网扫描 IP 地址,就能查询到一张 IP -> 域名的映射表。

对 IP 的 443 端口发送 clienthello,回复的 serverhello 中有一个 SSL 证书,证书中 common name 包含域名信息。

这就是为什么已经使用了 CDN,但依然会被打到源站 IP 的原因。

解决方法

使用虚假证书

创建一个使用 ip 的网站并配置以下 SSL 信息(空 SSL)即可避免泄露。

密钥(KEY)

-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDXyF6m81zOeoOPvfk6nGKtyfczRG6/yeSkcc+66vGvq0s8oB7V
cCzLl1YcNsru3ixelPR2z1zvjKqa9/Aqh8+TvP1kGGbLD/mynjnj8l+0vVzZ+vnz
AH0RN9fpqzlpHmFBHQzQ25AtIAH8pXOL1541YN0TNPRA3kHUCL0FH8CkwwIDAQAB
AoGAQ4ejh6AV5VCWJ8AOZXdXsofIYzUBa+glNAmiNx8b8BwteZWq0KVAf56nBkFn
lQXW4OrA7wXKUfW11rXNZaIHJePJXv1swkN9+Em18Hon6BrtcqnKAwzAbhok3SzY
IVjI/zrgOABH6+ii77xCRBzI1itVPNN88DAUHC7PYLYiaaECQQD7PSoij37+kMc/
wPeEkl9r3vzU0OrsCsjU8Ev714OaoL/SIuAh6nsiRh9rcbUrrpGSSzIcmsk9HMDa
hXBNkNl5AkEA298yQvssaUc4tbEWxAVfd9DsHJdCdbXfgf9Dy5/tpCzYncY7T0du
VVHqKu3jXWoMc5XlesiCOerU/DIlMM8dGwJBANQn7GLO5iC1xWvS2bF7oVSIMtzL
pvW4jaszWBbNAPccc59RkA9T4LMqn/GtTZ4bhhYRpbl+BB21IC3nrNPzU5ECQG8T
Ln0QDruQs2F2eR3F6RjKfr1i3LxCiQtPPZycypzp2vS5tDS0zVRk8XuGehoy/N9X
lnqU2NURgU92tbsWpokCQQDdc9tU3B/OM/YfzUNwvOLmUVwrJX6PFSFsOn+XHrCC
q9LcGEAHyzaf5GEWje84ee4rkv5oaZcwll3dg4IioBnC
-----END RSA PRIVATE KEY-----

证书(PEM 格式)

-----BEGIN CERTIFICATE-----
MIIBkjCB/AIJAI3bCYqa39hiMA0GCSqGSIb3DQEBBQUAMA0xCzAJBgNVBAYTAiAg
MCAXDTE4MTEyNDA5MDMzOFoYDzIwOTkxMjMxMDkwMzM4WjANMQswCQYDVQQGEwIg
IDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA18hepvNcznqDj735Opxircn3
M0Ruv8nkpHHPuurxr6tLPKAe1XAsy5dWHDbK7t4sXpT0ds9c74yqmvfwKofPk7z9
ZBhmyw/5sp454/JftL1c2fr58wB9ETfX6as5aR5hQR0M0NuQLSAB/KVzi9eeNWDd
EzT0QN5B1Ai9BR/ApMMCAwEAATANBgkqhkiG9w0BAQUFAAOBgQBiqHZsuVP09ubT
GzBSlAFEoqbM63sU51nwQpzkVObgGm9v9nnxS8Atid4be0THsz8nVjWcDym3Tydp
lznrhoSrHyqAAlK3/WSMwyuPnDCNM5g1RdsV40TjZXk9/md8xWxGJ6n1MoBdlK8T
H6h2ROkf59bb096TttB8lxXiT0uiDQ==
-----END CERTIFICATE-----

配置 Nginx 仅允许 CDN IP 访问

在 Nginx 上配置仅允许 CDN 的 IP 访问。比如 Cloudflare IPs

location / {
    allow 103.21.244.0/22;
}
  • [[censys]]

2023-03-27 ssl , linux , ip , cdn

Web 3.0 音乐平台:Muverse 简单介绍

Muverse 是一个由社群驱动的 Web3.0 互动音乐平台,将音乐、游戏、社交媒体和加密技术连接在一起。该平台通过构建新的社群,为独立艺术家创造一个更自由、更公正、更适当的商业环境。Muverse 通过其内部互动吸引全球艺术家和粉丝一起成长,并在 Web3 中共享丰厚的奖励。Muverse 平台具有多种有益于艺术家的功能,赋予艺术家在互联网上自由发行他们的音轨,并完全掌控他们的音乐的能力。此外,他们可以从其音乐和商品销售中赚取加密货币,并将其转换为真实货币。

最近,Muverse 推出了 YOLO Bunny NFT 头像系列,并公布了其全球产品开发计划,加速了未来“虚拟”NFT 市场的“实现”。随着音乐行业持续向区块链技术转移,像 Muverse 这样的平台有潜力为独立艺术家提供更公平透明的环境。

可以看到的是有一些艺术家,歌手已经开始在 Muverse 上独立发行音乐专辑,韩国歌手李洪基宣布在 Muverse 上独家发行单曲 그 자리(I’m missing you),而他发布的 NFT 也在一个小时的时间内售空。1

注册使用

在注册 Muverse 之后可以看到有两个很醒目的按钮「Play to Earn」 和 「Listen to Earn」

  • Play to Earn 非常类似于音乐游戏「节奏大师」,通过播放音乐,然后在手机的虚拟键盘上按节奏按下,会根据最后的得分给一定的奖励
  • Listen to Earn,就如字面的意思,进入之后会有不同的人在播放音乐,听音乐即可,会根据时长来奖励。

OOz0

听音乐获得 MCT 代币

上面还是有不少选曲不错的频道的。

Oq18

听够 6 分钟就能兑换。 On49

玩游戏获取 MCT 代币

Ose6

不过需要注意的是,应用最开始的时候就会要求用户购买一个耳机(Headphone),这样才会有更多的奖励,一个虚拟的耳机,在他 App 中的售价在 0.05 ETH 左右,折合人民币也得好几百了。这一点可以谨慎考虑一下,等熟悉了这个平台之后再进行购买也可以。

一点简单的思考

截止到目前为止,这个平台的构建还非常初步,在应用内的下方 5 个 Tab,其中就有 2 个(Invest、Social)还是未实现的,很显然官网目前说的音乐、游戏、社交媒体、加密货币,这个平台目前就只有将听音乐和音乐游戏做好了,并且游戏这一块还做的比较简单。而听音乐这一块,目前不知道这个平台的音乐版权是自己购买的还是和音乐人合作的,还在上面听到不少刚刚发行不超过 1 年的歌曲,比如 LeeHi 的 ONLY,米津玄師的 orion,还有一些欧美音乐人。还有一个要吐槽的是,明明是一个音乐应用,却不能在息屏的情况下听音乐,Why?

在 Web 3.0 的发展过程中我一直在思考的问题便是 Web 3.0 行业从业者经常提及的对私人数据的控制和所属权问题。在 Web 2.0 时代,内容(包括文字、图片、视频)的大量价值都被大平台(博客平台、Instagram、小红书、YouTube、抖音等)所垄断,原来归属于用户内容的「价值」全部被平台的所吸收,并美其名曰会给创作者以奖励。当然我承认在 Web 2.0 时代大平台所起得推广、算法推荐等等是对创作者有一定的推波助澜的作用的。但是如果真的能像 Web 3.0 所承诺的那样,比如音乐人在 Muverse 上发行的单曲,通过播放量,通过售卖的 NFT 来将收益直接归属到艺术家,是否会真正改变一些行业。之前也看到过一些文章分析 Spotify 兴起之后一些小众音乐家再无法通过有效的手段售卖自己的专辑,或许这样的情况是否可能直接通过一种新的方式得到改善,让我们拭目以待吧。

总结

如果你看到这里觉得这个平台很有意思,也可以直接点击这里(带邀请码)注册。或者在注册之后输入邀请码 j9uyp 。


2023-03-26 muverse , web-3 , nft , music , kpop , music-platform

邮件发送服务 MXRoute 使用体验

[[MXRoute]] 是一家 Email Hosting 服务提供商,专注于提供高送达率的电子邮件发件服务。[[MXRoute]] 是由国外著名主机论坛 LET 的管理员 Jarland 开设。MXRoute 的主要目标之一是向其用户提供经济实惠的邮件托管服务。

MXRoute 的特点是无限域名,无限邮箱账号。MXRoute 配置非常简单,只要拥有自己的域名,通过修改域名的 DNS 配置,就能很方便的搭建自己的邮件服务器。MXRoute 是正规邮件服务,不能用于发送 SPAM 。

需要注意的是,MXRoute 与其他电子邮件提供商类似,存在电子邮件被标记为垃圾邮件的风险,并且发送者信誉和电子邮件内容等因素可能会影响其交付率。

MXRoute 的优势

MXRoute 作为一家邮件服务提供商,提供了可靠的邮件送达率。

  • 拥有高声誉的发信 IP,ARIN 直接分配
  • 拥有一个帐号即可添加无限制的域名(当然这里需要声明的是在个人使用合理的范围内,如果添加超过万级别的域名可能需要向管理者申明,否则可能会被判定滥用)
  • 可以添加无限制的域名邮箱,每个邮箱都有每个小时 300 封发件的限制,用户可以手动创建不同的邮箱来规避这个限制,比如创建一个邮箱用来发送注册邮件,创建一个邮箱用来发送充值密码邮件,一个邮箱用来发送通知,这样是被允许的,但是如果如果为了规避这个限制人为得创建不同的邮箱帐号来做同样的事情,可能会被判定滥用,请注意
  • MXRoute 提供了非常实惠的价格,我购买的套餐就是 15 美元 1 一年,提供 25 GB 的空间,无限制的域名和邮箱

MXRoute 购买登录

在购买了 MXRoute 的服务之后,系统会发送一封标题为「[MXroute] Important Account Information」的邮件到注册的邮箱中,其中包含了后台访问的地址,用户米和密码,还有一些重要的 DNS 配置,包括 DNS 的 [[MX 记录]],[[SPF]] 记录。邮件中还包括了邮件客户端的配置,包括 [[IMAP]],[[SMTP]] 的访问信息,包括地址和端口等等。

使用

使用邮件中的信息,登录管理后台,如下图所示。

O9Dn

在域名设置中可以添加域名,子域名也是可以设置的。

配置 MX 记录

以 Cloudflare 中 DNS 配置为例,添加记录,然后选择 MX,填入邮件中 MXRoute 发来的 MX 记录地址,然后设置优先级,MXRoute 提供了两个地址分别设置优先级 10, 20 即可。如果是添加的子域名,这里记得将 @ 对应修改一下。

OAJl

配置 SPF 记录

关于 SPF 记录,DKIM 记录,以及电子邮件是如何工作的,可以参考之前的文章

SPF(Sender Policy Framework)记录是一种 DNS 记录,用于指定哪些邮件服务器被授权发送来自特定域名的电子邮件。通过使用 SPF 记录,邮件接收服务器可以检查发送方 IP 地址是否被列入授权的 IP 地址列表中,从而减少垃圾邮件和电子邮件欺诈的风险。

SPF 记录的名称通常是类似于下面这样的:

example.com.    IN    TXT    "v=spf1 mx a:mail.example.com -all"

其中,example.com 是你的域名,v=spf1 是 SPF 记录的版本号,mx 表示允许域名的 MX 记录中列出的邮件服务器发送电子邮件,a:mail.example.com 表示允许特定 IP 地址的邮件服务器发送电子邮件,-all 表示拒绝所有未列入授权 IP 地址列表中的其他邮件服务器发送电子邮件。

在 SPF 记录中,你可以添加多个条目来授权多个 IP 地址和邮件服务器发送电子邮件。当邮件接收服务器收到一封电子邮件时,它会检查发送方 IP 地址是否在域名的 SPF 记录中列出,并根据 SPF 记录的设置来确定是否接受该电子邮件。如果 SPF 记录中未列出发送方 IP 地址,则接收方邮件服务器可能会将该邮件标记为垃圾邮件或拒绝接收。

在 Cloudflare 中选择 TXT 记录,然后在记录值中填入 MXRoute 发送过来的记录值。

DKIM 记录

DKIM(DomainKeys Identified Mail)记录的名字通常是类似于下面这样的:

dkim._domainkey.example.com

其中,example.com 是你的域名,而 default._domainkey 是一个固定的字符串,表示这是一个 DKIM 记录。如果你有多个域名需要签名验证,则需要为每个域名创建一个相应的 DKIM 记录。

在 DNS 中添加 DKIM 记录时,需要将该记录类型设置为 TXT,并将 DKIM 信息放入记录的值字段中。DKIM 信息包括用于签名验证的公钥和用于加密 DKIM 签名的私钥。在 DKIM 记录中,公钥通常以 “k=” 开头,如下所示:

v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC...

当其他邮件服务器收到一封使用 DKIM 签名的电子邮件时,它们会检查该域名的 DNS 来查找 DKIM 记录,并使用公钥来验证该邮件的 DKIM 签名。如果签名验证成功,则说明该邮件确实是由该域名的授权发送者发送的,而不是伪造的垃圾邮件。

DKIM 记录没有在邮箱中,需要在 MXRoute 管理后台,找到 「帐号管理」 -> 「DKIM keys(USE ONLY DKIM KEY)」,然后复制 DKIM 值。

OUxy

然后在 Cloudflare 中添加 TXT 记录,Name 填写 dkim._domainkey,值就填写上面拷贝出来的值即可。记住如果是配置的子域名,可能需要自行调整一下记录的 Name。

配置 DMARC 记录

虽然 DMARC 记录是可选的,但是为了追求完美,还是建议配置 DMARC 记录

DMARC 记录通常是

_dmarc.example.com.    IN    TXT    "v=DMARC1; p=reject; rua=mailto:dmarc@example.com"

一般直接建议配置一个:

v=DMARC1; p=none;, p=reject;, p=quarantine;

邮箱客户端配置

在 MXRoute 后台配置完域名之后,可以在「邮件管理器」->「邮箱帐号」 中添加域名邮箱,然后就可以在任意的邮件客户端使用 IMAP ,或者使用 MXRoute 提供的网页([[Roundcube]])客户端来发送或接受邮件。IMAP 的连接地址在邮件中,用户名和密码就是添加邮箱的时候设置的。

最后测试

打开网站 https://www.mail-tester.com/, 之前几篇将 Self-hosted Email 的文章中也提到过,可以用来检测邮件服务器的得分(从各个方面判定邮件会不会进入垃圾邮箱)。打开这个网站之后,会生成一个随机的邮箱,使用自定义的域名邮箱向这个邮箱发送一封邮件(标题和内容随意),发送后点击页面中的 Then check your score 按钮,即可查看分数。正常如果得到 10 分才算是正常,如果不是,则按里面的要求进行改进,一般都是 DNS 配置错误。或者 如果发信的 IP 地址在黑名单中,也可能导致分数不好看。

最后的最后

MXRoute 不仅提供了邮件中显示的 Roundcube 的 Web Client,还可以登录 https://mail.mxlogin.com 这个客户端来收发邮件。这个客户端还不仅提供邮件的功能,还能作为 NextCloud 来管理自己的文件。

Oceh

同时登录的时候还可以选择自己喜欢的 Web Client。

OMCC

我现在也通过 EV Hosting 来售卖 MXRoute 的邮箱服务,可以以比官方更便宜的价格最低套餐一年只需要 50 元来使用 MXRoute 的服务。

reference


2023-03-25 mxroute , email-hosting , email-server , email , email-service , email-route , provider

AI 支持的编辑器 Cursor 使用体验

Cursor 编辑器是一个由 AI 支持的,可以通过自然语言进行交互编程的代码编辑器。很早就了解了 Cursor 编辑器,但是觉得比较鸡肋日常编程因为使用 IDEA 继承不太方便所以一直就没有怎么深入体验。但是最近遇到要看一个 Ruby 的项目,我没有学过 Ruby,所以就一下子想到了用这个编辑器来辅助我看 Ruby 的项目,一用之下才完全超出了我的想象,在我阅读 Ruby 项目的时候完全可以充当一个很好的老师。

9bpn

优点

Cursor 的这种会话式交互编程感觉在未来一段时间内将完全改变编程的习惯。虽然目前还只能在 Cursor 自己的编辑器中使用。未来成熟之后不知道能不能在常用的编辑器上用起来。

Cursor 集成了 [[GitHub Copilot]],直接可以在界面中登录使用。

O27i

不足

目前 Cursor 编辑器还是非常简陋,大概只能算得上一个文本编辑器,称不上 IDE,虽然支持了很多编程语言的自动补全以及语法高亮,但是没有内置的调试,运行等等编码相关的功能。

稳定性不足

因为 Cursor 依赖 OpenAI 所以一个良好的网络环境, 以及 OpanAI 的稳定性直接影响了 Cursor 的使用体验。

OgyX


2023-03-24 cursor , editor , programming , ai , ide , visual-code

电子书

本站提供服务

最近文章

  • AI Shell 让 AI 在命令行下提供 Shell 命令 AI Shell 是一款在命令行下的 AI 自动补全工具,当你想要实现一个功能,敲一大段命令又记不住的时候,使用自然语言让 AI 给你生成一个可执行的命令,然后确认之后执行。
  • 最棒的 Navidrome 音乐客户端 Sonixd(Feishin) Sonixd 是一款跨平台的音乐播放器,可以使用 [[Subsonic API]],兼容 Jellyfin,[[Navidrome]],Airsonic,Airsonic-Advanced,Gonic,Astiga 等等服务端。 Sonixd 是一款跨平台的音乐播放器,可以使用 [[Subsonic API]],兼容 Jellyfin,[[Navidrome]],Airsonic,Airsonic-Advanced,Gonic,Astiga 等等服务端。
  • 中心化加密货币交易所 Gate 注册以及认证 Gate.io 是一个中心化的加密货币交易所。Gate 中文通常被称为「芝麻开门」,Gate 创立于 2013 年,前身是比特儿,是一家致力于安全、稳定的数字货币交易所,支持超过 1600 种数字货币的交易,提供超过 2700 个交易对。
  • 不重启的情况下重新加载 rTorrent 配置文件 因为我在 Screen 下使用 rTorrent,最近经常调试修改 rtorrent.rc 配置文件,所以想要找一个方法可以在不重启 rTorrent 的情况重新加载配置文件,网上调查了一下之后发现原来挺简单的。
  • Go 语言编写的网络穿透工具 chisel chisel 是一个在 HTTP 协议上的 TCP/UDP 隧道,使用 Go 语言编写,10.9 K 星星。