Добавлен сервис redis:7-alpine (AOF, requirepass, maxmemory + allkeys-lru, healthcheck, том redis-data, порт только на 127.0.0.1) и абстракция redis.js по образцу storage.js. Переведено на Redis: - кэш ответов API и настроек (было Map в памяти), инвалидация по префиксу через SCAN + DEL; - rate limit для api/entry/file — общие счётчики вместо MemoryStore; - баны IP и счётчики неудачных входа — с TTL, вместо опроса БД каждую минуту; - кэш сессий (30 с) с invalidateSessions() на каждой мутации users/sessions/ user_branches, иначе деактивированный пользователь сохранил бы доступ; - pub/sub для SSE-событий и мгновенного пробуждения фоновых воркеров вместо ожидания цикла опроса БД. Отказоустойчивость: при недоступном Redis все операции уходят в in-memory backend с той же семантикой, приложение стартует и работает без Redis и возвращается в Redis автоматически. Первое подключение ограничено по времени (REDIS_CONNECT_TIMEOUT_MS, 5 с) — node-redis не отклоняет connect() при недоступном сервере, а повторяет попытки бесконечно. Добавлены тесты: redis.selftest.js (в т.ч. поведение при недоступном сервере) и api.smoketest.js (сквозная проверка API, включая инвалидацию кэша и мгновенную смерть сессии после logout).
26 lines
514 B
JSON
26 lines
514 B
JSON
{
|
|
"name": "whereldo",
|
|
"version": "1.0.0",
|
|
"private": true,
|
|
"scripts": {
|
|
"start": "node server.js"
|
|
},
|
|
"dependencies": {
|
|
"@aws-sdk/client-s3": "^3.1141.0",
|
|
"bcrypt": "^5.1.1",
|
|
"express": "^4.21.0",
|
|
"express-rate-limit": "^8.7.0",
|
|
"heic-convert": "^2.1.0",
|
|
"helmet": "^8.3.0",
|
|
"lucide": "^1.44.0",
|
|
"multer": "^1.4.5-lts.1",
|
|
"pg": "^8.13.0",
|
|
"redis": "^5.12.1",
|
|
"sharp": "^0.34.5",
|
|
"tar": "^7.4.3"
|
|
},
|
|
"allowScripts": {
|
|
"bcrypt@5.1.1": true
|
|
}
|
|
}
|