diff --git a/.cargo/config-docker.toml b/.cargo/config-docker.toml new file mode 100644 index 0000000..efe75fc --- /dev/null +++ b/.cargo/config-docker.toml @@ -0,0 +1,15 @@ +# Cargo config for Docker builds (used by Dockerfile via COPY) +# 与 .cargo/config.toml 区分:后者是 Windows 本地开发用 +# +# rsproxy.cn 镜像(rustcc 维护,国内最稳) +# 由 scripts/setup-runner-mirrors.sh 同步推荐;runner 端也建议用同样配置 + +[source.crates-io] +replace-with = "rsproxy-sparse" + +[source.rsproxy-sparse] +registry = "sparse+https://rsproxy.cn/index/" + +[net] +git-fetch-with-cli = true +EOF \ No newline at end of file diff --git a/scripts/setup-runner-mirrors.sh b/scripts/setup-runner-mirrors.sh new file mode 100644 index 0000000..06f9bf8 --- /dev/null +++ b/scripts/setup-runner-mirrors.sh @@ -0,0 +1,160 @@ +#!/usr/bin/env bash +# setup-runner-mirrors.sh —— Gitea Actions runner 国内网络加速配置 +# +# 目的:让 workflow 在国内服务器上跑得更快 +# 范围:Docker 镜像拉取 / crates.io 依赖下载 / git clone +# 适用:在 hermes-runner (ubuntu-22.04) 上以 root 跑一次 +# +# 用法: +# chmod +x scripts/setup-runner-mirrors.sh +# sudo ./scripts/setup-runner-mirrors.sh +# +# 回滚: +# sudo ./scripts/setup-runner-mirrors.sh --undo + +set -euo pipefail + +# ============ 镜像源配置 ============ +# Docker Hub 镜像源(选一个最稳的) +DOCKER_HUB_MIRROR="https://docker.m.daocloud.io" +# ghcr.io 镜像源(GitHub Container Registry) +GHCR_MIRROR="https://ghcr.nju.edu.cn" +# crates.io 镜像源(rsproxy - rustcc 维护) +CARGO_MIRROR="sparse+https://rsproxy.cn/index/" +# github.com git clone 镜像(ghproxy - 通用) +GIT_MIRROR="https://ghproxy.com/https://github.com" + +# ============ 日志 ============ +log() { echo -e "\033[1;32m[$(date +%H:%M:%S)]\033[0m $*"; } +warn() { echo -e "\033[1;33m[WARN]\033[0m $*" >&2; } +err() { echo -e "\033[1;31m[ERR]\033[0m $*" >&2; } + +# ============ 权限检查 ============ +if [[ $EUID -ne 0 ]]; then + err "请用 root 运行:sudo $0" + exit 1 +fi + +# ============ 回滚模式 ============ +if [[ "${1:-}" == "--undo" ]]; then + log "回滚模式:恢复所有备份" + if [[ -f /etc/docker/daemon.json.bak ]]; then + mv /etc/docker/daemon.json.bak /etc/docker/daemon.json + systemctl restart docker || true + log "✅ /etc/docker/daemon.json 已恢复" + else + warn "未找到 daemon.json.bak" + fi + if [[ -f /root/.cargo/config.toml.bak ]]; then + mv /root/.cargo/config.toml.bak /root/.cargo/config.toml + log "✅ /root/.cargo/config.toml 已恢复" + fi + exit 0 +fi + +# ============ 1. Docker daemon registry-mirrors ============ +log "[1/3] 配置 Docker daemon registry-mirrors..." + +DAEMON_CONFIG="/etc/docker/daemon.json" +mkdir -p /etc/docker + +# 备份现有配置 +if [[ -f "$DAEMON_CONFIG" ]] && [[ ! -f "${DAEMON_CONFIG}.bak" ]]; then + cp "$DAEMON_CONFIG" "${DAEMON_CONFIG}.bak" + log " 备份原配置到 ${DAEMON_CONFIG}.bak" +fi + +# 合并现有配置 + mirrors +# 使用 python 而非 jq 保证镜像源可用 +python3 - "$DAEMON_CONFIG" "$DOCKER_HUB_MIRROR" "$GHCR_MIRROR" <<'PYEOF' +import json, sys, os + +config_path = sys.argv[1] +docker_hub_mirror = sys.argv[2] +ghcr_mirror = sys.argv[3] + +# 读取现有配置 +existing = {} +if os.path.exists(config_path): + try: + with open(config_path) as f: + existing = json.load(f) + except json.JSONDecodeError: + existing = {} + +# 合并 registry-mirrors +mirrors = existing.get("registry-mirrors", []) +# 去重添加 +for m in [docker_hub_mirror, ghcr_mirror]: + if m not in mirrors: + mirrors.append(m) + +existing["registry-mirrors"] = mirrors + +# 写回 +with open(config_path, "w") as f: + json.dump(existing, f, indent=2) + +print(f" mirrors 已设置: {mirrors}") +PYEOF + +log " 重启 docker daemon..." +systemctl restart docker +sleep 2 +docker info 2>/dev/null | grep -A 5 "Registry Mirrors" || warn " Registry Mirrors 未显示,可能需要手动验证" + +# ============ 2. Cargo registry mirror ============ +log "[2/3] 配置 /root/.cargo/config.toml (crates.io 镜像)..." + +mkdir -p /root/.cargo +if [[ -f /root/.cargo/config.toml ]] && [[ ! -f /root/.cargo/config.toml.bak ]]; then + cp /root/.cargo/config.toml /root/.cargo/config.toml.bak +fi + +cat > /root/.cargo/config.toml <&1 | tail -3 || warn " hello-world 拉取失败" + +# 验证 cargo mirror +log " Cargo mirror 测试(cargo search):" +cargo search serde --limit 1 2>&1 | head -3 || warn " cargo search 失败" + +# ============ 完成 ============ +echo +log "✅ Runner 镜像加速配置完成!" +echo +echo "效果:" +echo " - Docker pull(actions / base images):通过 DaoCloud/NJU 镜像加速" +echo " - cargo build(Dockerfile 内):通过 rsproxy 镜像加速" +echo " - git clone(Dockerfile 内如有 git 依赖):通过 ghproxy 镜像加速" +echo +echo "回滚命令:sudo $0 --undo" +echo +echo "下一步:" +echo " 1. 推送仓库触发 workflow 验证" +echo " 2. workflow 中 Dockerfile COPY .cargo/config-docker.toml 后 cargo build 走镜像" \ No newline at end of file