From 1cc72684d627c80f268032eebc79627826a2db53 Mon Sep 17 00:00:00 2001 From: Wu Tong Date: Wed, 18 Sep 2024 20:11:01 +0800 Subject: [PATCH 1/3] =?UTF-8?q?docker=E7=89=88=E6=9C=AC=E5=88=9B=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .dockerignore | 3 + Dockerfile | 24 +++++++ docker.sh | 9 +++ entrypoint.py | 71 ++++++++++++++++++++ entrypoint.sh | 18 +++++ install.sh | 177 ++++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 302 insertions(+) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 docker.sh create mode 100644 entrypoint.py create mode 100644 entrypoint.sh create mode 100644 install.sh diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..eaa04b49 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +Dockerfile +docker.sh +install.sh \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..4097c7ed --- /dev/null +++ b/Dockerfile @@ -0,0 +1,24 @@ +# 使用python3.9作为基础镜像 +FROM mcr.microsoft.com/playwright/python:v1.31.1 + +# 设置数据卷 +VOLUME [ "/amiyabot" ] + +# 设置工作目录 +WORKDIR /app + +# 守护端口 +EXPOSE 8088 + +# 拷贝当前目录下的所有文件到工作目录 +COPY requirements.txt /app +COPY amiyabot.tar.gz /app +COPY entrypoint.sh /app +COPY entrypoint.py /app + +# 安装依赖 +RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple +RUN playwright install --with-deps chromium + +# 启动命令 +ENTRYPOINT [ "bash", "entrypoint.sh" ] diff --git a/docker.sh b/docker.sh new file mode 100644 index 00000000..57e41a24 --- /dev/null +++ b/docker.sh @@ -0,0 +1,9 @@ +echo -n "请输入版本号: " +read version + +# 压缩文件 +tar -zcvf amiyabot.tar.gz --exclude=.git --exclude=.vscode --exclude=.idea --exclude=docker.sh \ + --exclude=entrypoint.sh --exclude=install.sh --exclude=Dockerfile --exclude=amiyabot.tar.gz \ + * + +docker build -t amiyabot/amiyabot:$version . \ No newline at end of file diff --git a/entrypoint.py b/entrypoint.py new file mode 100644 index 00000000..c2ee54d8 --- /dev/null +++ b/entrypoint.py @@ -0,0 +1,71 @@ +import os +from pathlib import Path + +try: + import yaml +except ImportError: + import subprocess + + subprocess.run(["pip", "install", "pyyaml"]) + import yaml + +config_path = Path('config') + +def load_config(name: str) -> dict: + with open(config_path / f'{name}.yaml', 'r') as f: + return yaml.safe_load(f) + +def save_config(name: str, config: dict) -> None: + with open(config_path / f'{name}.yaml', 'w') as f: + yaml.safe_dump(config, f, encoding='utf-8', allow_unicode=True) + +def set_database(): + config = load_config('database') + if 'ENABLE_MYSQL' in os.environ and os.environ['ENABLE_MYSQL']: + config['mode'] = 'mysql' + else: + return + if 'MYSQL_HOST' in os.environ and os.environ['MYSQL_HOST']: + config['config']['host'] = os.environ['MYSQL_HOST'] + if 'MYSQL_PORT' in os.environ and os.environ['MYSQL_PORT']: + config['config']['port'] = os.environ['MYSQL_PORT'] + if 'MYSQL_USER' in os.environ and os.environ['MYSQL_USER']: + config['config']['user'] = os.environ['MYSQL_USER'] + if 'MYSQL_PASSWORD' in os.environ and os.environ['MYSQL_PASSWORD']: + config['config']['password'] = os.environ['MYSQL_PASSWORD'] + save_config('database', config) + + +def set_prefix(): + config = load_config('prefix') + if 'PREFIX' in os.environ and os.environ['PREFIX']: + if os.environ['PREFIX'].startswith('[') and os.environ['PREFIX'].endswith(']'): + prefixs = os.environ['PREFIX'][1:-1].split(',') + new = [] + for prefix in prefixs: + # remove space + new.append(prefix.strip().replace('\'', '').replace('\"', '').replace('`', '')) + prefixs = new + else: + prefixs = [os.environ['PREFIX']] + config['prefix_keywords'] = prefixs + save_config('prefix', config) + + +def set_server(): + config = load_config('server') + config['host'] = '0.0.0.0' + if 'AUTH' in os.environ and os.environ['AUTH']: + config['authKey'] = os.environ['AUTH'] + save_config('server', config) + + +def main(): + set_database() + set_prefix() + set_server() + + +if __name__ == '__main__': + main() + \ No newline at end of file diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100644 index 00000000..f3511d0e --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +BOT_FOLDER=/amiyabot + +if [ ! -f "$BOT_FOLDER/first_run" ]; then + # step 1: 解压bot本体 + tar -zxvf amiyabot.tar.gz -C $BOT_FOLDER + # step 2: 进入bot目录 + cd $BOT_FOLDER + # step 3: 初始化配置文件 + python entrypoint.py + # step 4: 标记已初始化 + touch first_run +fi + +# step 5: 运行bot +cd $BOT_FOLDER +python amiya.py \ No newline at end of file diff --git a/install.sh b/install.sh new file mode 100644 index 00000000..d0e495e8 --- /dev/null +++ b/install.sh @@ -0,0 +1,177 @@ +#!/bin/bash + +# step 1: 准备docker环境 +if [ -x "$(command -v docker)" ]; then + echo "Docker 已安装" +else + echo "Docker 未安装, 开始安装..." + sudo apt-get update + sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common + curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - + sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" + sudo apt-get update + sudo apt-get install -y docker-ce +fi + +# step 2: 收集环境变量 +while true; do + echo -n "是否启用mysql? [y/n] (默认: 使用sqlite): " + read mysql_enable + if [ "$mysql_enable" ]; then + if [ "$mysql_enable" = "y" ] || [ "$mysql_enable" = "Y" ]; then + mysql_enable=true + echo -n "请输入mysql主机地址 (默认: 127.0.0.1): " + read mysql_host + echo -n "请输入mysql端口 (默认: 3306): " + read mysql_port + echo -n "请输入mysql用户名: " + read mysql_user + echo -n "请输入mysql密码: " + read mysql_password + break + elif [ "$mysql_enable" = "n" ] || [ "$mysql_enable" = "N" ]; then + mysql_enable=false + break + else + echo "请输入y或n" + continue + fi + else + echo "请输入y或n" + continue + fi + done + +while true; do + echo -n "是否修改前缀? [y/n] (默认: 兔兔): " + read prefix_enable + if [ "$prefix_enable" ]; then + if [ "$prefix_enable" = "y" ] || [ "$prefix_enable" = "Y" ]; then + echo -n "请输入前缀, 用','分隔: " + read prefix + # 将前缀转换为python列表 + prefix="[\"$(echo $prefix | sed 's/,/\",\"/g')\"]" + break + elif [ "$prefix_enable" = "n" ] || [ "$prefix_enable" = "N" ]; then + break + else + echo "请输入y或n" + continue + fi + else + echo "请输入y或n" + continue + fi + done + +while true; do + echo -n "是否修改AuthKey? [y/n] (默认: 无): " + read auth_enable + if [ "$auth_enable" ]; then + if [ "$auth_enable" = "y" ] || [ "$auth_enable" = "Y" ]; then + echo -n "请输入AuthKey: " + read auth + break + elif [ "$auth_enable" = "n" ] || [ "$auth_enable" = "N" ]; then + break + else + echo "请输入y或n" + continue + fi + else + echo "请输入y或n" + continue + fi + done + +while true; do + echo -n "是否修改端口? [y/n] (默认: 8088): " + read port_enable + if [ "$port_enable" ]; then + if [ "$port_enable" = "y" ] || [ "$port_enable" = "Y" ]; then + echo -n "请输入端口: " + read port + break + elif [ "$port_enable" = "n" ] || [ "$port_enable" = "N" ]; then + port=8088 + break + else + echo "请输入y或n" + continue + fi + else + echo "请输入y或n" + continue + fi + done + +# # step 3: 运行docker + +while true; do + echo -n "是否将amiyabot挂载到本地? [y/n] (默认挂载到amiyabot存储卷): " + read mount_enable + if [ "$mount_enable" ]; then + if [ "$mount_enable" = "y" ] || [ "$mount_enable" = "Y" ]; then + echo -n "请输入挂载路径 (默认: $HOME/amiyabot): " + read mount_path + if [ ! "$mount_path" ]; then + mount_path="$HOME/amiyabot" + fi + break + elif [ "$mount_enable" = "n" ] || [ "$mount_enable" = "N" ]; then + break + else + echo "请输入y或n" + continue + fi + else + echo "请输入y或n" + continue + fi + done + +echo -n "请输入容器名称 (默认: amiyabot): " +read container_name +if [ ! "$container_name" ]; then + container_name="amiyabot" +fi + +command="sudo docker run -d --name $container_name" +if [ "$mysql_enable" = true ]; then + command="$command -e ENABLE_MYSQL=true -e MYSQL_HOST=$mysql_host -e MYSQL_PORT=$mysql_port -e MYSQL_USER=$mysql_user -e MYSQL_PASSWORD=$mysql_password" +fi +if [ "$prefix" ]; then + command="$command -e PREFIX=\"$prefix\"" +fi +if [ "$auth" ]; then + command="$command -e AUTH=$auth" +fi +if [ "$port" ]; then + command="$command -p $port:8088" +fi +if [ "$mount_path" ]; then + command="$command -v $mount_path:/amiyabot" +else + command="$command -v amiyabot:/amiyabot" +fi +command="$command amiyabot/amiyabot:latest" + +while true; do + echo "即将运行命令: $command, 是否继续? [y/n] (默认: n)" + read confirm + if [ "$confirm" ]; then + if [ "$confirm" = "y" ]; then + eval $command + break + elif [ "$confirm" = "n" ]; then + echo "已取消" + break + else + echo "请输入y或n" + continue + fi + else + echo "请输入y或n" + continue + fi + done \ No newline at end of file From cf1e171a1a02b11e1ea1f7bd782e42293107bdaa Mon Sep 17 00:00:00 2001 From: Wu Tong Date: Wed, 18 Sep 2024 20:28:25 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=96=B0=E5=BB=BAaction?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/docker-build.yaml | 31 +++++++++++++++++++++++++++++ Dockerfile | 5 +++-- docker.sh | 9 --------- 3 files changed, 34 insertions(+), 11 deletions(-) create mode 100644 .github/workflows/docker-build.yaml delete mode 100644 docker.sh diff --git a/.github/workflows/docker-build.yaml b/.github/workflows/docker-build.yaml new file mode 100644 index 00000000..fadc9b1d --- /dev/null +++ b/.github/workflows/docker-build.yaml @@ -0,0 +1,31 @@ +name: ci + +on: + push: + +jobs: + docker: + runs-on: ubuntu-latest + steps: + - + name: Checkout + uses: actions/checkout@v4 + - + name: Set up QEMU + uses: docker/setup-qemu-action@v3 + - + name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - + name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - + name: Build and push + uses: docker/build-push-action@v6 + with: + context: . + push: true + tags: amiyabot/amiyabot:latest \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 4097c7ed..8cda4fb4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,9 +12,10 @@ EXPOSE 8088 # 拷贝当前目录下的所有文件到工作目录 COPY requirements.txt /app -COPY amiyabot.tar.gz /app COPY entrypoint.sh /app -COPY entrypoint.py /app +COPY . /temp +RUN tar -zcvf amiyabot.tar.gz --exclude=/temp/.git --exclude=/temp/.vscode --exclude=/temp/.idea --exclude=/temp/docker.sh \ + --exclude=/temp/entrypoint.sh --exclude=/temp/install.sh --exclude=/temp/Dockerfile /temp/* # 安装依赖 RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple diff --git a/docker.sh b/docker.sh deleted file mode 100644 index 57e41a24..00000000 --- a/docker.sh +++ /dev/null @@ -1,9 +0,0 @@ -echo -n "请输入版本号: " -read version - -# 压缩文件 -tar -zcvf amiyabot.tar.gz --exclude=.git --exclude=.vscode --exclude=.idea --exclude=docker.sh \ - --exclude=entrypoint.sh --exclude=install.sh --exclude=Dockerfile --exclude=amiyabot.tar.gz \ - * - -docker build -t amiyabot/amiyabot:$version . \ No newline at end of file From 85ce0b312ef75c78556f4bdd8d7b5a6541e1b7a0 Mon Sep 17 00:00:00 2001 From: Wu Tong Date: Wed, 18 Sep 2024 20:33:58 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=88=A0=E9=99=A4pypi=E9=95=9C=E5=83=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 8cda4fb4..9c3e35a2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,7 +18,7 @@ RUN tar -zcvf amiyabot.tar.gz --exclude=/temp/.git --exclude=/temp/.vscode --exc --exclude=/temp/entrypoint.sh --exclude=/temp/install.sh --exclude=/temp/Dockerfile /temp/* # 安装依赖 -RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple +RUN pip install -r requirements.txt RUN playwright install --with-deps chromium # 启动命令