#!/usr/bin/env bash # Интерактивная установка tgvpn на Linux-сервер (Docker + PostgreSQL) set -euo pipefail INSTALL_DIR="${INSTALL_DIR:-/opt/tgvpn}" REPO_URL="" USE_CURRENT_DIR=false SKIP_DOCKER_INSTALL=false RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' CYAN='\033[0;36m' NC='\033[0m' info() { echo -e "${CYAN}[*]${NC} $*"; } ok() { echo -e "${GREEN}[✓]${NC} $*"; } warn() { echo -e "${YELLOW}[!]${NC} $*"; } fail() { echo -e "${RED}[✗]${NC} $*" >&2; exit 1; } prompt() { local label="$1" local default="${2:-}" local val if [[ -n "$default" ]]; then read -r -p "$label [$default]: " val echo "${val:-$default}" else read -r -p "$label: " val echo "$val" fi } prompt_required() { local label="$1" local val="" while [[ -z "$val" ]]; do read -r -p "$label: " val [[ -z "$val" ]] && warn "Поле обязательно." done echo "$val" } prompt_secret() { local label="$1" local val="" while [[ -z "$val" ]]; do read -r -s -p "$label: " val echo "" [[ -z "$val" ]] && warn "Поле обязательно." done echo "$val" } prompt_yn() { local label="$1" local default="${2:-y}" local hint="Y/n" [[ "$default" == "n" ]] && hint="y/N" local ans read -r -p "$label [$hint]: " ans ans="${ans:-$default}" [[ "$ans" =~ ^[Yy] ]] } need_cmd() { command -v "$1" >/dev/null 2>&1 } check_docker() { need_cmd docker && docker compose version >/dev/null 2>&1 } install_docker() { info "Установка Docker (официальный репозиторий)..." if need_cmd apt-get; then sudo apt-get update -qq sudo apt-get install -y ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings if [[ ! -f /etc/apt/keyrings/docker.asc ]]; then sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "${VERSION_CODENAME}") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null fi sudo apt-get update -qq sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin sudo usermod -aG docker "$USER" 2>/dev/null || true ok "Docker установлен. Если команда docker требует sudo — перелогиньтесь или выполните: newgrp docker" else fail "Автоустановка Docker поддерживается только для Debian/Ubuntu (apt). Установите Docker вручную: https://docs.docker.com/engine/install/" fi } write_env() { local env_file="$1" cat > "$env_file" </dev/null || true warn "Старая копия: .env.bak.*" fi write_env ".env" ok "Создан .env" echo "" info "=== Запуск контейнеров ===" DC="docker compose" if ! docker compose version >/dev/null 2>&1; then DC="sudo docker compose" fi $DC pull db 2>/dev/null || true $DC up -d --build echo "" sleep 3 $DC ps echo "" ok "Установка завершена!" echo "" echo " Каталог: $INSTALL_DIR" echo " Логи бота: $DC logs -f bot" echo " Логи БД: $DC logs -f db" echo " Перезапуск: $DC up -d --build" echo "" echo " В Telegram (аккаунт админа $TELEGRAM_ADMIN_ID):" echo " /start" echo " /admin check" echo " /admin squads" echo " /admin user" echo "" } main "$@"