v2.5.0: add legacy state migration

This commit is contained in:
Виталий Литвинов
2026-04-24 18:58:52 +03:00
parent 7afeb59261
commit ed9073f28f
7 changed files with 288 additions and 4 deletions

View File

@@ -245,6 +245,195 @@ menu_version() {
echo -e " ${DIM}$(printf '─%.0s' {1..54})${NC}"
}
# ── Upgrade migration ────────────────────────────────────────────────────────
snapshot_preupgrade_state() {
local marker="$GOTELEGRAM_DIR/.preupgrade_${GOTELEGRAM_VERSION}_done"
[ -f "$marker" ] && return 0
mkdir -p "$BACKUP_DIR"
local ts tmp archive
ts=$(date +%Y%m%d_%H%M%S)
tmp="/tmp/gotelegram_preupgrade_${ts}"
archive="$BACKUP_DIR/preupgrade_${GOTELEGRAM_VERSION}_${ts}.tar.gz"
mkdir -p "$tmp"
[ -f "$GOTELEGRAM_CONFIG" ] && mkdir -p "$tmp/opt/gotelegram" && cp "$GOTELEGRAM_CONFIG" "$tmp/opt/gotelegram/config.json" 2>/dev/null
[ -f "$TELEMT_CONFIG" ] && mkdir -p "$tmp/etc/telemt" && cp "$TELEMT_CONFIG" "$tmp/etc/telemt/config.toml" 2>/dev/null
[ -f "$NGINX_SITE_CONF" ] && mkdir -p "$tmp/etc/nginx/sites-available" && cp "$NGINX_SITE_CONF" "$tmp/etc/nginx/sites-available/gotelegram" 2>/dev/null
[ -d "$WEBSITE_ROOT" ] && mkdir -p "$tmp/var/www/gotelegram-site" && cp -a "$WEBSITE_ROOT/." "$tmp/var/www/gotelegram-site/" 2>/dev/null
[ -f "$BOT_DIR/.env" ] && mkdir -p "$tmp/opt/gotelegram-bot" && cp "$BOT_DIR/.env" "$tmp/opt/gotelegram-bot/.env" 2>/dev/null
if tar czf "$archive" -C "$tmp" . 2>/dev/null; then
log_dim "Pre-upgrade snapshot: $archive"
touch "$marker" 2>/dev/null || true
fi
rm -rf "$tmp"
}
read_config_or_default() {
local key="$1" fallback="$2"
config_get "$key" 2>/dev/null || echo "$fallback"
}
detect_deployed_template_id() {
local tpl=""
if [ -f "$WEBSITE_ROOT/.gotelegram_template_id" ]; then
tpl=$(head -1 "$WEBSITE_ROOT/.gotelegram_template_id" 2>/dev/null || echo "")
[ -n "$tpl" ] && { echo "$tpl"; return 0; }
fi
if [ -d "$WEBSITE_ROOT" ] && [ -f "$WEBSITE_ROOT/index.html" ]; then
echo "deployed_site"
return 0
fi
tpl=$(read_config_or_default template_id "")
[ -n "$tpl" ] && { echo "$tpl"; return 0; }
echo ""
}
detect_template_source() {
local src
if [ -f "$WEBSITE_ROOT/.gotelegram_template_source" ]; then
src=$(head -1 "$WEBSITE_ROOT/.gotelegram_template_source" 2>/dev/null || echo "")
[ -n "$src" ] && { echo "$src"; return 0; }
fi
[ -d "$WEBSITE_ROOT" ] && [ -f "$WEBSITE_ROOT/index.html" ] && return 0
read_config_or_default template_source ""
}
write_normalized_gotelegram_config() {
local mode="$1" port="$2" secret="$3" mask_host="$4" domain="$5" tpl_id="$6" tpl_source="$7"
local lang installed_at stats_enabled tmp
lang=$(read_config_or_default language "$(get_language 2>/dev/null || echo en)")
installed_at=$(read_config_or_default installed_at "$(date -Iseconds)")
stats_enabled=$(read_config_or_default stats_enabled "")
tmp=$(mktemp) || return 1
jq -n \
--arg version "$GOTELEGRAM_VERSION" \
--arg engine "telemt" \
--arg mode "$mode" \
--argjson port "$port" \
--arg secret "$secret" \
--arg mask_host "$mask_host" \
--arg domain "$domain" \
--arg template_id "$tpl_id" \
--arg template_source "$tpl_source" \
--arg language "$lang" \
--arg installed_at "$installed_at" \
--arg updated_at "$(date -Iseconds)" \
--arg stats_enabled "$stats_enabled" \
'{
version: $version,
engine: $engine,
mode: $mode,
port: $port,
secret: $secret,
mask_host: $mask_host,
domain: $domain,
template_id: $template_id,
language: $language,
installed_at: $installed_at,
updated_at: $updated_at
}
+ (if $template_source != "" then {template_source: $template_source} else {} end)
+ (if $stats_enabled == "true" then {stats_enabled: true} elif $stats_enabled == "false" then {stats_enabled: false} else {} end)' \
> "$tmp" || { rm -f "$tmp"; return 1; }
mkdir -p "$(dirname "$GOTELEGRAM_CONFIG")"
mv "$tmp" "$GOTELEGRAM_CONFIG"
chmod 600 "$GOTELEGRAM_CONFIG"
}
auto_migrate_legacy_state() {
local marker="$GOTELEGRAM_DIR/.migrated_${GOTELEGRAM_VERSION}"
local current_version
current_version=$(read_config_or_default version "")
if [ -f "$marker" ] && [ "$current_version" = "$GOTELEGRAM_VERSION" ]; then
return 0
fi
[ -f "$TELEMT_CONFIG" ] || [ -f "$GOTELEGRAM_CONFIG" ] || [ -d "$WEBSITE_ROOT" ] || return 0
log_step "Миграция состояния GoTelegram"
snapshot_preupgrade_state
local mode port secret mask_host domain mask_port tpl_id tpl_source users_block tls_emulation changed=0 users_block_needs_write=0
users_block=$(get_telemt_users_block "$TELEMT_CONFIG" 2>/dev/null || true)
secret=$(get_config_value secret "$TELEMT_CONFIG" 2>/dev/null || echo "")
[ -z "$secret" ] && secret=$(read_config_or_default secret "")
[ -z "$secret" ] && secret=$(first_telemt_user_secret "$TELEMT_CONFIG" 2>/dev/null || echo "")
[ -z "$secret" ] && secret=$(generate_hex 32)
if [ -n "$users_block" ] && ! printf '%s\n' "$users_block" | grep -qE '^[[:space:]]*main[[:space:]]*='; then
users_block=$(printf 'main = "%s"\n%s\n' "$secret" "$users_block")
users_block_needs_write=1
fi
if [ -z "$users_block" ]; then
users_block="main = \"$secret\""
users_block_needs_write=1
fi
port=$(get_config_value port "$TELEMT_CONFIG" 2>/dev/null || echo "")
[ -z "$port" ] && port=$(read_config_or_default port "443")
[[ "$port" =~ ^[0-9]+$ ]] || port=443
mask_host=$(get_config_value mask_host "$TELEMT_CONFIG" 2>/dev/null || echo "")
[ -z "$mask_host" ] && mask_host=$(read_config_or_default mask_host "google.com")
domain=$(read_config_or_default domain "")
mask_port=$(get_config_value mask_port "$TELEMT_CONFIG" 2>/dev/null || echo "")
[ -z "$mask_port" ] && mask_port="443"
tls_emulation=$(toml_bool_value censorship tls_emulation "$TELEMT_CONFIG" 2>/dev/null || echo "")
mode=$(read_config_or_default mode "")
if [ -z "$mode" ]; then
if [ -n "$domain" ] || [ "$tls_emulation" = "false" ] || grep -q 'dns_overrides' "$TELEMT_CONFIG" 2>/dev/null; then
mode="pro"
else
mode="lite"
fi
fi
if [ "$mode" = "pro" ]; then
[ -z "$domain" ] && domain="$mask_host"
[ -n "$domain" ] && mask_host="$domain"
[ "$mask_port" = "443" ] && mask_port="8443"
else
domain=""
mask_port="443"
fi
tpl_id=$(detect_deployed_template_id)
tpl_source=$(detect_template_source || echo "")
if [ -d "$WEBSITE_ROOT" ] && [ -f "$WEBSITE_ROOT/index.html" ] && [ -n "$tpl_id" ]; then
echo "$tpl_id" > "$WEBSITE_ROOT/.gotelegram_template_id" 2>/dev/null || true
[ -n "$tpl_source" ] && echo "$tpl_source" > "$WEBSITE_ROOT/.gotelegram_template_source" 2>/dev/null || true
fi
if [ -f "$TELEMT_CONFIG" ]; then
if ! grep -q '\[server.api\]' "$TELEMT_CONFIG" 2>/dev/null || \
! grep -q 'metrics_listen' "$TELEMT_CONFIG" 2>/dev/null || \
! grep -q "GoTelegram v${GOTELEGRAM_VERSION}" "$TELEMT_CONFIG" 2>/dev/null; then
generate_telemt_toml "$secret" "$port" "$mode" "$mask_host" "$mask_port" "$TELEMT_CONFIG" >&2
replace_telemt_users_block "$users_block" "$TELEMT_CONFIG"
changed=1
users_block_needs_write=0
elif [ "$users_block_needs_write" = "1" ]; then
replace_telemt_users_block "$users_block" "$TELEMT_CONFIG"
changed=1
fi
fi
write_normalized_gotelegram_config "$mode" "$port" "$secret" "$mask_host" "$domain" "$tpl_id" "$tpl_source" || \
log_warning "Не удалось нормализовать config.json"
if [ "$changed" = "1" ] && systemctl is-active --quiet "$TELEMT_SERVICE" 2>/dev/null; then
log_info "Перезапускаю telemt, чтобы применить нормализованный конфиг..."
restart_telemt || log_warning "telemt не перезапустился после миграции; проверьте journalctl -u telemt"
fi
touch "$marker" 2>/dev/null || true
log_success "Миграция завершена: ключи, режим, домен и сайт сохранены"
}
# ── Install: mode selection ─────────────────────────────────────────────────
menu_install() {
# Check for v1
@@ -1491,6 +1680,7 @@ main() {
if ! check_deps_present; then
ensure_deps >&2 || exit 1
fi
auto_migrate_legacy_state >&2 || true
bot_action_dispatch "$@"
exit $?
fi
@@ -1509,6 +1699,8 @@ main() {
}
fi
auto_migrate_legacy_state || true
# First-run language picker (before banner so banner appears in chosen lang)
first_run_language_picker