v2: кнопочное меню, проверка портов, совместимость Docker, кнопка Поделиться, TCP+UDP звонки, auto-install Docker

Made-with: Cursor
This commit is contained in:
anten-ka
2026-03-06 15:38:48 +03:00
parent 1f38f068f7
commit a438b361e1
2 changed files with 566 additions and 308 deletions

View File

@@ -1,89 +1,109 @@
#!/bin/bash
# Установка GoTelegram MTProxy Bot.
# Формат как kaskad: curl -sL -H "Authorization: token TOKEN" https://raw.githubusercontent.com/anten-ka/gotelegram_pro/main/install.sh -o /usr/local/bin/gotelegram && chmod +x /usr/local/bin/gotelegram && systemctl restart gotelegram-bot 2>/dev/null; GITHUB_TOKEN=TOKEN gotelegram
# GoTelegram MTProxy Bot — установка.
# curl -sL -H "Authorization: token TOKEN" https://raw.githubusercontent.com/anten-ka/gotelegram_pro/main/install.sh -o /usr/local/bin/gotelegram && chmod +x /usr/local/bin/gotelegram && gotelegram TOKEN
set -e
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; CYAN='\033[0;36m'; NC='\033[0m'
if [ "$EUID" -ne 0 ]; then
echo -e "${RED}Запустите с sudo.${NC}"
exit 1
fi
# Токен можно передать аргументом: gotelegram ВАШ_ТОКЕН (для приватного репо)
[ "$EUID" -ne 0 ] && { echo -e "${RED}Запустите с sudo.${NC}"; exit 1; }
[ -n "$1" ] && export GITHUB_TOKEN="$1"
BOT_DIR="/opt/gotelegram-bot"
SERVICE_NAME="gotelegram-bot"
REPO_RAW="${GOTETELEGRAM_REPO_RAW:-https://raw.githubusercontent.com/anten-ka/gotelegram_pro/main}"
REPO_RAW="https://raw.githubusercontent.com/anten-ka/gotelegram_pro/main"
REPO_GIT="https://github.com/anten-ka/gotelegram_pro.git"
echo -e "${GREEN}[*] GoTelegram Bot — установка...${NC}"
echo -e "${GREEN}╔═══════════════════════════════════════════╗${NC}"
echo -e "${GREEN}║ GoTelegram MTProxy Bot — установка ║${NC}"
echo -e "${GREEN}╚═══════════════════════════════════════════╝${NC}"
# Зависимости (python3, curl, git для приватного репо)
if ! command -v python3 &>/dev/null; then
# ── Зависимости ──────────────────────────────────────────────────────────────
install_pkg() {
if command -v apt-get &>/dev/null; then
apt-get update && apt-get install -y python3 python3-pip python3-venv curl git
apt-get update -qq && apt-get install -y -qq "$@"
elif command -v dnf &>/dev/null; then
dnf install -y python3 python3-pip python3-virtualenv curl git 2>/dev/null || dnf install -y python3 python3-pip curl git
dnf install -y "$@"
elif command -v yum &>/dev/null; then
yum install -y python3 python3-pip curl git
else
echo -e "${RED}Установите python3 и curl.${NC}"
exit 1
yum install -y "$@"
fi
fi
if [ -n "$GITHUB_TOKEN" ] && ! command -v git &>/dev/null; then
echo -e "${GREEN}[*] Установка git для клонирования приватного репо...${NC}"
if command -v apt-get &>/dev/null; then apt-get update && apt-get install -y git; fi
if command -v dnf &>/dev/null; then dnf install -y git; fi
if command -v yum &>/dev/null; then yum install -y git; fi
fi
}
for cmd in python3 curl git; do
command -v $cmd &>/dev/null || { echo -e "${YELLOW}[*] Установка $cmd...${NC}"; install_pkg $cmd; }
done
# python3-venv может быть отдельным пакетом
python3 -m venv --help &>/dev/null 2>&1 || install_pkg python3-venv 2>/dev/null || true
# Docker
if ! command -v docker &>/dev/null; then
echo -e "${YELLOW}[!] Docker не найден. Нужен для /install в боте.${NC}"
echo -e "${YELLOW}[*] Docker не найден. Устанавливаю...${NC}"
curl -fsSL https://get.docker.com | sh
systemctl enable --now docker
fi
mkdir -p "$BOT_DIR"
cd "$BOT_DIR"
# Проверка: Docker запущен?
if ! docker info &>/dev/null 2>&1; then
systemctl start docker 2>/dev/null || true
sleep 2
docker info &>/dev/null 2>&1 || {
echo -e "${RED}Docker не запускается. Проверьте вручную: systemctl status docker${NC}"
exit 1
}
fi
# Получение файлов бота: при токене — только git clone (raw для приватного не работает)
if [ ! -f "$BOT_DIR/bot.py" ]; then
echo -e "${GREEN}[*] Загрузка файлов из репозитория...${NC}"
if [ -n "$GITHUB_TOKEN" ] && command -v git &>/dev/null; then
# Проверка совместимости: показываем существующие контейнеры
EXISTING=$(docker ps --format "{{.Names}}\t{{.Image}}\t{{.Ports}}" 2>/dev/null)
if [ -n "$EXISTING" ]; then
echo -e "${CYAN}[*] Обнаружены работающие контейнеры:${NC}"
echo "$EXISTING" | while IFS= read -r line; do echo " $line"; done
echo -e "${GREEN}[*] Бот будет работать параллельно, не затрагивая их.${NC}"
fi
# ── Файлы бота ───────────────────────────────────────────────────────────────
mkdir -p "$BOT_DIR"
download_files() {
# Приватный репо: git clone
if [ -n "$GITHUB_TOKEN" ]; then
echo -e "${GREEN}[*] Клонирование репозитория...${NC}"
TMP="/tmp/gotelegram_pro_$$"
if git clone --depth 1 --branch main "https://${GITHUB_TOKEN}@github.com/anten-ka/gotelegram_pro.git" "$TMP" 2>/tmp/gotelegram_clone_err_$$; then
rm -rf "$TMP"
if git clone --depth 1 --branch main "https://${GITHUB_TOKEN}@${REPO_GIT#https://}" "$TMP" 2>/dev/null; then
cp -r "$TMP/gotelegram-bot"/* "$BOT_DIR/"
rm -rf "$TMP"
else
echo -e "${RED}Ошибка клонирования:${NC}"
cat /tmp/gotelegram_clone_err_$$ 2>/dev/null
rm -rf "$TMP" /tmp/gotelegram_clone_err_$$ 2>/dev/null
exit 1
return 0
fi
rm -f /tmp/gotelegram_clone_err_$$
else
# Публичный репо — пробуем curl
for f in bot.py requirements.txt config.example.env; do
curl -sL -f "$REPO_RAW/gotelegram-bot/$f" -o "$BOT_DIR/$f" 2>/dev/null || true
done
rm -rf "$TMP"
fi
if [ ! -f "$BOT_DIR/bot.py" ]; then
echo -e "${RED}Не удалось загрузить файлы. Для приватного репо запустите с токеном:${NC}"
echo -e " ${YELLOW}gotelegram ВАШ_GITHUB_ТОКЕН${NC}"
exit 1
fi
fi
# Публичный репо: curl
echo -e "${YELLOW}[*] Скачивание файлов...${NC}"
local ok=1
for f in bot.py requirements.txt config.example.env; do
curl -sL -f "$REPO_RAW/gotelegram-bot/$f" -o "$BOT_DIR/$f" 2>/dev/null || ok=0
done
[ "$ok" -eq 1 ] && return 0
return 1
}
# venv
# Всегда обновляем файлы бота при запуске (чтобы подтягивать обновления)
download_files || {
echo -e "${RED}Не удалось загрузить файлы бота.${NC}"
echo -e " Для приватного репо: ${YELLOW}gotelegram ВАШ_GITHUB_ТОКЕН${NC}"
exit 1
}
echo -e "${GREEN}[*] Файлы бота обновлены.${NC}"
# ── Python venv ──────────────────────────────────────────────────────────────
if [ ! -d "$BOT_DIR/venv" ]; then
python3 -m venv "$BOT_DIR/venv"
fi
"$BOT_DIR/venv/bin/pip" install --upgrade pip -q 2>/dev/null
"$BOT_DIR/venv/bin/pip" install -r "$BOT_DIR/requirements.txt" -q
# Конфиг
# ── Конфиг (.env) ────────────────────────────────────────────────────────────
if [ ! -f "$BOT_DIR/.env" ]; then
echo ""
echo -e "${YELLOW}Введите BOT_TOKEN от @BotFather:${NC}"
TOKEN=""
while [ -z "$TOKEN" ]; do
@@ -92,12 +112,13 @@ if [ ! -f "$BOT_DIR/.env" ]; then
[ -z "$TOKEN" ] && echo -e "${RED}Токен не может быть пустым.${NC}"
done
echo "BOT_TOKEN=$TOKEN" > "$BOT_DIR/.env"
[ -f "$BOT_DIR/config.example.env" ] && grep -v "^BOT_TOKEN=" "$BOT_DIR/config.example.env" | grep -v "^#" >> "$BOT_DIR/.env"
chmod 600 "$BOT_DIR/.env"
echo -e "${GREEN}[*] .env создан.${NC}"
else
echo -e "${GREEN}[*] .env уже есть — пропускаю.${NC}"
fi
# systemd
# ── systemd ──────────────────────────────────────────────────────────────────
cat > "/etc/systemd/system/${SERVICE_NAME}.service" << EOF
[Unit]
Description=GoTelegram MTProxy Bot
@@ -109,16 +130,21 @@ WorkingDirectory=$BOT_DIR
ExecStart=$BOT_DIR/venv/bin/python $BOT_DIR/bot.py
Restart=always
RestartSec=5
Environment=PATH=$BOT_DIR/venv/bin:/usr/bin
Environment=PATH=$BOT_DIR/venv/bin:/usr/bin:/usr/local/bin
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable "$SERVICE_NAME"
systemctl enable "$SERVICE_NAME" 2>/dev/null
systemctl restart "$SERVICE_NAME" 2>/dev/null || systemctl start "$SERVICE_NAME"
echo -e "${GREEN}[*] Сервис $SERVICE_NAME запущен.${NC}"
echo -e "Проверка: systemctl status $SERVICE_NAME"
echo -e "Логи: journalctl -u $SERVICE_NAME -f"
echo ""
echo -e "${GREEN}╔═══════════════════════════════════════════╗${NC}"
echo -e "${GREEN}║ Установка завершена! ║${NC}"
echo -e "${GREEN}╚═══════════════════════════════════════════╝${NC}"
echo -e "Бот: systemctl status $SERVICE_NAME"
echo -e "Логи: journalctl -u $SERVICE_NAME -f"
echo -e "Конфиг: $BOT_DIR/.env"
exit 0