diff --git a/.gitignore b/.gitignore index 9e3b0f1..9506108 100644 --- a/.gitignore +++ b/.gitignore @@ -44,7 +44,8 @@ gitea.pub !themes/**/scripts/ telegram/ migration-s3/ -INFO/ +INFO/* +!INFO/Deployment/ !INFO/Deployment/*.md forms/.env diff --git a/INFO/Deployment/VPS_SINGLE_DEPLOYMENT.md b/INFO/Deployment/VPS_SINGLE_DEPLOYMENT.md new file mode 100644 index 0000000..f3741d7 --- /dev/null +++ b/INFO/Deployment/VPS_SINGLE_DEPLOYMENT.md @@ -0,0 +1,1755 @@ +# План развертывания 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' + + + + + Test Form + + +

Test Plan Form

+
+
+
+
+
+
+
+ +
+ + +EOF + +echo "Откройте в браузере: https://YOUR_DOMAIN.COM/test_form.html" +echo "Заполните и отправьте форму" +echo "" +echo "Проверьте:" +echo "1. Email пришел на почту" +echo "2. Уведомление в Telegram боте" +echo "3. Файл создался: ls -la /var/secure/forms/" +echo "4. Логи msmtp: sudo tail /var/log/msmtp.log" +``` + +#### 6.4 Тест GitHub Webhook (10 минут) + +```bash +# Сделать тестовое изменение +cd /var/www/hugo-source +echo "" >> README.md +git add README.md +git commit -m "Test webhook deployment" +git push origin main + +# Проверить логи webhook +tail -30 /var/log/hugo-webhook.log + +# Проверить логи deploy +tail -30 /var/log/hugo-deploy.log + +# Проверить что сайт обновился +curl -I https://YOUR_DOMAIN.COM + +# В GitHub проверить: +# Settings → Webhooks → Recent Deliveries +# Должен быть зеленый чекмарк +``` + +--- + +## Troubleshooting (Устранение проблем) + +### Telegram Bot не запускается + +**Проблема:** `exit-code status=2` + +```bash +# Диагностика +cd /var/www/telegram-bot +source telegram_bot_env/bin/activate + +# Проверка синтаксиса +python3 -m py_compile telegram/telegram_bot.py + +# Проверка зависимостей +python3 -c "import telegram, requests, dotenv; print('OK')" + +# Запуск вручную +python3 telegram/telegram_bot.py +# Увидите точную ошибку +``` + +**Решение:** Установить недостающие модули: + +```bash +pip install python-telegram-bot==20.7 requests python-dotenv pycryptodome +sudo systemctl restart telegram-hugo-bot +``` + +### Permission denied: .env файл + +**Проблема:** `PermissionError: [Errno 13] Permission denied: '/var/www/telegram-bot/.env'` + +**Причина:** Бот запускается от `www-data`, а файл `.env` принадлежит другому пользователю + +**Решение:** + +```bash +# Проверить текущие права +ls -la /var/www/telegram-bot/.env + +# Изменить владельца на 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 + +# Перезапустить бота +sudo systemctl restart telegram-hugo-bot + +# Проверить статус +sudo systemctl status telegram-hugo-bot +``` + +**Важно:** Все файлы, используемые ботом, должны принадлежать `www-data`, так как systemd сервис запускает бота от этого пользователя. + +### Email не отправляется + +**Проблема:** Формы не отправляют email + +```bash +# Проверка msmtp +msmtp --version + +# Проверка конфигурации +sudo cat /etc/msmtprc + +# Проверка логов +sudo tail -f /var/log/msmtp.log + +# Тест отправки +echo "test" | msmtp YOUR_EMAIL@gmail.com + +# Проверка PHP +php -i | grep sendmail_path +# Должно показать: /usr/bin/msmtp -t +``` + +**Решение:** Проверить Gmail App Password и настройки msmtp + +### Webhook возвращает 404 + +**Проблема:** GitHub webhook получает 404 + +```bash +# Проверка файла +ls -la /var/www/api/webhook.php + +# Проверка Nginx конфигурации +sudo nginx -t + +# Проверка логов Nginx +sudo tail -f /var/log/nginx/error.log + +# Проверка PHP-FPM +sudo systemctl status php*-fpm + +# Тест webhook вручную +curl -X POST https://YOUR_DOMAIN.COM/api/webhook.php +``` + +**Решение:** Убедиться что: +1. Файл webhook.php существует в `/var/www/api/` +2. Nginx настроен на обработку `/api/` локации +3. PHP-FPM запущен + +### Hugo build fails + +**Проблема:** Deploy скрипт падает при сборке Hugo + +```bash +# Проверка вручную +cd /var/www/hugo-source +hugo --destination /var/www/html --cleanDestinationDir + +# Проверка логов +tail -50 /var/log/hugo-deploy.log + +# Проверка конфигурации Hugo +cat config.toml +``` + +**Решение:** Проверить синтаксис в markdown файлах + +### Git конфликты + +**Проблема:** Telegram bot не может сделать push + +```bash +# Проверка Git статуса +cd /var/www/hugo-source +sudo -u www-data git status + +# Сброс к origin/main +sudo -u www-data git fetch origin main +sudo -u www-data git reset --hard origin/main + +# Проверка credentials +sudo -u www-data git config --list | grep credential +``` + +### Git dubious ownership (detected dubious ownership) + +**Проблема:** Deploy скрипт падает с ошибкой `fatal: detected dubious ownership in repository` + +**Причина:** Репозиторий принадлежит одному пользователю (например, `ptp`), а скрипт запускается от другого (`www-data`) + +**Решение:** + +```bash +# Вариант 1: Изменить владельца репозитория на www-data (рекомендуется) +sudo chown -R www-data:www-data /var/www/hugo-source + +# Вариант 2: Добавить 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 +tail -20 /var/log/hugo-deploy.log +``` + +### S3 Upload Errors + +**Проблема:** "argument of type 'NoneType' is not iterable" + +**Решение:** Проверить systemd конфигурацию из [VPS2_DEPLOYMENT.md:645-674](../VPS2_DEPLOYMENT.md#L645-L674) + +--- + +## Финальный Checklist + +### После успешного развертывания: + +- [ ] ✅ Hugo сайт доступен по HTTPS +- [ ] ✅ SSL сертификат установлен и работает +- [ ] ✅ GitHub webhook настроен и работает (тестовый push) +- [ ] ✅ Telegram бот отвечает на /start +- [ ] ✅ Создание поста через бота работает +- [ ] ✅ Git sync через бота работает +- [ ] ✅ PHP формы доступны +- [ ] ✅ Email отправка работает (тест) +- [ ] ✅ Telegram уведомления от форм работают +- [ ] ✅ Зашифрованное хранилище работает (/var/secure/forms/) +- [ ] ✅ Все логи пишутся корректно +- [ ] ✅ Systemd сервисы в статусе Active + +### Безопасность: + +- [ ] UFW firewall включен (22, 80, 443) +- [ ] .env файлы имеют права 600 +- [ ] /var/secure/forms/ имеет права 700 +- [ ] Git credentials защищены +- [ ] Регулярные обновления настроены + +### Мониторинг: + +```bash +# Команды для мониторинга +sudo systemctl status nginx telegram-hugo-bot +sudo journalctl -u telegram-hugo-bot -f +tail -f /var/log/hugo-webhook.log +tail -f /var/log/msmtp.log +``` + +--- + +## Следующие шаги + +### 1. Регулярное обслуживание + +```bash +# Еженедельно +sudo apt update && sudo apt upgrade -y +sudo certbot renew --dry-run + +# Ежемесячно +# Проверка дискового пространства +df -h + +# Очистка старых логов +sudo journalctl --vacuum-time=30d +``` + +### 2. Backup стратегия + +```bash +# GitHub = backup контента (автоматически) +# Создать backup .env файлов (вручную) +cp /var/www/telegram-bot/.env ~/backup/.env.telegram +cp /var/www/forms/.env ~/backup/.env.forms + +# Снапшоты VPS (в панели провайдера) +# Рекомендация: раз в неделю +``` + +### 3. Улучшения (опционально) + +- Настроить fail2ban для защиты от брутфорса +- Добавить rate limiting в Nginx +- Настроить автоматическое удаление старых заявок (30+ дней) +- Добавить CAPTCHA на формы +- Настроить мониторинг uptime (UptimeRobot) + +--- + +## Полезные команды + +### Управление сервисами + +```bash +# Перезапуск всех компонентов +sudo systemctl restart nginx +sudo systemctl restart php*-fpm +sudo systemctl restart telegram-hugo-bot + +# Просмотр логов +sudo journalctl -u telegram-hugo-bot -f +tail -f /var/log/hugo-webhook.log +tail -f /var/log/hugo-deploy.log +tail -f /var/log/msmtp.log + +# Проверка статуса +sudo systemctl status nginx telegram-hugo-bot php*-fpm +``` + +### Git операции + +```bash +# Обновление Hugo сайта вручную +cd /var/www/hugo-source +git pull origin main +hugo --destination /var/www/html --cleanDestinationDir + +# Проверка Git конфигурации бота +sudo -u www-data git config --list +``` + +### Диагностика + +```bash +# Проверка всех компонентов +systemctl status nginx telegram-hugo-bot +curl -I https://YOUR_DOMAIN.COM +ls -la /var/www/html/ +ls -la /var/secure/forms/ + +# Тест email +echo "test" | msmtp YOUR_EMAIL@gmail.com + +# Проверка PHP +php -v +php -m | grep -E 'curl|json|mbstring' +``` + +--- + +## Документация + +### Связанные документы: +- [VPS1_DEPLOYMENT.md](VPS1_DEPLOYMENT.md) - Детали Hugo + Webhook +- [VPS2_DEPLOYMENT.md](VPS2_DEPLOYMENT.md) - Детали Telegram Bot + Forms +- [PROJECT_ARCHITECTURE.md](PROJECT_ARCHITECTURE.md) - Архитектура проекта +- [VPS_DEBUG_GUIDE.md](VPS_DEBUG_GUIDE.md) - Отладка проблем + +### Официальные ресурсы: +- Hugo: https://gohugo.io/documentation/ +- python-telegram-bot: https://docs.python-telegram-bot.org/ +- Nginx: https://nginx.org/en/docs/ +- Certbot: https://certbot.eff.org/ + +--- + +## Поддержка + +**При возникновении проблем:** + +1. Проверить логи (journalctl, /var/log/) +2. Использовать раздел Troubleshooting +3. Запустить компоненты вручную для диагностики +4. Проверить права доступа к файлам +5. Убедиться что все .env переменные настроены + +**Успешного развертывания! 🚀** + +--- + +*Последнее обновление: 2025-10-25* +*Версия документа: 1.3*