# Изменения в системе развертывания

**Последнее обновление:** 2025-11-10 (текущее время)
**Версия:** 2.3

---

## [2025-11-10] Обновление формы поездок (декабрь 2025) и UI улучшения

### ✅ ЗАВЕРШЕНО

**Основной результат:** Полное обновление страницы "Хочу поехать" с новыми полями формы, кастомизацией UI и изменением условий участия

#### 1. Обновление формы заявок на поездки
**Файлы:** `content/plan.md`, `forms/send_plan.php`, `static/data/upcoming-trips.json`

**Что добавлено:**
- ✅ Новое обязательное поле "Телефон *"
- ✅ Изменено поле "Имя" на "Фамилия, имя *"
- ✅ Добавлена загрузка PDF файла для уведомления о постановке на учёт БВС (максимум 5МБ, только PDF)
- ✅ Кастомная кнопка "Выбрать файл" вместо стандартной "Choose File" (на русском)
- ✅ Отображение выбранного имени файла с галочкой после загрузки
- ✅ Backend валидация для проверки типа файла и размера в `send_plan.php`

#### 2. Обновление условий участия и UI
**Файлы:** `content/plan.md`, `static/data/upcoming-trips.json`

**Что изменено:**
- ✅ Переименован раздел "Поездки с полетами дронов" → "Дронослёты"
- ✅ Изменены сроки подачи заявки: 7 дней → 5 дней до даты поездки
- ✅ Обновлен вводный текст: "Желаете отправиться..." → "Хотите присоединится к поездке? Ознакомьтесь с условиями участия и заполните форму"
- ✅ Удален раздел "Поездки без дронов" (принято решение не ездить с незнакомыми на некоммерческой основе)
- ✅ Удалено предложение собственного направления (оставлено на будущее)
- ✅ Удалена "Московская область" из описания (разрешение не дают)
- ✅ Добавлена подробная информация о времени выезда: "обычно рано утром, 5-6 утра из Москвы, иногда раньше в зависимости от удалённости локации"

#### 3. Обновление согласия на обработку данных
**Файлы:** `content/plan.md`

**Что изменено:**
- ✅ Добавлен заголовок "СОГЛАСИЕ НА ОБРАБОТКУ ПЕРСОНАЛЬНЫХ ДАННЫХ" (жирный, по центру) в блоке согласия формы
- ✅ Обновлен текст согласия: "Персональные данные обрабатываются исключительно для получения разрешения на полёты БВС. Согласие действует 1 месяц. Отзыв согласия – заявление на sleep-trip@ya.ru"
- ✅ Добавлен такой же заголовок в раздел "Пояснения к форме" перед детальным описанием согласия

#### 4. Обновление данных поездок
**Файл:** `static/data/upcoming-trips.json`

**Что изменено:**
- ✅ Скрыта ноябрьская поездка (active: false)
- ✅ Обновлена картинка декабрьской поездки на зимнее фото дрона: `/static/images/Rassvet_20231202_9.webp` → S3 URL `https://s3.regru.cloud/sleeptrip-dev/images/Rassvet_20231202_9.webp`
- ✅ Обновлено описание в карточке поездки на странице (убрана Московская область)

#### 5. Добавлено в form enctype
**Файл:** `content/plan.md`

**Что добавлено:**
- ✅ Атрибут `enctype="multipart/form-data"` в тег `<form>` для корректной работы с файлами

**Структура данных в форме:**
```php
$form_data = [
    'name' => 'string',           // Фамилия, имя (обязательно)
    'email' => 'string',          // Email (опционально)
    'phone' => 'string',          // Телефон (обязательно)
    'telegram' => 'string',       // Telegram ник (опционально)
    'bvs_number' => 'string',     // Номер/серийный номер БВС (опционально)
    'trip_period' => 'string',    // Выбранное мероприятие (опционально)
    'bvs_file' => 'string',       // Имя загруженного PDF файла (опционально)
    'consent' => 'agree'          // Согласие на обработку данных (обязательно)
];
```

**Валидация файла в backend:**
- Максимальный размер: 5 МБ
- Допустимый тип: только PDF (application/pdf)
- MIME тип проверяется функцией `mime_content_type()`
- Сохраняется только имя файла, сам файл передается в email/Telegram/JSON

#### 6. Рекомендации по развертыванию на VPS
**На VPS необходимо выполнить после git pull:**
```bash
# Скопировать обновленный файл формы
cp /var/www/hugo-source/forms/send_plan.php /var/www/forms/send_plan.php

# Установить права
sudo chown www-data:www-data /var/www/forms/send_plan.php
sudo chmod 644 /var/www/forms/send_plan.php
```

**Проверка на VPS:**
```bash
# Статус формы (должно вернуть 405 - GET не разрешен)
curl -s -o /dev/null -w "%{http_code}" http://sleeptrip.ru/forms/send_plan.php

# Логи ошибок PHP
tail -50 /var/log/php-fpm/error.log
```

**Количество коммитов:** 4
- `95fddb6` - Update December flights form and trip data
- `427ac1b` - Update plan page content with form improvements
- `856bace` - Fix December trip image URL to S3 link
- `328f32b` - Add custom file upload button with Russian label
- `9d5a0e1` - Update plan page: remove Moscow region, simplify conditions

---

## [2025-11-05] ПОЛНОЕ ОБНОВЛЕНИЕ - Галерея в боте + Документация развертывания + Исправления формы

### ✅ ЗАВЕРШЕНО - Большой объем работ

**Основной результат:** Добавлена полная система загрузки фотографий в галерею через Telegram бота с автоматическим обновлением сайта

#### 1. Реализована система загрузки фотографий в галерею
**Файл:** `telegram/telegram_bot.py` (строки добавлены в разные части файла)

**Что добавлено:**
- Новое состояние `GALLERY_UPLOAD` в классе `BotStates`
- Замена кнопки "📋 Заявки" на "📸 Галлерея" в главном меню (`get_main_keyboard()`)
- Функция `add_photo_to_gallery()` (строки ~1177-1205):
  - Загружает S3 URL в файл `content/gallery.md`
  - Использует Hugo shortcode `{{< figure src="..." >}}`
  - Автоматический git commit и push с сообщением "Добавлено фото в галлерею"
  - Обработка ошибок и логирование

- Обработка загрузки фото в `handle_photo()` (строки ~1246-1305):
  - Переименование: документ → имя файла `gallery_YYYYMMDD_N.jpg`
  - Загрузка в S3 папку `gallery/`
  - Вызов функции добавления в gallery.md
  - Ответ пользователю об успехе/ошибке

- Обработчик callback "gallery_upload" в `handle_callback_query()` (строки ~918-928):
  - Возврат в главное меню после отмены загрузки

**Архитектура:**
- Принцип работы: **простая загрузка фото** (без сложной формы как в постах)
- Поток: пользователь → выбирает "Галлерея" → загружает фото → автоматически добавляется на сайт
- S3 хранилище: все фото в папке `gallery/` с датой и номером
- Сайт: автоматически обновляется через webhook после git push

**Ключевой момент:** Исправлена ошибка параметров функции `git_add_commit_push(files, message)` - правильный порядок (files первым, message вторым).

#### 2. Исправления в формах
**Файлы:** `forms/forms_helper.php`, `forms/send_plan.php`, `forms/send_ask.php`

**Что исправлено:**
- ✅ Улучшена обработка ошибок отправки email
- ✅ Добавлено логирование для отладки проблем с msmtp
- ✅ Проверка наличия переменных окружения перед использованием
- ✅ Корректная работа с FORMS_SEND_TELEGRAM флагом

#### 3. Обновление dropdown поездок - добавлена опция "Предложить свое"
**Файл:** `static/js/trip-form-loader.js` (строки 70-74)

**Что добавлено:**
```javascript
const customOption = document.createElement('option');
customOption.value = 'Предложить свое';
customOption.textContent = 'Предложить свое';
select.appendChild(customOption);
```

**История этой задачи:**
1. Изначально была опция "Свой вариант без БВС" - **удалена** (была неправильная формулировка)
2. Добавлена новая опция "Предложить свое" (более понятная пользователям)
3. Опция загружается динамически из JavaScript, синхронизирована с управлением в Telegram боте

#### 4. Обновление условий участия в поездках без БВС
**Файл:** `content/plan.md`

**Что изменилось:**
- **Было:** Две отдельные строки:
  - "Подача заявки: минимум за 2-3 дня"
  - "Обсуждение деталей: [Telegram чат]"
- **Стало:** Одна консолидированная строка:
  - "Подача заявки: минимум за 2-3 дня через [Telegram чат 'Пока ты спал']"

**Результат:** Более компактная и понятная информация на странице

#### 5. Созданы две практические справки для развертывания

**Файл 1: `INFO/Deployment/TELEGRAM_BOT_UPDATE.md`** (Новый файл)
- Содержание: Как обновлять Telegram бота на VPS и перезапускать сервис
- Быстрый старт (2 минуты): scp копирование + systemctl restart
- Полный процесс с проверкой прав доступа
- Проверка статуса через journalctl
- Откат изменений
- Типичные ошибки и решения
- Интерпретация для других способов запуска (screen/tmux)

**Файл 2: `INFO/Deployment/PHP_FORMS_UPDATE.md`** (Новый файл)
- Содержение: Как обновлять PHP формы и устанавливать правильные права доступа
- Быстрый старт (1 минута): git add → commit → push (webhook автоматически обновит)
- Полный процесс обновления на VPS
- Таблица прав доступа для всех файлов
- Одна команда установки всех прав сразу
- Проверка что формы работают (curl + логи)
- Типичные проблемы (403, 500, не отправляется, email не приходит)

**Назначение этих файлов:**
- Быстрая справка при изменении кода (не нужно помнить все команды)
- Используются как références в документации
- Разделены по задачам (бот отдельно, формы отдельно)
- Содержат практические примеры и команды

#### 6. Открыта важная находка о webhook
**Проблема:** После миграции на новый домен sleeptrip.ru webhook не срабатывал автоматически
**Причина:** GitHub webhook был настроен с URL старого домена/тестовой версии
**Решение:** Обновлены GitHub webhook настройки указать новый Payload URL
**Документирование:** Добавлено в `VPS_SINGLE_DEPLOYMENT.md` как КРИТИЧЕСКИЙ момент - при смене домена ОБЯЗАТЕЛЬНО обновить webhook URL в GitHub

**Проверка:** Тестирование с маркером "ТЕСТ-WEBHOOK" в plan.md подтвердило что webhook работает после обновления URL

#### Коммиты сегодня:
1. `ea9ca59` - Remove 'Свой вариант без БВС' option from trip selection dropdown
2. `21e00bf` - Update trips without drones section - combine submission and discussion into one line
3. `d352bba` - Test webhook with new domain - check if auto deploy works
4. `6a3603c` - Fix ask form and improve .env parsing (из предыдущей сессии)

#### Статус проекта
- Прогресс: ~82% (все критичные компоненты работают, система полностью функциональна)
- Новые возможности: загрузка фотографий в галерею прямо из Telegram бота
- Документирование: созданы справочники по развертыванию
- Следующие задачи: S3 file listing feature (отдельная задача), дополнительные оптимизации

---

## [2025-11-05] Обновление страницы "Хочу поехать" (Plan page) + Webhook документация

### ✅ ВЫПОЛНЕНО - Изменения в форме поездок и инструкции

**Файлы изменены:**
- `static/js/trip-form-loader.js` - Удалена опция "Свой вариант без БВС" из dropdown
- `content/plan.md` - Обновлен текст условий участия для поездок без дронов
- `INFO/Deployment/VPS_SINGLE_DEPLOYMENT.md` - Добавлена критическая информация о Webhook

**Что изменилось:**

1. **Dropdown поездок:** Удалена статичная опция "Свой вариант без БВС"
   - Теперь список содержит только активные поездки из `upcoming-trips.json`
   - Пользователи по-прежнему могут предложить свой вариант через поле `bvs_number` (textarea)

2. **Условия участия:** Переформулировано для поездок без дронов
   - **Было:** Две отдельные строки (подача заявки и обсуждение деталей)
   - **Стало:** Одна строка - "Подача заявки: минимум за 2-3 дня до поездки через Telegram чат 'Пока ты спал'"

3. **GitHub Webhook - ВАЖНО:** Добавлена новая секция в инструкцию развертывания
   - ⚠️ **КРИТИЧЕСКИЙ момент:** При смене домена ОБЯЗАТЕЛЬНО обновить Payload URL в GitHub webhook настройках
   - Без обновления webhook URL автоматический deploy не будет работать
   - Добавлены инструкции для тестирования webhook (делать изменение → push → проверить что обновилось на сайте)
   - Добавлены инструкции для отладки если webhook не работает

**Тестирование:**
- Проверена работа webhook с новым доменом sleeptrip.ru
- ✅ Webhook работает корректно - сайт обновляется за несколько секунд после push на main ветку

**Коммиты:**
- `ea9ca59` - Remove 'Свой вариант без БВС' option from trip selection dropdown
- `21e00bf` - Update trips without drones section - combine submission and discussion into one line
- `d352bba` - Test webhook with new domain - check if auto deploy works
- `[следующий]` - Remove test marker, update deployment docs with webhook critical info

---

## [2025-10-29] ВЕЧЕР - Полный Пакет Зеркалирования VPS и Автоматизации

### 🎉 ЗАВЕРШЕНО - БОЛЬШОЕ ОБНОВЛЕНИЕ

**Создан полный пакет для:**
- ✅ Зеркалирования VPS (production → testing)
- ✅ Автоматических бэкапов на S3 (еженедельно + ежедневно)
- ✅ Проверки целостности бэкапов (ежемесячно)
- ✅ Синхронизации тестового VPS (еженедельно)
- ✅ Мониторинга и оповещений по email

**Создано файлов:**

**Документация:**
- `INFO/mirror/00_START_HERE.md` - Быстрый старт (5 минут)
- `INFO/mirror/QUICK_START.md` - Полный гайд (30 мин)
- `INFO/mirror/TESTING_VPS_SETUP.md` - Подробный гайд (4-5 часов)
- `INFO/mirror/INDEX.md` - Полный обзор пакета

**Скрипты (2,663 строк кода):**
- `scripts/backup-to-s3.sh` - Полные + инкрементальные бэкапы (400 строк)
- `scripts/restore-from-s3.sh` - Восстановление из бэкапов (350 строк)
- `scripts/verify-backups.sh` - Проверка целостности (450 строк)
- `scripts/sync-vps-full.sh` - Синхронизация VPS (300 строк)
- `scripts/setup-backup-automation.sh` - Настройка cron (350 строк)
- `scripts/setup-git-workflow.sh` - Настройка git (350 строк)
- `scripts/install-all.sh` - Интерактивный установщик (600 строк)
- `scripts/.env.backup` - Шаблон конфигурации

**Расписание автоматизации:**
- 1:00 AM ежедневно (Пн-Сб) → Инкрементальный бэкап
- 2:00 AM по воскресеньям → Полный бэкап
- 1:00 AM 1-го числа → Проверка целостности
- 4:00 AM по пятницам → Синхронизация test VPS

**Возможности:**
- Полная автоматизация бэкапов (0 ручного вмешательства)
- 7 встроенных тестов для проверки целостности
- Email уведомления при ошибках
- Автоматическая ротация старых бэкапов (28-дневное хранение)
- Логирование всех операций
- Dry-run режим для тестирования

### Помощь с Конфигурацией

- ✅ Объяснено где находится конфиг почты (`.env` файлы и `/etc/msmtprc`)
- ✅ Объяснены правильные права доступа для msmtp:
  - `/etc/msmtprc` → 640 root:mail (для доступа www-data через группу)
  - `/var/www/forms/.env` → 600 www-data:www-data
  - `/var/log/msmtp.log` → 666 root:root (логирование)
- ✅ Показано как проверить Telegram бота и API
- ✅ Проведена диагностика проблем с правами доступа

---

## [2025-10-29] ДЕНЬ - Email через формы, Миграция на sleeptrip.ru

### Завершено
- ✅ **Email отправка через формы (КРИТИЧНЫЙ ФИкС)**
  - Добавлена функция `send_email_notification()` в forms_helper.php
  - Обновлены send_plan.php и send_ask.php для вызова функции
  - **КРИТИЧНО:** www-data должен быть в группе `mail` для доступа к msmtp
    ```bash
    sudo usermod -a -G mail www-data
    sudo systemctl restart php8.3-fpm
    ```
  - Настроен PHP error logging: `/var/log/php_errors.log`
  - Формы теперь работают в 3 каналах: Email + Telegram + JSON

- ✅ **Календарь поездок обновлен**
  - upcoming-trips.json: ноябрь/декабрь 2025 заменили сентябрь/октябрь
  - last_updated: 2025-10-29

- ✅ **Миграция на основной домен sleeptrip.ru**
  - config.toml: baseURL изменен на https://sleeptrip.ru/
  - SSL сертификат получен через Let's Encrypt
  - Сайт работает на production домене
  - Nginx автоматически настроен через certbot

### Исправлено
- **Права доступа www-data к msmtp**
  - Проблема: mail() возвращал FALSE, письма не отправлялись
  - Причина: www-data не мог читать /etc/msmtprc (группа mail)
  - Решение: добавление www-data в группу mail

- **PHP error_log не работал**
  - Добавлен error_log = /var/log/php_errors.log в php.ini
  - Добавлен catch_workers_output = yes в pool.d/www.conf
  - Создан файл лога с правами www-data:www-data

### Не решено
- ⚠️ **Шифрование PHP↔Python** - отложено
  - Telegram бот по-прежнему не может расшифровать PHP-encrypted заявки
  - Ошибка: "Padding is incorrect"
  - Приоритет снижен, т.к. Email и Telegram уведомления работают

### Статус проекта
- Прогресс: ~80% (критичные компоненты работают, основной домен)
- Время затрачено: ~8 часов (текущая + предыдущие сессии)
- Осталось: ~2 часа (шифрование + добавление админа в бот)

---

## [2025-10-27] - Security Headers, Оптимизация фона, Отладка шифрования

### Завершено
- ✅ **Формы AJAX** - исправлены белые страницы
  - Формы теперь возвращают JSON вместо HTTP redirect
  - Обе формы (plan и ask) работают через AJAX без перезагрузки
  - Убран тестовый текст из map.md

- ✅ **Security Headers** - добавлены 6 HTTP заголовков безопасности
  - Базовые headers (X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy)
  - HSTS (Strict-Transport-Security)
  - CSP (Content-Security-Policy) в режиме Report-Only
  - Создана документация: INFO/Deployment/SECURITY_HEADERS.md
  - Добавлен раздел 3.7 в VPS_SINGLE_DEPLOYMENT.md

- ✅ **Оптимизация фона** - DESKTOP_NEW_1.jpg → WebP
  - Размер: 4.5MB → 571KB (экономия 87%)
  - Разрешение: 5418x3070 → 1920x1088
  - Формат: JPG → WebP
  - Ускорение загрузки страницы на 3-4 секунды

- ✅ **Документация ошибок** - создан ERRORS_COLLECTION.md
  - 7 категорий ошибок при развертывании
  - Git push problems
  - S3 upload issues
  - Telegram bot path issues
  - Forms AJAX/redirect incompatibility
  - .env file parsing bug
  - Permission errors
  - Script line endings

### В процессе
- ⚠️ **Шифрование PHP↔Python** - проблема остается
  - Заявки сохраняются в `/var/secure/forms/*.json` ✅
  - Ключи шифрования совпадают ✅
  - `forms_helper.php` обновлен (openssl параметр 0) ✅
  - PHP-FPM перезапущен ✅
  - **Проблема:** Python выдает `Padding is incorrect` при расшифровке
  - **План на завтра:** Тесты совместимости PHP/Python шифрования

### Исправлено
- **Forms Git tracking** - формы добавлены в git
  - Обновлен .gitignore: `forms/` → `forms/.env`
  - Формы теперь версионируются в git
  - `.env` файл защищен от коммита
  - Автоматический deploy через webhook

- **.env parsing bug** - исправлена функция load_env_file()
  - Проблема: Пробелы и inline комментарии не удалялись
  - `FORMS_SEND_TELEGRAM=true       # comment` читалось как `'true       # comment'`
  - Решение: Добавлен trim() после удаления комментариев
  - Обновлен forms_helper.php (строки 22-24, 34)

- **Nginx configuration** - Security Headers в HTTPS блоке
  - Заголовки добавлены в правильное место (port 443)
  - Проверено через curl
  - Работают все 4 базовых заголовка

### Добавлено
- **Скрипты permissions/** - набор скриптов для проверки прав
  - `check-permissions.sh` - проверка прав доступа
  - `fix-*.sh` - исправление прав для разных компонентов
  - Автоматическая диагностика проблем

- **TOMORROW_PLAN.md** - подробный план на 2025-10-28
  - 10 задач с приоритетами
  - Критично: исправить шифрование PHP↔Python
  - Добавить ноябрь/декабрь в поездки
  - Форма с загрузкой файлов
  - Кнопка "отметить рассмотренной" в боте
  - Оптимизации: Font-display, Cache headers, Lazy loading
  - SEO исправления

- **INFO/Deployment/.gitignore** - защита документации
  - Разрешены только .md файлы в INFO/Deployment/
  - Скрипты и другие файлы защищены

### Статус проекта
- Прогресс: ~75% (критичные компоненты работают)
- Время затрачено: ~6 часов (сегодняшняя сессия + предыдущие)
- Осталось: ~2 часа (шифрование + мелкие задачи)

### Следующие шаги (2025-10-28)
1. 🔥 **Критично:** Исправить шифрование PHP↔Python
2. Добавить ноябрь/декабрь в поездки
3. Исправить управление поездками в боте
4. Форма с загрузкой файлов (30 минут автоочистка)
5. Кнопка "отметить рассмотренной"
6. Font-display: swap
7. Cache headers в Nginx
8. Документация переноса домена
9. Оптимизация изображений (lazy load)
10. SEO исправления

---

## [2025-10-25] - Исправление прав доступа, архитектуры и Telegram бота

### Критическое исправление Telegram бота
- **Git синхронизация не работала:**
  - Проблема: `GIT_REPO_PATH = '/var/www/telegram-bot/ptp'` (hardcoded неправильный путь)
  - Ошибка: `fatal: not a git repository (or any of the parent directories): .git`
  - Решение: `GIT_REPO_PATH = os.getenv('GIT_REPO_PATH', '/var/www/hugo-source')`
  - Результат: Git sync, создание постов, отображение постов теперь работают

- **Управление календарем поездок не работало:**
  - Проблема: `TRIPS_JSON_PATH` использовал путь относительно telegram_bot.py
  - Решение: `TRIPS_JSON_PATH = os.path.join(GIT_REPO_PATH, 'static', 'data', 'upcoming-trips.json')`
  - Результат: Календарь корректно читается и обновляется

- **Обновление сайта после изменения календаря:**
  - Добавлен автоматический git commit и push в функцию `handle_trips_update_site()`
  - Теперь кнопка "Обновить сайт" делает: сохранение → commit → push → webhook → deploy
  - Workflow аналогичен созданию постов

- **Файл:** `ptp/telegram/telegram_bot.py` (строки 36, 40, 1928-1978)

### Критическое исправление архитектуры
- **PHP формы перенесены в отдельную директорию:**
  - Проблема: Формы в `/var/www/html/` удалялись Hugo при каждом deploy (`--cleanDestinationDir`)
  - Решение: Создана отдельная директория `/var/www/forms/` для PHP форм
  - Обновлен Nginx: добавлен location блок `/forms/` в этапе 3.1
  - Обновлен этап 1.5: создание директории `/var/www/forms/`
  - Обновлен этап 5.1: копирование форм в `/var/www/forms/`
  - Обновлен этап 5.2: `.env` файл теперь в `/var/www/forms/.env`
  - Обновлены все ссылки и комментарии в документации
  - Преимущества: формы защищены от удаления, доступны через `https://domain.com/forms/send_plan.php`

### Исправлено
- **Git dubious ownership error:** Исправлена критическая ошибка при работе webhook
  - Проблема: Репозиторий принадлежал пользователю `ptp`, а deploy скрипт запускался от `www-data`
  - Решение: Добавлена команда `sudo chown -R www-data:www-data /var/www/hugo-source`
  - Обновлены разделы: 2.2 (клонирование), 3.4 (sudo права)
  - Добавлен раздел в Troubleshooting

- **Permission denied для .env файла:** Исправлена ошибка при запуске Telegram бота
  - Проблема: `.env` файл создавался от текущего пользователя, а бот работает от `www-data`
  - Решение: Добавлены команды `chown www-data:www-data` в этап 4.3
  - Добавлен раздел в Troubleshooting: "Permission denied: .env файл"

### Добавлено
- **Новый файл TODAY.md:**
  - Быстрый ежедневный статус: на чем остановились, следующий шаг
  - Важные исправления текущей сессии
  - Полезные команды для VPS
  - План на следующий раз
  - Местоположение: `ptp/INFO/Deployment/TODAY.md`

- **Документация про заявки в Telegram боте:**
  - Заявки сохраняются в `/var/secure/forms/` в зашифрованном виде
  - ApplicationsReader расшифровывает и отображает их
  - Поддерживает два типа: 'plan' (заявки на поездки) и 'ask' (вопросы)
  - Требуется совпадение FORMS_ENCRYPTION_KEY в обоих .env файлах
  - Меню бота: 📋 Заявки → Новые заявки / Все заявки / Статистика

- **Новый раздел "Важные концепции"** в начале документа
  - Объяснение роли пользователя `www-data`
  - Почему все компоненты используют единого пользователя
  - Преимущества такого подхода
  - Важные правила для .env файлов и репозитория

- **Расширенные пояснения про FORMS_ENCRYPTION_KEY:**
  - Этап 4.3: зачем боту ключ шифрования форм
  - Этап 5.2: как работает схема шифрования/расшифрования
  - Важность совпадения ключей в обоих .env файлах

- **Новые разделы Troubleshooting:**
  - "Git dubious ownership" - проблема прав репозитория
  - "Permission denied: .env файл" - проблема прав конфигурации

### Обновлено
- **Скрипт 2.2-clone-repo.sh:** автоматически меняет владельца на www-data
- **Скрипт 3.3-setup-webhook-sudo.sh:** добавляет safe.directory и проверяет ошибки
- **Этап 2.2 (клонирование):** добавлены команды установки прав на репозиторий
- **Этап 3.4 (sudo права):** добавлены safe.directory и подсказки при ошибках
- **Этап 4.3 (.env для бота):**
  - Добавлено объяснение важности www-data
  - Автоматическая установка правильных прав на .env
  - Инструкции по проверке прав после редактирования

### Завершено
- ✅ **ЭТАП 3: Nginx и SSL** полностью выполнен
  - 3.1 Настройка Nginx (с location блоком `/forms/`)
  - 3.2 Настройка DNS
  - 3.3 Установка SSL сертификата
  - 3.4 Настройка sudo прав для webhook (с фиксом ownership)
  - 3.5 Создание лог файлов
  - 3.6 Настройка GitHub Webhook

- ✅ **ЭТАП 4: Telegram Bot** полностью выполнен
  - 4.1 Python окружение
  - 4.2 Копирование файлов бота
  - 4.3 Настройка .env для бота (с фиксом прав www-data)
  - 4.4 Настройка Git для www-data
  - 4.5 Создание Systemd сервиса
  - 4.6 Тестирование бота

### Статус проекта
- Прогресс: ~70% (4 из 6 этапов + 5.1)
- Время затрачено: ~5.2 часа
- Осталось: ~2.3 часа

---

## [2025-10-24] - Исправления и завершение Этапа 2

### Исправлено
- **Критическая ошибка путей:** Исправлены все упоминания `/var/www/hugo-source/ptp` на `/var/www/hugo-source`
  - Обновлен VPS_SINGLE_DEPLOYMENT.md (9 упоминаний)
  - Исправлены скрипты 2.3 и 2.4
  - Причина: репозиторий клонируется напрямую в `hugo-source/`, Hugo файлы в корне

### Добавлено
- **Инструкции по получению токенов** в разделе "Подготовка перед началом":
  - GitHub Personal Access Token - пошаговая инструкция
  - Telegram Bot Token - через @BotFather
  - Telegram User ID - через @userinfobot
- Предупреждения о безопасности токенов
- Ссылки на нужные страницы GitHub и Telegram

### Завершено
- ✅ **ЭТАП 2: Git и Hugo** полностью выполнен
  - 2.1 Настройка Git
  - 2.2 Клонирование репозитория
  - 2.3 Первая сборка Hugo
  - 2.4 Создание Deploy скрипта (с правильным путем)
  - 2.5 Создание Webhook обработчика

### Статус проекта
- Прогресс: 33.3% (2 из 6 этапов)
- Время затрачено: ~2 часа
- Осталось: ~5.5 часов

---

## [2025-10-21] - Начальная версия

### Что было сделано

### 1. Добавлена поддержка российских почтовых сервисов

Теперь вы можете выбрать из трёх вариантов для отправки email:

- ✅ **Yandex** - рекомендуется для проектов в РФ (стабильная работа)
- ✅ **Gmail** - для международных проектов (может блокироваться в РФ)
- ✅ **Mail.ru** - российская альтернатива

**Обновлено в документации:**
- Чеклист подготовки ([VPS_SINGLE_DEPLOYMENT.md](VPS_SINGLE_DEPLOYMENT.md#L108-L111))
- Раздел 5.3 с тремя вариантами настройки ([VPS_SINGLE_DEPLOYMENT.md](VPS_SINGLE_DEPLOYMENT.md#L883-L1008))
- Таблица сравнения сервисов ([VPS_SINGLE_DEPLOYMENT.md](VPS_SINGLE_DEPLOYMENT.md#L1001-L1008))

### 2. Созданы автоматизированные bash-скрипты

Все 19 скриптов извлечены из документации и готовы к использованию:

#### ЭТАП 1: Базовая подготовка (5 скриптов)
- `1.1-initial-setup.sh` - Обновление системы
- `1.2-install-packages.sh` - Установка пакетов
- `1.3-install-hugo.sh` - Установка Hugo
- `1.4-setup-firewall.sh` - Настройка firewall
- `1.5-create-directories.sh` - Создание директорий

#### ЭТАП 2: Git и Hugo (5 скриптов)
- `2.1-setup-git.sh` - Настройка Git
- `2.2-clone-repo.sh` - Клонирование репозитория
- `2.3-build-hugo.sh` - Сборка Hugo
- `2.4-create-deploy-script.sh` - Deploy скрипт
- `2.5-create-webhook.sh` - GitHub webhook

#### ЭТАП 3: Nginx и SSL (4 скрипта)
- `3.1-setup-nginx.sh` - Настройка Nginx
- `3.2-setup-ssl.sh` - Установка SSL
- `3.3-setup-webhook-sudo.sh` - Sudo права
- `3.4-create-logs.sh` - Лог файлы

#### ЭТАП 5: Email (4 скрипта)
- `5.3a-setup-msmtp-gmail.sh` - Gmail
- `5.3b-setup-msmtp-yandex.sh` - Yandex ⭐
- `5.3c-setup-msmtp-mailru.sh` - Mail.ru
- `5.4-setup-php-msmtp.sh` - Настройка PHP

#### Мастер-скрипт
- `deploy-all.sh` - Автоматическое выполнение всех этапов

### 3. Реорганизована структура файлов

**Старая структура:**
```
ptp/INFO/
└── VPS_SINGLE_DEPLOYMENT.md
```

**Новая структура:**
```
ptp/INFO/Deployment/
├── README.md                    # Обзор и быстрый старт
├── VPS_SINGLE_DEPLOYMENT.md     # Полная инструкция
├── CHANGES.md                   # Этот файл
└── scripts/                     # Автоматизация
    ├── README.md
    ├── deploy-all.sh
    └── [19 скриптов этапов]
```

### 4. Обновлена документация

**Добавлено:**
- Ссылки на скрипты в каждом разделе инструкции
- Блок "Автоматизация" в начале каждого этапа
- Три README файла с разным уровнем детализации
- Таблица сравнения почтовых сервисов

**Улучшено:**
- Чеклист подготовки теперь включает выбор email сервиса
- Инструкции по получению App Password для Yandex
- Описание лимитов и особенностей каждого сервиса

## Преимущества новой структуры

### Для разработчика
- ✅ Быстрое развертывание через `deploy-all.sh`
- ✅ Каждый скрипт можно запустить отдельно
- ✅ Интерактивные подсказки при выполнении
- ✅ Автоматическая проверка на ошибки (`set -e`)

### Для проекта в РФ
- ✅ Поддержка Yandex и Mail.ru
- ✅ Стабильная работа без зависимости от внешних сервисов
- ✅ Гибкий выбор почтового провайдера

### Для поддержки
- ✅ Код скриптов вынесен из документации
- ✅ Легко обновлять и тестировать
- ✅ Версионирование через Git

## Использование

### Быстрый старт (автоматически):

```bash
cd ptp/INFO/Deployment/scripts
./deploy-all.sh
```

### Пошаговое выполнение:

```bash
# Этап 1
./1.1-initial-setup.sh
./1.2-install-packages.sh
# ... и так далее

# Этап 5 - выбрать один из вариантов
./5.3b-setup-msmtp-yandex.sh  # Рекомендуется для РФ
```

### Ручная установка:

Следуйте инструкциям в [VPS_SINGLE_DEPLOYMENT.md](VPS_SINGLE_DEPLOYMENT.md)

## Обратная совместимость

Все существующие инструкции остались в документации - можно выполнять вручную копируя команды.

Скрипты созданы на основе этих инструкций, поэтому результат идентичен.

## Следующие шаги

Возможные улучшения в будущем:
- [ ] Добавить скрипты для Этапа 4 (Telegram Bot)
- [ ] Создать скрипт полной проверки системы после развертывания
- [ ] Добавить скрипт резервного копирования
- [ ] Интеграция с CI/CD

## Миграция со старой версии

Если вы уже развернули систему по старой инструкции:

1. Скрипты **не требуются** - они для новых развертываний
2. Для добавления Yandex/Mail.ru вместо Gmail:
   - Запустите `5.3b-setup-msmtp-yandex.sh` или
   - Следуйте новому разделу 5.3 в документации

---

**Контакты:**
- Документация: [README.md](README.md)
- Полная инструкция: [VPS_SINGLE_DEPLOYMENT.md](VPS_SINGLE_DEPLOYMENT.md)
- Скрипты: [scripts/README.md](scripts/README.md)
