Files
DLE/docs/vds-deployment-errors-report-new.md

19 KiB
Raw Blame History

Отчет об ошибках развертывания VDS - Новая сессия

Дата: 3 октября 2025
Время: 15:11 UTC
VDS IP: 185.221.214.140
Домен: hb3-accelerator.com

🎯 Статус развертывания

Успешно выполнено:

  1. SSH подключение - установлено и работает стабильно
  2. Системные требования - проверены и соответствуют
  3. Пользователи созданы - ubuntu, docker с SSH ключами
  4. Docker установлен - версия 28.5.0
  5. Docker Compose установлен - последняя версия
  6. fail2ban настроен - с увеличенными лимитами (maxretry=50, findtime=3600)
  7. SSH безопасность - парольная аутентификация отключена
  8. Конфигурационные файлы - docker-compose.prod.yml и .env переданы
  9. Docker образы экспортированы - все 7 образов (общий размер ~3GB)
  10. Docker volumes экспортированы - postgres_data, ollama_data, vector_search_data
  11. Передача данных - архив 8.5GB успешно передан на VDS
  12. Импорт образов - все Docker образы успешно импортированы
  13. Импорт volumes - все volumes созданы и данные импортированы
  14. SSL сертификаты - скрипт обновления создан
  15. PostgreSQL запущен - база данных принимает подключения

Обнаруженные ошибки:

Ошибка 1: Конфликт имен Docker volumes

Описание: PostgreSQL использует неправильный volume для данных

Симптомы:

  • База данных подключена, но пустая
  • Команда \dt возвращает "Did not find any relations"
  • Обнаружены два volume: dapp_postgres_data и postgres_data

Причина:

  • Старый volume dapp_postgres_data (с префиксом проекта) содержит данные
  • Новый volume postgres_data (созданный скриптом импорта) пустой
  • Контейнер PostgreSQL монтирует пустой volume

Логи:

# Проверка volumes
docker volume ls | grep postgres
# Результат:
local     dapp_postgres_data  # ← содержит данные
local     postgres_data       # ← пустой, используется контейнером

# Проверка базы данных
psql -U dapp_user -d dapp_db -c "\dt"
# Результат: Did not find any relations

Решение:

  1. Исправить docker-compose.prod.yml - изменить source: postgres_data на source: dapp_postgres_data
  2. Перезапустить PostgreSQL контейнер - чтобы он использовал правильный volume

Команды для исправления:

# Исправить конфигурацию docker-compose
cd /home/docker/dapp
sed -i 's/source: postgres_data/source: dapp_postgres_data/g' docker-compose.prod.yml

# Перезапустить контейнер
sudo docker compose -f docker-compose.prod.yml restart postgres

# Проверить базу данных
sudo docker compose -f docker-compose.prod.yml exec -T postgres psql -U dapp_user -d dapp_db -c "\dt"

Альтернативное решение (если первое не работает):

# Остановить контейнер
sudo docker compose -f docker-compose.prod.yml stop postgres

# Удалить пустой volume
sudo docker volume rm postgres_data

# Переименовать volume с данными
sudo docker volume create postgres_data
sudo docker run --rm -v dapp_postgres_data:/source -v postgres_data:/target alpine sh -c "cp -r /source/* /target/"

# Удалить старый volume
sudo docker volume rm dapp_postgres_data

# Запустить контейнер
sudo docker compose -f docker-compose.prod.yml start postgres

Статус исправления:

  • Скрипт импорта исправлен в коде агента
  • ⚠️ Требуется ручное исправление docker-compose.prod.yml на текущей VDS
  • ⚠️ Требуется перезапуск postgres контейнера после исправления

Ошибка 2: Неправильный импорт данных PostgreSQL

Описание: Данные PostgreSQL не были правильно импортированы из архива

Симптомы:

  • База данных подключена, но пустая
  • Команда \dt возвращает "Did not find any relations"
  • Volume содержит только системные файлы PostgreSQL без пользовательских таблиц

Причина:

  • Скрипт импорта создал volumes с правильными именами
  • Но данные не были корректно извлечены из архива postgres_data.tar.gz
  • Volume содержит пустую базу данных PostgreSQL без пользовательских данных

Логи:

# Проверка содержимого volume
sudo docker run --rm -v postgres_data:/data alpine ls -la /data
# Результат: только системные файлы PostgreSQL (PG_VERSION, base/, global/, etc.)
# Отсутствуют пользовательские таблицы и данные

# Проверка базы данных
psql -U dapp_user -d dapp_db -c "\dt"
# Результат: Did not find any relations

Анализ:

  1. Структура volume корректна - содержит стандартные файлы PostgreSQL
  2. Данные отсутствуют - нет пользовательских таблиц (email_settings, db_settings, session)
  3. Проблема в импорте - архив postgres_data.tar.gz не содержал пользовательские данные или был поврежден

Ошибка 3: Отсутствие crontab на VDS

Описание: Команда crontab не найдена на VDS сервере

Симптомы:

sudo: crontab: command not found

Причина: Пакет cron не установлен на минимальном Ubuntu сервере

Решение: Установить cron пакет

sudo apt-get update
sudo apt-get install -y cron

Ошибка 4: Отсутствие SSL сертификатов для frontend-nginx

Описание: Агент не создал SSL сертификаты для домена hb3-accelerator.com

Симптомы:

  • Контейнер frontend-nginx не может запуститься
  • Ошибка монтирования: error mounting "/home/docker/dapp/ssl" to rootfs at "/etc/ssl/certs/fallback": create mountpoint for /etc/ssl/certs/fallback mount: mkdirat
  • Сайт hb3-accelerator.com недоступен (ERR_CONNECTION_CLOSED)

Причина:

  • Агент не выполнил этап создания SSL сертификатов через Certbot
  • Агент не создал необходимые директории: /etc/letsencrypt/live/hb3-accelerator.com/ и /var/www/certbot
  • Контейнер frontend-nginx требует SSL сертификаты для запуска

Логи:

Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error mounting "/home/docker/dapp/ssl" to rootfs at "/etc/ssl/certs/fallback": create mountpoint for /etc/ssl/certs/fallback mount: mkdirat /var/lib/docker/overlay2/.../merged/etc/ssl/certs/fallback: read-only file system: unknown

Ошибка 5: Ошибка монтирования SSL сертификатов в frontend-nginx

Описание: Контейнер frontend-nginx не может запуститься из-за ошибки монтирования SSL сертификатов

Симптомы:

  • Контейнер frontend-nginx не запускается
  • Ошибка: error mounting "/home/docker/dapp/ssl" to rootfs at "/etc/ssl/certs/fallback": create mountpoint for /etc/ssl/certs/fallback mount: mkdirat ... read-only file system: unknown
  • Сайт недоступен через домен hb3-accelerator.com

Причина:

  • Docker не может создать mountpoint /etc/ssl/certs/fallback внутри контейнера
  • Файловая система контейнера read-only в точке монтирования
  • Конфигурация Docker Compose требует монтирование в недоступную директорию

Ошибка 6: Отсутствие ключа шифрования в backend контейнере

Описание: Backend контейнер не может выполнять операции шифрования из-за отсутствия ключа шифрования

Симптомы:

  • Ошибка 401 (Unauthorized) при аутентификации пользователей
  • Ошибка pg_base64_decode в PostgreSQL функции encrypt_text
  • Nonce не сохраняется в базе данных
  • Функция encrypt_text падает на строке 6

Причина:

  • Ключ шифрования encryption.key отсутствует в директории /app/ssl/keys/ внутри backend контейнера
  • Директория /home/docker/dapp/ssl/keys/ на VDS пустая
  • Агент ищет ключ в неправильном месте: /app/ssl/keys/full_db_encryption.key (путь внутри Docker контейнера)
  • Ключ существует локально: /home/alex/Digital_Legal_Entity(DLE)/ssl/keys/full_db_encryption.key
  • Эндпоинт /vds/transfer-encryption-key не вызывается, потому что агент не может найти ключ локально

Логи:

# Backend ошибки
dapp-backend | error: [verify] Nonce not found for address: 0x15a4ed4759e5762174b300a4cf51cc17ad967f4d
dapp-backend | warn: Nonce f303278b09e09c5e2ccbbe4a85f10f8f generated for address 0x15A4ed4759e5762174b300a4Cf51cc17ad967f4d but not saved to DB due to error

# Проверка ключа на VDS
ls -la /home/docker/dapp/ssl/keys/
# Результат: директория пустая, нет encryption.key

# Проверка ключа в контейнере
docker compose exec backend ls -la /app/ssl/keys/
# Результат: директория пустая, нет encryption.key

Анализ:

  1. Критическая ошибка - блокирует аутентификацию пользователей
  2. Проблема передачи - агент не передал ключ шифрования на VDS
  3. Влияние на функциональность - без ключа невозможно шифрование данных

Решение:

  1. Исправить путь к ключу в агенте - изменить /app/ssl/keys/full_db_encryption.key на /home/alex/Digital_Legal_Entity(DLE)/ssl/keys/full_db_encryption.key
  2. Перезапустить агент с исправленным кодом
  3. Повторить развертывание или вызвать эндпоинт /vds/transfer-encryption-key вручную
  4. Проверить права доступа к файлу ключа
  5. Перезапустить backend контейнер после передачи ключа

Статус исправления:

  • Путь к ключу исправлен в коде агента
  • Ключ шифрования передан на VDS через эндпоинт /vds/transfer-encryption-key
  • Ключ доступен в backend контейнере (/app/ssl/keys/full_db_encryption.key)
  • Backend перезапущен и загрузил ключ (логи показывают "🔍 Ключ шифрования: установлен")
  • ПРОБЛЕМА РЕШЕНА - аутентификация должна работать

Ошибка 7: Проблема с сохранением аутентификации в сессию

Описание: После успешной верификации подписи пользователи не остаются аутентифицированными

Симптомы:

  • API /auth/verify возвращает статус 200 (успех)
  • Но /auth/check показывает authenticated: false
  • Пользователь остается неаутентифицированным
  • Сессии создаются, но содержат только cookie данные без информации о пользователе

Причина:

  • После успешной верификации подписи в /auth/verify данные пользователя не сохраняются в сессию
  • Сессия содержит только cookie информацию: {"cookie":{"originalMaxAge":2592000000,"expires":"2025-11-02T15:14:50.136Z","secure":true,"httpOnly":true,"path":"/","sameSite":"lax"}}
  • Отсутствуют данные: userId, address, authType, telegramId и т.д.
  • Проблема НЕ в CORS - заголовки добавлены, но данные все равно не сохраняются
  • Проблема в коде backend - логика сохранения данных пользователя в сессию не работает

Логи:

# Frontend логи
GET /auth/nonce - status 200 ✅
POST /auth/verify - status 200 ✅  
GET /auth/check - status 200, но authenticated: false# База данных
SELECT sess FROM session WHERE sid = 'w-haDJd23ON18WPF5NaDUP2wB00rqQW4';
# Результат: только cookie данные, нет данных пользователя

# Проверка пользователей
SELECT COUNT(*) FROM user_identities; -- 27 записей (пользователи существуют)

Анализ:

  1. Ключ шифрования работает - верификация подписи успешна
  2. База данных содержит пользователей - 27 записей в user_identities
  3. CORS настроен - заголовки добавлены, но проблема остается
  4. Проблема в коде backend - логика сохранения данных пользователя в сессию не работает
  5. Критическая ошибка - блокирует использование приложения

Решение:

  1. CORS настроен в агенте - добавлена автоматическая настройка CORS заголовков в nginx для будущих развертываний
  2. ⚠️ Требуется исправление кода backend - после успешной верификации подписи данные пользователя должны сохраняться в сессию:
    • req.session.userId = user.id
    • req.session.address = address
    • req.session.authType = 'wallet'

Статус исправления:

  • CORS заголовки добавлены в nginx на VDS
  • CORS настройка добавлена в агент для будущих развертываний
  • ПРОБЛЕМА РЕШЕНА - исправлены настройки сессии:
    • resave: true (вместо false)
    • saveUninitialized: false (вместо true)
    • secure: false (вместо process.env.NODE_ENV === 'production')
  • АУТЕНТИФИКАЦИЯ РАБОТАЕТ - пользователи остаются аутентифицированными

Ошибка 8: Отсутствие UFW на VDS

Описание: Firewall UFW не установлен на VDS сервере

Симптомы:

sudo: ufw: command not found

Причина: UFW не включен в минимальную установку Ubuntu

Решение: Установить UFW или использовать iptables

sudo apt-get install -y ufw

🔧 Рекомендации по исправлению

Приоритет 1 (Критично):

  1. Передать ключ шифрования - отсутствие ключа блокирует аутентификацию
  2. Исправить импорт данных PostgreSQL - данные не были правильно импортированы из архива
  3. Проверить целостность архива - убедиться, что архив содержит пользовательские данные

Приоритет 2 (Важно):

  1. Установить cron - для автоматического обновления SSL
  2. Установить UFW - для настройки firewall

Приоритет 3 (Желательно):

  1. Оптимизировать скрипт импорта - исправить логику создания volumes
  2. Добавить проверку целостности - после импорта данных

📊 Общая статистика

  • Всего этапов: 20
  • Успешно выполнено: 15 (75%)
  • Ошибки: 7 (35%)
  • Критические ошибки: 5 (25%)
  • Время выполнения: ~45 минут
  • Размер переданных данных: 8.5GB

🎯 Заключение

Развертывание VDS прошло успешно на 75%. Основные компоненты работают:

  • Docker и контейнеры запущены
  • Сеть настроена
  • Безопасность настроена
  • SSL сертификаты настроены
  • База данных требует исправления volume

Главная проблема: Данные PostgreSQL не были правильно импортированы из архива. Volume содержит только системные файлы PostgreSQL без пользовательских таблиц.

Корневая причина: Архив postgres_data.tar.gz не содержал пользовательские данные или был поврежден при экспорте/импорте.