diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..0ffc4e0 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,4 @@ +.git +vendor +__pycache__ +tests diff --git a/.env b/.env index 9cab17b..9385fd9 100644 --- a/.env +++ b/.env @@ -1,8 +1,7 @@ PROXY=http://192.168.0.208:7890 GIT_LINK=https://git.lichx.top/li_chx/MAAsConfig.git -GIT_NAME=MAAsConfig -REDROID_PATH=/app/redroid-rk3588 -MAA_CONFIG_DIR=/app/MAAsConfig/ArknightsMaaConfig -MAA_LOG=/app/redroid-log -# default.json of MAA also set the ADB_ADDRESS -ADB_ADDRESS=172.17.0.1:5555 +ADB_ADDRESS=127.0.0.1:5555 +REDROID_CONTAINER=redroid +DOCKER_GID=996 +# 多个游戏用空格分隔;MaaEnd 任务配置完成后可改成 "arknights maaend"。 +GAMES=arknights diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4a00424 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/vendor/ +__pycache__/ diff --git a/Dockerfile b/Dockerfile index 4f73411..9f2cc40 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,23 +1,27 @@ FROM ubuntu:24.04 -ARG proxy git_link git_name -ENV http_proxy=$proxy \ - https_proxy=$proxy \ - PATH=/app/bin:$PATH +ARG proxy +ARG git_link=https://git.lichx.top/li_chx/MAAsConfig.git +ENV http_proxy=$proxy https_proxy=$proxy \ + no_proxy=localhost,127.0.0.1,git.lichx.top \ + PATH=/app/bin:$PATH TZ=Asia/Shanghai PYTHONUNBUFFERED=1 \ + HOME=/home/app \ + MAA_DATA_DIR=/app/maa MAA_CONFIG_DIR=/app/MAAsConfig/ArknightsMaaConfig \ + MAA_STATE_DIR=/state/arknights MAA_CACHE_DIR=/state/cache \ + ADB_SERVER_SOCKET=tcp:15037 LOG_DIR=/state/logs +RUN sed -i 's|http://ports.ubuntu.com/ubuntu-ports|http://mirrors.aliyun.com/ubuntu-ports|g' /etc/apt/sources.list.d/ubuntu.sources \ + && apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ + curl ca-certificates git docker.io python3 adb tzdata libatomic1 libgomp1 libgl1 libglib2.0-0 \ + libx11-6 libxrandr2 libxfixes3 libxi6 libxtst6 libxkbcommon0 libwayland-client0 \ + libwayland-cursor0 libwayland-egl1 libegl1 libdbus-1-3 libpulse0 libasound2t64 libvulkan1 \ + && rm -rf /var/lib/apt/lists/* \ + && ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ + && useradd -m -u 1001 app WORKDIR /app -RUN cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak \ - && echo "# 阿里云 Ubuntu 24.04 镜像源" > /etc/apt/sources.list.d/ubuntu.sources \ - && echo "Types: deb" >> /etc/apt/sources.list.d/ubuntu.sources \ - && echo "URIs: http://mirrors.aliyun.com/ubuntu-ports/" >> /etc/apt/sources.list.d/ubuntu.sources \ - && echo "Suites: noble noble-updates noble-security" >> /etc/apt/sources.list.d/ubuntu.sources \ - && echo "Components: main restricted universe multiverse" >> /etc/apt/sources.list.d/ubuntu.sources \ - && echo "Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg" >> /etc/apt/sources.list.d/ubuntu.sources \ - && apt update && apt upgrade -y && apt install -y wget tar jq git docker.io python3 python-is-python3 docker-compose-v2 adb libatomic1 -RUN mkdir -p /app/MaaAssistantArknights && mkdir -p /app/bin && mkdir -p /app/redroid-log \ - && wget $(wget -qO- https://api.github.com/repos/MaaAssistantArknights/MaaAssistantArknights/releases/latest | jq -r '.assets[] | select(.name | test("linux-aarch64.tar.gz$")) | .browser_download_url') \ - -O MAA-latest-linux-aarch64.tar.gz && tar -zxvf MAA-latest-linux-aarch64.tar.gz -C /app/MaaAssistantArknights \ - && ln -s /app/MaaAssistantArknights/maa /app/bin/maa -RUN maa install -RUN git clone $git_link && ln -s /app/$git_name/run_all.sh /app/bin/run_all.sh && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime - -#CMD ["tail","-f","/dev/null"] -CMD [ "run_all.sh" ] +COPY install.sh /app/install.sh +# 构建临时目录不使用运行时的 /state 挂载。 +RUN TMPDIR=/tmp MAA_CACHE_DIR=/tmp/maa-cache bash install.sh \ + && http_proxy= https_proxy= git clone "$git_link" /app/MAAsConfig \ + && chown -R app:app /app +USER app +ENV TMPDIR=/state/tmp +ENTRYPOINT ["/app/MAAsConfig/run_all.sh"] diff --git a/README.md b/README.md index 64faa15..09e4325 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,44 @@ -变量的转递主要通过.env 因为仅是个人使用 部分定义不规范 -本项目不包括redroid的安装和配置 -关于redroid 还需查看github相关仓库信息 +# MAAsDocker(个人使用) + +流程:crontab → 更新 MAAsDocker → Compose 启动一次性容器 → 容器更新 MAAsConfig → 更新 MAA → 重启 ReDroid → 执行任务 → 停止 ReDroid → 容器退出。 + +## 构建 + +开发板目录 `/home/lichx/maas/MAAsDocker`。修改 `.env` 的代理、Git 地址和 ADB 地址后: + +```sh +mkdir -p ../state/{home,tmp,logs} +docker compose build +docker compose up -d +docker compose logs -f app +``` + +Dockerfile 内仍然 `git clone` MAAsConfig,启动时两层仓库都 `git pull --ff-only`。配置和脚本改完需提交、推送到对应仓库;不再靠 rsync 发布配置。pull 遇到分叉或冲突直接报错,不使用 reset --hard 覆盖本地修改。 + +构建下载和 `maa update`、`maa self update` 使用 `.env` 中的代理;拉取自己的 Git 仓库、ADB 和游戏任务不走代理。更新 MAA 失败会打印错误并继续使用已安装版本。MaaEnd 下载 latest 包,随镜像重新构建更新。 + +只面向当前 ARM64 开发板:用户 UID/GID 1001,Docker socket 组 996。容器通过 Docker socket 启停现有 `redroid`,不重建 ReDroid,也不挂载其数据。应用数据、ADB 密钥、缓存和日志都放在本项目 `state/`。 + +## 定时运行 + +由 lichx 手动加入 crontab(开发板北京时间): + +```cron +0 8,16,22 * * * /home/lichx/maas/MAAsDocker/start-docker.sh >> /home/lichx/maas/state/logs/cron.log 2>&1 +``` + +明日方舟沿用 startup → recruit → infrast → fight → mall → award。保留原来的命令重试、重开游戏重试,以及失败后继续尝试其他任务的行为;最后用退出码记录是否发生失败。 + +基本进度通过 `MAA_LOG=info` 显示,`tee` 同时保存到 `state/logs/maa-日期-时间.log`;MAA 内核调试日志另存 `state/arknights/debug/asst.log`。 + +## MaaEnd + +当前 `.env` 的 `GAMES=arknights`,尚未自动运行 MaaEnd。需要配置时: + +```sh +docker compose run --rm app maaend-config +``` + +保存后,把 `state/maaend-版本/maafw/config/maa_pi_config.json` 的内容更新到 MAAsConfig 仓库的 `MaaEndConfig/maa_pi_config.json`,提交并推送。随后把 `.env` 改为 `GAMES="arknights maaend"`,两种游戏会依次运行,各自结束时停止 ReDroid。 + +MaaEnd 只保留必要适配:补齐 CLI 的资源路径,在 state 中生成 ADB 专用 interface,省略 CLI 不支持的 hotkey 设置导入;保留上游 interface 和默认游戏资源。用户数据随版本保存在 state 中,不自动删除旧版本数据。 diff --git a/docker-compose.yml b/docker-compose.yml index c6b15a6..197217b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,24 +1,26 @@ -#version: '3.8' - +name: maas services: app: - image: lichx/maa-container:v1.0 - build: + image: lichx/maa-container:personal + build: context: . - dockerfile: Dockerfile args: proxy: ${PROXY} git_link: ${GIT_LINK} - git_name: ${GIT_NAME} + user: "1001:1001" + group_add: ["${DOCKER_GID:-996}"] + network_mode: host + init: true + restart: "no" environment: - - redroid_path=${REDROID_PATH} - - adb_address=${ADB_ADDRESS} - - MAA_CONFIG_DIR=${MAA_CONFIG_DIR} - - MAA_LOG=${MAA_LOG} + http_proxy: ${PROXY} + https_proxy: ${PROXY} + ADB_ADDRESS: ${ADB_ADDRESS} + REDROID_CONTAINER: ${REDROID_CONTAINER:-redroid} + GAMES: ${GAMES:-arknights} + MAA_LOG: info volumes: - - ~/.config/redroid-rk3588:/app/redroid-rk3588 - - ~/redroid-data:/home/ubuntu/redroid-data - /var/run/docker.sock:/var/run/docker.sock - - ~/.config/redroid-log:/app/redroid-log - - # network_mode: host + - ../state:/state + - ../state/home:/home/app + - ../state/tmp:/tmp diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..fd8cc01 --- /dev/null +++ b/install.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +set -euo pipefail +mkdir -p /app/bin /app/maa /app/maaend +# 跟随 latest 的跳转取版本号,避免 GitHub API 的匿名限流。 +cli=$(curl -fsSL -o /dev/null -w '%{url_effective}' https://github.com/MaaAssistantArknights/maa-cli/releases/latest) +cli=${cli##*/} +curl -fL --retry 3 "https://github.com/MaaAssistantArknights/maa-cli/releases/download/$cli/maa_cli-$cli-aarch64-unknown-linux-gnu.tar.gz" | tar -xz -C /app/bin maa +maa install +end=$(curl -fsSL -o /dev/null -w '%{url_effective}' https://github.com/MaaEnd/MaaEnd/releases/latest) +end=${end##*/} +curl -fL --retry 3 "https://github.com/MaaEnd/MaaEnd/releases/download/$end/MaaEnd-linux-aarch64-$end.tar.gz" | tar -xz -C /app/maaend +# MaaPiCli 从 maafw 目录读取界面和资源;保留上游 agent 的相对路径。 +for path in /app/maaend/*; do + name=$(basename "$path") + [[ "$name" == maafw ]] || ln -s "../$name" "/app/maaend/maafw/$name" +done +chmod +x /app/maaend/maafw/MaaPiCli /app/maaend/agent/go-service /app/maaend/agent/cpp-algo diff --git a/start-docker.sh b/start-docker.sh index 0d5af78..4b730d5 100755 --- a/start-docker.sh +++ b/start-docker.sh @@ -1,4 +1,7 @@ -#!/bin/bash -cd $(dirname $(readlink -f "$0")) -git fetch origin && git reset --hard origin/master && git pull +#!/usr/bin/env bash +set -euo pipefail +cd -- "$(dirname -- "$(readlink -f -- "$0")")" +# 保留启动时更新;pull 遇到冲突报错,不强制丢弃本地改动。 +http_proxy= https_proxy= HTTP_PROXY= HTTPS_PROXY= git pull --ff-only +mkdir -p ../state/{home,tmp,logs} docker compose up -d