新增分享码功能

This commit is contained in:
eafonyang
2026-06-12 15:50:01 +08:00
parent 46fd35b0df
commit 8010cbd32f
24 changed files with 2610 additions and 66 deletions
+114 -45
View File
@@ -1,55 +1,124 @@
#!/usr/bin/env bash
set -euo pipefail
KEY="$HOME/.ssh/aws_eafon.pem"
REMOTE_DIR="/data/project/app-api/"
SERVER="api1"
if [ $# -gt 0 ] && { [ "$1" = "api1" ] || [ "$1" = "api2" ]; }; then
SERVER="$1"
DEFAULT_PATHS=(
./cmd/
./internal/
./pkg
./go.mod
./go.sum
./Dockerfile
./docker-compose.yml
)
show_help() {
cat <<'EOF'
用法: upload.sh [选项] [服务器] [路径...]
将本地代码同步到远程服务器(rsync)。
选项:
-n 虚拟执行,不实际传输或删除远程文件
-h, --help 显示此帮助信息
服务器:
api1 仅上传到 api1 (luxsin-api1)
api2 仅上传到 api2 (luxsin-api2)
(省略) 同时上传到 api1 和 api2
路径:
指定要同步的文件或目录,可传多个。
省略时使用默认路径: cmd/ internal/ pkg go.mod go.sum Dockerfile docker-compose.yml
示例:
upload.sh 同步默认路径到 api1 和 api2
upload.sh api1 同步默认路径到 api1
upload.sh api2 ./internal 同步 internal/ 到 api2
upload.sh -n 虚拟执行,预览同步到 api1 和 api2
upload.sh -n api1 ./internal 虚拟执行,预览同步到 api1
EOF
}
remote_host_for() {
case "$1" in
api1) echo "luxsin-api1" ;;
api2) echo "luxsin-api2" ;;
*)
echo "未知服务器: $1(可选: api1, api2" >&2
exit 1
;;
esac
}
upload_to() {
local server="$1"
shift
fi
local paths=("$@")
local remote_host
remote_host="$(remote_host_for "$server")"
case "$SERVER" in
api1)
REMOTE_HOST="ubuntu@ec2-18-184-205-87.eu-central-1.compute.amazonaws.com"
;;
api2)
REMOTE_HOST="ubuntu@ec2-3-71-153-45.eu-central-1.compute.amazonaws.com"
;;
*)
echo "未知服务器: $SERVER(可选: api1, api2" >&2
exit 1
;;
esac
REMOTE="${REMOTE_HOST}:${REMOTE_DIR}"
if [ $# -eq 0 ]; then
PATHS=(
./cmd/
./internal/
./pkg
./go.mod
./go.sum
./Dockerfile
./docker-compose.yml
)
else
PATHS=("$@")
fi
echo "上传到 ${SERVER} (${REMOTE_HOST}) ..."
SSH_OPTS="-i $KEY -o StrictHostKeyChecking=no"
# 上传前先删除远程同名目录,避免 scp 嵌套
for item in "${PATHS[@]}"; do
if [[ -d "$item" ]]; then
remote_item="${REMOTE_DIR}${item#./}"
echo " 删除远程目录: ${REMOTE_HOST}:${remote_item}"
ssh $SSH_OPTS "$REMOTE_HOST" "rm -rf '${remote_item}'"
if [ "$DRY_RUN" = true ]; then
echo "虚拟上传到 ${server} (${remote_host}) ..."
else
echo "上传到 ${server} (${remote_host}) ..."
fi
local rsync_opts=(-avz --progress)
if [ "$DRY_RUN" = true ]; then
rsync_opts+=(-n)
fi
local item rel remote_path
for item in "${paths[@]}"; do
rel="${item#./}"
remote_path="${REMOTE_DIR}${rel}"
if [[ -d "$item" ]]; then
echo " 同步目录: $item -> ${remote_host}:${remote_path}/"
rsync "${rsync_opts[@]}" --delete "${item}/" "${remote_host}:${remote_path}/"
else
echo " 同步文件: $item -> ${remote_host}:${remote_path}"
rsync "${rsync_opts[@]}" "$item" "${remote_host}:${remote_path}"
fi
done
}
DRY_RUN=false
ARGS=()
for arg in "$@"; do
case "$arg" in
-n)
DRY_RUN=true
;;
-h|--help)
show_help
exit 0
;;
*)
ARGS+=("$arg")
;;
esac
done
scp -i "$KEY" -r "${PATHS[@]}" "$REMOTE"
SERVERS=()
if [ ${#ARGS[@]} -gt 0 ] && { [ "${ARGS[0]}" = "api1" ] || [ "${ARGS[0]}" = "api2" ]; }; then
SERVERS=("${ARGS[0]}")
ARGS=("${ARGS[@]:1}")
else
SERVERS=(api1 api2)
fi
if [ ${#ARGS[@]} -eq 0 ]; then
PATHS=("${DEFAULT_PATHS[@]}")
else
PATHS=("${ARGS[@]}")
fi
for server in "${SERVERS[@]}"; do
upload_to "$server" "${PATHS[@]}"
echo
done
echo "完成。"