134 lines
4.0 KiB
Markdown
134 lines
4.0 KiB
Markdown
# Flamy Trade
|
||
|
||
Публичный frontend для `trade.flamy.studio`: лендинг, блог и демонстрационный дашборд ML-прогнозов по крипторынку.
|
||
|
||
Проект построен на SvelteKit, Svelte 5 Runes, Tailwind CSS v4, TypeScript и `lightweight-charts`.
|
||
|
||
## Требования
|
||
|
||
```text
|
||
Node.js: >=24.0.0 <25
|
||
pnpm: >=11.15.1 <12
|
||
```
|
||
|
||
В Windows PowerShell запускайте pnpm через `pnpm.cmd`, если выполнение `.ps1`-скриптов отключено.
|
||
|
||
## Быстрый старт
|
||
|
||
```bash
|
||
pnpm install
|
||
pnpm dev
|
||
```
|
||
|
||
Локальный адрес по умолчанию:
|
||
|
||
```text
|
||
http://localhost:5173
|
||
```
|
||
|
||
## Команды
|
||
|
||
```bash
|
||
pnpm format # автоформатирование
|
||
pnpm format:check # проверка форматирования
|
||
pnpm lint # ESLint
|
||
pnpm check # Svelte + TypeScript
|
||
pnpm build # production build
|
||
pnpm preview # preview production build
|
||
pnpm audit # аудит зависимостей
|
||
```
|
||
|
||
`pnpm outdated` может показывать `@types/node` 26.x и TypeScript 7.x. Это не ошибка текущего стека: проект закреплён на Node 24 LTS, а `@sveltejs/kit` и `typescript-eslint` на текущих версиях требуют TypeScript `<6.1`.
|
||
|
||
## Конфигурация
|
||
|
||
Основные изменяемые значения вынесены в `.env.example`.
|
||
|
||
Публичные значения сайта:
|
||
|
||
```bash
|
||
PUBLIC_SITE_URL=https://trade.flamy.studio
|
||
PUBLIC_SITE_NAME=Flamy Trade
|
||
PUBLIC_SITE_DESCRIPTION=Публичная витрина ML-прогнозов для крипторынка.
|
||
```
|
||
|
||
Runtime-переменные SvelteKit adapter-node:
|
||
|
||
```bash
|
||
HOST=0.0.0.0
|
||
PORT=3000
|
||
ORIGIN=https://trade.flamy.studio
|
||
BODY_SIZE_LIMIT=1M
|
||
SHUTDOWN_TIMEOUT=15
|
||
```
|
||
|
||
Docker Compose:
|
||
|
||
```bash
|
||
APP_HOST_IP=10.20.0.20
|
||
APP_PUBLISHED_PORT=18082
|
||
APP_IMAGE_TAG=<git-sha>
|
||
```
|
||
|
||
## Структура
|
||
|
||
```text
|
||
src/lib/blog/posts.ts # статические статьи блога
|
||
src/lib/config/site.ts # единая конфигурация сайта и canonical URL
|
||
src/lib/stores/chartStore.ts # типы графика и демонстрационный provider
|
||
src/lib/components/Chart.svelte # lightweight-charts компонент
|
||
src/routes/healthz/+server.ts # health endpoint
|
||
src/routes/sitemap.xml/+server.ts # sitemap
|
||
docker/nginx/default.conf # project nginx
|
||
docs/deployment.md # runbook развёртывания
|
||
```
|
||
|
||
## Данные дашборда
|
||
|
||
Текущий provider в `chartStore.ts` генерирует демонстрационные данные. Он не является реальным торговым API и не меняет контракт будущего backend.
|
||
|
||
Ожидаемая форма `ChartData`:
|
||
|
||
```typescript
|
||
type ChartData = {
|
||
candles: Array<{ time: number; open: number; high: number; low: number; close: number }>;
|
||
prediction: Array<{ time: number; value: number }>;
|
||
signal: {
|
||
direction: 'long' | 'short';
|
||
confidence: number;
|
||
entry: number;
|
||
tp: number;
|
||
sl: number;
|
||
};
|
||
currentPrice: number;
|
||
change24h: number;
|
||
change24hPct: number;
|
||
};
|
||
```
|
||
|
||
## Блог
|
||
|
||
Статьи хранятся как типизированные блоки, а не как HTML-строки. Это позволяет рендерить контент без `{@html}` и без отдельной санитаризации.
|
||
|
||
## Production
|
||
|
||
Production-сборка рассчитана на схему:
|
||
|
||
```text
|
||
Internet -> Caddy -> 10.20.0.20:18082 -> nginx -> app:3000
|
||
```
|
||
|
||
Подробный порядок развёртывания, Caddy block, smoke-check и rollback описаны в [docs/deployment.md](docs/deployment.md).
|
||
|
||
## Что не входит в текущий этап
|
||
|
||
Пока не подключаются:
|
||
|
||
- ML-runtime;
|
||
- реальный API;
|
||
- S3;
|
||
- база данных;
|
||
- Redis;
|
||
- Telegram egress;
|
||
- публикация ML API через Caddy.
|