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

437 lines
14 KiB
Markdown
Executable File
Raw Permalink 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.
# 🐛 Коллекция ошибок при развертывании на VPS
**Документация всех проблем и решений при установке PTP на VPS**
---
## 📋 Содержание
1. [Git Push Problems](#1-git-push-problems)
2. [S3 Upload Issues](#2-s3-upload-issues)
3. [Telegram Bot Path Issues](#3-telegram-bot-path-issues)
4. [Forms White Page (AJAX/Redirect)](#4-forms-white-page-ajaxredirect)
5. [.env File Parsing Bug](#5-env-file-parsing-bug)
6. [Permission Errors](#6-permission-errors)
7. [Script Line Endings](#7-script-line-endings)
---
## 1. Git Push Problems
### ❌ Проблема
```bash
fatal: The current branch main has no upstream branch.
```
### 🔍 Причина
Локальная ветка `main` не связана с удалённой `github/main`.
### ✅ Решение
```bash
git branch --set-upstream-to=github/main main
git pull --no-rebase
git push
```
### 📝 Урок
Всегда проверять связь веток перед первым push после клонирования.
---
## 2. S3 Upload Issues
### ❌ Проблема
Telegram бот не может загружать фото на S3 REG.RU:
```
which aws
/usr/bin/aws
aws configure list
Name Value Type Location
---- ----- ---- --------
profile <not set> None None
access_key <not set> None None
secret_key <not set> None None
region <not set> None None
```
### 🔍 Причина
AWS CLI установлен, но не настроен. Пытались установить через pip3, но получили:
```
error: externally-managed-environment
```
### ✅ Решение
Не использовать AWS CLI! Переключиться на **direct HTTP upload** метод:
```python
# В telegram_bot.py использовать:
upload_photo_direct() # вместо upload_photo_s3()
```
Этот метод использует только `requests` библиотеку и прямой HTTP PUT запрос к S3.
### 📝 Урок
На Ubuntu 24.04+ pip установка блокируется по умолчанию. Лучше использовать HTTP API напрямую без CLI инструментов.
---
## 3. Telegram Bot Path Issues
### ❌ Проблема
```python
fatal: not a git repository
```
Бот не может выполнить git команды.
### 🔍 Причина
В коде бота путь к репозиторию был захардкожен:
```python
GIT_REPO_PATH = '/var/www/hugo-site' # Неправильный путь!
```
### ✅ Решение
Читать из `.env`:
```python
GIT_REPO_PATH = os.getenv('GIT_REPO_PATH', '/var/www/hugo-source')
TRIPS_JSON_PATH = os.path.join(GIT_REPO_PATH, 'static/data/upcoming-trips.json')
```
В `/var/www/telegram-bot/.env`:
```bash
GIT_REPO_PATH=/var/www/hugo-source
```
### 📝 Урок
Никогда не хардкодить пути. Всегда использовать переменные окружения.
---
## 4. Forms White Page (AJAX/Redirect)
### ❌ Проблема
После отправки формы - **белая страница**, хотя POST данные приходят:
```
=== Request at 2025-10-27 15:02:32 ===
Array (
[name] => Test
[email] => test@test.com
...
)
```
### 🔍 Причина
**Несовместимость AJAX и HTTP redirect:**
JavaScript в `plan.md`:
```javascript
fetch('/forms/send_plan.php', {
method: 'POST',
body: formData
})
.then(response => response.text())
.then(text => {
const data = JSON.parse(text); // Ожидает JSON!
...
})
```
PHP в `send_plan.php` (старая версия):
```php
header("Location: /plan/?success=" . urlencode($success)); // Редирект!
exit;
```
**fetch() API НЕ следует редиректам автоматически** → получает пустой ответ → белая страница!
### ✅ Решение (3 части)
**1. PHP - вернуть JSON вместо redirect:**
```php
// send_plan.php и send_ask.php
if (isset($success)) {
header('Content-Type: application/json; charset=utf-8');
echo json_encode([
'success' => true,
'message' => $success
], JSON_UNESCAPED_UNICODE);
exit;
}
```
**2. HTML - привязать JavaScript обработчик к форме:**
```html
<form ... onsubmit="return handleFormSubmit(event)">
```
**3. Добавить fallback на случай если переменные не установлены:**
```php
// В конце send_plan.php перед ?>
if (!isset($success) && !isset($error)) {
header('Content-Type: application/json; charset=utf-8');
echo json_encode(['success' => false, 'error' => 'Неизвестная ошибка обработки']);
exit;
}
```
### 📝 Урок
- AJAX формы **ВСЕГДА** должны возвращать JSON, не redirect
- Проверять что обработчик формы **привязан** через `onsubmit`
- История проблем важна - нашли решение в `CHANGELOG.md` от 2025-09-03!
---
## 5. .env File Parsing Bug
### ❌ Проблема
Форма возвращает ошибку "Неизвестная ошибка обработки", хотя в `.env` установлено:
```bash
FORMS_SEND_TELEGRAM=true # Уведомления в Telegram
FORMS_NOTIFICATIONS=true # Push-уведомления
```
Проверка настроек показывает:
```
Send telegram: false ❌
Notifications: false ❌
```
### 🔍 Причина
**Пробелы и комментарии в .env файле!**
При парсинге строки:
```bash
FORMS_SEND_TELEGRAM=true # Уведомления в Telegram
```
Функция `load_env_file()` сохраняет:
```php
$_ENV['FORMS_SEND_TELEGRAM'] = 'true # Уведомления в Telegram'
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Лишние символы!
```
Затем проверка:
```php
getenv('FORMS_SEND_TELEGRAM') === 'true' // FALSE!
// 'true # Уведомления...' !== 'true'
```
**Видимость с `cat -A`:**
```bash
FORMS_SEND_TELEGRAM=true # M-PM-#M-PM-2...
^^^^^^^^ Пробелы!
```
### ✅ Решение
**Метод 1: Исправить .env файл (быстро):**
```bash
# Убрать всё после # и лишние пробелы
sudo sed -i 's/=\(.*\)#.*/=\1/' /var/www/forms/.env
sudo sed -i 's/= */=/g' /var/www/forms/.env
sudo sed -i 's/ *$//g' /var/www/forms/.env
```
**Результат:**
```bash
FORMS_SEND_EMAIL=false
FORMS_SEND_TELEGRAM=true
FORMS_NOTIFICATIONS=true
```
**Метод 2: Улучшить load_env_file() (надёжно):**
```php
function load_env_file($file_path = '../.env') {
if (!file_exists($file_path)) {
return false;
}
$lines = file($file_path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($lines as $line) {
// Пропускаем комментарии
if (strpos(trim($line), '#') === 0) {
continue;
}
// Убираем inline комментарии
if (strpos($line, '#') !== false) {
$line = substr($line, 0, strpos($line, '#'));
}
list($name, $value) = explode('=', $line, 2);
$name = trim($name);
$value = trim($value); // ← Важно! Убирает пробелы
if (!array_key_exists($name, $_SERVER) && !array_key_exists($name, $_ENV)) {
putenv(sprintf('%s=%s', $name, $value));
$_ENV[$name] = $value;
$_SERVER[$name] = $value;
}
}
return true;
}
```
### 📝 Урок
- **ВСЕГДА trim() значения** из .env файлов!
- Использовать `cat -A` для проверки невидимых символов
- .env формат не стандартизирован - парсить осторожно
- Эта проблема встречалась **ДВА раза**:
1. В начале октября - отступы в начале строк
2. Сегодня - пробелы перед комментариями
---
## 6. Permission Errors
### ❌ Проблема
```bash
fatal: could not create work tree dir: Permission denied
```
### 🔍 Причина
Неправильные владельцы файлов. Telegram бот работает от `www-data`, но файлы принадлежат `root`.
### ✅ Решение
```bash
# Git репозиторий
sudo chown -R www-data:www-data /var/www/hugo-source
# Формы
sudo chown -R www-data:www-data /var/www/forms
sudo chmod 600 /var/www/forms/.env
# Secure storage
sudo chown -R www-data:www-data /var/secure/forms
sudo chmod 700 /var/secure/forms
```
### 📝 Урок
Всегда проверять кто запускает процесс (`systemctl status service | grep User`) и выставлять права соответственно.
**Создан набор скриптов:** `INFO/Deployment/permissions/*.sh`
---
## 7. Script Line Endings
### ❌ Проблема
```bash
./enable-forms-debug.sh
-bash: ./enable-forms-debug.sh: cannot execute: required file not found
```
### 🔍 Причина
**CRLF line endings** (Windows/Mac) вместо LF (Unix):
```bash
#!/bin/bash\r\n # ← \r\n вместо \n
```
Bash ищет интерпретатор `/bin/bash\r` который не существует!
### ✅ Решение
```bash
# Конвертировать в Unix формат
sed -i 's/\r$//' /var/www/enable-forms-debug.sh
# Или через dos2unix
sudo apt install dos2unix
dos2unix /var/www/enable-forms-debug.sh
```
### 📝 Урок
При создании скриптов на Mac/Windows для Linux:
- Использовать редактор с LF endings (не CRLF)
- Или конвертировать через `dos2unix` перед запуском
---
## 🎯 Общие уроки
### 1. Документация критична
Создание `CHANGELOG.md` помогло найти решение для AJAX проблемы через 2 месяца!
### 2. Debug логи спасают
```php
file_put_contents("/tmp/debug.log", print_r($data, true), FILE_APPEND);
```
Помогли найти что POST данные приходят, но ответ пустой.
### 3. Системные инструменты
- `cat -A` - показывает невидимые символы
- `ls -la` - проверяет права
- `grep -n` - находит строки с номерами
- `curl -v` - тестирует HTTP запросы
### 4. Порядок проверки при пустом ответе PHP
1. ✅ POST данные приходят? → Debug лог
2. ✅ PHP ошибки? → `/var/log/php8.3-fpm.log`
3. ✅ Content-Type правильный? → `curl -I`
4. ✅ Переменные устанавливаются? → Debug перед выводом
5. ✅ .env загружается? → Тест парсинга
6. ✅ Значения правильные? → `cat -A` для невидимых символов
### 5. Git workflow важен
- Формы теперь в git → автоматический deploy через webhook
- `.env` защищён через `.gitignore`
- Версионирование всех изменений
---
## 📊 Статистика проблем
| Категория | Количество | Критичность |
|-----------|------------|-------------|
| **Права доступа** | 5 | Высокая |
| **Парсинг .env** | 2 | Критическая |
| **AJAX/HTTP** | 1 | Критическая |
| **Пути к файлам** | 3 | Средняя |
| **Line endings** | 1 | Низкая |
| **AWS CLI** | 1 | Средняя |
**Общее время на решение:** ~4 часа чистого времени отладки
**Самая долгая проблема:** Forms white page (2+ часа)
**Самая коварная:** .env пробелы (не видны глазом!)
---
## 🚀 Профилактика
### Перед развертыванием проверить:
1. **Права:**
```bash
./INFO/Deployment/permissions/check-permissions.sh
```
2. **.env файлы:**
```bash
cat -A .env | grep "=" # Проверить на пробелы
```
3. **Line endings скриптов:**
```bash
file script.sh # Должно быть "ASCII text", не "CRLF"
```
4. **Git remote:**
```bash
git remote -v
git branch -vv # Проверить upstream
```
5. **Формы AJAX:**
- Проверить `onsubmit` привязан
- PHP возвращает JSON
- JavaScript ожидает JSON
---
**Создано:** 2025-10-27
**Последнее обновление:** 2025-10-27
**Автор:** Собрано в процессе развертывания PTP на VPS
*Этот документ будет обновляться по мере обнаружения новых проблем.*