Unibot Docker 部署

首先拉取 Ubuntu 镜像:

docker pull ubuntu:20.04 # 这里以 Ubuntu 20.04 为例

用浏览器访问unibot-api.unipjsk.com并导出证书,放在 Unibot 根目录下。

参考 分布式客户端使用文档 | Unibot 使用文档,在 Unibot 根目录下新建Dockerfile

FROM ubuntu:20.04 # 使用上面拉取的 Ubuntu 镜像

COPY bot-3.1.0-cpython-38-x86_64-linux-gnu /usr/local/bin/ # 复制 Unibot 可执行文件
COPY token.yaml / # 复制配置
COPY _.unipjsk.com.crt /usr/local/share/ca-certificates/ # 复制并更新证书
RUN apt-get update && apt-get install -y ca-certificates
RUN update-ca-certificates

ENTRYPOINT ["/usr/local/bin/bot-3.1.0-cpython-310-x86_64-linux-gnu"]

设置镜像时区,在ENTRYPOINT前追加:

ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone && apt install -y tzdata

构建镜像并运行容器:

docker build -t unibot .
docker run -itd --name unibot --network=host unibot

查看运行日志:

docker logs unibot

NoneBot Docker 部署

以下为使用nb-cli启动的例子。

可以使用nb docker generate快速生成配置,请确保已安装nb-cli及其 Docker 插件。

nb self install nb-cli-plugin-docker

根目录下新建Dockerfile

FROM python:3.10 as requirements_stage

WORKDIR /wheel

RUN python -m pip install --user pipx

COPY ./pyproject.toml \
  ./poetry.lock \
  /wheel/

RUN python -m pipx run --no-cache poetry export -f requirements.txt --output requirements.txt --without-hashes
RUN python -m pip wheel --wheel-dir=/wheel --no-cache-dir --requirement ./requirements.txt

COPY ./bot.py /tmp/

FROM ubuntu:22.04

RUN apt-get update && DEBIAN_FRONTEND="noninteractive" apt-get install -y ca-certificates tzdata python3.10 python3.10-gdbm python3-pip python3.10-dev locales locales-all fonts-noto
RUN update-ca-certificates

ENV LANG zh_CN.UTF-8
ENV LANGUAGE zh_CN.UTF-8
ENV LC_ALL zh_CN.UTF-8

WORKDIR /app

ENV TZ Asia/Shanghai
ENV PYTHONPATH=/app

RUN ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone 

ENV APP_MODULE __main__:app
ENV MAX_WORKERS 1

COPY --from=requirements_stage /tmp/bot.py /app
COPY ./docker/_main.py /app
COPY --from=requirements_stage /wheel /wheel

RUN pip install --no-cache-dir gunicorn uvicorn[standard] nonebot2 \
  && pip install --no-cache-dir --no-index --force-reinstall --find-links=/wheel -r /wheel/requirements.txt && rm -rf /wheel
COPY ./start_exec.sh /app/
RUN python3 -m playwright install firefox

ENTRYPOINT ["/app/start_exec.sh"]

根目录下新建docker-compose.yml

version: "3"

x-config-host: &config-host ${HOST:-0.0.0.0}
x-config-port: &config-port ${PORT:-1919}

services:
  nonebot:
    build: .
    ports:
      - *config-port
    env_file:
      - .env.dev
    environment:
      ENVIRONMENT: dev
      HOST: *config-host
      PORT: *config-port
    restart: always
    volumes:
      - .:/app # 挂载bot根目录到容器下

nb-cli Docker 插件常用命令:

nb docker up # 构建镜像并启动容器
nb docker down # 停止正在运行的容器
nb docker generate # 构建镜像
nb docker logs # 输出容器日志

Docker 清理

docker system prune -a

清理无用镜像及构建缓存。