До портфоліо

GoldVeldspar — платформа ринкової аналітики для EVE Online

SaaS ринкової аналітики для трейдерів EVE Online: знімки ESI, рівневі правила спостереження, алерти в Telegram, поради щодо спреду та веб-додаток на TimescaleDB зі staging і production на інфраструктурі SmartDevOS.

Лише офіційний EVE ESI. Поради щодо спреду орієнтовні (на основі знімків, до комісій).

Категорія

Web Services

Дата

2025-05 — 2026-06

Статус

У продакшені (staging + production)

Роль

Архітектура, backend, воркери, Telegram-бот, веб-додаток, DevOps, продуктовий дизайн

Технології

Python, FastAPI, Celery, aiogram, PostgreSQL, TimescaleDB, Redis, Next.js, Docker, Caddy, Prometheus, Grafana, EVE ESI

Теги

EVE Online, Market Data, Telegram Bot, SaaS, TimescaleDB, Multi-tenant Alerts

Огляд

GoldVeldspar — сервіс ринкової аналітики для трейдерів EVE Online. Він збирає публічні знімки ринкових ордерів через офіційний API CCP (ESI), зберігає часові ряди цін, перевіряє користувацькі правила спостереження та надсилає сповіщення в Telegram і веб-додатку.

Платформа орієнтована на тих, хто стежить за спредами між хабами, падінням цін, сплесками обсягу та арбітражем — без власних скриптів і постійного ручного моніторингу.

Користувач може шукати в каталозі ~19 тис. типів предметів, створювати спостереження з різними типами правил, отримувати DM у Telegram при спрацюванні, запитувати поради щодо спреду та переглядати історію алертів, графіки та каталог у веб-інтерфейсі.

Ядро системи не прив’язане до однієї гри — EVE є першим вертикальним модулем; інші ігри додаються через адаптери без переписування схеми БД.


Контекст

Трейдери EVE вже платять за ринкові інструменти, але багато процесів досі зводяться до ручної перевірки хабів або важких сторонніх сайтів. Мета продукту — легкий Telegram-супутник за реалістичною ціною (Pro — €5/міс), який швидше фіксує можливості, ніж ручний моніторинг.

Основні вимоги:

  • лише офіційний API — EVE ESI, без скрапінгу;
  • обережне збирання даних — обмежений бюджет ESI, каденс ~10 хв, повага до rate limits;
  • покриття п’яти хабів — Jita, Amarr, Dodixie, Rens, Hek;
  • чесна модель покриття — повний пошук каталогу з рівневим оновленням знімків (hot → watched → фон);
  • експлуатація малою командою — один VPS, staging + prod, CI/CD, моніторинг, runbook;
  • багатомовний UX — EN / UA / RU в боті та вебі.

Відповідальність

У межах проєкту:

  • архітектура продукту та структура monorepo;
  • REST API (FastAPI), авторизація, тарифи, спостереження, поради;
  • Celery workers + beat: знімки ESI, оцінка алертів, службові задачі;
  • Telegram-бот (aiogram 3): команди, i18n, webhook;
  • Next.js: маркетинг, користувацький веб, адмін-панель;
  • PostgreSQL + TimescaleDB, міграції Alembic, імпорт SDE-каталогу;
  • стратегія рівневих знімків (hot / watched / catalog LRU);
  • деплой на Hetzner, Docker Compose, Caddy TLS, GitLab CI/CD;
  • алерти Prometheus, Grafana, Loki, процедура аварійного вимкнення.

Рішення

GoldVeldspar — monorepo зі спільними Python-пакетами та окремими сервісами (api, workers, bot, web, admin, marketing).

Потік даних:

  • Celery beat запускає рівневі знімки ESI кожні ~10 хвилин;
  • воркери агрегують best ask/bid по предмету × хаб і пишуть у TimescaleDB;
  • окремий evaluator алертів (щохвилини, лише БД) перевіряє активні спостереження;
  • спрацьовані алерти йдуть у Telegram; історія доступна у вебі;
  • користувачі Pro можуть викликати /advice або панель Advice у вебі.

Тарифи: Free — 5 активних спостережень, оновлення алертів 15 хв; Pro (€5/міс) — 100 спостережень, 1 хв, усі режими порад щодо спреду.

Канали: Telegram-бот, веб-додаток, адмін-панель для операторів.


Технічні деталі

Стек

  • Python 3.12, FastAPI, SQLAlchemy (async), Pydantic, Celery, Redis
  • aiogram 3, Fluent i18n (EN / UA / RU)
  • PostgreSQL 16 + TimescaleDB, Alembic
  • Next.js, Tailwind CSS
  • Docker Compose, Caddy, GitLab CI/CD, Hetzner VPS
  • Prometheus, Grafana, Loki, Alertmanager → Telegram

Архітектура

  • патерн адаптера — контракт SourceAdapter; EVE-реалізація з обробкою ESI error limits;
  • рівні знімків — hot → watched → catalog LRU (Jita-first, з лімітом);
  • движок правил — JSONB у спостереженнях; шість типів правил у Phase 1;
  • середовища — ізольовані Compose-проєкти staging і production на одному VPS;
  • авторизація — email link codes через /link у боті; спільний cookie domain.

Функціональність

Реалізовано:

  • знімки п’яти торгових хабів EVE;
  • імпорт SDE-каталогу (~19k типів для пошуку);
  • CRUD спостережень з квотами за тарифом;
  • типи алертів: ціна нижче, падіння %, новий мінімум, сплеск обсягу, наявність, арбітраж;
  • поради: по предмету, найкраще зараз, скан «купити в хабі»;
  • графіки цін зі знімків;
  • адмін: здоров’я джерел, свіжість даних, користувачі за тарифом;
  • режим обслуговування: Caddy 503 + документоване вимкнення сервісів.

Виклики

Основними викликами були:

  • обсяг ESI vs покриття — повний каталог × усі хаби кожні 10 хв неможливий; вирішено рівневим оновленням і чесним UX;
  • дані не в реальному часі — поради й алерти на агрегованих best bid/ask;
  • консистентність — однакові ліміти тарифів у API, боті та вебі;
  • ops на обмеженому бюджеті — staging + prod + observability на одному VPS;
  • чесність продукту — узгодження маркетингу з тим, що реально моніториться.

Результат

Платформа працює на staging і production, з автодеплоєм на staging і ручним релізом на prod.

Реалізовано:

  • повний ланцюжок: ESI → TimescaleDB → правила → Telegram;
  • арбітраж і поради щодо спреду для моніторованих предметів;
  • пошук по каталогу EVE з пріоритетним оновленням hot/watched;
  • веб + бот + адмін з i18n;
  • CI/CD, метрики, алерти та процедури аварійного вимкнення.

Архітектура готова до підключення оплати (Stripe) і нових ігор через адаптери джерел.


Примітки

  • Лише офіційний EVE ESI; без авторизації персонажа в Phase 1.
  • Поради орієнтовні (~10 хв затримки, до комісій і логістики).
  • Оплата (Stripe) запланована; ліміти тарифів уже в коді.
  • EVE — перший вертикальний модуль; ядро задумане як універсальне.

Галерея

Відео

Відеоогляд ще не опубліковано.

Посилання