architect/_archive/2025-11-26-cleanup/templates/TROUBLESHOOTING.template.md

🔧 TROUBLESHOOTING - Диагностика проблем

Проект: {PROJECT_NAME}
Последнее обновление: {ДАТА}


📑 СОДЕРЖАНИЕ

  1. Быстрая диагностика
  2. Приложение не запускается
  3. Приложение медленно работает
  4. Ошибки БД
  5. API не отвечает
  6. Проблемы с памятью
  7. Проблемы с диском
  8. Частые ошибки

🚀 БЫСТРАЯ ДИАГНОСТИКА {#быстрая-диагностика}

Первые 5 команд при проблеме

# 1. Статус приложения
systemctl status {PROJECT_NAME}

# 2. Последние логи
journalctl -u {PROJECT_NAME} -n 50 --no-pager

# 3. Проверка ресурсов
top -bn1 | head -20

# 4. Проверка диска
df -h

# 5. Проверка БД
curl http://localhost:{PORT}/health

Матрица проблем

Симптом Вероятная причина Решение
Не запускается Ошибка конфигурации Проверить .env, логи
502 Bad Gateway Приложение упало systemctl restart
Медленно работает Много запросов Проверить CPU/память
Ошибки БД Нет подключения Проверить PostgreSQL
Диск заполнен Логи/бэкапы Очистить место

❌ ПРИЛОЖЕНИЕ НЕ ЗАПУСКАЕТСЯ {#приложение-не-запускается}

Симптомы

$ systemctl status {PROJECT_NAME} {PROJECT_NAME}.service - {Description}
     Loaded: loaded
     Active: failed (Result: exit-code)

Диагностика

# 1. Подробные логи
journalctl -u {PROJECT_NAME} -xe

# 2. Проверить конфигурацию
cat /etc/{PROJECT_NAME}/.env

# 3. Проверить права доступа
ls -la /opt/{PROJECT_NAME}/

# 4. Попробовать запустить вручную
cd /opt/{PROJECT_NAME}
source venv/bin/activate
{КОМАНДА_ЗАПУСКА}  # Например: streamlit run app.py

Частые причины и решения

Ошибка: ModuleNotFoundError

Причина: Не установлены зависимости

Решение:

cd /opt/{PROJECT_NAME}
source venv/bin/activate
pip install -r requirements.txt
systemctl restart {PROJECT_NAME}

Ошибка: Permission denied

Причина: Неправильные права доступа

Решение:

# Исправить владельца
chown -R {USER}:{GROUP} /opt/{PROJECT_NAME}

# Исправить права
chmod 755 /opt/{PROJECT_NAME}
chmod 644 /opt/{PROJECT_NAME}/*.py

# Перезапустить
systemctl restart {PROJECT_NAME}

Ошибка: Address already in use

Причина: Порт занят

Решение:

# Найти процесс на порту
lsof -i :{PORT}

# Убить процесс
kill -9 {PID}

# Или изменить порт в конфиге
# Перезапустить
systemctl restart {PROJECT_NAME}

Ошибка: Can't connect to database

Причина: БД не запущена или неверные credentials

Решение:

# Проверить PostgreSQL
systemctl status postgresql
sudo -u postgres psql -c "SELECT version();"

# Проверить подключение
sudo -u postgres psql -U {DB_USER} -d {DB_NAME}

# Проверить DATABASE_URL в .env
cat /etc/{PROJECT_NAME}/.env | grep DATABASE_URL

# Если пароль неверный - см. SECRETS.md

🐌 ПРИЛОЖЕНИЕ МЕДЛЕННО РАБОТАЕТ {#приложение-медленно-работает}

Симптомы

Диагностика

# 1. Проверить CPU
top -bn1 | grep %Cpu
# Если > 80% - проблема с CPU

# 2. Проверить память
free -h
# Если Swap используется - нехватка RAM

# 3. Проверить load average
uptime
# Если > количество CPU cores - перегрузка

# 4. Проверить медленные запросы БД
sudo -u postgres psql {DB_NAME} -c "SELECT query, calls, total_time, mean_time FROM pg_stat_statements ORDER BY mean_time DESC LIMIT 10;"

# 5. Профилирование приложения
# Добавить в код профайлер

Решения

CPU перегружен

Причина: Много запросов или тяжёлые вычисления

Решение:

# 1. Временно: увеличить timeout
# В конфиге Nginx/Gunicorn

# 2. Добавить кеширование (Redis)
# См. CODE-GUIDE.md

# 3. Оптимизировать код
# Профилирование, убрать циклы

# 4. Horizontal scaling
# Запустить несколько инстансов за load balancer

Медленные запросы БД

Причина: Нет индексов или неоптимальные запросы

Решение:

# 1. Найти медленные запросы
sudo -u postgres psql {DB_NAME} -c "SELECT query, calls, mean_time FROM pg_stat_statements WHERE mean_time > 1000 ORDER BY mean_time DESC LIMIT 5;"

# 2. Добавить индексы
# CREATE INDEX idx_orders_status ON orders(status);

# 3. EXPLAIN ANALYZE запрос
sudo -u postgres psql {DB_NAME} -c "EXPLAIN ANALYZE SELECT * FROM orders WHERE status = 'new';"

# 4. VACUUM ANALYZE
sudo -u postgres psql {DB_NAME} -c "VACUUM ANALYZE;"

Нехватка памяти

Решение:

# 1. Проверить что жрёт память
ps aux --sort=-%mem | head -10

# 2. Перезапустить приложение (освободить память)
systemctl restart {PROJECT_NAME}

# 3. Увеличить RAM сервера (если постоянная проблема)

# 4. Оптимизировать код (memory leaks)

🗄️ ОШИБКИ БД {#ошибки-бд}

БД не доступна

Симптомы:

psycopg2.OperationalError: could not connect to server

Диагностика:

# Проверить статус PostgreSQL
systemctl status postgresql

# Проверить подключение
sudo -u postgres psql

Решение:

# Запустить PostgreSQL
systemctl start postgresql

# Если не стартует - проверить логи
journalctl -u postgresql -n 50

БД заполнена

Симптомы:

FATAL: could not create shared memory segment: No space left on device

Диагностика:

# Проверить размер БД
sudo -u postgres psql -c "SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) AS size FROM pg_database;"

Решение:

# 1. Очистить старые данные (см. MAINTENANCE.md)

# 2. VACUUM FULL
sudo -u postgres psql {DB_NAME} -c "VACUUM FULL;"

# 3. Увеличить диск (если нужно)

Ошибка миграции

Симптомы:

alembic.util.exc.CommandError: Can't locate revision

Диагностика:

# Проверить текущую версию
alembic current

# История миграций
alembic history

Решение:

# Откатить на последнюю работающую
alembic downgrade -1

# Применить снова
alembic upgrade head

# Если не помогает - stamp версию вручную
alembic stamp head

🌐 API НЕ ОТВЕЧАЕТ {#api-не-отвечает}

502 Bad Gateway

Причина: Backend не запущен

Решение:

systemctl restart {PROJECT_NAME}
systemctl status {PROJECT_NAME}

504 Gateway Timeout

Причина: Backend тормозит, не успевает за timeout

Решение:

# Увеличить timeout в Nginx
# /etc/nginx/sites-available/{DOMAIN}
proxy_read_timeout 300s;
proxy_connect_timeout 300s;

nginx -t
systemctl reload nginx

401 Unauthorized

Причина: Неверный API ключ или токен

Решение:

# Проверить ключ
cat /etc/{PROJECT_NAME}/.env | grep API_KEY

# Проверить срок действия токена (JWT)
# Если истёк - обновить

💾 ПРОБЛЕМЫ С ПАМЯТЬЮ {#проблемы-с-памятью}

Memory leak

Симптомы:
- Память постоянно растёт
- Через N часов приложение падает с OOM

Диагностика:

# Мониторить память каждые 10 сек
watch -n 10 free -h

# Профилирование (Python)
pip install memory_profiler
python -m memory_profiler app.py

Решение:

# 1. Временно: перезапускать приложение раз в N часов (cron)
0 */6 * * * systemctl restart {PROJECT_NAME}

# 2. Найти и исправить leak в коде
# Использовать профайлер

# 3. Ограничить память для процесса (systemd)
# /etc/systemd/system/{PROJECT_NAME}.service
MemoryMax=2G

Out of Memory (OOM)

Симптомы:

Killed

Диагностика:

# Проверить OOM в логах
dmesg | grep -i "out of memory"

# Проверить что убито
journalctl -k | grep -i kill

Решение:

# 1. Увеличить RAM сервера

# 2. Добавить swap
fallocate -l 4G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

# 3. Оптимизировать код

💿 ПРОБЛЕМЫ С ДИСКОМ {#проблемы-с-диском}

Диск заполнен

Симптомы:

No space left on device

Диагностика:

# Общее использование
df -h

# Что занимает место
du -sh /* | sort -h
du -sh /var/* | sort -h

Решение:

# 1. Очистить логи
find /var/log/ -name "*.log.*" -mtime +30 -delete

# 2. Очистить старые бэкапы
find /backup/ -name "*.sql" -mtime +30 -delete

# 3. Очистить /tmp
rm -rf /tmp/*

# 4. Docker (если используется)
docker system prune -a

# 5. Очистить package cache
apt clean

# 6. VACUUM FULL БД
sudo -u postgres psql {DB_NAME} -c "VACUUM FULL;"

Inodes закончились

Симптомы:

No space left on device (но df показывает есть место)

Диагностика:

# Проверить inodes
df -i

# Найти где много файлов
find / -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n

Решение:

# Найти и удалить много маленьких файлов
find /tmp -type f -delete
find /var/log -name "*.log.*" -delete

⚠️ ЧАСТЫЕ ОШИБКИ {#частые-ошибки}

ImportError: No module named 'X'

Решение:

source venv/bin/activate
pip install {MODULE}

SSL Certificate has expired

Решение:

certbot renew
systemctl reload nginx

Connection refused

Причина: Сервис не запущен

Решение:

systemctl start {SERVICE}

Too many open files

Решение:

# Увеличить лимит
ulimit -n 65536

# Permanent (в /etc/security/limits.conf)
* soft nofile 65536
* hard nofile 65536

📞 КОГДА ЗВАТЬ НА ПОМОЩЬ

Если после 30 минут troubleshooting проблема не решена:

  1. Задокументировать что пробовали
  2. Собрать логи:
    bash journalctl -u {PROJECT_NAME} -n 500 > /tmp/logs.txt
  3. Создать issue с описанием проблемы
  4. Позвать senior разработчика

Последнее обновление: {ДАТА}
Контакт для экстренных случаев: {ТЕЛЕФОН/EMAIL}