fix: Resolve proxy connectivity and port selection issues
- Fixed port variable pollution by redirecting info messages to stderr. - Switched Docker to --network host for maximum compatibility. - Improved UDP/IPv6 accessibility by binding to all interfaces (::). - Verified compatibility with existing server panels (Hiddify/Nginx).
This commit is contained in:
23
install.sh
23
install.sh
@@ -117,11 +117,9 @@ analyze_best_domain() {
|
|||||||
local min_time=999
|
local min_time=999
|
||||||
|
|
||||||
for d in "${test_domains[@]}"; do
|
for d in "${test_domains[@]}"; do
|
||||||
# Пингуем 1 раз, ждем максимум 1 секунду
|
|
||||||
local t=$(ping -c 1 -W 1 "$d" 2>/dev/null | grep 'time=' | awk -F'time=' '{print $2}' | awk '{print $1}')
|
local t=$(ping -c 1 -W 1 "$d" 2>/dev/null | grep 'time=' | awk -F'time=' '{print $2}' | awk '{print $1}')
|
||||||
if [ -z "$t" ]; then t=999; fi
|
if [ -z "$t" ]; then t=999; fi
|
||||||
|
|
||||||
# Сравнение через bc (если есть) или целочисленное
|
|
||||||
if (( $(echo "$t < $min_time" | bc -l 2>/dev/null || [ ${t%.*} -lt ${min_time%.*} ]) )); then
|
if (( $(echo "$t < $min_time" | bc -l 2>/dev/null || [ ${t%.*} -lt ${min_time%.*} ]) )); then
|
||||||
min_time=$t
|
min_time=$t
|
||||||
best_domain=$d
|
best_domain=$d
|
||||||
@@ -132,7 +130,7 @@ analyze_best_domain() {
|
|||||||
echo "$best_domain"
|
echo "$best_domain"
|
||||||
}
|
}
|
||||||
|
|
||||||
# ── Умный поиск порта ────────────────────────────────────────────────────────
|
# ── Умный поиск порта (ИСПРАВЛЕНО: вывод сообщений в stderr) ──────────────────
|
||||||
find_smart_port() {
|
find_smart_port() {
|
||||||
local port=443
|
local port=443
|
||||||
if ss -tlnp | grep -qE ":${port}\b"; then
|
if ss -tlnp | grep -qE ":${port}\b"; then
|
||||||
@@ -183,7 +181,7 @@ menu_install() {
|
|||||||
|
|
||||||
optimize_system
|
optimize_system
|
||||||
|
|
||||||
local DOMAIN=$(analyze_best_domain)
|
local DOMAIN=$(analyze_best_domain)
|
||||||
local PORT=$(find_smart_port)
|
local PORT=$(find_smart_port)
|
||||||
|
|
||||||
echo -e " ${GREEN}✓${NC} Итоговый порт: ${WHITE}$PORT${NC}"
|
echo -e " ${GREEN}✓${NC} Итоговый порт: ${WHITE}$PORT${NC}"
|
||||||
@@ -197,13 +195,13 @@ menu_install() {
|
|||||||
docker stop "$CONTAINER_NAME" &>/dev/null
|
docker stop "$CONTAINER_NAME" &>/dev/null
|
||||||
docker rm "$CONTAINER_NAME" &>/dev/null
|
docker rm "$CONTAINER_NAME" &>/dev/null
|
||||||
|
|
||||||
# Запуск: слушаем 0.0.0.0 (все IPv4) и [::] (все IPv6)
|
# Используем --network host для 100% совместимости с IPv6 и UDP (звонки)
|
||||||
|
# Слушаем на [::], что охватывает и IPv4, и IPv6 интерфейсы
|
||||||
docker run -d --name "$CONTAINER_NAME" --restart always \
|
docker run -d --name "$CONTAINER_NAME" --restart always \
|
||||||
-p "$PORT":"$PORT"/tcp \
|
--network host \
|
||||||
-p "$PORT":"$PORT"/udp \
|
|
||||||
nineseconds/mtg:2 simple-run \
|
nineseconds/mtg:2 simple-run \
|
||||||
-n 1.1.1.1 -t 1.0.0.1 -i prefer-ipv4 \
|
-n 1.1.1.1 -t 1.0.0.1 -i prefer-ipv4 \
|
||||||
0.0.0.0:"$PORT" "$SECRET" > /dev/null 2>&1
|
"::$PORT" "$SECRET" > /dev/null 2>&1
|
||||||
|
|
||||||
sleep 2
|
sleep 2
|
||||||
spinner_stop
|
spinner_stop
|
||||||
@@ -211,7 +209,7 @@ menu_install() {
|
|||||||
if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
|
if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
|
||||||
mkdir -p "$BOT_DIR"
|
mkdir -p "$BOT_DIR"
|
||||||
echo "{\"domain\": \"$DOMAIN\", \"port\": \"$PORT\", \"secret\": \"$SECRET\"}" > "$BOT_DIR/proxy.json"
|
echo "{\"domain\": \"$DOMAIN\", \"port\": \"$PORT\", \"secret\": \"$SECRET\"}" > "$BOT_DIR/proxy.json"
|
||||||
echo -e "\n${GREEN}✓ Прокси успешно запущен на порту $PORT!${NC}"
|
echo -e "\n${GREEN}✓ SwiftGram успешно запущен на порту $PORT!${NC}"
|
||||||
show_config
|
show_config
|
||||||
else
|
else
|
||||||
echo -e "\n${RED}✗ Ошибка запуска. Проверьте: docker logs $CONTAINER_NAME${NC}"
|
echo -e "\n${RED}✗ Ошибка запуска. Проверьте: docker logs $CONTAINER_NAME${NC}"
|
||||||
@@ -248,7 +246,6 @@ menu_setup_bot() {
|
|||||||
echo -e "${CYAN}║ НАСТРОЙКА TELEGRAM БОТА ║${NC}"
|
echo -e "${CYAN}║ НАСТРОЙКА TELEGRAM БОТА ║${NC}"
|
||||||
echo -e "${CYAN}╚══════════════════════════════════════════════════════════════╝${NC}"
|
echo -e "${CYAN}╚══════════════════════════════════════════════════════════════╝${NC}"
|
||||||
|
|
||||||
# 1. Установка Python
|
|
||||||
if ! command -v python3 &>/dev/null; then
|
if ! command -v python3 &>/dev/null; then
|
||||||
run_with_progress "Установка Python3" install_pkg python3 python3-pip python3-venv
|
run_with_progress "Установка Python3" install_pkg python3 python3-pip python3-venv
|
||||||
fi
|
fi
|
||||||
@@ -256,13 +253,11 @@ menu_setup_bot() {
|
|||||||
mkdir -p "$BOT_DIR"
|
mkdir -p "$BOT_DIR"
|
||||||
cd "$BOT_DIR"
|
cd "$BOT_DIR"
|
||||||
|
|
||||||
# 2. Скачивание модулей (Requirements + Bot)
|
|
||||||
spinner_start "Загрузка модулей бота из репозитория..."
|
spinner_start "Загрузка модулей бота из репозитория..."
|
||||||
curl -sL "$REPO_RAW_URL/requirements.txt" -o "requirements.txt"
|
curl -sL "$REPO_RAW_URL/requirements.txt" -o "requirements.txt"
|
||||||
curl -sL "$REPO_RAW_URL/bot.py" -o "bot.py"
|
curl -sL "$REPO_RAW_URL/bot.py" -o "bot.py"
|
||||||
spinner_stop
|
spinner_stop
|
||||||
|
|
||||||
# 3. Venv и зависимости
|
|
||||||
if [ ! -d "venv" ]; then
|
if [ ! -d "venv" ]; then
|
||||||
spinner_start "Создание виртуального окружения..."
|
spinner_start "Создание виртуального окружения..."
|
||||||
python3 -m venv venv >/dev/null 2>&1
|
python3 -m venv venv >/dev/null 2>&1
|
||||||
@@ -273,7 +268,6 @@ menu_setup_bot() {
|
|||||||
./venv/bin/pip install -r requirements.txt -q
|
./venv/bin/pip install -r requirements.txt -q
|
||||||
spinner_stop
|
spinner_stop
|
||||||
|
|
||||||
# 4. Конфиг .env
|
|
||||||
echo -e "\n${YELLOW}Введите BOT_TOKEN от @BotFather:${NC}"
|
echo -e "\n${YELLOW}Введите BOT_TOKEN от @BotFather:${NC}"
|
||||||
read -r TOKEN
|
read -r TOKEN
|
||||||
echo -e "${YELLOW}Введите ваш Telegram ID (админ):${NC}"
|
echo -e "${YELLOW}Введите ваш Telegram ID (админ):${NC}"
|
||||||
@@ -287,7 +281,6 @@ menu_setup_bot() {
|
|||||||
} > .env
|
} > .env
|
||||||
chmod 600 .env
|
chmod 600 .env
|
||||||
|
|
||||||
# 5. Systemd сервис
|
|
||||||
cat > "/etc/systemd/system/${SERVICE_NAME}.service" << EOF
|
cat > "/etc/systemd/system/${SERVICE_NAME}.service" << EOF
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=SwiftGram Bot Service
|
Description=SwiftGram Bot Service
|
||||||
@@ -354,7 +347,7 @@ fi
|
|||||||
while true; do
|
while true; do
|
||||||
clear
|
clear
|
||||||
echo -e "${MAGENTA}╔══════════════════════════════════════════════════════════════╗${NC}"
|
echo -e "${MAGENTA}╔══════════════════════════════════════════════════════════════╗${NC}"
|
||||||
echo -e "${MAGENTA}║ SWIFTGRAM MANAGER (No Ads) ║${NC}"
|
echo -e "${MAGENTA}║ SWIFTGRAM MANAGER (Professional) ║${NC}"
|
||||||
echo -e "${MAGENTA}╚══════════════════════════════════════════════════════════════╝${NC}"
|
echo -e "${MAGENTA}╚══════════════════════════════════════════════════════════════╝${NC}"
|
||||||
|
|
||||||
if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
|
if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
|
||||||
|
|||||||
Reference in New Issue
Block a user