Приложение хранит проектную документацию клиентов, ключ Anthropic и токен Telegram-бота. Ниже — то, что нужно проверить перед тем, как выставить его куда-то дальше собственного ноутбука.
Токены подписываются секретом из JWT_SECRET. Если переменная не задана,
код берёт запасной dev-secret-change-in-production — строку, которая лежит
в открытом репозитории. С ней кто угодно собирает валидный токен на любого
пользователя, включая ADMIN, и авторизация перестаёт что-либо значить.
openssl rand -hex 32Полученное значение — в .env:
JWT_SECRET=<64 hex-символа>
docker-compose.yml передаёт переменную в контейнер бэкенда. При старте
с NODE_ENV=production и незаданным секретом сервис пишет в лог явное
предупреждение — если вы его видите, авторизация не защищена.
Смена секрета разлогинивает всех. Старые токены перестают проверяться, пользователи входят заново. Это единственное последствие, данные не теряются.
В docker-compose.yml база опубликована как 5432:5432 — то есть слушает
на всех интерфейсах машины. Внутри compose-сети бэкенд ходит к базе по имени
db, публикация нужна только чтобы подключиться psql с хоста.
На сервере с белым IP это означает открытый наружу Postgres. Либо закройте порт файрволом, либо привяжите его к петле:
ports:
- "127.0.0.1:5432:5432"Строку не меняли в репозитории намеренно: у кого-то к этому порту может ходить внешний инструмент, и тихо оборвать ему доступ хуже, чем написать здесь.
ANTHROPIC_API_KEY, TG_BOT_TOKEN и пароль базы приходят из .env.
Файл .env в .gitignore — держите его там. В образ ключи не попадают,
пересборка при их смене не нужна: достаточно docker compose up -d.
Если ключ всё же утёк в коммит — перевыпустите его. Удаление файла следующим коммитом не помогает: значение остаётся в истории git навсегда.
Документы лежат в томе files_data (/app/files внутри контейнера) и
отдаются только через API с проверкой токена. Не подключайте эту папку
напрямую к веб-серверу как статику — проверка доступа в этом случае
обходится по прямой ссылке.
-
JWT_SECRETзадан и не равен значению из репозитория; - в логе бэкенда нет строки
[БЕЗОПАСНОСТЬ]; - пароль базы (
DB_PASSWORD) неyour_postgres_passwordиз примера; - порт 5432 не смотрит в интернет;
-
.envне в git (git check-ignore .envотвечает.env); - приложение за HTTPS — токен ходит в заголовке
Authorizationи по HTTP читается любым, кто видит трафик.