- FastAPI REST API with JWT auth - aiogram 3 Telegram bot with admin middleware - APScheduler daily tasks (expiry, reminders, revoke, sync) - SQLAlchemy 2 async ORM with Alembic migrations - Jinja2 admin panel (Dashboard, Users, Payments, Servers, Tariffs) - VPN provider abstraction with MockProvider - Stats service with revenue/subscription analytics - Docker Compose (PostgreSQL + Redis + app) - Healthcheck endpoint
29 lines
925 B
HTML
29 lines
925 B
HTML
{% extends "base.html" %}
|
|
{% block title %}Dashboard — VPN Control Panel{% endblock %}
|
|
{% block content %}
|
|
<h2>Dashboard</h2>
|
|
|
|
<div class="cards">
|
|
<div class="card">
|
|
<div class="value">{{ active_users }} / {{ total_users }}</div>
|
|
<div class="label">Active Users</div>
|
|
</div>
|
|
<div class="card">
|
|
<div class="value">{{ total_tariffs }}</div>
|
|
<div class="label">Tariffs</div>
|
|
</div>
|
|
<div class="card">
|
|
<div class="value">{{ active_servers }} / {{ total_servers }}</div>
|
|
<div class="label">Active Servers</div>
|
|
</div>
|
|
<div class="card">
|
|
<div class="value">{{ confirmed_payments }} / {{ total_payments }}</div>
|
|
<div class="label">Confirmed Payments</div>
|
|
</div>
|
|
<div class="card">
|
|
<div class="value">{{ "%.2f"|format(total_revenue) }}</div>
|
|
<div class="label">Revenue (RUB)</div>
|
|
</div>
|
|
</div>
|
|
{% endblock %}
|