Skip to content

自行部署(构建第三方实例)

绅士喵 edited this page Jun 2, 2022 · 46 revisions

前言

自行部署 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 和 Docker Compose

这里不对 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 的使用

通过 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 页面只是临时记录相关内容,在项目更稳定的未来会迁移到官网的相关页面中。

Clone this wiki locally