mirror of
https://git.fightbot.fun/hxuanyu/BingPaper.git
synced 2026-03-07 14:19:31 +08:00
Compare commits
2 Commits
3c1f29e4ef
...
34848e7b91
| Author | SHA1 | Date | |
|---|---|---|---|
| 34848e7b91 | |||
| 9ec9a2ba91 |
@@ -19,7 +19,7 @@ api:
|
||||
|
||||
cron:
|
||||
enabled: true
|
||||
daily_spec: "0 10 * * *"
|
||||
daily_spec: "20 8-23/4 * * *"
|
||||
|
||||
retention:
|
||||
days: 0
|
||||
|
||||
@@ -36,6 +36,20 @@ func Init(webFS embed.FS, configPath string) *gin.Engine {
|
||||
// 2. 初始化日志
|
||||
util.InitLogger(cfg.Log)
|
||||
|
||||
// 以 debug 级别输出配置加载详情和环境变量覆盖情况
|
||||
util.Logger.Debug("Configuration loading details",
|
||||
zap.String("config_file", config.GetRawViper().ConfigFileUsed()),
|
||||
)
|
||||
envOverrides := config.GetEnvOverrides()
|
||||
if len(envOverrides) > 0 {
|
||||
for _, override := range envOverrides {
|
||||
util.Logger.Debug("Environment variable override applied", zap.String("detail", override))
|
||||
}
|
||||
} else {
|
||||
util.Logger.Debug("No environment variable overrides detected")
|
||||
}
|
||||
util.Logger.Debug("Full effective configuration:\n" + config.GetFormattedSettings())
|
||||
|
||||
// 输出配置信息
|
||||
util.Logger.Info("Application configuration loaded")
|
||||
util.Logger.Info("├─ Config file", zap.String("path", config.GetRawViper().ConfigFileUsed()))
|
||||
|
||||
@@ -3,6 +3,7 @@ package config
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"sort"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
@@ -156,7 +157,7 @@ func Init(configPath string) error {
|
||||
v.SetDefault("log.db_log_level", "info")
|
||||
v.SetDefault("api.mode", "local")
|
||||
v.SetDefault("cron.enabled", true)
|
||||
v.SetDefault("cron.daily_spec", "0 10 * * *")
|
||||
v.SetDefault("cron.daily_spec", "20 8-23/4 * * *")
|
||||
v.SetDefault("retention.days", 0)
|
||||
v.SetDefault("db.type", "sqlite")
|
||||
v.SetDefault("db.dsn", "data/bing_paper.db")
|
||||
@@ -254,6 +255,38 @@ func GetRawViper() *viper.Viper {
|
||||
return v
|
||||
}
|
||||
|
||||
// GetAllSettings 返回所有生效配置项
|
||||
func GetAllSettings() map[string]interface{} {
|
||||
return v.AllSettings()
|
||||
}
|
||||
|
||||
// GetFormattedSettings 以 key: value 形式返回所有配置项的字符串
|
||||
func GetFormattedSettings() string {
|
||||
keys := v.AllKeys()
|
||||
sort.Strings(keys)
|
||||
var sb strings.Builder
|
||||
for _, k := range keys {
|
||||
sb.WriteString(fmt.Sprintf("%s: %v\n", k, v.Get(k)))
|
||||
}
|
||||
return sb.String()
|
||||
}
|
||||
|
||||
// GetEnvOverrides 返回环境变量覆盖详情(已排序)
|
||||
func GetEnvOverrides() []string {
|
||||
var overrides []string
|
||||
keys := v.AllKeys()
|
||||
sort.Strings(keys)
|
||||
for _, key := range keys {
|
||||
// 根据 viper 的配置生成对应的环境变量名
|
||||
// Prefix: BINGPAPER, KeyReplacer: . -> _
|
||||
envKey := strings.ToUpper(fmt.Sprintf("BINGPAPER_%s", strings.ReplaceAll(key, ".", "_")))
|
||||
if val, ok := os.LookupEnv(envKey); ok {
|
||||
overrides = append(overrides, fmt.Sprintf("%s: %s=%s", key, envKey, val))
|
||||
}
|
||||
}
|
||||
return overrides
|
||||
}
|
||||
|
||||
func GetTokenTTL() time.Duration {
|
||||
ttl, err := time.ParseDuration(GetConfig().Token.DefaultTTL)
|
||||
if err != nil {
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
package config
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
@@ -19,3 +22,46 @@ func TestDefaultConfig(t *testing.T) {
|
||||
t.Errorf("Expected DB type sqlite, got %s", cfg.DB.Type)
|
||||
}
|
||||
}
|
||||
|
||||
func TestDebugFunctions(t *testing.T) {
|
||||
// 设置一个环境变量
|
||||
os.Setenv("BINGPAPER_SERVER_PORT", "9999")
|
||||
defer os.Unsetenv("BINGPAPER_SERVER_PORT")
|
||||
|
||||
err := Init("")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to init config: %v", err)
|
||||
}
|
||||
|
||||
settings := GetAllSettings()
|
||||
serverCfg, ok := settings["server"].(map[string]interface{})
|
||||
if !ok {
|
||||
t.Fatalf("Expected server config map, got %v", settings["server"])
|
||||
}
|
||||
|
||||
// Viper numbers in AllSettings are often int
|
||||
portValue := serverCfg["port"]
|
||||
// 允许不同的数字类型,因为 viper 内部实现可能变化
|
||||
portStr := fmt.Sprintf("%v", portValue)
|
||||
if portStr != "9999" {
|
||||
t.Errorf("Expected port 9999 in settings, got %v (%T)", portValue, portValue)
|
||||
}
|
||||
|
||||
overrides := GetEnvOverrides()
|
||||
found := false
|
||||
for _, o := range overrides {
|
||||
if strings.Contains(o, "server.port") && strings.Contains(o, "9999") {
|
||||
found = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !found {
|
||||
t.Errorf("Expected server.port override in %v", overrides)
|
||||
}
|
||||
|
||||
// 验证格式化输出
|
||||
formatted := GetFormattedSettings()
|
||||
if !strings.Contains(formatted, "server.port: 9999") {
|
||||
t.Errorf("Expected formatted settings to contain server.port: 9999, got %s", formatted)
|
||||
}
|
||||
}
|
||||
|
||||
101
scripts/deploy.sh
Normal file
101
scripts/deploy.sh
Normal file
@@ -0,0 +1,101 @@
|
||||
#!/bin/bash
|
||||
|
||||
# 定时任务示例 (每30分钟执行一次):
|
||||
# */30 * * * * /path/to/project/scripts/deploy.sh >> /path/to/project/scripts/deploy_cron.log 2>&1
|
||||
|
||||
# 项目根目录
|
||||
# 假设脚本位于 scripts 目录下
|
||||
PROJECT_DIR=$(cd $(dirname $0)/.. && pwd)
|
||||
cd $PROJECT_DIR
|
||||
|
||||
# 日志文件
|
||||
LOG_FILE="$PROJECT_DIR/scripts/deploy.log"
|
||||
|
||||
log() {
|
||||
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
|
||||
}
|
||||
|
||||
# 确保在项目根目录
|
||||
if [ ! -f "docker-compose.yml" ]; then
|
||||
log "错误: 未能在 $PROJECT_DIR 找到 docker-compose.yml,请确保脚本位置正确。"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log "开始检查更新..."
|
||||
|
||||
# 获取远程代码
|
||||
git fetch origin
|
||||
|
||||
# 获取当前分支名
|
||||
BRANCH=$(git rev-parse --abbrev-ref HEAD)
|
||||
|
||||
# 检查本地分支是否有上游分支
|
||||
UPSTREAM=$(git rev-parse --abbrev-ref @{u} 2>/dev/null)
|
||||
if [ -z "$UPSTREAM" ]; then
|
||||
log "错误: 当前分支 $BRANCH 没有设置上游分支,无法自动对比更新。"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 检查本地是否落后于远程
|
||||
LOCAL=$(git rev-parse HEAD)
|
||||
REMOTE=$(git rev-parse "$UPSTREAM")
|
||||
|
||||
if [ "$LOCAL" = "$REMOTE" ]; then
|
||||
log "代码已是最新 ($LOCAL),无需更新。"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
log "检测到远程变更 ($LOCAL -> $REMOTE),准备开始升级..."
|
||||
|
||||
# 检查是否有本地修改
|
||||
HAS_CHANGES=$(git status --porcelain)
|
||||
|
||||
if [ -n "$HAS_CHANGES" ]; then
|
||||
log "检测到本地修改,正在暂存以保留个性化配置..."
|
||||
git stash
|
||||
STASHED=true
|
||||
else
|
||||
STASHED=false
|
||||
fi
|
||||
|
||||
# 拉取新代码
|
||||
log "正在拉取远程代码 ($BRANCH)..."
|
||||
if git pull origin "$BRANCH"; then
|
||||
log "代码拉取成功。"
|
||||
else
|
||||
log "错误: 代码拉取失败。"
|
||||
if [ "$STASHED" = true ]; then
|
||||
git stash pop
|
||||
fi
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 恢复本地修改
|
||||
if [ "$STASHED" = true ]; then
|
||||
log "正在恢复本地修改..."
|
||||
if git stash pop; then
|
||||
log "本地修改已成功恢复。"
|
||||
else
|
||||
log "警告: 恢复本地修改时发生冲突,请手动检查 docker-compose.yml 等文件。"
|
||||
# 即使冲突也尝试继续,或者你可以选择在此退出
|
||||
fi
|
||||
fi
|
||||
|
||||
# 确定 docker-compose 命令
|
||||
DOCKER_COMPOSE_BIN="docker-compose"
|
||||
if ! command -v $DOCKER_COMPOSE_BIN &> /dev/null; then
|
||||
DOCKER_COMPOSE_BIN="docker compose"
|
||||
fi
|
||||
|
||||
# 执行 docker-compose 部署
|
||||
log "正在执行 $DOCKER_COMPOSE_BIN 部署..."
|
||||
if $DOCKER_COMPOSE_BIN up -d --build; then
|
||||
log "服务升级成功!"
|
||||
# 清理无用镜像(可选)
|
||||
docker image prune -f
|
||||
else
|
||||
log "错误: $DOCKER_COMPOSE_BIN 部署失败。"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log "部署任务完成。"
|
||||
Reference in New Issue
Block a user