refactor: 清理is_paid/paid_expires_at旧字段引用(scripts+service文件)

This commit is contained in:
2026-05-26 10:02:10 +08:00
parent c9c9cc04de
commit 28033bc432
3 changed files with 57 additions and 241 deletions

View File

@@ -1,28 +0,0 @@
[Unit]
Description=Rust Backend Development Service
After=network.target postgresql.service
Wants=network.target
[Service]
Type=simple
User=root
Group=root
WorkingDirectory=/root/rust/rust_backend_dev
ExecStart=/root/rust/rust_backend_dev/rust-backend
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal
EnvironmentFile=/root/rust/rust_backend_dev/.env
NoNewPrivileges=yes
PrivateTmp=yes
ProtectSystem=strict
ProtectHome=read-only
ReadWritePaths=/root/rust/rust_backend_dev
SyslogIdentifier=rust-backend-dev
[Install]
WantedBy=multi-user.target

1
rust-backend-dev.service Symbolic link
View File

@@ -0,0 +1 @@
deploy/rust-backend-development.service

View File

@@ -1,31 +0,0 @@
[Unit]
Description=Rust Backend Service (Weather Data Collection API)
After=network.target postgresql.service
Wants=network.target
[Service]
Type=simple
User=root
Group=root
WorkingDirectory=/root/rust/rust_backend
ExecStart=/root/rust/rust_backend/rust-backend
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal
# 环境变量配置
EnvironmentFile=/root/rust/rust_backend/.env
# 安全加固
NoNewPrivileges=yes
PrivateTmp=yes
ProtectSystem=strict
ProtectHome=read-only
ReadWritePaths=/root/rust/rust_backend
# 日志标识
SyslogIdentifier=rust-backend
[Install]
WantedBy=multi-user.target

1
rust-backend.service Symbolic link
View File

@@ -0,0 +1 @@
deploy/rust-backend-prod.service

View File

@@ -1,19 +1,11 @@
#!/bin/bash
# scripts/expire-paid-user.sh
# 通过 SSH 在服务器上执行 SQL使用户的付费时间过期(仅修改 paid_expires_at
# 与 set-paid-user.sh --expires 的区别:此脚本专用于"过期"场景,
# 保持 is_paid=true用户仍标记为付费仅将 paid_expires_at 设到过去。
#
# 使用 config/development.toml 中的数据库配置
# 密码由服务器的 1panel/环境变量提供,无需手动传入
#
# 用法:
# ./scripts/expire-paid-user.sh <user_id>
# ./scripts/expire-paid-user.sh <user_id> --date YYYY-MM-DD
#
# 示例:
# ./scripts/expire-paid-user.sh 1 # 设为昨天到期(立即过期)
# ./scripts/expire-paid-user.sh 1 --date 2025-01-01 # 设为指定日期到期(已过期)
# ===========================================
# 通过 SSH 在服务器上执行 SQL使用户的付费时间过期
# 仅修改 membership_expires_at 到过去日期
# is_member 保持 trueis_active_member 会变为 false
# ===========================================
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
@@ -28,187 +20,68 @@ usage() {
echo "用法: $0 <user_id> [--date YYYY-MM-DD]"
echo ""
echo " user_id 用户 ID必填"
echo " --date DATE 指定期日期(默认: 昨天"
echo ""
echo "说明:"
echo " 将用户 paid_expires_at 设到过去日期is_paid 保持 true"
echo " 用户的 is_paid_active 会变为 false"
echo ""
echo "数据源:"
echo " SSH 服务器: .env 中 SSH_SERVER"
echo " 数据库配置: config/development.toml (host/port/dbname)"
echo " 密码: 服务器上的环境变量/1panel 自动提供"
echo " --date YYYY-MM-DD 指定期日期(默认:昨天,即立即过期"
echo ""
echo "示例:"
echo " $0 1 # 设为昨天到"
echo " $0 1 --date 2025-01-01 # 设为 2025-01-01"
echo " $0 1 # 用户 1 立即过"
echo " $0 1 --date 2025-01-01 # 用户 1 在 2025-01-01 过期"
exit 0
}
validate_date() {
local date="$1"
if [[ ! "$date" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "错误: 日期格式无效,请使用 YYYY-MM-DD"
exit 1
fi
}
# 解析 toml 文件中的 database_url
parse_toml_db_url() {
local file="$1"
grep '^database_url' "$file" 2>/dev/null | head -1 | sed 's/^database_url *= *["'"'"']//' | sed 's/["'"'"']*$//' | tr -d ' '
}
# 解析 postgres:// URL
parse_db_url() {
local db_url="$1"
local rest="${db_url#postgres://}"
DB_USER="${rest%%:*}"
local host_port="${rest##*@}"
host_port="${host_port%%/*}"
if [[ "$host_port" == *:* ]]; then
DB_HOST="${host_port%%:*}"
DB_PORT="${host_port##*:}"
else
DB_HOST="$host_port"
DB_PORT="5432"
fi
DB_NAME="${rest##*/}"
DB_NAME="${DB_NAME%%\?*}"
}
info() { echo "[INFO] $1"; }
warn() { echo "[WARN] $1"; }
error() { echo "[ERROR] $1" >&2; }
step() { echo ""; echo ">>> 第 $1 步: $2"; echo ""; }
# 在服务器上通过 docker exec 执行 SQL
exec_sql() {
local sql="$1"
ssh -o BatchMode=yes -o StrictHostKeyChecking=no -o ConnectTimeout=5 "$SSH_HOST" \
"cd /root/rust/rust_backend_dev 2>/dev/null || true; docker exec 1Panel-postgresql-FtMo psql -U ${DB_USER} -d ${DB_NAME} -c \"${sql}\"" 2>&1
}
main() {
if [[ $# -lt 1 ]]; then
usage
fi
USER_ID="$1"
shift
if [[ ! "$USER_ID" =~ ^[0-9]+$ ]]; then
error "user_id 必须是数字"
exit 1
fi
# ---------- 参数解析 ----------
USER_ID=""
EXPIRES_DATE=""
while [[ $# -gt 0 ]]; do
case "$1" in
--date)
EXPIRES_DATE="$2"
validate_date "$EXPIRES_DATE"
shift 2
;;
-h|--help) usage ;;
*) error "未知参数: $1"; usage ;;
--date) EXPIRES_DATE="$2"; shift 2 ;;
--help|-h) usage ;;
*) USER_ID="$1"; shift ;;
esac
done
# 默认过期日期:昨天
if [[ -z "$EXPIRES_DATE" ]]; then
if date --version 2>/dev/null | grep -q GNU; then
EXPIRES_DATE=$(date -d "yesterday" "+%Y-%m-%d")
else
EXPIRES_DATE=$(date -v -1d "+%Y-%m-%d")
fi
[ -z "$USER_ID" ] && usage
# ---------- 连接信息 ----------
SSH_HOST=$(get_ssh_host)
[ -z "$SSH_HOST" ] && { echo "错误: 未配置 SSH_SERVER"; exit 1; }
DB_CONTAINER="1Panel-postgresql-FtMo"
DB_NAME="milkydata"
DB_USER="milkydata"
# ---------- 设置过期日期 ----------
if [ -z "$EXPIRES_DATE" ]; then
EXPIRES_DATE=$(date -d "yesterday" +%Y-%m-%d)
echo "未指定日期,默认设为昨天: ${EXPIRES_DATE}"
fi
# ===== Step 1: 读取配置 =====
step 1 "读取配置"
echo "═══════════════════════════════════════"
echo "用户 ${USER_ID} 会员过期操作"
echo "到期日期: ${EXPIRES_DATE}"
echo "═══════════════════════════════════════"
SSH_HOST="$(get_ssh_host)"
if [[ -z "$SSH_HOST" ]]; then
error "未找到 SSH_SERVER 配置,请检查 .env 文件"
exit 1
fi
info "SSH 服务器: $SSH_HOST"
CONFIG_FILE="$CONFIG_DIR/development.toml"
if [[ ! -f "$CONFIG_FILE" ]]; then
error "配置文件不存在: $CONFIG_FILE"
exit 1
fi
TOML_DB_URL="$(parse_toml_db_url "$CONFIG_FILE")"
if [[ -z "$TOML_DB_URL" ]]; then
error "development.toml 中未找到 database_url"
exit 1
fi
parse_db_url "$TOML_DB_URL"
info "数据库: ${DB_USER}@${DB_HOST}:${DB_PORT}/${DB_NAME}"
# ===== Step 2: 构造 SQL =====
step 2 "构造 SQL 语句"
SQL="UPDATE users SET is_paid = true, paid_expires_at = '${EXPIRES_DATE}'::date WHERE id = ${USER_ID};"
info "设置过期日期: $EXPIRES_DATE"
echo " SQL: $SQL"
# ===== Step 3: 执行 SQL =====
step 3 "通过 SSH 在服务器上执行 SQL"
info "连接 $SSH_HOST (超时 15s) ..."
SQL_RAW=$(exec_sql "$SQL")
SQL_EXIT=$?
if [[ $SQL_EXIT -ne 0 ]]; then
error "执行失败(退出码: $SQL_EXIT"
echo "$SQL_RAW" | sed 's/^/ /' >&2
exit 1
fi
echo "$SQL_RAW"
if echo "$SQL_RAW" | grep -q "UPDATE [01]"; then
ROWS=$(echo "$SQL_RAW" | grep "UPDATE" | grep -oP '\d+' | head -1)
if [[ "${ROWS:-0}" == "0" ]]; then
warn "未更新任何行(用户 ID $USER_ID 可能不存在)"
else
info "成功更新 ${ROWS}"
fi
else
warn "无法确认更新结果"
fi
# ===== Step 4: 验证结果 =====
step 4 "查询用户信息确认"
QUERY_SQL="SELECT id, name, phone, type, is_paid, is_admin, paid_expires_at FROM users WHERE id = ${USER_ID};"
info "SQL: $QUERY_SQL"
QUERY_RAW=$(exec_sql "$QUERY_SQL")
QUERY_EXIT=$?
if [[ $QUERY_EXIT -ne 0 ]]; then
warn "查询失败(退出码: $QUERY_EXIT),但数据更新已执行"
echo "$QUERY_RAW" | sed 's/^/ /'
else
echo "$QUERY_RAW"
fi
# ===== 总结 =====
echo ""
echo "============================================"
echo " 执行完成"
echo "============================================"
echo " 用户 ID: $USER_ID"
echo " 过期日期: $EXPIRES_DATE"
echo " 服务器: $SSH_HOST"
echo "============================================"
echo ""
echo "提示: is_paid 保持 trueis_paid_active 会变为 false付费已过期"
}
main "$@"
echo "⚠️ 即将执行以下操作:"
echo " 将用户 ${USER_ID} 的 membership_expires_at 设到 ${EXPIRES_DATE}"
echo " is_member 保持 true用户仍标记为曾付费"
echo " 用户的 is_active_member 会变为 false付费已过期"
echo ""
read -p "确认执行? [y/N] " -n 1 -r; echo
[[ ! $REPLY =~ ^[Yy]$ ]] && { echo "已取消"; exit 0; }
# ---------- 执行 SQL ----------
SQL="UPDATE users SET is_member = true, membership_expires_at = '${EXPIRES_DATE}'::date WHERE id = ${USER_ID};"
echo "执行 SQL: ${SQL}"
ssh "$SSH_HOST" "docker exec ${DB_CONTAINER} psql -U ${DB_USER} -d ${DB_NAME} -c \"${SQL}\"" && echo "✅ 操作成功" || echo "❌ 操作失败"
# 查询验证
QUERY_SQL="SELECT id, name, phone, type, is_member, is_admin, membership_expires_at FROM users WHERE id = ${USER_ID};"
echo ""
echo "验证结果:"
ssh "$SSH_HOST" "docker exec ${DB_CONTAINER} psql -U ${DB_USER} -d ${DB_NAME} -c \"${QUERY_SQL}\""
echo ""
echo "提示: is_member 保持 trueis_active_member 会变为 false付费已过期"