modified: install.sh
This commit is contained in:
344
install.sh
344
install.sh
@@ -1,9 +1,8 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# 🚀 SwiftGram MTProxy — Smart Modular Manager
|
# 🚀 SwiftGram MTProxy — Полнофункциональный менеджер
|
||||||
# Чистая версия без рекламы.
|
# Исправлено: Возврат к стандартной сетевой модели Docker для 100% доступности.
|
||||||
# Функции: Auto-BBR, IPv6, UDP-Fix, Domain Analysis, Hiddify Compatible.
|
|
||||||
|
|
||||||
# ── Настройки репозитория (ЗАМЕНИ НА СВОИ ПОСЛЕ СОЗДАНИЯ РЕПО) ────────────────
|
# ── Настройки репозитория ────────────────────────────────────────────────────
|
||||||
REPO_RAW_URL="https://git.bargcraft.top/kobalt/swiftgram/raw/branch/main"
|
REPO_RAW_URL="https://git.bargcraft.top/kobalt/swiftgram/raw/branch/main"
|
||||||
|
|
||||||
# ── Цвета ────────────────────────────────────────────────────────────────────
|
# ── Цвета ────────────────────────────────────────────────────────────────────
|
||||||
@@ -54,6 +53,20 @@ progress_bar() {
|
|||||||
[ "$current" -eq "$total" ] && echo "" >&2
|
[ "$current" -eq "$total" ] && echo "" >&2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
run_with_progress() {
|
||||||
|
local label="$1"; shift
|
||||||
|
spinner_start "$label"
|
||||||
|
"$@" >/dev/null 2>&1
|
||||||
|
local rc=$?
|
||||||
|
spinner_stop
|
||||||
|
if [ $rc -eq 0 ]; then
|
||||||
|
echo -e " ${GREEN}✓${NC} $label"
|
||||||
|
else
|
||||||
|
echo -e " ${RED}✗${NC} $label ${RED}(ошибка)${NC}"
|
||||||
|
fi
|
||||||
|
return $rc
|
||||||
|
}
|
||||||
|
|
||||||
# ── Проверки системы ─────────────────────────────────────────────────────────
|
# ── Проверки системы ─────────────────────────────────────────────────────────
|
||||||
if [ "$EUID" -ne 0 ]; then
|
if [ "$EUID" -ne 0 ]; then
|
||||||
echo -e "${RED}Запустите с sudo / root.${NC}"
|
echo -e "${RED}Запустите с sudo / root.${NC}"
|
||||||
@@ -70,26 +83,18 @@ install_pkg() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# ── Оптимизация Сети (BBR + Limits) ──────────────────────────────────────────
|
# ── Оптимизация Сети (BBR) ───────────────────────────────────────────────────
|
||||||
optimize_system() {
|
optimize_system() {
|
||||||
spinner_start "Оптимизация сетевого стека (BBR)..."
|
|
||||||
if ! sysctl net.ipv4.tcp_congestion_control | grep -q "bbr"; then
|
if ! sysctl net.ipv4.tcp_congestion_control | grep -q "bbr"; then
|
||||||
|
spinner_start "Оптимизация сетевого стека (BBR)..."
|
||||||
{
|
{
|
||||||
echo "net.core.default_qdisc=fq"
|
echo "net.core.default_qdisc=fq"
|
||||||
echo "net.ipv4.tcp_congestion_control=bbr"
|
echo "net.ipv4.tcp_congestion_control=bbr"
|
||||||
echo "net.ipv4.ip_local_port_range=1024 65535"
|
|
||||||
echo "net.core.somaxconn=65535"
|
|
||||||
echo "net.ipv4.tcp_fastopen=3"
|
|
||||||
} >> /etc/sysctl.conf
|
} >> /etc/sysctl.conf
|
||||||
sysctl -p >/dev/null 2>&1
|
sysctl -p >/dev/null 2>&1
|
||||||
|
spinner_stop
|
||||||
|
echo -e " ${GREEN}✓${NC} BBR включен"
|
||||||
fi
|
fi
|
||||||
# Увеличение лимитов открытых файлов
|
|
||||||
if ! grep -q "soft nofile 1000000" /etc/security/limits.conf; then
|
|
||||||
echo "* soft nofile 1000000" >> /etc/security/limits.conf
|
|
||||||
echo "* hard nofile 1000000" >> /etc/security/limits.conf
|
|
||||||
fi
|
|
||||||
spinner_stop
|
|
||||||
echo -e " ${GREEN}✓${NC} Система оптимизирована (BBR включен)"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# ── Firewall (Фикс звонков) ──────────────────────────────────────────────────
|
# ── Firewall (Фикс звонков) ──────────────────────────────────────────────────
|
||||||
@@ -103,34 +108,43 @@ fix_firewall() {
|
|||||||
firewall-cmd --permanent --add-port="$port"/udp >/dev/null 2>&1
|
firewall-cmd --permanent --add-port="$port"/udp >/dev/null 2>&1
|
||||||
firewall-cmd --reload >/dev/null 2>&1
|
firewall-cmd --reload >/dev/null 2>&1
|
||||||
fi
|
fi
|
||||||
echo -e " ${GREEN}✓${NC} Firewall: порты $port/TCP и $port/UDP открыты"
|
echo -e " ${GREEN}✓${NC} Порты $port (TCP/UDP) открыты"
|
||||||
}
|
}
|
||||||
|
|
||||||
# ── Интеллектуальный анализ домена ───────────────────────────────────────────
|
# ── Установка зависимостей ───────────────────────────────────────────────────
|
||||||
analyze_best_domain() {
|
install_base_deps() {
|
||||||
spinner_start "Анализ оптимального домена для Fake TLS..."
|
local steps=0 total=4
|
||||||
local test_domains=(
|
progress_bar $steps $total "Проверка зависимостей..."
|
||||||
"google.com" "wikipedia.org" "github.com" "habr.com"
|
if ! command -v curl &>/dev/null; then run_with_progress "Установка curl" install_pkg curl; fi
|
||||||
"microsoft.com" "stackoverflow.com" "lenta.ru" "rbc.ru"
|
steps=$((steps+1)); progress_bar $steps $total "curl"
|
||||||
)
|
if ! command -v docker &>/dev/null; then
|
||||||
local best_domain="google.com"
|
spinner_start "Установка Docker..."
|
||||||
local min_time=999
|
curl -fsSL https://get.docker.com | sh >/dev/null 2>&1
|
||||||
|
systemctl enable --now docker >/dev/null 2>&1
|
||||||
for d in "${test_domains[@]}"; do
|
spinner_stop
|
||||||
local t=$(ping -c 1 -W 1 "$d" 2>/dev/null | grep 'time=' | awk -F'time=' '{print $2}' | awk '{print $1}')
|
fi
|
||||||
if [ -z "$t" ]; then t=999; fi
|
steps=$((steps+1)); progress_bar $steps $total "docker"
|
||||||
|
if ! command -v qrencode &>/dev/null; then run_with_progress "Установка qrencode" install_pkg qrencode; fi
|
||||||
if (( $(echo "$t < $min_time" | bc -l 2>/dev/null || [ ${t%.*} -lt ${min_time%.*} ]) )); then
|
steps=$((steps+1)); progress_bar $steps $total "qrencode"
|
||||||
min_time=$t
|
if ! docker info &>/dev/null 2>&1; then systemctl start docker 2>/dev/null; sleep 2; fi
|
||||||
best_domain=$d
|
steps=$((steps+1)); progress_bar $steps $total "Готово"
|
||||||
fi
|
echo ""
|
||||||
done
|
}
|
||||||
spinner_stop
|
|
||||||
echo -e " ${GREEN}✓${NC} Оптимальный домен: ${WHITE}$best_domain${NC} (задержка: ${min_time}ms)"
|
# ── Утилиты IP и Портов ──────────────────────────────────────────────────────
|
||||||
echo "$best_domain"
|
get_ip4() { curl -s -4 --max-time 5 https://api.ipify.org || echo "0.0.0.0"; }
|
||||||
|
|
||||||
|
check_port() {
|
||||||
|
local port="$1"
|
||||||
|
if docker ps --format '{{.Names}}' 2>/dev/null | grep -q "^${CONTAINER_NAME}$"; then
|
||||||
|
local hp=$(docker inspect "$CONTAINER_NAME" --format='{{range $p,$c := .HostConfig.PortBindings}}{{(index $c 0).HostPort}} {{end}}' 2>/dev/null)
|
||||||
|
for p in $hp; do [ "$p" = "$port" ] && return 1; done
|
||||||
|
fi
|
||||||
|
local line=$(ss -tlnp 2>/dev/null | grep -E ":${port}\b" | head -1)
|
||||||
|
[ -n "$line" ] && { echo "$line"; return 0; }
|
||||||
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
# ── Умный поиск порта (ИСПРАВЛЕНО: вывод сообщений в 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
|
||||||
@@ -144,80 +158,7 @@ find_smart_port() {
|
|||||||
echo "$port"
|
echo "$port"
|
||||||
}
|
}
|
||||||
|
|
||||||
# ── Установка зависимостей ───────────────────────────────────────────────────
|
# ── Показать данные подключения ──────────────────────────────────────────────
|
||||||
install_base_deps() {
|
|
||||||
local total=4 cur=0
|
|
||||||
progress_bar $cur $total "Проверка..."
|
|
||||||
|
|
||||||
if ! command -v curl &>/dev/null; then install_pkg curl; fi
|
|
||||||
cur=$((cur+1)); progress_bar $cur $total "curl"
|
|
||||||
|
|
||||||
if ! command -v docker &>/dev/null; then
|
|
||||||
spinner_start "Установка Docker..."
|
|
||||||
curl -fsSL https://get.docker.com | sh >/dev/null 2>&1
|
|
||||||
systemctl enable --now docker >/dev/null 2>&1
|
|
||||||
spinner_stop
|
|
||||||
fi
|
|
||||||
cur=$((cur+1)); progress_bar $cur $total "docker"
|
|
||||||
|
|
||||||
if ! command -v qrencode &>/dev/null; then install_pkg qrencode; fi
|
|
||||||
cur=$((cur+1)); progress_bar $cur $total "qrencode"
|
|
||||||
|
|
||||||
if ! docker info &>/dev/null 2>&1; then systemctl start docker; fi
|
|
||||||
cur=$((cur+1)); progress_bar $cur $total "Готово"
|
|
||||||
echo ""
|
|
||||||
}
|
|
||||||
|
|
||||||
# ── IP Утилиты ───────────────────────────────────────────────────────────────
|
|
||||||
get_ip4() { curl -s -4 --max-time 5 https://api.ipify.org || echo "0.0.0.0"; }
|
|
||||||
get_ip6() { curl -s -6 --max-time 5 https://api6.ipify.org || echo ""; }
|
|
||||||
|
|
||||||
# ── 1) Установка MTProxy ─────────────────────────────────────────────────────
|
|
||||||
menu_install() {
|
|
||||||
clear
|
|
||||||
echo -e "${CYAN}╔══════════════════════════════════════════════════════════════╗${NC}"
|
|
||||||
echo -e "${CYAN}║ УСТАНОВКА SWIFTGRAM MTPROXY ║${NC}"
|
|
||||||
echo -e "${CYAN}╚══════════════════════════════════════════════════════════════╝${NC}"
|
|
||||||
|
|
||||||
optimize_system
|
|
||||||
|
|
||||||
local DOMAIN=$(analyze_best_domain)
|
|
||||||
local PORT=$(find_smart_port)
|
|
||||||
|
|
||||||
echo -e " ${GREEN}✓${NC} Итоговый порт: ${WHITE}$PORT${NC}"
|
|
||||||
fix_firewall "$PORT"
|
|
||||||
|
|
||||||
# Процесс Docker
|
|
||||||
spinner_start "Загрузка и запуск прокси (IPv4 + IPv6 + UDP)..."
|
|
||||||
docker pull nineseconds/mtg:2 >/dev/null 2>&1
|
|
||||||
local SECRET=$(docker run --rm nineseconds/mtg:2 generate-secret --hex "$DOMAIN" 2>/dev/null)
|
|
||||||
|
|
||||||
docker stop "$CONTAINER_NAME" &>/dev/null
|
|
||||||
docker rm "$CONTAINER_NAME" &>/dev/null
|
|
||||||
|
|
||||||
# Используем --network host для 100% совместимости с IPv6 и UDP (звонки)
|
|
||||||
# Слушаем на [::], что охватывает и IPv4, и IPv6 интерфейсы
|
|
||||||
docker run -d --name "$CONTAINER_NAME" --restart always \
|
|
||||||
--network host \
|
|
||||||
nineseconds/mtg:2 simple-run \
|
|
||||||
-n 1.1.1.1 -t 1.0.0.1 -i prefer-ipv4 \
|
|
||||||
"::$PORT" "$SECRET" > /dev/null 2>&1
|
|
||||||
|
|
||||||
sleep 2
|
|
||||||
spinner_stop
|
|
||||||
|
|
||||||
if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
|
|
||||||
mkdir -p "$BOT_DIR"
|
|
||||||
echo "{\"domain\": \"$DOMAIN\", \"port\": \"$PORT\", \"secret\": \"$SECRET\"}" > "$BOT_DIR/proxy.json"
|
|
||||||
echo -e "\n${GREEN}✓ SwiftGram успешно запущен на порту $PORT!${NC}"
|
|
||||||
show_config
|
|
||||||
else
|
|
||||||
echo -e "\n${RED}✗ Ошибка запуска. Проверьте: docker logs $CONTAINER_NAME${NC}"
|
|
||||||
fi
|
|
||||||
read -p "Нажмите Enter..."
|
|
||||||
}
|
|
||||||
|
|
||||||
# ── Показать данные ──────────────────────────────────────────────────────────
|
|
||||||
show_config() {
|
show_config() {
|
||||||
if ! docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
|
if ! docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
|
||||||
echo -e "${RED}Прокси не запущен!${NC}"; return
|
echo -e "${RED}Прокси не запущен!${NC}"; return
|
||||||
@@ -226,73 +167,106 @@ show_config() {
|
|||||||
local PORT=$(echo "$DATA" | grep -oP '(?<="port": ")[^"]*')
|
local PORT=$(echo "$DATA" | grep -oP '(?<="port": ")[^"]*')
|
||||||
local SECRET=$(echo "$DATA" | grep -oP '(?<="secret": ")[^"]*')
|
local SECRET=$(echo "$DATA" | grep -oP '(?<="secret": ")[^"]*')
|
||||||
local IP4=$(get_ip4)
|
local IP4=$(get_ip4)
|
||||||
local IP6=$(get_ip6)
|
|
||||||
|
|
||||||
echo -e "\n${CYAN}--- ДАННЫЕ ПОДКЛЮЧЕНИЯ ---${NC}"
|
|
||||||
echo -e "IPv4: ${WHITE}$IP4${NC}"
|
|
||||||
[ -n "$IP6" ] && echo -e "IPv6: ${WHITE}$IP6${NC}"
|
|
||||||
echo -e "Порт: ${WHITE}$PORT${NC}"
|
|
||||||
echo -e "Secret: ${WHITE}$SECRET${NC}"
|
|
||||||
|
|
||||||
local LINK="tg://proxy?server=$IP4&port=$PORT&secret=$SECRET"
|
local LINK="tg://proxy?server=$IP4&port=$PORT&secret=$SECRET"
|
||||||
echo -e "\nСсылка: ${BLUE}$LINK${NC}"
|
|
||||||
|
echo -e "\n${CYAN}╔══════════════════════════════════════════════════════════════╗${NC}"
|
||||||
|
echo -e "${CYAN}║ ДАННЫЕ ПОДКЛЮЧЕНИЯ ║${NC}"
|
||||||
|
echo -e "${CYAN}╚══════════════════════════════════════════════════════════════╝${NC}"
|
||||||
|
echo -e " IP: ${WHITE}$IP4${NC}"
|
||||||
|
echo -e " Порт: ${WHITE}$PORT${NC} (TCP + UDP)"
|
||||||
|
echo -e " Secret: ${WHITE}$SECRET${NC}"
|
||||||
|
echo -e "\n Ссылка: ${BLUE}$LINK${NC}"
|
||||||
|
echo ""
|
||||||
qrencode -t ANSIUTF8 "$LINK"
|
qrencode -t ANSIUTF8 "$LINK"
|
||||||
}
|
}
|
||||||
|
|
||||||
# ── 3) Настройка бота (Модульная) ────────────────────────────────────────────
|
# ── 1) Установка MTProxy ─────────────────────────────────────────────────────
|
||||||
|
menu_install() {
|
||||||
|
clear
|
||||||
|
echo -e "${CYAN}╔══════════════════════════════════════════════════════════════╗${NC}"
|
||||||
|
echo -e "${CYAN}║ УСТАНОВКА SWIFTGRAM MTPROXY ║${NC}"
|
||||||
|
echo -e "${CYAN}╚══════════════════════════════════════════════════════════════╝${NC}"
|
||||||
|
|
||||||
|
local domains=("google.com" "wikipedia.org" "github.com" "habr.com" "microsoft.com" "stackoverflow.com" "lenta.ru" "rbc.ru")
|
||||||
|
echo -e "\nВыберите домен для маскировки (Fake TLS):"
|
||||||
|
for i in "${!domains[@]}"; do
|
||||||
|
printf " ${YELLOW}%2d)${NC} %-20s" "$((i+1))" "${domains[$i]}"
|
||||||
|
[[ $(( (i+1) % 2 )) -eq 0 ]] && echo ""
|
||||||
|
done
|
||||||
|
echo -e "\n ${CYAN}9)${NC} Ввести свой домен"
|
||||||
|
read -p "Выбор: " d_idx
|
||||||
|
if [ "$d_idx" = "9" ]; then read -p "Введите домен: " DOMAIN; else DOMAIN=${domains[$((d_idx-1))]}; fi
|
||||||
|
DOMAIN=${DOMAIN:-google.com}
|
||||||
|
|
||||||
|
local PORT=$(find_smart_port)
|
||||||
|
echo -e " ${GREEN}✓${NC} Итоговый порт: ${WHITE}$PORT${NC}"
|
||||||
|
|
||||||
|
optimize_system
|
||||||
|
fix_firewall "$PORT"
|
||||||
|
|
||||||
|
spinner_start "Запуск контейнера..."
|
||||||
|
docker pull nineseconds/mtg:2 >/dev/null 2>&1
|
||||||
|
local SECRET=$(docker run --rm nineseconds/mtg:2 generate-secret --hex "$DOMAIN" 2>/dev/null)
|
||||||
|
|
||||||
|
docker stop "$CONTAINER_NAME" &>/dev/null
|
||||||
|
docker rm "$CONTAINER_NAME" &>/dev/null
|
||||||
|
|
||||||
|
# ВОЗВРАТ К СТАНДАРТНОЙ СХЕМЕ (Bridge + 0.0.0.0), которая работала в оригинале
|
||||||
|
docker run -d --name "$CONTAINER_NAME" --restart always \
|
||||||
|
-p "$PORT":"$PORT"/tcp \
|
||||||
|
-p "$PORT":"$PORT"/udp \
|
||||||
|
nineseconds/mtg:2 simple-run \
|
||||||
|
-n 1.1.1.1 -i prefer-ipv4 \
|
||||||
|
0.0.0.0:"$PORT" "$SECRET" > /dev/null 2>&1
|
||||||
|
|
||||||
|
sleep 2
|
||||||
|
spinner_stop
|
||||||
|
|
||||||
|
if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
|
||||||
|
mkdir -p "$BOT_DIR"
|
||||||
|
echo "{\"domain\": \"$DOMAIN\", \"port\": \"$PORT\", \"secret\": \"$SECRET\"}" > "$BOT_DIR/proxy.json"
|
||||||
|
echo -e "\n${GREEN}✓ SwiftGram успешно запущен!${NC}"
|
||||||
|
show_config
|
||||||
|
else
|
||||||
|
echo -e "\n${RED}✗ Ошибка запуска. Проверьте: docker logs $CONTAINER_NAME${NC}"
|
||||||
|
fi
|
||||||
|
read -p "Нажмите Enter..."
|
||||||
|
}
|
||||||
|
|
||||||
|
# ── 3) Настройка бота ────────────────────────────────────────────────────────
|
||||||
menu_setup_bot() {
|
menu_setup_bot() {
|
||||||
clear
|
clear
|
||||||
echo -e "${CYAN}╔══════════════════════════════════════════════════════════════╗${NC}"
|
echo -e "${CYAN}╔══════════════════════════════════════════════════════════════╗${NC}"
|
||||||
echo -e "${CYAN}║ НАСТРОЙКА TELEGRAM БОТА ║${NC}"
|
echo -e "${CYAN}║ НАСТРОЙКА TELEGRAM БОТА ║${NC}"
|
||||||
echo -e "${CYAN}╚══════════════════════════════════════════════════════════════╝${NC}"
|
echo -e "${CYAN}╚══════════════════════════════════════════════════════════════╝${NC}"
|
||||||
|
|
||||||
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; fi
|
||||||
run_with_progress "Установка Python3" install_pkg python3 python3-pip python3-venv
|
|
||||||
fi
|
|
||||||
|
|
||||||
mkdir -p "$BOT_DIR"
|
mkdir -p "$BOT_DIR"
|
||||||
cd "$BOT_DIR"
|
cd "$BOT_DIR"
|
||||||
|
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
|
||||||
|
[ ! -d "venv" ] && python3 -m venv venv >/dev/null 2>&1
|
||||||
if [ ! -d "venv" ]; then
|
|
||||||
spinner_start "Создание виртуального окружения..."
|
|
||||||
python3 -m venv venv >/dev/null 2>&1
|
|
||||||
spinner_stop
|
|
||||||
fi
|
|
||||||
spinner_start "Установка зависимостей Python..."
|
|
||||||
./venv/bin/pip install --upgrade pip -q
|
./venv/bin/pip install --upgrade pip -q
|
||||||
./venv/bin/pip install -r requirements.txt -q
|
./venv/bin/pip install -r requirements.txt -q
|
||||||
spinner_stop
|
|
||||||
|
|
||||||
echo -e "\n${YELLOW}Введите BOT_TOKEN от @BotFather:${NC}"
|
echo -e "\n${YELLOW}Введите BOT_TOKEN:${NC}"
|
||||||
read -r TOKEN
|
read -r TOKEN
|
||||||
echo -e "${YELLOW}Введите ваш Telegram ID (админ):${NC}"
|
echo -e "${YELLOW}Ваш Telegram ID:${NC}"
|
||||||
read -r ADMIN_ID
|
read -r ADMIN_ID
|
||||||
|
{ echo "BOT_TOKEN=$TOKEN"; echo "ALLOWED_IDS=$ADMIN_ID"; echo "CONTAINER_NAME=$CONTAINER_NAME"; echo "CONFIG_PATH=$BOT_DIR/proxy.json"; } > .env
|
||||||
{
|
|
||||||
echo "BOT_TOKEN=$TOKEN"
|
|
||||||
[ -n "$ADMIN_ID" ] && echo "ALLOWED_IDS=$ADMIN_ID"
|
|
||||||
echo "CONTAINER_NAME=$CONTAINER_NAME"
|
|
||||||
echo "CONFIG_PATH=$BOT_DIR/proxy.json"
|
|
||||||
} > .env
|
|
||||||
chmod 600 .env
|
chmod 600 .env
|
||||||
|
|
||||||
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
|
||||||
After=network.target docker.service
|
After=network.target docker.service
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=simple
|
Type=simple
|
||||||
WorkingDirectory=$BOT_DIR
|
WorkingDirectory=$BOT_DIR
|
||||||
ExecStart=$BOT_DIR/venv/bin/python $BOT_DIR/bot.py
|
ExecStart=$BOT_DIR/venv/bin/python $BOT_DIR/bot.py
|
||||||
Restart=always
|
Restart=always
|
||||||
RestartSec=5
|
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
EOF
|
EOF
|
||||||
@@ -300,81 +274,39 @@ EOF
|
|||||||
systemctl daemon-reload
|
systemctl daemon-reload
|
||||||
systemctl enable --now "$SERVICE_NAME"
|
systemctl enable --now "$SERVICE_NAME"
|
||||||
systemctl restart "$SERVICE_NAME"
|
systemctl restart "$SERVICE_NAME"
|
||||||
|
echo -e "\n${GREEN}✓ Бот запущен!${NC}"
|
||||||
echo -e "\n${GREEN}✓ Бот успешно запущен и добавлен в автозагрузку!${NC}"
|
|
||||||
read -p "Нажмите Enter..."
|
read -p "Нажмите Enter..."
|
||||||
}
|
}
|
||||||
|
|
||||||
# ── 7) Полное меню удаления ──────────────────────────────────────────────────
|
# ── 7) Удаление ──────────────────────────────────────────────────────────────
|
||||||
menu_remove() {
|
menu_remove() {
|
||||||
clear
|
clear
|
||||||
echo -e "${RED}╔══════════════════════════════════════════════════════════════╗${NC}"
|
read -p "Удалить SwiftGram полностью? (y/N): " yn
|
||||||
echo -e "${RED}║ УДАЛЕНИЕ SWIFTGRAM ║${NC}"
|
|
||||||
echo -e "${RED}╚══════════════════════════════════════════════════════════════╝${NC}"
|
|
||||||
echo -e "Будет удалено: контейнер, файлы бота, сервис и настройки.\n"
|
|
||||||
|
|
||||||
read -p "Вы уверены? (y/N): " yn
|
|
||||||
[[ "$yn" != "y" ]] && return
|
[[ "$yn" != "y" ]] && return
|
||||||
|
|
||||||
local words=("УДАЛИТЬ" "SWIFTGRAM" "ОЧИСТКА" "ФИНАЛ")
|
|
||||||
local confirm_word="${words[$((RANDOM % ${#words[@]}))]}"
|
|
||||||
echo -e "Введите слово для подтверждения: ${WHITE}$confirm_word${NC}"
|
|
||||||
read -p ">>> " input_word
|
|
||||||
[[ "$input_word" != "$confirm_word" ]] && { echo "Отмена."; sleep 1; return; }
|
|
||||||
|
|
||||||
spinner_start "Удаление..."
|
spinner_start "Удаление..."
|
||||||
docker stop "$CONTAINER_NAME" &>/dev/null
|
docker stop "$CONTAINER_NAME" &>/dev/null; docker rm "$CONTAINER_NAME" &>/dev/null
|
||||||
docker rm "$CONTAINER_NAME" &>/dev/null
|
systemctl stop "$SERVICE_NAME" 2>/dev/null; systemctl disable "$SERVICE_NAME" 2>/dev/null
|
||||||
systemctl stop "$SERVICE_NAME" 2>/dev/null
|
rm -f "/etc/systemd/system/${SERVICE_NAME}.service"; rm -rf "$BOT_DIR"; rm -f /usr/local/bin/swiftgram
|
||||||
systemctl disable "$SERVICE_NAME" 2>/dev/null
|
|
||||||
rm -f "/etc/systemd/system/${SERVICE_NAME}.service"
|
|
||||||
rm -rf "$BOT_DIR"
|
|
||||||
rm -f /usr/local/bin/swiftgram
|
|
||||||
spinner_stop
|
spinner_stop
|
||||||
echo -e "${GREEN}✓ Система полностью очищена.${NC}"
|
echo -e "${GREEN}✓ Удалено.${NC}"; read -p "Enter..."
|
||||||
read -p "Нажмите Enter..."
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# ── Главный цикл ─────────────────────────────────────────────────────────────
|
# ── Главный цикл ─────────────────────────────────────────────────────────────
|
||||||
install_base_deps
|
install_base_deps
|
||||||
|
|
||||||
# Самокопирование
|
|
||||||
SELF="$(realpath "$0")"
|
SELF="$(realpath "$0")"
|
||||||
if [ "$SELF" != "/usr/local/bin/swiftgram" ]; then
|
[ "$SELF" != "/usr/local/bin/swiftgram" ] && { cp "$SELF" /usr/local/bin/swiftgram; chmod +x /usr/local/bin/swiftgram; }
|
||||||
cp "$SELF" /usr/local/bin/swiftgram && chmod +x /usr/local/bin/swiftgram
|
|
||||||
fi
|
|
||||||
|
|
||||||
while true; do
|
while true; do
|
||||||
clear
|
clear
|
||||||
echo -e "${MAGENTA}╔══════════════════════════════════════════════════════════════╗${NC}"
|
echo -e "${MAGENTA}╔══════════════════════════════════════════════════════════════╗${NC}"
|
||||||
echo -e "${MAGENTA}║ SWIFTGRAM MANAGER (Professional) ║${NC}"
|
echo -e "${MAGENTA}║ SWIFTGRAM MANAGER (Professional) ║${NC}"
|
||||||
echo -e "${MAGENTA}╚══════════════════════════════════════════════════════════════╝${NC}"
|
echo -e "${MAGENTA}╚══════════════════════════════════════════════════════════════╝${NC}"
|
||||||
|
docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$" && echo -e " Прокси: ${GREEN}РАБОТАЕТ${NC}" || echo -e " Прокси: ${RED}ВЫКЛЮЧЕН${NC}"
|
||||||
if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
|
systemctl is-active --quiet "$SERVICE_NAME" && echo -e " Бот: ${GREEN}РАБОТАЕТ${NC}" || echo -e " Бот: ${YELLOW}НЕ НАСТРОЕН${NC}"
|
||||||
echo -e " Прокси: ${GREEN}РАБОТАЕТ${NC}"
|
echo -e "\n ${GREEN}1)${NC} Установить / Обновить прокси\n ${GREEN}2)${NC} Показать данные (QR)\n ${CYAN}3)${NC} Настроить Telegram-бота\n ${GREEN}4)${NC} Перезапустить прокси\n ${RED}5)${NC} Удалить SwiftGram\n ${WHITE}0)${NC} Выход"
|
||||||
else
|
|
||||||
echo -e " Прокси: ${RED}ВЫКЛЮЧЕН${NC}"
|
|
||||||
fi
|
|
||||||
if systemctl is-active --quiet "$SERVICE_NAME"; then
|
|
||||||
echo -e " Бот: ${GREEN}РАБОТАЕТ${NC}"
|
|
||||||
else
|
|
||||||
echo -e " Бот: ${YELLOW}НЕ НАСТРОЕН${NC}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo -e "\n ${GREEN}1)${NC} Установить / Обновить прокси"
|
|
||||||
echo -e " ${GREEN}2)${NC} Показать данные (QR)"
|
|
||||||
echo -e " ${CYAN}3)${NC} Настроить Telegram-бота"
|
|
||||||
echo -e " ${GREEN}4)${NC} Перезапустить прокси"
|
|
||||||
echo -e " ${RED}5)${NC} Удалить всё"
|
|
||||||
echo -e " ${WHITE}0)${NC} Выход"
|
|
||||||
echo ""
|
|
||||||
read -p "Пункт: " m_idx
|
read -p "Пункт: " m_idx
|
||||||
case $m_idx in
|
case $m_idx in
|
||||||
1) menu_install ;;
|
1) menu_install ;; 2) clear; show_config; read -p "Нажмите Enter..." ;; 3) menu_setup_bot ;;
|
||||||
2) clear; show_config; read -p "Нажмите Enter..." ;;
|
4) docker restart "$CONTAINER_NAME"; sleep 1 ;; 5) menu_remove ;; 0) exit 0 ;;
|
||||||
3) menu_setup_bot ;;
|
|
||||||
4) docker restart "$CONTAINER_NAME"; echo "Готово"; sleep 1 ;;
|
|
||||||
5) menu_remove ;;
|
|
||||||
0) exit 0 ;;
|
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
Reference in New Issue
Block a user