mirror of
https://github.com/anten-ka/gotelegram_pro.git
synced 2026-05-19 15:36:03 +00:00
v2.5.0: add legacy state migration
This commit is contained in:
192
install.sh
192
install.sh
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user