diff --git a/.gitea/workflows/server-deploy.yml b/.gitea/workflows/server-deploy.yml index 5a7abcf..aeb9ce1 100644 --- a/.gitea/workflows/server-deploy.yml +++ b/.gitea/workflows/server-deploy.yml @@ -42,11 +42,6 @@ jobs: # 推荐把私钥做成 base64(单行)存到 Secrets,避免多行变量丢换行 SSH_KEY_B64: ${{ github.event.inputs.env == 'dev' && secrets.DEV_SSH_KEY_B64 || secrets.PRO_SSH_KEY_B64 }} - # Runner 宿主机私钥模式(推荐放宿主机时使用) - # - 配置 vars.RUNNER_SSH_KEY_PATH 后将优先使用该私钥文件 - # - 例:/home/runner/.ssh/deploy_key 或 /root/.ssh/deploy_key - RUNNER_SSH_KEY_PATH: ${{ vars.RUNNER_SSH_KEY_PATH }} - # Nginx upstream 配置(建议放到 vars) NGINX_UPSTREAM_FILE: ${{ vars.NGINX_UPSTREAM_FILE }} NGINX_UPSTREAM_NAME: ${{ vars.NGINX_UPSTREAM_NAME }} @@ -84,40 +79,28 @@ jobs: mkdir -p ~/.ssh chmod 700 ~/.ssh - # 优先:使用 Runner 宿主机上的私钥文件(避免在 CI 中传输私钥) - SSH_KEY_PATH="" - if [[ -n "${RUNNER_SSH_KEY_PATH:-}" ]]; then - SSH_KEY_PATH="${RUNNER_SSH_KEY_PATH}" - if [[ ! -f "${SSH_KEY_PATH}" ]]; then - echo "未找到 Runner 宿主机私钥文件:${SSH_KEY_PATH}" - echo "请在 Runner 宿主机上放置私钥,并确保该路径对 Runner 执行用户可读。" - exit 1 - fi - chmod 600 "${SSH_KEY_PATH}" || true - else - # 兜底:从 Secrets 写入私钥(不推荐,但兼容) - SSH_KEY_PATH="${HOME}/.ssh/id_rsa" - if [[ -n "${SSH_KEY_B64:-}" ]]; then - # 兼容两种常见误配置: - # 1) *_SSH_KEY_B64 里其实粘贴的是“原始私钥”(包含 -----BEGIN ... PRIVATE KEY-----) - # 2) base64 值在粘贴/保存过程中混入空白或其他无关字符 - if printf '%s' "${SSH_KEY_B64}" | grep -qE 'BEGIN[[:space:]].*PRIVATE[[:space:]]KEY'; then - echo "提示:检测到 *_SSH_KEY_B64 看起来是原始私钥内容,将按原始私钥写入(建议你改用真正的 base64 单行值)。" - printf '%s' "${SSH_KEY_B64}" | tr -d '\r' > "${SSH_KEY_PATH}" - else - CLEAN_B64="$(printf '%s' "${SSH_KEY_B64}" | tr -d '\r\n\t ')" - if ! printf '%s' "${CLEAN_B64}" | base64 -d -i | tr -d '\r' > "${SSH_KEY_PATH}"; then - echo "私钥 base64 解码失败:" - echo "- 请确认你在 Gitea Secrets 配置的 *_SSH_KEY_B64 是“单行 base64 字符串”,不要带引号/前后空格。" - echo "- 推荐用仓库里的脚本生成并复制:node scripts/ssh-key-to-b64.mjs ~/.ssh/你的私钥 --clipboard" - exit 1 - fi - fi + # 从 Secrets 写入私钥(推荐使用 *_SSH_KEY_B64) + SSH_KEY_PATH="${HOME}/.ssh/id_rsa" + if [[ -n "${SSH_KEY_B64:-}" ]]; then + # 兼容两种常见误配置: + # 1) *_SSH_KEY_B64 里其实粘贴的是“原始私钥”(包含 -----BEGIN ... PRIVATE KEY-----) + # 2) base64 值在粘贴/保存过程中混入空白或其他无关字符 + if printf '%s' "${SSH_KEY_B64}" | grep -qE 'BEGIN[[:space:]].*PRIVATE[[:space:]]KEY'; then + echo "提示:检测到 *_SSH_KEY_B64 看起来是原始私钥内容,将按原始私钥写入(建议你改用真正的 base64 单行值)。" + printf '%s' "${SSH_KEY_B64}" | tr -d '\r' > "${SSH_KEY_PATH}" else - printf '%s' "${SSH_KEY}" | tr -d '\r' > "${SSH_KEY_PATH}" + CLEAN_B64="$(printf '%s' "${SSH_KEY_B64}" | tr -d '\r\n\t ')" + if ! printf '%s' "${CLEAN_B64}" | base64 -d -i | tr -d '\r' > "${SSH_KEY_PATH}"; then + echo "私钥 base64 解码失败:" + echo "- 请确认你在 Gitea Secrets 配置的 *_SSH_KEY_B64 是“单行 base64 字符串”,不要带引号/前后空格。" + echo "- 推荐用仓库里的脚本生成并复制:node scripts/ssh-key-to-b64.mjs ~/.ssh/你的私钥 --clipboard" + exit 1 + fi fi - chmod 600 "${SSH_KEY_PATH}" + else + printf '%s' "${SSH_KEY}" | tr -d '\r' > "${SSH_KEY_PATH}" fi + chmod 600 "${SSH_KEY_PATH}" # 自检(不输出私钥内容,仅输出元信息,方便定位是否写入了错误文件/被截断) echo "SSH_KEY_PATH=${SSH_KEY_PATH}" @@ -142,14 +125,6 @@ jobs: exit 1 fi - # 供后续步骤统一使用 - if [[ -n "${GITHUB_ENV:-}" ]]; then - echo "SSH_KEY_PATH=${SSH_KEY_PATH}" >> "$GITHUB_ENV" - fi - if [[ -n "${GITEA_ENV:-}" ]]; then - echo "SSH_KEY_PATH=${SSH_KEY_PATH}" >> "$GITEA_ENV" - fi - SSH_PORT="${SSH_PORT:-22}" if [[ -n "${GITHUB_ENV:-}" ]]; then echo "SSH_PORT=${SSH_PORT}" >> "$GITHUB_ENV" @@ -167,7 +142,7 @@ jobs: set -euo pipefail SSH_PORT="${SSH_PORT:-22}" ssh -p "${SSH_PORT}" \ - -i "${SSH_KEY_PATH}" \ + -i ~/.ssh/id_rsa \ -o StrictHostKeyChecking=yes \ -o BatchMode=yes \ -o IdentitiesOnly=yes \ @@ -202,7 +177,7 @@ jobs: exit 0 fi - ssh -p "${SSH_PORT}" -i "${SSH_KEY_PATH}" -o StrictHostKeyChecking=yes -o IdentitiesOnly=yes \ + ssh -p "${SSH_PORT}" -i ~/.ssh/id_rsa -o StrictHostKeyChecking=yes -o IdentitiesOnly=yes \ "${SSH_USER}@${SSH_HOST}" bash -s -- "${DOCKER_TOKEN}" "${DOCKER_USERNAME}" "${REG}" <<'REMOTE' set -euo pipefail @@ -233,7 +208,7 @@ jobs: echo "准备部署:${DOCKER_IMAGE}:${DEPLOY_TAG} -> ${DEPLOY_ENV} (${SSH_USER}@${SSH_HOST}:${SSH_PORT})" - ssh -p "${SSH_PORT}" -i "${SSH_KEY_PATH}" -o StrictHostKeyChecking=yes -o IdentitiesOnly=yes "${SSH_USER}@${SSH_HOST}" bash -s -- \ + ssh -p "${SSH_PORT}" -i ~/.ssh/id_rsa -o StrictHostKeyChecking=yes -o IdentitiesOnly=yes "${SSH_USER}@${SSH_HOST}" bash -s -- \ "${DOCKER_IMAGE}" "${DEPLOY_TAG}" "${NGINX_UPSTREAM_FILE}" "${NGINX_UPSTREAM_NAME}" "${BLUE_PORT}" "${GREEN_PORT}" "${CONTAINER_PORT}" "${HEALTHCHECK_PATH}" "${REMOTE_ENV_FILE:-}" <<'REMOTE' set -euo pipefail