deploy: POST /api/wallets + full swagger
This commit is contained in:
82
README.md
82
README.md
@@ -1,82 +0,0 @@
|
||||
# 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
|
||||
```
|
||||
Reference in New Issue
Block a user