251 lines
10 KiB
Bash
251 lines
10 KiB
Bash
#!/usr/bin/env bash
|
||
|
||
# -----------------------------------------------------------------------------
|
||
# Включает режим немедленного завершения скрипта при любой ошибке.
|
||
# Это предотвращает ситуацию, когда одна из команд не выполнилась,
|
||
# но скрипт продолжил работу и создал некорректную конфигурацию.
|
||
# -----------------------------------------------------------------------------
|
||
set -e
|
||
|
||
|
||
# -----------------------------------------------------------------------------
|
||
# Директория установки MTProto Proxy.
|
||
# Здесь будут храниться:
|
||
# - docker-compose.yml
|
||
# - .env
|
||
# При необходимости путь можно изменить.
|
||
# -----------------------------------------------------------------------------
|
||
INSTALL_DIR="/opt/mtproto"
|
||
|
||
|
||
# -----------------------------------------------------------------------------
|
||
# Заголовок установщика
|
||
# -----------------------------------------------------------------------------
|
||
echo "=== MTProto Proxy Installer ==="
|
||
|
||
|
||
# -----------------------------------------------------------------------------
|
||
# Проверка запуска от root.
|
||
# Установка Docker, обновление системы и работа с /opt требуют root прав.
|
||
# Если скрипт запущен обычным пользователем — завершаем выполнение.
|
||
# -----------------------------------------------------------------------------
|
||
if [ "$EUID" -ne 0 ]; then
|
||
echo "Run script as root"
|
||
exit 1
|
||
fi
|
||
|
||
|
||
# -----------------------------------------------------------------------------
|
||
# Запрос порта для MTProto Proxy.
|
||
# Если пользователь просто нажмёт Enter — будет использован порт 443.
|
||
# -----------------------------------------------------------------------------
|
||
echo
|
||
read -p "Enter MTProto port (default 443): " PORT
|
||
|
||
# Если переменная пустая — подставляем значение по умолчанию
|
||
PORT=${PORT:-443}
|
||
|
||
# -----------------------------------------------------------------------------
|
||
# Если установлен UFW — открываем порт
|
||
# -----------------------------------------------------------------------------
|
||
if command -v ufw >/dev/null 2>&1; then
|
||
echo "Opening port $PORT in UFW firewall..."
|
||
ufw allow "$PORT"/tcp comment "MTPROTO-TCP" || true
|
||
ufw allow "$PORT"/udp comment "MTPROTO-UDP" || true
|
||
fi
|
||
|
||
# -----------------------------------------------------------------------------
|
||
# Запрос TAG.
|
||
# TAG используется для Telegram Ads / статистики прокси.
|
||
# Он необязательный, поэтому можно просто нажать Enter.
|
||
# -----------------------------------------------------------------------------
|
||
echo
|
||
read -p "Enter TAG (optional, press enter to skip): " TAG
|
||
|
||
|
||
# -----------------------------------------------------------------------------
|
||
# Генерация SECRET ключа.
|
||
# SECRET — это основной ключ доступа к MTProto Proxy.
|
||
# Генерируется 16 байт случайных данных (32 hex символа).
|
||
# -----------------------------------------------------------------------------
|
||
SECRET=$(openssl rand -hex 16)
|
||
|
||
|
||
# -----------------------------------------------------------------------------
|
||
# Вывод сгенерированного секретного ключа пользователю
|
||
# -----------------------------------------------------------------------------
|
||
echo
|
||
echo "Generated SECRET:"
|
||
echo "$SECRET"
|
||
echo
|
||
|
||
|
||
# -----------------------------------------------------------------------------
|
||
# Обновление системы.
|
||
# Это рекомендуется делать перед установкой Docker,
|
||
# чтобы избежать проблем с зависимостями.
|
||
# -----------------------------------------------------------------------------
|
||
echo "Updating system..."
|
||
|
||
apt update
|
||
apt upgrade -y
|
||
|
||
|
||
# -----------------------------------------------------------------------------
|
||
# Проверяем установлен ли Docker.
|
||
# command -v docker возвращает путь к бинарнику если он существует.
|
||
# Если Docker не найден — запускается процедура установки.
|
||
# -----------------------------------------------------------------------------
|
||
if ! command -v docker >/dev/null 2>&1; then
|
||
|
||
echo "Installing Docker..."
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# Установка необходимых пакетов
|
||
# ---------------------------------------------------------------------------
|
||
apt install -y ca-certificates curl gnupg
|
||
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# Создание директории для хранения GPG ключей репозиториев
|
||
# ---------------------------------------------------------------------------
|
||
install -m 0755 -d /etc/apt/keyrings
|
||
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# Добавление официального GPG ключа Docker
|
||
# ---------------------------------------------------------------------------
|
||
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
|
||
| gpg --dearmor -o /etc/apt/keyrings/docker.gpg
|
||
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# Разрешение чтения ключа системой
|
||
# ---------------------------------------------------------------------------
|
||
chmod a+r /etc/apt/keyrings/docker.gpg
|
||
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# Добавление официального Docker репозитория в систему
|
||
# VERSION_CODENAME автоматически определяет версию Ubuntu
|
||
# ---------------------------------------------------------------------------
|
||
echo \
|
||
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
|
||
$(. /etc/os-release && echo $VERSION_CODENAME) stable" \
|
||
> /etc/apt/sources.list.d/docker.list
|
||
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# Обновление списка пакетов после добавления репозитория
|
||
# ---------------------------------------------------------------------------
|
||
apt update
|
||
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# Установка Docker Engine и Docker Compose plugin
|
||
# ---------------------------------------------------------------------------
|
||
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
||
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# Включаем автозапуск Docker при старте системы
|
||
# ---------------------------------------------------------------------------
|
||
systemctl enable docker
|
||
|
||
# Запускаем Docker сразу
|
||
systemctl start docker
|
||
fi
|
||
|
||
|
||
# -----------------------------------------------------------------------------
|
||
# Создание директории установки MTProto
|
||
# -----------------------------------------------------------------------------
|
||
echo "Creating directory $INSTALL_DIR"
|
||
|
||
mkdir -p "$INSTALL_DIR"
|
||
|
||
|
||
# -----------------------------------------------------------------------------
|
||
# Пути к создаваемым конфигурационным файлам
|
||
# -----------------------------------------------------------------------------
|
||
ENV_FILE="$INSTALL_DIR/.env"
|
||
COMPOSE_FILE="$INSTALL_DIR/docker-compose.yml"
|
||
|
||
|
||
# -----------------------------------------------------------------------------
|
||
# Создание файла .env
|
||
# Этот файл хранит переменные окружения для Docker Compose
|
||
# -----------------------------------------------------------------------------
|
||
echo "Creating .env"
|
||
|
||
cat > "$ENV_FILE" <<EOF
|
||
MTPROTO_PORT=$PORT
|
||
MTPROTO_SECRET=$SECRET
|
||
MTPROTO_TAG=$TAG
|
||
EOF
|
||
|
||
|
||
# -----------------------------------------------------------------------------
|
||
# Создание docker-compose.yml
|
||
# -----------------------------------------------------------------------------
|
||
echo "Creating docker-compose.yml"
|
||
|
||
cat > "$COMPOSE_FILE" <<EOF
|
||
services:
|
||
mtproto:
|
||
image: telegrammessenger/proxy:latest
|
||
container_name: mtproto-proxy
|
||
restart: unless-stopped
|
||
|
||
ports:
|
||
- "\${MTPROTO_PORT}:443"
|
||
|
||
environment:
|
||
- SECRET=\${MTPROTO_SECRET}
|
||
- TAG=\${MTPROTO_TAG}
|
||
|
||
volumes:
|
||
- proxy-data:/data
|
||
|
||
volumes:
|
||
proxy-data:
|
||
EOF
|
||
|
||
|
||
# -----------------------------------------------------------------------------
|
||
# Запуск контейнера
|
||
# -----------------------------------------------------------------------------
|
||
echo
|
||
echo "Starting proxy..."
|
||
|
||
cd "$INSTALL_DIR"
|
||
|
||
docker compose up -d
|
||
|
||
|
||
# -----------------------------------------------------------------------------
|
||
# Получение публичного IP сервера
|
||
# Используется для формирования ссылки подключения
|
||
# -----------------------------------------------------------------------------
|
||
IP=$(curl -s ifconfig.me)
|
||
|
||
|
||
# -----------------------------------------------------------------------------
|
||
# Финальная информация пользователю
|
||
# -----------------------------------------------------------------------------
|
||
echo
|
||
echo "================================="
|
||
echo "MTProto Proxy installed!"
|
||
echo
|
||
echo "Server: $IP"
|
||
echo "Port: $PORT"
|
||
echo "Secret: $SECRET"
|
||
echo
|
||
echo "Connection link:"
|
||
echo
|
||
echo "tg://proxy?server=$IP&port=$PORT&secret=$SECRET"
|
||
echo
|
||
echo "Config directory:"
|
||
echo "$INSTALL_DIR"
|
||
echo "================================="
|