CI / Go (test / vet / build) (push) Successful in 1m22s
CI / Go (test / vet / build) (pull_request) Successful in 1m31s
CI / Rust (fmt / clippy / test / build) (pull_request) Successful in 2m18s
CI / Rust (fmt / clippy / test / build) (push) Successful in 2m47s
CI / Go ↔ Rust differential + SQLite takeover (pull_request) Successful in 1m49s
CI / Go ↔ Rust differential + SQLite takeover (push) Successful in 2m42s
Go 1.25 ServeMux redirects unclean paths with 301, while newer Go (and the Rust port that mirrors it) uses 307, so the Go reference built in CI disagreed with Rust on '/a/../app.js'. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
121 lines
3.5 KiB
Markdown
121 lines
3.5 KiB
Markdown
# Разработка и запуск
|
||
|
||
## Требования
|
||
|
||
Production-сервер использует Rust 1.90+ и bundled SQLite. Go 1.25+ нужен для сохранённой эталонной реализации; differential-проверки (`tools/compatibility.py`) требуют Go 1.27.3, как в CI: поведение `net/http` (например, код редиректа ServeMux 301/307) зависит от версии Go. Python 3 используется без сторонних пакетов.
|
||
|
||
Проверить локальную версию:
|
||
|
||
```bash
|
||
rustc --version
|
||
cargo --version
|
||
go version
|
||
```
|
||
|
||
## Установка зависимостей
|
||
|
||
```bash
|
||
cargo fetch --locked
|
||
go mod download
|
||
```
|
||
|
||
## Сборка
|
||
|
||
```bash
|
||
cargo build --locked
|
||
go build ./...
|
||
```
|
||
|
||
## Тесты
|
||
|
||
```bash
|
||
cargo test --locked
|
||
cargo build --locked
|
||
python3 tools/compatibility.py
|
||
go test ./...
|
||
```
|
||
|
||
С race detector:
|
||
|
||
```bash
|
||
go test -race ./...
|
||
```
|
||
|
||
## Static checks
|
||
|
||
```bash
|
||
cargo fmt --check
|
||
cargo clippy --locked --all-targets -- -D warnings
|
||
go vet ./...
|
||
```
|
||
|
||
Если в проекте есть Makefile/CI, его команды имеют приоритет как canonical build pipeline.
|
||
|
||
## Локальный запуск
|
||
|
||
Перед запуском изучите конфигурацию в коде и `.env`/deployment files.
|
||
|
||
Не коммитьте реальные credentials.
|
||
|
||
Собрать и запустить Rust-сервер:
|
||
|
||
```bash
|
||
cargo build --locked --release
|
||
export BALANCE_JWT_SECRET="replace-with-a-long-random-secret"
|
||
export BALANCE_DB_PATH="./data/balance.db"
|
||
./target/release/balance-server
|
||
```
|
||
|
||
По умолчанию сервер слушает `:8080`. Файл `.env` читает Docker Compose; при
|
||
прямом запуске переменные нужно передать процессу через окружение.
|
||
|
||
## Database
|
||
|
||
SQLite встроен в executable. При первом запуске сервер создаёт каталог,
|
||
таблицы и индексы автоматически. Отдельный процесс БД не нужен. При переходе
|
||
с Go сохраните существующий файл БД и `BALANCE_JWT_SECRET`; подробная
|
||
процедура и откат описаны в [DEPLOYMENT.md](DEPLOYMENT.md).
|
||
|
||
## Production
|
||
|
||
Рекомендуемый pipeline:
|
||
|
||
```text
|
||
source
|
||
↓
|
||
cargo fmt --check && cargo test --locked
|
||
↓
|
||
cargo clippy --locked --all-targets -- -D warnings
|
||
↓
|
||
cargo build --locked --release
|
||
↓
|
||
python3 tools/compatibility.py --rust-binary target/release/balance-server
|
||
↓
|
||
container/package
|
||
↓
|
||
deploy
|
||
↓
|
||
health check
|
||
```
|
||
|
||
Для production нужны:
|
||
- TLS termination;
|
||
- persistent database;
|
||
- backups;
|
||
- monitoring;
|
||
- log rotation;
|
||
- secrets management;
|
||
- migration procedure.
|
||
|
||
## Совместимость
|
||
|
||
При релизе server проверяйте минимум:
|
||
- старый iOS client + новый server;
|
||
- новый iOS client + server;
|
||
- Android client + server;
|
||
- concurrent sync с двух устройств;
|
||
- login/refresh после истечения access token;
|
||
- delete → pull на другом устройстве.
|
||
|
||
Production build: `cargo build --locked --release`. Прямой запуск: `BALANCE_JWT_SECRET=<secret> target/release/balance-server`, порт 8080. Docker Compose публикует порт 8123 и сохраняет прежний volume `/data`. Процедура миграции Go → Rust и rollback: [DEPLOYMENT.md](DEPLOYMENT.md).
|