# План развертывания PTP на одном VPS ## Обзор Этот документ описывает развертывание всего проекта PTP на **одном VPS** для тестирования или небольших production сред. **Компоненты на одном сервере:** - Hugo статический сайт - Nginx веб-сервер - GitHub webhook для автодеплоя - Telegram Bot для создания контента - PHP формы с многоканальной отправкой (Email + Telegram + JSON) - msmtp для email - REG.RU S3 для хранения медиа ## Требования к VPS ### Минимальная конфигурация: - **ОС**: Ubuntu 20.04+ / Debian 11+ - **RAM**: 4GB (минимум 2GB) - **CPU**: 2 ядра - **Диск**: 40GB SSD - **Сеть**: 100 Мбит/с ### Рекомендуемая конфигурация: - **RAM**: 4-8GB - **CPU**: 2-4 ядра - **Диск**: 60GB SSD - **Сеть**: 1 Гбит/с ### Открытые порты: - 22 (SSH) - 80 (HTTP) - 443 (HTTPS) ## Архитектура на одном VPS ``` ┌─────────────────────────────────────────────────┐ │ Единый VPS Server │ │ │ │ ┌──────────────────────────────────────────┐ │ │ │ Nginx (Port 80/443) │ │ │ │ - Hugo статический сайт │ │ │ │ - PHP формы │ │ │ │ - Webhook API endpoint │ │ │ └──────────────────────────────────────────┘ │ │ │ │ ┌──────────────────────────────────────────┐ │ │ │ Hugo + Git Repository │ │ │ │ /var/www/hugo-source/ │ │ │ │ - Исходники сайта │ │ │ │ - Content от Telegram бота │ │ │ └──────────────────────────────────────────┘ │ │ │ │ ┌──────────────────────────────────────────┐ │ │ │ Telegram Bot (Systemd) │ │ │ │ - Создание постов │ │ │ │ - Управление заявками │ │ │ │ - Git push в GitHub │ │ │ │ - S3 загрузка медиа │ │ │ └──────────────────────────────────────────┘ │ │ │ │ ┌──────────────────────────────────────────┐ │ │ │ PHP Forms + msmtp │ │ │ │ - Обработка заявок │ │ │ │ - Email отправка │ │ │ │ - Telegram уведомления │ │ │ │ - Шифрованное хранилище │ │ │ └──────────────────────────────────────────┘ │ │ │ │ ┌──────────────────────────────────────────┐ │ │ │ Secure Storage (Encrypted) │ │ │ │ /var/secure/forms/ │ │ │ └──────────────────────────────────────────┘ │ └─────────────────────────────────────────────────┘ ↕ GitHub Repository ↕ REG.RU S3 Storage ``` ## Общее время развертывания ### Оптимистичный сценарий (все готово): - **Подготовка**: 30 минут - **Hugo + Nginx**: 1 час - **Telegram Bot**: 1.5 часа - **PHP Forms**: 1 час - **Тестирование**: 30 минут - **ИТОГО: 4.5 часа** ### Реалистичный сценарий: - **ИТОГО: 6-8 часов** (один рабочий день) ### Первый раз: - **ИТОГО: 8-12 часов** (можно растянуть на 2 дня) ## Важные концепции ### Пользователь www-data **Что это такое:** - `www-data` - стандартный системный пользователь в Linux для веб-сервисов - Используется по умолчанию в Nginx, Apache, PHP-FPM **Почему мы используем www-data для всего:** - ✅ Nginx запускается от `www-data` - ✅ PHP-FPM работает от `www-data` - ✅ Deploy скрипт выполняется от `www-data` - ✅ Telegram бот запускается от `www-data` - ✅ Репозиторий Git принадлежит `www-data` **Преимущества единого пользователя:** - Все компоненты имеют одинаковые права доступа - Нет конфликтов прав при работе с файлами - Webhook может обновлять репозиторий без проблем - Бот может читать зашифрованные заявки из `/var/secure/forms/` **Важно помнить:** - Все `.env` файлы должны принадлежать `www-data` - Git репозиторий должен принадлежать `www-data` - Файлы конфигурации должны иметь права 600 для безопасности --- ## Подготовка перед началом ### Чеклист - получить заранее: - [ ] **VPS доступ**: SSH root или sudo пользователь - [ ] **Домен**: тестовый домен с доступом к DNS - [ ] **GitHub**: Personal Access Token (scope: repo) - [ ] **Telegram Bot**: Token от @BotFather - [ ] **Telegram**: Ваш User ID от @userinfobot - [ ] **Email для msmtp** (выберите один): - [ ] **Gmail**: App Password (рекомендуется для международных проектов) - [ ] **Yandex**: App Password (рекомендуется для РФ) - [ ] **Mail.ru**: обычный пароль (альтернатива) - [ ] **REG.RU S3**: Access Key + Secret Key - [ ] **Encryption Key**: Случайная строка 32+ символов ### Получение GitHub Personal Access Token: **Зачем нужен:** Для клонирования репозитория и автоматических git push операций **Как получить:** 1. Перейти: https://github.com/settings/tokens 2. Нажать **"Generate new token"** → **"Generate new token (classic)"** 3. Заполнить: - **Note**: `VPS PTP Deployment` (описание токена) - **Expiration**: 90 days (или No expiration для постоянного доступа) - **Scopes**: Выбрать только **`repo`** (полный доступ к приватным репозиториям) 4. Нажать **"Generate token"** 5. **ВАЖНО**: Скопировать токен сразу! Формат: `ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx` 6. Сохранить токен в безопасном месте (понадобится в этапе 2.2) **Безопасность:** - Никогда не коммитьте токен в Git - Не делитесь токеном - Если токен скомпрометирован - удалите его на GitHub и создайте новый ### Получение Telegram Bot Token: **Зачем нужен:** Для работы Telegram бота, который создаёт контент **Как получить:** 1. Открыть Telegram и найти бота: [@BotFather](https://t.me/BotFather) 2. Отправить команду: `/newbot` 3. Ввести имя бота (например: `PTP Hugo Bot`) 4. Ввести username бота (должен заканчиваться на `bot`, например: `ptp_hugo_bot`) 5. Скопировать токен. Формат: `1234567890:ABC-DEF1234ghIkl-zyx57W2v1u123ew11` 6. Сохранить токен (понадобится в этапе 4.3) **Дополнительно:** - Получить свой User ID: [@userinfobot](https://t.me/userinfobot) → `/start` - Сохранить User ID (понадобится для ALLOWED_USER_IDS) ### Генерация ключа шифрования: ```bash # На локальной машине: openssl rand -base64 32 # Или python3 -c "import secrets; print(secrets.token_urlsafe(32))" ``` ## План развертывания > **💡 Автоматизация:** Для каждого этапа доступны готовые bash-скрипты в папке [scripts/](scripts/) > > **Быстрый старт:** Запустите `./scripts/deploy-all.sh` для автоматического развертывания всех этапов > > **Ручная установка:** Следуйте инструкциям ниже для пошагового выполнения ### ЭТАП 1: Базовая подготовка VPS (30-60 минут) #### 1.1 Подключение и обновление системы (10 минут) **Автоматизация:** `./scripts/1.1-initial-setup.sh` ```bash # Подключение к VPS ssh root@YOUR_VPS_IP # или ssh your_user@YOUR_VPS_IP # Обновление системы sudo apt update && sudo apt upgrade -y # Установка базовых утилит sudo apt install -y curl wget htop vim nano tree git ``` #### 1.2 Установка всех необходимых пакетов (20 минут) **Автоматизация:** `./scripts/1.2-install-packages.sh` ```bash # Установка основных пакетов sudo apt install -y \ nginx \ git \ python3 \ python3-pip \ python3-venv \ python3-full \ php-fpm \ php-cli \ php-curl \ php-json \ php-mbstring \ msmtp \ msmtp-mta \ certbot \ python3-certbot-nginx \ ufw # Проверка установки echo "=== Проверка установленных пакетов ===" git --version && echo "✅ Git OK" || echo "❌ Git failed" python3 --version && echo "✅ Python OK" || echo "❌ Python failed" php --version && echo "✅ PHP OK" || echo "❌ PHP failed" nginx -v && echo "✅ Nginx OK" || echo "❌ Nginx failed" ``` #### 1.3 Установка Hugo Extended (10 минут) **Автоматизация:** `./scripts/1.3-install-hugo.sh` ```bash # Скачать Hugo Extended (обязательно Extended версия!) cd /tmp wget https://github.com/gohugoio/hugo/releases/download/v0.139.0/hugo_extended_0.139.0_linux-amd64.deb # Установить sudo dpkg -i hugo_extended_*.deb # Проверить hugo version # Должно показать: hugo v0.139.0+extended... ``` #### 1.4 Настройка Firewall (5 минут) **Автоматизация:** `./scripts/1.4-setup-firewall.sh` ```bash # Настройка UFW sudo ufw allow 22/tcp comment 'SSH' sudo ufw allow 80/tcp comment 'HTTP' sudo ufw allow 443/tcp comment 'HTTPS' sudo ufw --force enable # Проверка sudo ufw status ``` #### 1.5 Создание структуры директорий (5 минут) **Автоматизация:** `./scripts/1.5-create-directories.sh` ```bash # Создание всех необходимых директорий sudo mkdir -p /var/www/{html,hugo-source,api,webhook,telegram-bot,forms,logs} sudo mkdir -p /var/secure/forms # Настройка прав доступа sudo chown -R $USER:www-data /var/www/ sudo chmod -R 775 /var/www/ sudo chmod 700 /var/secure/forms # Проверка структуры tree -L 2 /var/www/ # Структура должна быть: # /var/www/ # ├── html/ - Hugo статический сайт (пересобирается каждый раз) # ├── hugo-source/ - Исходники Hugo + Git репозиторий # ├── api/ - Webhook PHP endpoint # ├── webhook/ - Deploy скрипт # ├── telegram-bot/ - Telegram бот # ├── forms/ - PHP формы (НЕ пересобираются Hugo) # └── logs/ - Логи ``` --- ### ЭТАП 2: Git и Hugo (1 час) #### 2.1 Настройка Git (10 минут) **Автоматизация:** `./scripts/2.1-setup-git.sh` ```bash # Настройка Git глобально git config --global user.name "VPS Bot User" git config --global user.email "bot@yourdomain.com" # Проверка git config --list | grep user ``` #### 2.2 Клонирование репозитория (15 минут) **Автоматизация:** `./scripts/2.2-clone-repo.sh` ```bash # ВАРИАНТ 1: HTTPS с Personal Access Token (рекомендуется) cd /var/www git clone https://YOUR_USERNAME:YOUR_GITHUB_TOKEN@github.com/YOUR_USERNAME/ptp.git hugo-source # ВАРИАНТ 2: Обычное клонирование (потом настроить credentials) cd /var/www git clone https://github.com/YOUR_USERNAME/ptp.git hugo-source # Настройка git credentials для автоматизации echo "https://YOUR_USERNAME:YOUR_GITHUB_TOKEN@github.com" > ~/.git-credentials git config --global credential.helper store # Добавить папку в safe.directory git config --global --add safe.directory /var/www/hugo-source # ВАЖНО: Изменить владельца на www-data для работы webhook sudo chown -R www-data:www-data /var/www/hugo-source # Проверить права ls -la /var/www/hugo-source/ ``` #### 2.3 Первая сборка Hugo (15 минут) **Автоматизация:** `./scripts/2.3-build-hugo.sh` ```bash # Перейти в директорию Hugo cd /var/www/hugo-source # Проверить что config.toml существует ls -la config.toml # Собрать сайт hugo --destination /var/www/html --cleanDestinationDir # Проверить что файлы собрались ls -la /var/www/html/ # Настроить права sudo chown -R www-data:www-data /var/www/html ``` #### 2.4 Создание Deploy скрипта (10 минут) **Автоматизация:** `./scripts/2.4-create-deploy-script.sh` ```bash # Создать скрипт автодеплоя cat > /var/www/webhook/deploy.sh << 'EOF' #!/bin/bash set -e LOG_FILE="/var/log/hugo-deploy.log" HUGO_SOURCE="/var/www/hugo-source" HUGO_OUTPUT="/var/www/html" log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE } log "Starting Hugo deployment" # Переходим в папку с исходниками cd $HUGO_SOURCE # Обновляем код git pull origin main log "Git pull completed" # Собираем Hugo сайт hugo --destination $HUGO_OUTPUT --cleanDestinationDir log "Hugo build completed" # Устанавливаем права chown -R www-data:www-data $HUGO_OUTPUT log "Permissions set" log "Deployment finished successfully" EOF # Сделать исполняемым chmod +x /var/www/webhook/deploy.sh # Тестовый запуск sudo /var/www/webhook/deploy.sh ``` #### 2.5 Создание Webhook обработчика (10 минут) **Автоматизация:** `./scripts/2.5-create-webhook.sh` ```bash # Создать webhook.php sudo mkdir -p /var/www/api sudo tee /var/www/api/webhook.php > /dev/null << 'EOF' &1", $output, $return_code); $output_str = implode("\n", $output); writeLog("DEPLOY OUTPUT:\n" . $output_str); if ($return_code === 0) { writeLog("SUCCESS: Deploy completed successfully"); http_response_code(200); echo "Deploy successful"; } else { writeLog("ERROR: Deploy failed with code: $return_code"); http_response_code(500); echo "Deploy failed"; } writeLog("=== Webhook finished ===\n"); ?> EOF # Установить права sudo chown www-data:www-data /var/www/api/webhook.php sudo chmod 644 /var/www/api/webhook.php ``` --- ### ЭТАП 3: Nginx и SSL (1 час) #### 3.1 Настройка Nginx (20 минут) **Автоматизация:** `./scripts/3.1-setup-nginx.sh` ```bash # Определить версию PHP-FPM PHP_VERSION=$(php -r "echo PHP_MAJOR_VERSION.'.'.PHP_MINOR_VERSION;") echo "PHP Version: $PHP_VERSION" # Создать конфигурацию Nginx sudo tee /etc/nginx/sites-available/ptp-site > /dev/null << EOF server { listen 80; server_name YOUR_DOMAIN.COM; # ЗАМЕНИТЕ на ваш домен root /var/www/html; index index.html index.htm; # Основной Hugo сайт (статический контент) location / { try_files \$uri \$uri/ =404; } # API endpoint для webhook location /api/ { root /var/www; location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php${PHP_VERSION}-fpm.sock; fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name; include fastcgi_params; } } # PHP формы (отдельная папка, НЕ удаляется при deploy) location /forms/ { root /var/www; location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php${PHP_VERSION}-fpm.sock; fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name; include fastcgi_params; } } # Безопасность - блокировка скрытых файлов location ~ /\. { deny all; access_log off; log_not_found off; } # Блокировка .env файлов location ~ /\.env { deny all; } } EOF # Активировать сайт sudo ln -sf /etc/nginx/sites-available/ptp-site /etc/nginx/sites-enabled/ sudo rm -f /etc/nginx/sites-enabled/default # Проверить конфигурацию sudo nginx -t # Перезапустить Nginx sudo systemctl restart nginx sudo systemctl restart php${PHP_VERSION}-fpm # Проверить статус sudo systemctl status nginx ``` #### 3.2 Настройка DNS (5 минут + ожидание) **В панели управления доменом:** ``` Тип: A Имя: @ (или оставить пустым для корн��вого домена) Значение: YOUR_VPS_IP TTL: 300 (5 минут) # Для поддомена: Тип: A Имя: test (или dev) Значение: YOUR_VPS_IP TTL: 300 ``` **Проверка распространения DNS:** ```bash # Подождите 5-60 минут, затем проверьте: nslookup YOUR_DOMAIN.COM dig YOUR_DOMAIN.COM # Или проверьте через curl curl -I http://YOUR_DOMAIN.COM ``` #### 3.3 Установка SSL сертификата (15 минут) **ВАЖНО: Выполнять ТОЛЬКО после того как DNS работает!** ```bash # Проверить что домен отвечает curl -I http://YOUR_DOMAIN.COM # Получить SSL сертификат sudo certbot --nginx -d YOUR_DOMAIN.COM # Certbot автоматически обновит конфигурацию Nginx # Проверить автопродление sudo certbot renew --dry-run # Проверить что HTTPS работает curl -I https://YOUR_DOMAIN.COM ``` #### 3.4 Настройка sudo прав для webhook (10 минут) **Автоматизация:** `./scripts/3.3-setup-webhook-sudo.sh` ```bash # Добавить права для www-data запускать deploy скрипт echo "www-data ALL=(ALL) NOPASSWD: /var/www/webhook/deploy.sh" | sudo tee /etc/sudoers.d/webhook sudo chmod 440 /etc/sudoers.d/webhook # Добавить safe.directory для www-data sudo -u www-data git config --global --add safe.directory /var/www/hugo-source # Тестирование sudo -u www-data sudo /var/www/webhook/deploy.sh # Если получаете ошибку "fatal: detected dubious ownership", выполните: # sudo chown -R www-data:www-data /var/www/hugo-source ``` #### 3.5 Создание лог файлов (5 минут) **Автоматизация:** `./scripts/3.4-create-logs.sh` ```bash # Создать лог файлы sudo touch /var/log/hugo-webhook.log /var/log/hugo-deploy.log # Настроить права sudo chown www-data:www-data /var/log/hugo-*.log sudo chmod 664 /var/log/hugo-*.log # Проверить что логи работают sudo -u www-data bash -c 'echo "Test log entry" >> /var/log/hugo-webhook.log' tail /var/log/hugo-webhook.log ``` #### 3.6 Настройка GitHub Webhook (5 минут) **В GitHub репозитории:** 1. Перейти: Settings → Webhooks → Add webhook 2. Настроить: - **Payload URL**: `https://YOUR_DOMAIN.COM/api/webhook.php` - **Content type**: `application/json` - **Secret**: (оставить пустым для тестов или добавить секрет) - **Events**: Just the push event - **Active**: ✓ 3. Сохранить и проверить Recent Deliveries **Тестирование webhook:** ```bash # Сделать тестовый коммит cd /var/www/hugo-source echo "Test webhook" >> README.md git add README.md git commit -m "Test webhook" git push origin main # Проверить логи tail -f /var/log/hugo-webhook.log tail -f /var/log/hugo-deploy.log # Проверить что сайт обновился curl -I https://YOUR_DOMAIN.COM ``` #### 3.7 Настройка Security Headers (10 минут) **Что делают Security Headers:** - 🛡️ Защита от XSS атак - 🚫 Защита от clickjacking - 🔐 Принудительное HTTPS - 🎯 Контроль загрузки ресурсов **На VPS:** ```bash # Открыть конфигурацию Nginx sudo nano /etc/nginx/sites-available/ptp-site # Найти блок server { для HTTPS (слушает 443 ssl) # Добавить Security Headers перед закрывающей скобкой }: # Security Headers add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always; add_header Permissions-Policy "geolocation=(), microphone=(), camera=(), payment=(), usb=()" always; # HSTS - принудительное HTTPS (добавлять только после стабильной работы SSL!) add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; # CSP - Content Security Policy (тестовый режим, не блокирует) add_header Content-Security-Policy-Report-Only "default-src 'self'; script-src 'self' 'unsafe-inline' https://unpkg.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https://s3.regru.cloud https://s3.storage.selcloud.ru; font-src 'self' data:; connect-src 'self'; frame-ancestors 'self'; base-uri 'self'; form-action 'self';" always; } # ← Перед этой закрывающей скобкой HTTPS блока # Сохранить: Ctrl+O, Enter, Ctrl+X # Проверить синтаксис sudo nginx -t # Если OK - перезагрузить sudo systemctl reload nginx ``` **Проверка заголовков:** ```bash # Проверить что заголовки работают curl -I https://YOUR_DOMAIN.COM | grep -E "X-Frame|X-Content|Referrer|Permissions|Strict-Transport|Content-Security" # Должно показать все 6 заголовков ``` **Тестирование CSP:** ```bash # Откройте сайт в браузере # Нажмите F12 → Console # Проверьте нет ли ошибок CSP # Если всё работает - через неделю можно включить блокировку CSP: # Заменить Content-Security-Policy-Report-Only на Content-Security-Policy ``` **Онлайн проверка:** Проверьте безопасность на: https://securityheaders.com/?q=https://YOUR_DOMAIN.COM **Подробности:** См. [SECURITY_HEADERS.md](SECURITY_HEADERS.md) для детальной информации. --- ### ЭТАП 4: Telegram Bot (1.5-2 часа) #### 4.1 Python окружение (20 минут) ```bash # Перейти в директорию бота cd /var/www/telegram-bot # Убедиться что python3-venv установлен sudo apt install -y python3-full python3-venv # Создать виртуальное окружение python3 -m venv --system-site-packages telegram_bot_env # Активировать окружение source telegram_bot_env/bin/activate # Проверить что окружение работает which pip which python3 # Должно показать: /var/www/telegram-bot/telegram_bot_env/bin/... # Обновить pip pip install --upgrade pip # Создать requirements.txt cat > requirements.txt << 'EOF' python-telegram-bot==20.7 requests python-dotenv pycryptodome EOF # Установить зависимости pip install -r requirements.txt # Проверить установку python3 -c " import telegram import requests import dotenv from Crypto.Cipher import AES print('✅ Все модули установлены успешно!') " ``` #### 4.2 Копирование файлов Telegram бота (15 минут) **ВАЖНО:** Файлы `telegram/` в .gitignore - нужно копировать вручную! **На локальной машине:** ```bash # Проверить что файлы существуют локально ls -la ~/path/to/ptp/telegram/ # Скопировать на VPS scp -r ~/path/to/ptp/telegram/ user@YOUR_VPS_IP:/var/www/telegram-bot/ # Пример для вашего пути: scp -r /Users/kirik/Sync/Projects/Websites/PTP/DEV/ptp/telegram/ user@YOUR_VPS_IP:/var/www/telegram-bot/ ``` **На VPS - проверка:** ```bash # Проверить что файлы скопировались ls -la /var/www/telegram-bot/telegram/ # Должны быть: # telegram_bot.py # applications_reader.py # s3_helper.py # requirements.txt # Установить права sudo chown -R $USER:www-data /var/www/telegram-bot/ ``` #### 4.3 Настройка .env для бота (20 минут) **Важно про пользователя www-data:** - Telegram бот запускается от пользователя `www-data` (настроено в systemd) - `www-data` - стандартный веб-сервер пользователь в Linux - Используется для: Nginx, PHP-FPM, deploy скрипты, Telegram бот - Все файлы конфигурации (.env) и репозиторий должны принадлежать `www-data` - Это обеспечивает единые права доступа для всех компонентов системы ```bash # Создать .env файл cat > /var/www/telegram-bot/.env << 'EOF' # ============================================ # Telegram Bot Configuration # ============================================ # 1. Создайте бота: https://t.me/BotFather -> /newbot # 2. Получите токен (формат: 1234567890:ABC-DEF1234ghIkl-zyx57W2v1u123ew11) TELEGRAM_BOT_TOKEN=YOUR_BOT_TOKEN_HERE # 3. Найдите ваш User ID: https://t.me/userinfobot -> /start # 4. Добавьте через запятую ID всех админов ALLOWED_USER_IDS=123456789,987654321 # 5. Chat ID для уведомлений (обычно ваш User ID) TELEGRAM_ADMIN_CHAT_ID=123456789 # ============================================ # Forms Configuration (многоканальная отправка) # ============================================ FORMS_SEND_EMAIL=true # Отправлять на email через msmtp FORMS_SEND_TELEGRAM=true # Уведомления в Telegram FORMS_SAVE_JSON=true # Сохранять зашифрованные заявки FORMS_NOTIFICATIONS=true # Push-уведомления # Ключ шифрования: сгенерируйте случайную строку 32+ символов # openssl rand -base64 32 # ВАЖНО: Этот ключ используется для: # - PHP формы шифруют заявки этим ключом и сохраняют в /var/secure/forms/ # - Telegram бот расшифровывает заявки этим же ключом для отображения # - Ключ ДОЛЖЕН совпадать с FORMS_ENCRYPTION_KEY в /var/www/forms/.env (этап 5.2) FORMS_ENCRYPTION_KEY=YOUR_32_CHAR_ENCRYPTION_KEY_HERE # ============================================ # REG.RU S3 Configuration (для загрузки фото) # ============================================ # Найти в панели REG.RU: Услуги -> Облачное хранилище -> Настройки API # Регион REG.RU: ru-1 (Москва) или ru-2 (Санкт-Петербург) AWS_ACCESS_KEY_ID=YOUR_REGRU_ACCESS_KEY AWS_SECRET_ACCESS_KEY=YOUR_REGRU_SECRET_KEY AWS_DEFAULT_REGION=ru-1 AWS_ENDPOINT_URL=https://s3.regru.cloud # Альтернативные имена переменных (бот поддерживает оба формата) S3_ACCESS_KEY_ID=YOUR_REGRU_ACCESS_KEY S3_SECRET_ACCESS_KEY=YOUR_REGRU_SECRET_KEY # ============================================ # Git Configuration # ============================================ # Путь к Git репозиторию GIT_REPO_PATH=/var/www/hugo-source EOF # ВАЖНО: Установить права для www-data (бот запускается от этого пользователя) sudo chown www-data:www-data /var/www/telegram-bot/.env sudo chmod 600 /var/www/telegram-bot/.env # Проверить права ls -la /var/www/telegram-bot/.env # Должно показать: -rw------- 1 www-data www-data echo "" echo "⚠️ ВНИМАНИЕ: Отредактируйте .env файл с вашими настройками!" echo "sudo nano /var/www/telegram-bot/.env" echo "" echo "После редактирования снова установите права:" echo "sudo chown www-data:www-data /var/www/telegram-bot/.env" ``` **Редактирование .env:** ```bash nano /var/www/telegram-bot/.env # Заменить: # - YOUR_BOT_TOKEN_HERE → токен от BotFather # - 123456789 → ваш Telegram User ID # - YOUR_32_CHAR_ENCRYPTION_KEY_HERE → сгенерированный ключ # - YOUR_REGRU_ACCESS_KEY → ключи от REG.RU S3 ``` #### 4.4 Настройка Git для www-data (15 минут) ```bash # Настроить Git для www-data пользователя sudo -u www-data git config --global user.name "Telegram Bot" sudo -u www-data git config --global user.email "bot@yourdomain.com" sudo -u www-data git config --global credential.helper store # Добавить safe.directory sudo -u www-data git config --global --add safe.directory /var/www/hugo-source # Создать .git-credentials для www-data sudo -u www-data bash -c 'echo "https://YOUR_USERNAME:YOUR_GITHUB_TOKEN@github.com" > /var/www/.git-credentials' sudo chmod 600 /var/www/.git-credentials sudo chown www-data:www-data /var/www/.git-credentials # Проверить настройки sudo -u www-data git config --list ``` #### 4.5 Создание Systemd сервиса (10 минут) ```bash # Создать systemd сервис sudo tee /etc/systemd/system/telegram-hugo-bot.service > /dev/null << 'EOF' [Unit] Description=Telegram Hugo Bot After=network.target [Service] Type=simple User=www-data Group=www-data WorkingDirectory=/var/www/telegram-bot Environment=PATH=/var/www/telegram-bot/telegram_bot_env/bin:/usr/local/bin:/usr/bin:/bin Environment=PYTHONHTTPSVERIFY=0 Environment=AWS_CLI_AUTO_PROMPT=off Environment=PYTHONWARNINGS=ignore ExecStart=/var/www/telegram-bot/telegram_bot_env/bin/python3 telegram/telegram_bot.py Restart=always RestartSec=10 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target EOF # Перезагрузить systemd sudo systemctl daemon-reload # Включить автозапуск sudo systemctl enable telegram-hugo-bot # Запустить бота sudo systemctl start telegram-hugo-bot # Проверить статус sudo systemctl status telegram-hugo-bot # Смотреть логи в реальном времени sudo journalctl -u telegram-hugo-bot -f ``` #### 4.6 Тестирование Telegram бота (10 минут) ```bash # Проверить что бот запущен sudo systemctl status telegram-hugo-bot # Проверить логи на ошибки sudo journalctl -u telegram-hugo-bot --no-pager -n 50 # В Telegram: # 1. Найти вашего бота # 2. Отправить /start # 3. Проверить кнопки главного меню # Если есть ошибки - проверить: cd /var/www/telegram-bot source telegram_bot_env/bin/activate python3 telegram/telegram_bot.py # Увидите детальные ошибки ``` --- ### ЭТАП 5: PHP Forms с Email (1-1.5 часа) #### 5.1 Копирование PHP файлов форм (10 минут) **ВАЖНО:** PHP формы НЕ должны быть в `/var/www/html/`, так как Hugo удаляет всё из этой папки при каждом deploy (`--cleanDestinationDir`). Используем отдельную папку `/var/www/forms/`. **На локальной машине:** ```bash # Скопировать файлы форм на VPS в отдельную папку scp -r ~/path/to/ptp/forms/* user@YOUR_VPS_IP:/var/www/forms/ # Пример: scp -r /Users/kirik/Sync/Projects/Websites/PTP/DEV/ptp/forms/* user@YOUR_VPS_IP:/var/www/forms/ ``` **На VPS - проверка:** ```bash # Проверить файлы ls -la /var/www/forms/ # Должны быть: # send_plan.php # send_ask.php # forms_helper.php # Установить права sudo chown -R www-data:www-data /var/www/forms/ sudo chmod 644 /var/www/forms/*.php # Проверить что Hugo не удалит эти файлы при deploy echo "✅ Формы в /var/www/forms/ - Hugo их не трогает" echo "✅ Доступ через: https://YOUR_DOMAIN.COM/forms/send_plan.php" ``` #### 5.2 Создание .env для форм (10 минут) ```bash # Создать .env для PHP форм в отдельной папке forms/ cat > /var/www/forms/.env << 'EOF' # ============================================ # Forms Configuration # ============================================ FORMS_SEND_EMAIL=true # Отправлять на email через msmtp FORMS_SEND_TELEGRAM=true # Уведомления в Telegram FORMS_SAVE_JSON=true # Сохранять зашифрованные заявки FORMS_NOTIFICATIONS=true # Push-уведомления # Ключ шифрования (ДОЛЖЕН СОВПАДАТЬ с ключом в Telegram боте!) # ВАЖНО: Используйте тот же ключ, что и в /var/www/telegram-bot/.env # Этот ключ шифрует заявки, а бот их расшифровывает для отображения FORMS_ENCRYPTION_KEY=SAME_KEY_AS_TELEGRAM_BOT # Telegram настройки TELEGRAM_BOT_TOKEN=YOUR_BOT_TOKEN TELEGRAM_ADMIN_CHAT_ID=YOUR_ADMIN_CHAT_ID EOF # Установить права chmod 600 /var/www/forms/.env sudo chown www-data:www-data /var/www/forms/.env echo "⚠️ Отредактируйте .env файл!" echo "nano /var/www/forms/.env" ``` #### 5.3 Настройка msmtp для Email (30 минут) > **Выберите один из почтовых сервисов**: Gmail, Yandex или Mail.ru ##### ВАРИАНТ A: Gmail (рекомендуется для международных проектов) **Получение Gmail App Password:** 1. Включить 2FA: https://myaccount.google.com/security 2. Создать App Password: https://myaccount.google.com/apppasswords 3. Выбрать: Mail → Other → "VPS PTP Bot" 4. Сохранить 16-символьный пароль **Запустить скрипт:** `./scripts/5.3a-setup-msmtp-gmail.sh` ##### ВАРИАНТ B: Yandex (рекомендуется для РФ) **Получение Yandex App Password:** 1. Перейти: https://passport.yandex.ru/profile 2. Безопасность → Пароли приложений 3. Создать пароль для "Почта" 4. Сохранить 16-символьный пароль 5. Включить SMTP: https://mail.yandex.ru/ → Настройки → Почтовые программы → "Разрешить доступ" **Запустить скрипт:** `./scripts/5.3b-setup-msmtp-yandex.sh` ##### ВАРИАНТ C: Mail.ru (альтернатива) **Примечание:** Mail.ru использует обычный пароль от почты (не App Password) **Запустить скрипт:** `./scripts/5.3c-setup-msmtp-mailru.sh` --- **Ручная настройка (если предпочитаете):** ```bash # Установить msmtp (если не установлен) sudo apt install -y msmtp msmtp-mta # Создать конфигурацию msmtp - ВЫБЕРИТЕ ОДИН ИЗ ВАРИАНТОВ: # === ВАРИАНТ A: Gmail === sudo tee /etc/msmtprc > /dev/null << 'EOF' defaults auth on tls on tls_trust_file /etc/ssl/certs/ca-certificates.crt logfile /var/log/msmtp.log account gmail host smtp.gmail.com port 587 from YOUR_EMAIL@gmail.com user YOUR_EMAIL@gmail.com password YOUR_GMAIL_APP_PASSWORD account default : gmail EOF # === ВАРИАНТ B: Yandex === sudo tee /etc/msmtprc > /dev/null << 'EOF' defaults auth on tls on tls_trust_file /etc/ssl/certs/ca-certificates.crt logfile /var/log/msmtp.log account yandex host smtp.yandex.ru port 587 from YOUR_EMAIL@yandex.ru user YOUR_EMAIL@yandex.ru password YOUR_YANDEX_APP_PASSWORD account default : yandex EOF # === ВАРИАНТ C: Mail.ru === sudo tee /etc/msmtprc > /dev/null << 'EOF' defaults auth on tls on tls_trust_file /etc/ssl/certs/ca-certificates.crt logfile /var/log/msmtp.log account mailru host smtp.mail.ru port 587 from YOUR_EMAIL@mail.ru user YOUR_EMAIL@mail.ru password YOUR_MAILRU_PASSWORD account default : mailru EOF # Установить права sudo chmod 600 /etc/msmtprc sudo chown root:mail /etc/msmtprc # Создать лог файл sudo touch /var/log/msmtp.log sudo chown www-data:adm /var/log/msmtp.log sudo chmod 664 /var/log/msmtp.log ``` **Редактирование конфигурации:** ```bash sudo nano /etc/msmtprc # Заменить в зависимости от выбранного сервиса: # Gmail: YOUR_EMAIL@gmail.com и YOUR_GMAIL_APP_PASSWORD # Yandex: YOUR_EMAIL@yandex.ru и YOUR_YANDEX_APP_PASSWORD # Mail.ru: YOUR_EMAIL@mail.ru и YOUR_MAILRU_PASSWORD ``` **Сравнение сервисов:** | Параметр | Gmail | Yandex | Mail.ru | |----------|-------|--------|---------| | Лимит/день | 500-2000 | ~500 | ~1000 | | Тип пароля | App Password | App Password | Обычный | | Доступность в РФ | Может блокироваться | Стабильно | Стабильно | | Надёжность | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | #### 5.4 Настройка PHP для использования msmtp (10 минут) **Автоматизация:** `./scripts/5.4-setup-php-msmtp.sh` ```bash # Определить версию PHP PHP_VERSION=$(php -r "echo PHP_MAJOR_VERSION.'.'.PHP_MINOR_VERSION;") echo "Настраиваем PHP версии: $PHP_VERSION" # Настроить sendmail_path для PHP-FPM echo "sendmail_path = /usr/bin/msmtp -t" | sudo tee -a /etc/php/$PHP_VERSION/fpm/php.ini # Настроить sendmail_path для PHP CLI echo "sendmail_path = /usr/bin/msmtp -t" | sudo tee -a /etc/php/$PHP_VERSION/cli/php.ini # Перезапустить PHP-FPM sudo systemctl restart php$PHP_VERSION-fpm ``` #### 5.5 Тестирование Email (10 минут) ```bash # Тест 1: msmtp напрямую echo "Test from VPS - msmtp" | msmtp YOUR_EMAIL@gmail.com # Проверить логи sudo tail /var/log/msmtp.log # Тест 2: PHP mail функция echo "" | php # Тест 3: Проверка из браузера echo '' | sudo tee /var/www/html/test_email.php # Открыть в браузере: # https://YOUR_DOMAIN.COM/test_email.php # Удалить тестовый файл после проверки sudo rm /var/www/html/test_email.php ``` #### 5.6 Создание безопасного хранилища (5 минут) ```bash # Создать директорию для зашифрованных заявок sudo mkdir -p /var/secure/forms # Установить строгие права доступа sudo chmod 700 /var/secure/forms sudo chown www-data:www-data /var/secure/forms # Проверить права ls -la /var/secure/ # Должно показать: drwx------ www-data www-data forms ``` --- ### ЭТАП 6: Тестирование системы (1 час) #### 6.1 Проверка всех ��омпонентов (20 минут) ```bash echo "=== Проверка статуса всех сервисов ===" # Nginx sudo systemctl status nginx | grep "Active:" # PHP-FPM PHP_VERSION=$(php -r "echo PHP_MAJOR_VERSION.'.'.PHP_MINOR_VERSION;") sudo systemctl status php$PHP_VERSION-fpm | grep "Active:" # Telegram Bot sudo systemctl status telegram-hugo-bot | grep "Active:" # Проверка Hugo hugo version # Проверка Git cd /var/www/hugo-source git status # Проверка файлов echo -e "\n=== Проверка ключевых файлов ===" ls -la /var/www/html/index.html && echo "✅ Hugo site OK" ls -la /var/www/api/webhook.php && echo "✅ Webhook OK" ls -la /var/www/forms/send_plan.php && echo "✅ PHP Forms OK" ls -la /var/www/telegram-bot/telegram/telegram_bot.py && echo "✅ Telegram Bot OK" echo -e "\n=== Все компоненты проверены ===" ``` #### 6.2 Тест Telegram бота (15 минут) **В Telegram:** ``` 1. Найти вашего бота 2. Отправить: /start 3. Проверить кнопки: - 📝 Управление постами - 🗓️ Управление календарем поездок - 📋 Заявки 4. Попробовать создать пост: - Нажать "📝 Управление постами" - "➕ Создать пост" - Следовать инструкциям 5. Проверить Git sync: - "🔄 Синхронизация Git" ``` **Проверка логов:** ```bash # Логи бота sudo journalctl -u telegram-hugo-bot -f # Если ошибки - запуск вручную для диагностики cd /var/www/telegram-bot source telegram_bot_env/bin/activate python3 telegram/telegram_bot.py ``` #### 6.3 Тест PHP форм и Email (15 минут) ```bash # Создать тестовую HTML страницу с формой cat > /var/www/html/test_form.html << 'EOF'