-
Notifications
You must be signed in to change notification settings - Fork 105
自行部署(构建第三方实例)
自行部署 Policr Mini 非常容易,有基本的服务器操作知识就能无障碍做到。本文详细的介绍了过程,虽然看起来有些冗长,但核心步骤却极其的简单。
目前你需要掌握以下技能(具备初级使用经验即可开始操作):
- TG bot 的申请和设置
- Docker 和 Docker Compose
- Nginx 反向代理(可选)
- Cloudflare 的使用(抵御攻击,可选)
- 主机商的防火墙设置(抵御攻击,可选)
使用 BotFather 选择你的 bot,打开 Edit Bot 菜单,再点击 Edit About。
这里并不是教你怎么写机器人的 info,而是附带两个小小的统一的约定。一是保证 about 信息中包含有你自己的官网主页链接,这里不举例。二是在最后一个新行写入(电脑用户请使用 Ctrl + Enter 组合键换行):
Powered by Policr Mini
作为本项目的第三方实例,只需要添加上面那条就够了。不需要在 USERNAME 或名称上带有 Policr Mini 相关的内容,也不建议。
希望能规范添加相关文字,不要有空格、换行或大小写问题。因为强迫症看了会难受。
跟着本章节安装必要软件、创建必要文件/目录。这些是让机器人能在容器中成功启动的前提。
这里不对 Docker 相关软件的安装做步骤描述,因为互联网上已经有充分的资料。所以这里总结了一些常见的资料链接。
对于 CentOS/Debian/Fedora/Raspbian/Ubuntu 这些系统而言,请参照 Docker 官方的页面。注意,这些系统请不要使用默认源中的 Docker 包,因为它们提供的版本普遍太低。
对于其它系统,如果你有较好的英文阅读能力(或使用翻译软件),推荐按照系统官方的步骤走。如果没有,请 Google 搜索 "系统名称 docker install" 查找资料。
如果 Docker 已安装完成,请前往官方页面安装 docker-compose
程序。注意,这是一个单文件二进制程序,你需要跟着步骤设置文件权限并放置到有效的系统目录中。
这里我以用户目录作为根目录,并且预设当前用户的用户名为 bot
。记住以下的路径:
pwd
/home/bot
创建目录:
mkdir policr-mini
创建 docker-compose.yml
和 .env
文件:
touch policr-mini/docker-compose.yml
touch policr-mini/.env
这两个文件是空的,因为我们会在下一章节编辑和解释它们。
此时,文件树如下:
.
└── policr-mini
├── docker-compose.yml
└── .env
从这里开始,我们将进入 policr-mini
目录:
cd policr-mini
将以下文件内容写入 docker-compose.yml
文件中:
version: "3"
services:
db:
image: postgres:12
environment:
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: policr_mini_prod
volumes:
- ${DATA_DIR}/_data:/var/lib/postgresql/data
restart: always
server:
image: telestd/policr-mini
stdin_open: true
ports:
- ${POLICR_MINI_SERVER_PORT}:${POLICR_MINI_SERVER_PORT}
environment:
POLICR_MINI_DATABASE_URL: "ecto://postgres:${POSTGRES_PASSWORD}@db/policr_mini_prod"
POLICR_MINI_DATABASE_POOL_SIZE: ${POLICR_MINI_DATABASE_POOL_SIZE}
POLICR_MINI_SERVER_ROOT_URL: ${POLICR_MINI_SERVER_ROOT_URL}
POLICR_MINI_SERVER_SECRET_KEY_BASE: ${POLICR_MINI_SERVER_SECRET_KEY_BASE}
POLICR_MINI_SERVER_PORT: ${POLICR_MINI_SERVER_PORT}
POLICR_MINI_BOT_TOKEN: ${POLICR_MINI_BOT_TOKEN}
POLICR_MINI_BOT_NAME: ${POLICR_MINI_BOT_NAME}
POLICR_MINI_BOT_OWNER_ID: ${POLICR_MINI_BOT_OWNER_ID}
POLICR_MINI_BOT_ASSETS_PATH: /_assets
POLICR_MINI_BOT_ISSUE_33: "true"
POLICR_MINI_BOT_AUTO_GEN_COMMANDS: ${POLICR_MINI_BOT_AUTO_GEN_COMMANDS}
POLICR_MINI_UNBAN_METHOD: ${POLICR_MINI_UNBAN_METHOD}
POLICR_MINI_OPTS: ${POLICR_MINI_OPTS}
volumes:
- ${DATA_DIR}/_assets:/_assets
restart: always
depends_on:
- db
一般来讲这个文件无需任何编辑,因为它引用了大量的变量。我们只需要对这些变量一一赋值即可,也就是编辑 .env
文件:
DATA_DIR=<填入数据目录> # 别忘了之前的路径。使用 pwd 输出的路径 + policr-mini 目录。例如 /home/bot/policr-mini
POSTGRES_PASSWORD=<填入数据库密码> # 这里自定义一个密码,推荐随机一个较短的 hash 字符串
POLICR_MINI_DATABASE_POOL_SIZE=10 # 数据库连接池的大小,已预设值
POLICR_MINI_SERVER_ROOT_URL=<填入根 URL 地址> # 完成 web 配置以后的访问地址,例如 https://mini.your.domain
POLICR_MINI_SERVER_SECRET_KEY_BASE=<填入密钥> # 推荐随机一个较长的 hash 字符串
POLICR_MINI_SERVER_PORT=<填入端口号> # 例如 8080
POLICR_MINI_BOT_NAME=<填入机器人名称> # 请使用自己的机器人的名字
POLICR_MINI_BOT_TOKEN=<填入机器人 Token> # 这里不解释了
POLICR_MINI_BOT_OWNER_ID=<填入机器人拥有者的 ID> # 就是机器人主人的 TG 账号的 ID
POLICR_MINI_BOT_AUTO_GEN_COMMANDS=true # 是否自动生成机器人命令,已预设值
POLICR_MINI_UNBAN_METHOD=until_date # 解封方法,预设值为过期时间。也可设置为 api_call
POLICR_MINI_OPTS="" # 可选参数,此处预设为空
请根据以上内容和注释填充正确的变量值,注意不需要尖括号(<>
)。另外对以上部分变量进行一些扩充解释:
-
POLICR_MINI_SERVER_ROOT_URL
: 必选变量,用于生成后台链接。如果/login
命令生成的链接无法访问,可能是此处配置不正确。如果确保此变量的地址是正确的,那么可能是对 web 服务的代理出现了问题。记住,本项目 web 是不可或缺的一部分。 -
POLICR_MINI_BOT_NAME
: 可选变量,用途是显示官网的 LOGO 文字和网页标题的后缀。因为机器人很多时候名称带有版本信息(显示这些是多余的),所以特地提供一个变量来自定义。当我们定义值为Policr Mini
时,即便机器人当前的名称是 "Policr Mini (beta)" 仍然可以让官网显示为 "Policr Mini",从而去掉了名称中的版本等无关文字。注意:如果不设置这个变量,将直接使用 bot 的名称。 -
POLICR_MINI_BOT_OWNER_ID
: 必选变量,用于后台对最高管理员的身份的识别。这里的 ID 不是用户账号的 USERNAME,是一串数字。在官方 TG 客户端中,几乎不会显示这个 ID。通过向 @userinfobot 发送消息可以获取这个 ID。注意:不要复制任何教程中的 ID。
高级配置
在上面的配置模板中,存在一些注释为”已预设值“的配置字段。已预设值表示它们或许不需要修改,但它们中的一些可能非常有用。以下是已预设值字段的解释:
-
POLICR_MINI_DATABASE_POOL_SIZE
: 数据库连接池的大小。粗略的讲,越小的池服务器消耗越低(数据库内存、CPU 占用低),但是不适合并发高的实例。越大的池,服务器资源消耗越高,但是能应付更大的并发连接,适合并发高的实例。对于仅仅部署用来服务自己的群的实例,将此值设置到尽可能小即可(可小于 10)。目前官方实例此配置的值为10
。 -
POLICR_MINI_BOT_AUTO_GEN_COMMANDS
: 自动生成机器人命令。将此值设置为true
将在每次启动时自动生成或更新机器人的命令列表,不需要再人工通过 BotFather 机器人设置。有时候,您或许想隐藏某些命令或全部命令,则可以将此值设置为false
。
可选配置
可选配置是一系列开关的统一配置位置,这些开关不需要值,因此无需独立配置。当前可选配置存在以下参数:
-
--independent
: 让机器人处于完全独立的运营模式,包括不和官方实例通信(例如获取共享的第三方实例列表)。
可选配置的值就是一个个的可选参数,多个参数用空格间隔开来。例如
POLICR_MINI_OPTS="--independent --<假想的可选参数2>"
提示:如果您想让自己的实例或所服务的用户受到足够的隐私保护,那么建议添加 --independent
可选参数。因为默认情况下部署的第三方实例首页被访问时,客户端浏览器会向官方实例发送请求以获取一些共享数据,这时候官方实例是知道有来自第三方实例用户的请求的,虽然官方实例并在意这些请求数据。
此时已经大功告成,输入命令尝试启动容器:
sudo docker-compose up -d
查看容器日志:
sudo docker logs policr-mini_server_1 # 容器不一定是这个名称
如果输出以下内容,表示启动成功:
18:51:36.899 [info] Already up
18:51:37.170 [info] Running PolicrMiniWeb.Endpoint with cowboy 2.9.0 at :::8080 (http)
18:51:37.174 [info] Access PolicrMiniWeb.Endpoint at http://localhost:8080
18:51:37.401 [info] Checking bot information...
18:51:37.484 [info] Bot (@your_bot_username) is working
如果发生错误,将会启动失败。请复制或截图日志中的报错信息,到社区群求助。一旦问题被解决,再执行 sudo docker-compose up -d
即可。注意:一旦发生修改或镜像升级都需要重新执行这个命令,重启是不会让新东西生效的。
和常规 web 应用程序一样,如上配置的话代理到 http://localhost:8080
即可。
因为 Nginx 涉及到的无关东西太多,例如 SSL 证书等。于是本章节预设了读者有基本的 Nginx 使用经验,所以几乎略过了所有步骤。但不排除未来在有时间的情况下,为没有相关知识的用户补充这部分内容。
通过 Cloudflare 或类似产品提供的解析和代理服务,确保 ip 不会被暴露。因为 ip 一旦暴露可能成为 DDOS 流量攻击的目标。详情请去 Cloudflare 官网自行了解,它的免费服务即可达成目的。
注意:没有防御能力的第三方实例不会成为社区运营实例。因为它太脆弱,无法保障相对稳定的服务。
当然,如果你认为你的机器人只是自己使用,应该不会遭遇攻击,也可以不必做这种步骤。但若要开放服务,为了其它群组着想,请务必考虑。
为了彻底杜绝 ip 暴漏导致的风险,还可以考虑为 80 和 443 端口设置 ip 白名单。参照 Cloudflare 官方的 ip 范围页面 将所有 ip 添加到白名单即可。
当然,像例如 22 这类端口更应设置白名单,通过跳板服务器连入。这样 bot 服务器就彻底的没有为流量攻击创造条件,只能被 CC 攻击。但 CC 攻击可通过 Cloudflare 的防火墙规则或速率限制轻松抵御。实际上,官方实例一直有遭遇 CC 攻击,但是强度太低,甚至不需要防御。
而这一切,都是免费的。
由于官方实例的图片验证资源并非项目的一部分,所以它并不会提供出来。您可以使用 mini-assets 项目制作图片资源,并通过后台线上安装。该项目有非常详细的教程和解释。
如果您当前并不打算制作自己的图片验证资源,也不会影响机器人的工作。因为图片验证会因为没有验证资源而生成失败,将自动切换到后备验证方式上。在不提供图片验证资源的情况下,实例拥有者可通过修改全局默认验证方式(为非图片验证的其它方式),以避免切换到后备验证上。
第三方首先是配置中有独特的部分,例如新的 LOGO 文字,标题后缀。其次,官网的 LOGO 会有一个 T-party
标记,意为 Third-party(第三方)。
未来会有更多的区别于官方的地方,但几乎不会带来主要功能上的差异。
如果是根据原始源代码构建的机器人程序,包括官方提供的镜像,会是相对安全的。因为即便是机器人拥有者也不具备其它群组在后台的「可写」权限。也就是说拥有者至多做到查阅它群的设置(具备可读权限)或者操作机器人退群,并不能修改其它群的设置(包括通过后台封人、踢人都需要可写权限)。
在未来会有接管功能,它可以向指定群组管理员申请临时的可写权限(需要被申请人确认)。这个功能的目的在于帮助他人解决设置问题。
但请记住,程序的安全性不表示机器人的安全性。任何第三方实例的拥有者都可以通过修改源代码或者直接调用 bot API 的方式对具备权限的群做出超出功能限制的行为,所以在使用第三方实例前请确保它足以信任(如果可以,请自行部署)。
本文的发表不表示机器人的完成度已经相当高了,实际上并没有。但这不妨碍对自行部署的尝试或增加社区运营的稳定性考验时间。实际上在正式版本发布以后,镜像一定是带有版本 tag
的,并且有详细的 CHANGELOG,包含升级中需要修改或新增的不兼容部分。因为现在还处于开发阶段,所以并没有这样做。
如果你想让机器人成为将来会被官方推荐的社区运营实例,请在社区群中交流。
注意:此 Wiki 页面只是临时记录相关内容,在项目更稳定的未来会迁移到官网的相关页面中。