diff --git a/conf/config.toml b/conf/config.dev.toml similarity index 100% rename from conf/config.toml rename to conf/config.dev.toml diff --git a/conf/config.prod.toml b/conf/config.prod.toml new file mode 100644 index 0000000..dd11dd8 --- /dev/null +++ b/conf/config.prod.toml @@ -0,0 +1,26 @@ +[base] +jwt_secret = "mCTf-JhNRnhaaGJy_x" +bind_addr = ":8090" + +[log] +echo_log_file = "../log/echo.log" +log_file = "../log/app.log" +max_size = 500 +max_backups = 3 +max_age = 28 +compress = true +level = "debug" + + +[azure_openai] +endpoint = "https://grammar.openai.azure.com/" +keys = "8b68c235b737488ab9a99983a14f8cca,0274ccde58aa47b189f0d13349885ad3" +gpt4_model = "gpt4" +gpt35_model = "gpt35" + + +[database] +mysql_conn = "localhost:3306" +mysql_user = "devops" +mysql_pass = "b5hs945wXjHr" +redis_conn = "127.0.0.1:6379" \ No newline at end of file diff --git a/deploy.sh b/deploy.sh new file mode 100755 index 0000000..03ef1c1 --- /dev/null +++ b/deploy.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +# 远程服务器信息 +REMOTE_USER="ubuntu" +REMOTE_HOST="49.51.178.206" +REMOTE_DIR="/usr/local/aigrammar" +BACKUP_DIR="$REMOTE_DIR/backup" +TIMESTAMP=$(date +"%Y%m%d_%H%M%S") + +# 配置文件环境(默认生产环境) +ENV=${1:-prod} # 运行时可以传入 `dev` 或 `prod` +CONFIG_FILE="conf/config.${ENV}.toml" + +# 检查本地文件是否存在 +if [[ ! -f "bin/aigrammar" || ! -f "bin/service.sh" || ! -f "$CONFIG_FILE" ]]; then + echo "❌ 关键文件不存在,请检查 bin/aigrammar, bin/service.sh, $CONFIG_FILE" + exit 1 +fi + +# 远程创建必要目录(如果不存在) +echo "🔹 确保远程目录结构完整..." +ssh $REMOTE_USER@$REMOTE_HOST "mkdir -p $REMOTE_DIR/{bin,conf,log,backup}" + +# 备份远程服务器的旧文件 +echo "📂 备份远程服务器文件..." +ssh $REMOTE_USER@$REMOTE_HOST "mkdir -p $BACKUP_DIR && \ + [ -f $REMOTE_DIR/bin/aigrammar ] && mv $REMOTE_DIR/bin/aigrammar $BACKUP_DIR/aigrammar_$TIMESTAMP || true && \ + [ -f $REMOTE_DIR/bin/service.sh ] && mv $REMOTE_DIR/bin/service.sh $BACKUP_DIR/service_$TIMESTAMP.sh || true && \ + [ -f $REMOTE_DIR/conf/config.toml ] && mv $REMOTE_DIR/conf/config.toml $BACKUP_DIR/config_$TIMESTAMP.toml || true" + +# 复制文件到远程服务器(保持目录结构) +echo "📤 复制文件到远程服务器..." +scp bin/aigrammar $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/bin/ +scp bin/service.sh $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/bin/ +scp $CONFIG_FILE $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/conf/config.toml + +# 远程执行 restart +echo "🔄 远程重启服务..." +ssh $REMOTE_USER@$REMOTE_HOST "cd $REMOTE_DIR/bin && chmod +x service.sh && ./service.sh restart" + +echo "✅ 发布完成!" diff --git a/src/user.go b/src/user.go index b7ec35c..5c4316a 100644 --- a/src/user.go +++ b/src/user.go @@ -141,7 +141,8 @@ func queryUserBenefits(c echo.Context) (bool, error) { db, _ := GetDBManager() var vip int - err := db.MySQL.QueryRow("SELECT IsVIP FROM vip WHERE ID = ?", ID).Scan(&vip) + // 查询 vip 表,因为可能VIP过期,所以要加上时间戳的判断。这里的服务器是东八区时间。 + err := db.MySQL.QueryRow("SELECT IsVIP FROM vip WHERE ID = ? AND ExpDate >= ?", ID, time.Now()).Scan(&vip) if err == sql.ErrNoRows { // 非VIP,查询redis的免费次数 db, _ := GetDBManager() @@ -163,6 +164,7 @@ func queryUserBenefits(c echo.Context) (bool, error) { } if vip == 1 { + logger.Debug("queryUserBenefits", zap.Int("ID", ID), zap.String("timeZone", timeZone), zap.Int("secondsFromGMT", secondsFromGMT), zap.Int("isvip", 1)) return true, nil } return false, nil