Files
ptp/INFO/Deployment/VPS_SINGLE_DEPLOYMENT.md
T
2026-01-15 22:24:06 +03:00

1756 lines
59 KiB
Markdown
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# План развертывания 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'
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
$secret = ''; // ЗАПОЛНИТЕ ПОЗЖЕ или оставьте пустым для тестов
$log_file = '/var/log/hugo-webhook.log';
function writeLog($message) {
global $log_file;
file_put_contents($log_file, "[" . date('Y-m-d H:i:s') . "] $message\n", FILE_APPEND);
}
writeLog("=== Webhook triggered ===");
// Проверяем метод
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
http_response_code(405);
writeLog("ERROR: Wrong method: " . $_SERVER['REQUEST_METHOD']);
exit('Method not allowed');
}
// Получаем payload
$payload = file_get_contents('php://input');
$data = json_decode($payload, true);
if (!$data) {
http_response_code(400);
writeLog("ERROR: Invalid JSON payload");
exit('Invalid payload');
}
// Проверка подписи GitHub (если secret настроен)
if (!empty($secret)) {
$signature = $_SERVER['HTTP_X_HUB_SIGNATURE_256'] ?? '';
$expected = 'sha256=' . hash_hmac('sha256', $payload, $secret);
if (!hash_equals($expected, $signature)) {
http_response_code(401);
writeLog('ERROR: Invalid signature');
exit('Unauthorized');
}
}
// Проверяем что это push в main ветку
if (!isset($data['ref']) || $data['ref'] !== 'refs/heads/main') {
writeLog("INFO: Skipping - not main branch. Ref: " . ($data['ref'] ?? 'unknown'));
exit('Not main branch');
}
writeLog("INFO: Push to main branch detected");
// Запускаем deploy скрипт
$deploy_script = '/var/www/webhook/deploy.sh';
$output = [];
$return_code = 0;
writeLog("INFO: Starting deploy script...");
exec("sudo $deploy_script 2>&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 mail('YOUR_EMAIL@gmail.com', 'Test Subject', 'Test from PHP'); echo 'Mail sent'; ?>" | php
# Тест 3: Проверка из браузера
echo '<?php
$to = "YOUR_EMAIL@gmail.com";
$subject = "Test from PHP web";
$message = "This is a test email from PHP running via Nginx";
$headers = "From: webmaster@yourdomain.com";
if(mail($to, $subject, $message, $headers)) {
echo "Email sent successfully!";
} else {
echo "Failed to send email.";
}
?>' | 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'
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Test Form</title>
</head>
<body>
<h1>Test Plan Form</h1>
<form action="/forms/send_plan.php" method="POST">
<label>Имя: <input type="text" name="name" value="Test User" required></label><br>
<label>Email: <input type="email" name="email" value="test@example.com" required></label><br>
<label>Телефон: <input type="tel" name="phone" value="+79001234567"></label><br>
<label>Telegram: <input type="text" name="telegram" value="@testuser"></label><br>
<label>Поездка: <input type="text" name="trip_period" value="Сентябрь 2025"></label><br>
<label>БВС: <input type="text" name="bvs_number" value="БВС-001"></label><br>
<button type="submit">Отправить</button>
</form>
</body>
</html>
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 "<!-- Test webhook $(date) -->" >> 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*