Files
BalanceServer/docs/DEVELOPMENT.md
T
wtandClaude Opus 5.5 622740fe70
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
ci: pin Go 1.27.3 for the differential compatibility check
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>
2026-10-30 13:03:00 +07:00

3.5 KiB
Raw Blame History

Разработка и запуск

Требования

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 используется без сторонних пакетов.

Проверить локальную версию:

rustc --version
cargo --version
go version

Установка зависимостей

cargo fetch --locked
go mod download

Сборка

cargo build --locked
go build ./...

Тесты

cargo test --locked
cargo build --locked
python3 tools/compatibility.py
go test ./...

С race detector:

go test -race ./...

Static checks

cargo fmt --check
cargo clippy --locked --all-targets -- -D warnings
go vet ./...

Если в проекте есть Makefile/CI, его команды имеют приоритет как canonical build pipeline.

Локальный запуск

Перед запуском изучите конфигурацию в коде и .env/deployment files.

Не коммитьте реальные credentials.

Собрать и запустить Rust-сервер:

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.

Production

Рекомендуемый pipeline:

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.