mirror of
				https://github.com/nonebot/nonebot2.git
				synced 2025-11-04 08:56:42 +00:00 
			
		
		
		
	🔖 Release 2.3.2
This commit is contained in:
		@@ -0,0 +1,299 @@
 | 
			
		||||
---
 | 
			
		||||
sidebar_position: 3
 | 
			
		||||
description: 部署你的机器人
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
# 部署
 | 
			
		||||
 | 
			
		||||
import Tabs from "@theme/Tabs";
 | 
			
		||||
import TabItem from "@theme/TabItem";
 | 
			
		||||
 | 
			
		||||
在编写完成各类插件后,我们需要长期运行机器人来使得用户能够正常使用。通常,我们会使用云服务器来部署机器人。
 | 
			
		||||
 | 
			
		||||
我们在开发插件时,机器人运行的环境称为开发环境;而在部署后,机器人运行的环境称为生产环境。与开发环境不同的是,在生产环境中,开发者通常不能随意地修改/添加/删除代码,开启或停止服务。
 | 
			
		||||
 | 
			
		||||
## 部署前准备
 | 
			
		||||
 | 
			
		||||
### 项目依赖管理
 | 
			
		||||
 | 
			
		||||
由于部署后的机器人运行在生产环境中,因此,为确保机器人能够正常运行,我们需要保证机器人的运行环境与开发环境一致。我们可以通过以下几种方式来进行依赖管理:
 | 
			
		||||
 | 
			
		||||
<Tabs groupId="tool">
 | 
			
		||||
  <TabItem value="poetry" label="Poetry" default>
 | 
			
		||||
 | 
			
		||||
[Poetry](https://python-poetry.org/) 是一个 Python 项目的依赖管理工具。它可以通过声明项目所依赖的库,为你管理(安装/更新)它们。Poetry 提供了一个 `poetry.lock` 文件,以确保可重复安装,并可以构建用于分发的项目。
 | 
			
		||||
 | 
			
		||||
Poetry 会在安装依赖时自动生成 `poetry.lock` 文件,在**项目目录**下执行以下命令:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
# 初始化 poetry 配置
 | 
			
		||||
poetry init
 | 
			
		||||
# 添加项目依赖,这里以 nonebot2[fastapi] 为例
 | 
			
		||||
poetry add nonebot2[fastapi]
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
  </TabItem>
 | 
			
		||||
  <TabItem value="pdm" label="PDM">
 | 
			
		||||
 | 
			
		||||
[PDM](https://pdm.fming.dev/) 是一个现代 Python 项目的依赖管理工具。它采用 [PEP621](https://www.python.org/dev/peps/pep-0621/) 标准,依赖解析快速;同时支持 [PEP582](https://www.python.org/dev/peps/pep-0582/) 和 [virtualenv](https://virtualenv.pypa.io/)。PDM 提供了一个 `pdm.lock` 文件,以确保可重复安装,并可以构建用于分发的项目。
 | 
			
		||||
 | 
			
		||||
PDM 会在安装依赖时自动生成 `pdm.lock` 文件,在**项目目录**下执行以下命令:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
# 初始化 pdm 配置
 | 
			
		||||
pdm init
 | 
			
		||||
# 添加项目依赖,这里以 nonebot2[fastapi] 为例
 | 
			
		||||
pdm add nonebot2[fastapi]
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
  </TabItem>
 | 
			
		||||
  <TabItem value="pip" label="pip">
 | 
			
		||||
 | 
			
		||||
[pip](https://pip.pypa.io/) 是 Python 包管理工具。他并不是一个依赖管理工具,为了尽可能保证环境的一致性,我们可以使用 `requirements.txt` 文件来声明依赖。
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
pip freeze > requirements.txt
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
  </TabItem>
 | 
			
		||||
</Tabs>
 | 
			
		||||
 | 
			
		||||
### 安装 Docker
 | 
			
		||||
 | 
			
		||||
[Docker](https://www.docker.com/) 是一个应用容器引擎,可以让开发者打包应用以及依赖包到一个可移植的镜像中,然后发布到服务器上。
 | 
			
		||||
 | 
			
		||||
我们可以参考 [Docker 官方文档](https://docs.docker.com/get-docker/) 来安装 Docker 。
 | 
			
		||||
 | 
			
		||||
在 Linux 上,我们可以使用以下一键脚本来安装 Docker 以及 Docker Compose Plugin:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
curl -fsSL https://get.docker.com | sh -s -- --mirror Aliyun
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
在 Windows/macOS 上,我们可以使用 [Docker Desktop](https://docs.docker.com/desktop/) 来安装 Docker 以及 Docker Compose Plugin。
 | 
			
		||||
 | 
			
		||||
### 安装脚手架 Docker 插件
 | 
			
		||||
 | 
			
		||||
我们可以使用 [nb-cli-plugin-docker](https://github.com/nonebot/cli-plugin-docker) 来快速部署机器人。
 | 
			
		||||
 | 
			
		||||
插件可以帮助我们生成配置文件并构建 Docker 镜像,以及启动/停止/重启机器人。使用以下命令安装脚手架 Docker 插件:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
nb self install nb-cli-plugin-docker
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Docker 部署
 | 
			
		||||
 | 
			
		||||
### 快速部署
 | 
			
		||||
 | 
			
		||||
使用脚手架命令即可一键生成配置并部署:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
nb docker up
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
当看到 `Running` 字样时,说明机器人已经启动成功。我们可以通过以下命令来查看机器人的运行日志:
 | 
			
		||||
 | 
			
		||||
<Tabs groupId="deploy-tool">
 | 
			
		||||
  <TabItem value="nb-cli" label="NB CLI" default>
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
nb docker logs
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
  </TabItem>
 | 
			
		||||
  <TabItem value="docker-compose" label="Docker Compose">
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
docker compose logs
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
  </TabItem>
 | 
			
		||||
</Tabs>
 | 
			
		||||
 | 
			
		||||
如果需要停止机器人,我们可以使用以下命令:
 | 
			
		||||
 | 
			
		||||
<Tabs groupId="deploy-tool">
 | 
			
		||||
  <TabItem value="nb-cli" label="NB CLI" default>
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
nb docker down
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
  </TabItem>
 | 
			
		||||
  <TabItem value="docker-compose" label="Docker Compose">
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
docker compose down
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
  </TabItem>
 | 
			
		||||
</Tabs>
 | 
			
		||||
 | 
			
		||||
### 自定义部署
 | 
			
		||||
 | 
			
		||||
在部分情况下,我们需要事先生成 Docker 配置文件,再到生产环境进行部署;或者自动生成的配置文件并不能满足复杂场景,需要根据实际需求手动修改配置文件。我们可以使用以下命令来生成基础配置文件:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
nb docker generate
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
nb-cli 将会在项目目录下生成 `docker-compose.yml` 和 `Dockerfile` 等配置文件。在 nb-cli 完成配置文件的生成后,我们可以根据部署环境的实际情况使用 nb-cli 或者 Docker Compose 来启动机器人。
 | 
			
		||||
 | 
			
		||||
我们可以参考 [Dockerfile 文件规范](https://docs.docker.com/engine/reference/builder/)和 [Compose 文件规范](https://docs.docker.com/compose/compose-file/)修改这两个文件。
 | 
			
		||||
 | 
			
		||||
修改完成后我们可以直接启动或者手动构建镜像:
 | 
			
		||||
 | 
			
		||||
<Tabs groupId="deploy-tool">
 | 
			
		||||
  <TabItem value="nb-cli" label="NB CLI" default>
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
# 启动机器人
 | 
			
		||||
nb docker up
 | 
			
		||||
# 手动构建镜像
 | 
			
		||||
nb docker build
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
  </TabItem>
 | 
			
		||||
  <TabItem value="docker-compose" label="Docker Compose">
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
# 启动机器人
 | 
			
		||||
docker compose up -d
 | 
			
		||||
# 手动构建镜像
 | 
			
		||||
docker compose build
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
  </TabItem>
 | 
			
		||||
</Tabs>
 | 
			
		||||
 | 
			
		||||
### 持续集成
 | 
			
		||||
 | 
			
		||||
我们可以使用 GitHub Actions 来实现持续集成(CI),我们只需要在 GitHub 上发布 Release 即可自动构建镜像并推送至镜像仓库。
 | 
			
		||||
 | 
			
		||||
首先,我们需要在 [Docker Hub](https://hub.docker.com/) (或者其他平台,如:[GitHub Packages](https://github.com/features/packages)、[阿里云容器镜像服务](https://www.alibabacloud.com/zh/product/container-registry)等)上创建镜像仓库,用于存放镜像。
 | 
			
		||||
 | 
			
		||||
前往项目仓库的 `Settings` > `Secrets` > `actions` 栏目 `New Repository Secret` 添加构建所需的密钥:
 | 
			
		||||
 | 
			
		||||
- `DOCKERHUB_USERNAME`: 你的 Docker Hub 用户名
 | 
			
		||||
- `DOCKERHUB_TOKEN`: 你的 Docker Hub PAT([创建方法](https://docs.docker.com/docker-hub/access-tokens/))
 | 
			
		||||
 | 
			
		||||
将以下文件添加至**项目目录**下的 `.github/workflows/` 目录下,并将文件中高亮行中的仓库名称替换为你的仓库名称:
 | 
			
		||||
 | 
			
		||||
```yaml title=.github/workflows/build.yml
 | 
			
		||||
name: Docker Hub Release
 | 
			
		||||
 | 
			
		||||
on:
 | 
			
		||||
  push:
 | 
			
		||||
    tags:
 | 
			
		||||
      - "v*"
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  docker:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Checkout
 | 
			
		||||
        uses: actions/checkout@v3
 | 
			
		||||
 | 
			
		||||
      - name: Set up QEMU
 | 
			
		||||
        uses: docker/setup-qemu-action@v2
 | 
			
		||||
 | 
			
		||||
      - name: Setup Docker
 | 
			
		||||
        uses: docker/setup-buildx-action@v2
 | 
			
		||||
 | 
			
		||||
      - name: Login to DockerHub
 | 
			
		||||
        uses: docker/login-action@v2
 | 
			
		||||
        with:
 | 
			
		||||
          username: ${{ secrets.DOCKERHUB_USERNAME }}
 | 
			
		||||
          password: ${{ secrets.DOCKERHUB_TOKEN }}
 | 
			
		||||
 | 
			
		||||
      - name: Generate Tags
 | 
			
		||||
        uses: docker/metadata-action@v4
 | 
			
		||||
        id: metadata
 | 
			
		||||
        with:
 | 
			
		||||
          images: |
 | 
			
		||||
            # highlight-next-line
 | 
			
		||||
            {organization}/{repository}
 | 
			
		||||
          tags: |
 | 
			
		||||
            type=semver,pattern={{version}}
 | 
			
		||||
            type=semver,pattern={{major}}.{{minor}}
 | 
			
		||||
            type=sha
 | 
			
		||||
 | 
			
		||||
      - name: Build and Publish
 | 
			
		||||
        uses: docker/build-push-action@v4
 | 
			
		||||
        with:
 | 
			
		||||
          context: .
 | 
			
		||||
          push: true
 | 
			
		||||
          tags: ${{ steps.metadata.outputs.tags }}
 | 
			
		||||
          labels: ${{ steps.metadata.outputs.labels }}
 | 
			
		||||
          cache-from: type=gha
 | 
			
		||||
          cache-to: type=gha,mode=max
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### 持续部署
 | 
			
		||||
 | 
			
		||||
在完成发布并构建镜像后,我们可以自动将镜像部署到服务器上。
 | 
			
		||||
 | 
			
		||||
前往项目仓库的 `Settings` > `Secrets` > `actions` 栏目 `New Repository Secret` 添加部署所需的密钥:
 | 
			
		||||
 | 
			
		||||
- `DEPLOY_HOST`: 部署服务器的 SSH 地址
 | 
			
		||||
- `DEPLOY_USER`: 部署服务器用户名
 | 
			
		||||
- `DEPLOY_KEY`: 部署服务器私钥([创建方法](https://github.com/appleboy/ssh-action#setting-up-a-ssh-key))
 | 
			
		||||
- `DEPLOY_PATH`: 部署服务器上的项目路径
 | 
			
		||||
 | 
			
		||||
将以下文件添加至**项目目录**下的 `.github/workflows/` 目录下,在构建成功后触发部署:
 | 
			
		||||
 | 
			
		||||
```yaml title=.github/workflows/deploy.yml
 | 
			
		||||
name: Deploy
 | 
			
		||||
 | 
			
		||||
on:
 | 
			
		||||
  workflow_run:
 | 
			
		||||
    workflows:
 | 
			
		||||
      - Docker Hub Release
 | 
			
		||||
    types:
 | 
			
		||||
      - completed
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  deploy:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    if: ${{ github.event.workflow_run.conclusion == 'success' }}
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Start Deployment
 | 
			
		||||
        uses: bobheadxi/deployments@v1
 | 
			
		||||
        id: deployment
 | 
			
		||||
        with:
 | 
			
		||||
          step: start
 | 
			
		||||
          token: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
          env: bot
 | 
			
		||||
 | 
			
		||||
      - name: Run Remote SSH Command
 | 
			
		||||
        uses: appleboy/ssh-action@master
 | 
			
		||||
        env:
 | 
			
		||||
          DEPLOY_PATH: ${{ secrets.DEPLOY_PATH }}
 | 
			
		||||
        with:
 | 
			
		||||
          host: ${{ secrets.DEPLOY_HOST }}
 | 
			
		||||
          username: ${{ secrets.DEPLOY_USER }}
 | 
			
		||||
          key: ${{ secrets.DEPLOY_KEY }}
 | 
			
		||||
          envs: DEPLOY_PATH
 | 
			
		||||
          script: |
 | 
			
		||||
            cd $DEPLOY_PATH
 | 
			
		||||
            docker compose up -d --pull always
 | 
			
		||||
 | 
			
		||||
      - name: update deployment status
 | 
			
		||||
        uses: bobheadxi/deployments@v0.6.2
 | 
			
		||||
        if: always()
 | 
			
		||||
        with:
 | 
			
		||||
          step: finish
 | 
			
		||||
          token: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
          status: ${{ job.status }}
 | 
			
		||||
          env: ${{ steps.deployment.outputs.env }}
 | 
			
		||||
          deployment_id: ${{ steps.deployment.outputs.deployment_id }}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
将上一部分的 `docker-compose.yml` 文件以及 `.env.prod` 配置文件添加至 `DEPLOY_PATH` 目录下,并修改 `docker-compose.yml` 文件中的镜像配置,替换为 Docker Hub 的仓库名称:
 | 
			
		||||
 | 
			
		||||
```diff
 | 
			
		||||
- build: .
 | 
			
		||||
+ image: {organization}/{repository}:latest
 | 
			
		||||
```
 | 
			
		||||
		Reference in New Issue
	
	Block a user