Files
cryptowallet/README.md
2026-04-21 15:01:05 +03:00

83 lines
3.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# CryptoWallet API — Production Deploy Bundle
Самодостаточная папка для деплоя на Linux-сервер. Содержит всё нужное для сборки и запуска продакшн-версии API.
## Состав
```
deployserver/
├── Dockerfile # Multi-stage production build
├── docker-compose.yml # Только API (БД внешняя, из Vault)
├── .env.example # Шаблон переменных окружения
├── .dockerignore
├── start.sh # Автоматический deploy скрипт
├── apps/api/ # Исходник API
│ ├── src/
│ ├── package.json
│ ├── tsconfig.json
│ ├── swagger.json
│ └── .eslintrc.json
├── package.json # Монорепо root
├── pnpm-workspace.yaml
└── pnpm-lock.yaml
```
## Требования
- Ubuntu 20.04+ / Debian 11+ / любой Linux с Docker 24+
- Docker Compose plugin (`docker compose` команда)
- Исходящий HTTPS на Vault (`corp.vault.elcsa.ru:443`)
- Сетевой доступ к PostgreSQL (адрес приходит из Vault)
- БД должна быть **инициализирована отдельно** (таблицы `users`, `wallets`, `sessions` — создаются вручную DBA)
## Порты
| Порт | Назначение | Открыть наружу? |
|------|-----------|-----------------|
| 3001 | API HTTP | ✅ да (`ufw allow 3001`) |
| 443 (out) | Vault | исходящий, обычно открыт |
| 5432 (out) | PostgreSQL | исходящий к внешнему адресу БД |
## Управление
```bash
docker compose logs -f api # смотреть логи
docker compose restart api # рестарт (после смены .env)
docker compose down # остановить
docker compose ps # статус
docker compose up -d --build # пересобрать и запустить
```
## Ротация ключей
JWT public keys и CSRF secret читаются из Vault при старте и **каждый час** обновляются автоматически (см. `key-rotation.service.ts`). При ошибках Vault сервис продолжает работать со старыми ключами — в логах будет `ERROR: Failed to refresh ...`.
## Безопасность Dockerfile
- **Non-root user** (uid 1001) — контейнер не работает от root
- **tini** как PID 1 — корректная обработка `SIGTERM` / `SIGKILL`
- **Multi-stage build** — в финальный образ попадают только production deps + компилированный dist
- **Alpine base** — минимальный образ (~150 MB)
- **Healthcheck** — Docker рестартит контейнер если API упал
- **Log rotation** — max 5×20MB логов, не забьёт диск
## Troubleshooting
**`Vault AppRole login failed`**
- Проверь VAULT_ROLE_ID / VAULT_SECRET_ID в .env
- Проверь доступ: `curl -v https://corp.vault.elcsa.ru/v1/sys/health`
**`relation "users" does not exist`**
- БД не инициализирована — попроси DBA создать таблицы (`users`, `wallets`, `sessions`)
**Port 3001 занят**
- `sudo lsof -i :3001`
- Измени порт: в `docker-compose.yml` `"3002:3001"` и в `ufw allow 3002`
## Автозапуск при reboot
Restart policy `unless-stopped` уже настроен. Убедись что Docker стартует:
```bash
sudo systemctl enable docker
```