- Added section 3.7 with all 6 HTTP security headers - Includes HSTS, CSP, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy - Testing instructions and online validation tools - Links to detailed SECURITY_HEADERS.md documentation - Fixed .gitignore to properly allow INFO/Deployment/*.md files
59 KiB
План развертывания 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 операций
Как получить:
- Перейти: https://github.com/settings/tokens
- Нажать "Generate new token" → "Generate new token (classic)"
- Заполнить:
- Note:
VPS PTP Deployment(описание токена) - Expiration: 90 days (или No expiration для постоянного доступа)
- Scopes: Выбрать только
repo(полный доступ к приватным репозиториям)
- Note:
- Нажать "Generate token"
- ВАЖНО: Скопировать токен сразу! Формат:
ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - Сохранить токен в безопасном месте (понадобится в этапе 2.2)
Безопасность:
- Никогда не коммитьте токен в Git
- Не делитесь токеном
- Если токен скомпрометирован - удалите его на GitHub и создайте новый
Получение Telegram Bot Token:
Зачем нужен: Для работы Telegram бота, который создаёт контент
Как получить:
- Открыть Telegram и найти бота: @BotFather
- Отправить команду:
/newbot - Ввести имя бота (например:
PTP Hugo Bot) - Ввести username бота (должен заканчиваться на
bot, например:ptp_hugo_bot) - Скопировать токен. Формат:
1234567890:ABC-DEF1234ghIkl-zyx57W2v1u123ew11 - Сохранить токен (понадобится в этапе 4.3)
Дополнительно:
- Получить свой User ID: @userinfobot →
/start - Сохранить User ID (понадобится для ALLOWED_USER_IDS)
Генерация ключа шифрования:
# На локальной машине:
openssl rand -base64 32
# Или
python3 -c "import secrets; print(secrets.token_urlsafe(32))"
План развертывания
💡 Автоматизация: Для каждого этапа доступны готовые bash-скрипты в папке scripts/
Быстрый старт: Запустите
./scripts/deploy-all.shдля автоматического развертывания всех этаповРучная установка: Следуйте инструкциям ниже для пошагового выполнения
ЭТАП 1: Базовая подготовка VPS (30-60 минут)
1.1 Подключение и обновление системы (10 минут)
Автоматизация: ./scripts/1.1-initial-setup.sh
# Подключение к 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
# Установка основных пакетов
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
# Скачать 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
# Настройка 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
# Создание всех необходимых директорий
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
# Настройка 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
# ВАРИАНТ 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
# Перейти в директорию 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
# Создать скрипт автодеплоя
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
# Создать 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
# Определить версию 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:
# Подождите 5-60 минут, затем проверьте:
nslookup YOUR_DOMAIN.COM
dig YOUR_DOMAIN.COM
# Или проверьте через curl
curl -I http://YOUR_DOMAIN.COM
3.3 Установка SSL сертификата (15 минут)
ВАЖНО: Выполнять ТОЛЬКО после того как DNS работает!
# Проверить что домен отвечает
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
# Добавить права для 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
# Создать лог файлы
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 репозитории:
-
Перейти: Settings → Webhooks → Add webhook
-
Настроить:
- Payload URL:
https://YOUR_DOMAIN.COM/api/webhook.php - Content type:
application/json - Secret: (оставить пустым для тестов или добавить секрет)
- Events: Just the push event
- Active: ✓
- Payload URL:
-
Сохранить и проверить Recent Deliveries
Тестирование webhook:
# Сделать тестовый коммит
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:
# Открыть конфигурацию 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
Проверка заголовков:
# Проверить что заголовки работают
curl -I https://YOUR_DOMAIN.COM | grep -E "X-Frame|X-Content|Referrer|Permissions|Strict-Transport|Content-Security"
# Должно показать все 6 заголовков
Тестирование CSP:
# Откройте сайт в браузере
# Нажмите F12 → Console
# Проверьте нет ли ошибок CSP
# Если всё работает - через неделю можно включить блокировку CSP:
# Заменить Content-Security-Policy-Report-Only на Content-Security-Policy
Онлайн проверка:
Проверьте безопасность на: https://securityheaders.com/?q=https://YOUR_DOMAIN.COM
Подробности: См. SECURITY_HEADERS.md для детальной информации.
ЭТАП 4: Telegram Bot (1.5-2 часа)
4.1 Python окружение (20 минут)
# Перейти в директорию бота
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 - нужно копировать вручную!
На локальной машине:
# Проверить что файлы существуют локально
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 - проверка:
# Проверить что файлы скопировались
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 - Это обеспечивает единые права доступа для всех компонентов системы
# Создать .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:
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 минут)
# Настроить 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 минут)
# Создать 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 минут)
# Проверить что бот запущен
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/.
На локальной машине:
# Скопировать файлы форм на 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 - проверка:
# Проверить файлы
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 минут)
# Создать .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:
- Включить 2FA: https://myaccount.google.com/security
- Создать App Password: https://myaccount.google.com/apppasswords
- Выбрать: Mail → Other → "VPS PTP Bot"
- Сохранить 16-символьный пароль
Запустить скрипт: ./scripts/5.3a-setup-msmtp-gmail.sh
ВАРИАНТ B: Yandex (рекомендуется для РФ)
Получение Yandex App Password:
- Перейти: https://passport.yandex.ru/profile
- Безопасность → Пароли приложений
- Создать пароль для "Почта"
- Сохранить 16-символьный пароль
- Включить 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
Ручная настройка (если предпочитаете):
# Установить 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
Редактирование конфигурации:
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
# Определить версию 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 минут)
# Тест 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 минут)
# Создать директорию для зашифрованных заявок
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 минут)
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"
Проверка логов:
# Логи бота
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 минут)
# Создать тестовую 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 минут)
# Сделать тестовое изменение
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
# Диагностика
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
# Увидите точную ошибку
Решение: Установить недостающие модули:
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 принадлежит другому пользователю
Решение:
# Проверить текущие права
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
# Проверка 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
# Проверка файла
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
Решение: Убедиться что:
- Файл webhook.php существует в
/var/www/api/ - Nginx настроен на обработку
/api/локации - PHP-FPM запущен
Hugo build fails
Проблема: Deploy скрипт падает при сборке Hugo
# Проверка вручную
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
# Проверка 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)
Решение:
# Вариант 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
Финальный 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 защищены
- Регулярные обновления настроены
Мониторинг:
# Команды для мониторинга
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. Регулярное обслуживание
# Еженедельно
sudo apt update && sudo apt upgrade -y
sudo certbot renew --dry-run
# Ежемесячно
# Проверка дискового пространства
df -h
# Очистка старых логов
sudo journalctl --vacuum-time=30d
2. Backup стратегия
# 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)
Полезные команды
Управление сервисами
# Перезапуск всех компонентов
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 операции
# Обновление Hugo сайта вручную
cd /var/www/hugo-source
git pull origin main
hugo --destination /var/www/html --cleanDestinationDir
# Проверка Git конфигурации бота
sudo -u www-data git config --list
Диагностика
# Проверка всех компонентов
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 - Детали Hugo + Webhook
- VPS2_DEPLOYMENT.md - Детали Telegram Bot + Forms
- PROJECT_ARCHITECTURE.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/
Поддержка
При возникновении проблем:
- Проверить логи (journalctl, /var/log/)
- Использовать раздел Troubleshooting
- Запустить компоненты вручную для диагностики
- Проверить права доступа к файлам
- Убедиться что все .env переменные настроены
Успешного развертывания! 🚀
Последнее обновление: 2025-10-25 Версия документа: 1.3