- Add AJAX handler to ask.md (same as plan.md) - Improve load_env_file() to strip inline comments and spaces - Create ERRORS_COLLECTION.md documenting all 7 error categories - Fixes white page/JSON display issue in ask form
14 KiB
🐛 Коллекция ошибок при развертывании на VPS
Документация всех проблем и решений при установке PTP на VPS
📋 Содержание
- Git Push Problems
- S3 Upload Issues
- Telegram Bot Path Issues
- Forms White Page (AJAX/Redirect)
- .env File Parsing Bug
- Permission Errors
- Script Line Endings
1. Git Push Problems
❌ Проблема
fatal: The current branch main has no upstream branch.
🔍 Причина
Локальная ветка main не связана с удалённой github/main.
✅ Решение
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 метод:
# В 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
❌ Проблема
fatal: not a git repository
Бот не может выполнить git команды.
🔍 Причина
В коде бота путь к репозиторию был захардкожен:
GIT_REPO_PATH = '/var/www/hugo-site' # Неправильный путь!
✅ Решение
Читать из .env:
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:
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:
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 (старая версия):
header("Location: /plan/?success=" . urlencode($success)); // Редирект!
exit;
fetch() API НЕ следует редиректам автоматически → получает пустой ответ → белая страница!
✅ Решение (3 части)
1. PHP - вернуть JSON вместо redirect:
// 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 обработчик к форме:
<form ... onsubmit="return handleFormSubmit(event)">
3. Добавить fallback на случай если переменные не установлены:
// В конце 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 установлено:
FORMS_SEND_TELEGRAM=true # Уведомления в Telegram
FORMS_NOTIFICATIONS=true # Push-уведомления
Проверка настроек показывает:
Send telegram: false ❌
Notifications: false ❌
🔍 Причина
Пробелы и комментарии в .env файле!
При парсинге строки:
FORMS_SEND_TELEGRAM=true # Уведомления в Telegram
Функция load_env_file() сохраняет:
$_ENV['FORMS_SEND_TELEGRAM'] = 'true # Уведомления в Telegram'
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Лишние символы!
Затем проверка:
getenv('FORMS_SEND_TELEGRAM') === 'true' // FALSE!
// 'true # Уведомления...' !== 'true'
Видимость с cat -A:
FORMS_SEND_TELEGRAM=true # M-PM-#M-PM-2...
^^^^^^^^ Пробелы!
✅ Решение
Метод 1: Исправить .env файл (быстро):
# Убрать всё после # и лишние пробелы
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
Результат:
FORMS_SEND_EMAIL=false
FORMS_SEND_TELEGRAM=true
FORMS_NOTIFICATIONS=true
Метод 2: Улучшить load_env_file() (надёжно):
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 формат не стандартизирован - парсить осторожно
- Эта проблема встречалась ДВА раза:
- В начале октября - отступы в начале строк
- Сегодня - пробелы перед комментариями
6. Permission Errors
❌ Проблема
fatal: could not create work tree dir: Permission denied
🔍 Причина
Неправильные владельцы файлов. Telegram бот работает от www-data, но файлы принадлежат root.
✅ Решение
# 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
❌ Проблема
./enable-forms-debug.sh
-bash: ./enable-forms-debug.sh: cannot execute: required file not found
🔍 Причина
CRLF line endings (Windows/Mac) вместо LF (Unix):
#!/bin/bash\r\n # ← \r\n вместо \n
Bash ищет интерпретатор /bin/bash\r который не существует!
✅ Решение
# Конвертировать в 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 логи спасают
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
- ✅ POST данные приходят? → Debug лог
- ✅ PHP ошибки? →
/var/log/php8.3-fpm.log - ✅ Content-Type правильный? →
curl -I - ✅ Переменные устанавливаются? → Debug перед выводом
- ✅ .env загружается? → Тест парсинга
- ✅ Значения правильные? →
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 пробелы (не видны глазом!)
🚀 Профилактика
Перед развертыванием проверить:
-
Права:
./INFO/Deployment/permissions/check-permissions.sh -
.env файлы:
cat -A .env | grep "=" # Проверить на пробелы -
Line endings скриптов:
file script.sh # Должно быть "ASCII text", не "CRLF" -
Git remote:
git remote -v git branch -vv # Проверить upstream -
Формы AJAX:
- Проверить
onsubmitпривязан - PHP возвращает JSON
- JavaScript ожидает JSON
- Проверить
Создано: 2025-10-27 Последнее обновление: 2025-10-27 Автор: Собрано в процессе развертывания PTP на VPS
Этот документ будет обновляться по мере обнаружения новых проблем.