feat: add Remnawave panel 2.7.0 support

- Add MONTH_ROLLING traffic reset mode (button, locales: ru/en/zh/fa)
- Add NodeInfo config_profile and active_plugin_uuid fields
- Update bandwidth display: remove /s suffix, label as Inbound Traffic
- Update tariffs.ts type comment with MONTH_ROLLING
This commit is contained in:
c0mrade
2026-03-28 12:35:47 +03:00
parent a57674c22b
commit a50c06c101
8 changed files with 41 additions and 11 deletions

View File

@@ -94,6 +94,19 @@ export interface NodeInfo {
created_at?: string; created_at?: string;
updated_at?: string; updated_at?: string;
provider_uuid?: string; provider_uuid?: string;
active_plugin_uuid?: string;
config_profile?: {
active_config_profile_uuid: string | null;
active_inbounds: Array<{
uuid: string;
profile_uuid: string;
tag: string;
type: string;
network: string | null;
security: string | null;
port: number | null;
}>;
};
} }
export interface NodesListResponse { export interface NodesListResponse {

View File

@@ -86,7 +86,7 @@ export interface TariffDetail {
is_daily: boolean; is_daily: boolean;
daily_price_kopeks: number; daily_price_kopeks: number;
// Режим сброса трафика // Режим сброса трафика
traffic_reset_mode: string | null; // 'DAY', 'WEEK', 'MONTH', 'NO_RESET', null = глобальная настройка traffic_reset_mode: string | null; // 'DAY', 'WEEK', 'MONTH', 'MONTH_ROLLING', 'NO_RESET', null = глобальная настройка
// Внешний сквад RemnaWave // Внешний сквад RemnaWave
external_squad_uuid: string | null; external_squad_uuid: string | null;
created_at: string; created_at: string;

View File

@@ -316,7 +316,8 @@
"trafficReset": { "trafficReset": {
"DAY": "Resets daily", "DAY": "Resets daily",
"WEEK": "Resets weekly", "WEEK": "Resets weekly",
"MONTH": "Resets monthly" "MONTH": "Resets monthly",
"MONTH_ROLLING": "Resets every 30 days"
}, },
"traffic": "Traffic", "traffic": "Traffic",
"unlimited": "Unlimited", "unlimited": "Unlimited",
@@ -1490,7 +1491,7 @@
"totalUsers": "Total Users", "totalUsers": "Total Users",
"nodesOnline": "Nodes Online", "nodesOnline": "Nodes Online",
"connections": "Connections", "connections": "Connections",
"bandwidth": "Realtime Bandwidth", "bandwidth": "Inbound Traffic",
"download": "Download", "download": "Download",
"upload": "Upload", "upload": "Upload",
"total": "Total", "total": "Total",
@@ -2198,6 +2199,8 @@
"resetModeWeeklyDesc": "Reset every week", "resetModeWeeklyDesc": "Reset every week",
"resetModeMonthly": "Monthly", "resetModeMonthly": "Monthly",
"resetModeMonthlyDesc": "Reset every month", "resetModeMonthlyDesc": "Reset every month",
"resetModeMonthRolling": "Rolling month",
"resetModeMonthRollingDesc": "Reset every 30 days from first connection",
"resetModeNever": "Never", "resetModeNever": "Never",
"resetModeNeverDesc": "Traffic is not reset", "resetModeNeverDesc": "Traffic is not reset",
"cancelButton": "Cancel", "cancelButton": "Cancel",

View File

@@ -277,7 +277,8 @@
"trafficReset": { "trafficReset": {
"DAY": "بازنشانی روزانه", "DAY": "بازنشانی روزانه",
"WEEK": "بازنشانی هفتگی", "WEEK": "بازنشانی هفتگی",
"MONTH": "بازنشانی ماهانه" "MONTH": "بازنشانی ماهانه",
"MONTH_ROLLING": "بازنشانی هر ۳۰ روز"
}, },
"traffic": "ترافیک", "traffic": "ترافیک",
"unlimited": "نامحدود", "unlimited": "نامحدود",
@@ -1853,6 +1854,8 @@
"resetModeWeeklyDesc": "بازنشانی هر هفته", "resetModeWeeklyDesc": "بازنشانی هر هفته",
"resetModeMonthly": "ماهانه", "resetModeMonthly": "ماهانه",
"resetModeMonthlyDesc": "بازنشانی هر ماه", "resetModeMonthlyDesc": "بازنشانی هر ماه",
"resetModeMonthRolling": "ماه متحرک",
"resetModeMonthRollingDesc": "بازنشانی هر ۳۰ روز از اولین اتصال",
"resetModeNever": "هرگز", "resetModeNever": "هرگز",
"resetModeNeverDesc": "ترافیک بازنشانی نمی‌شود", "resetModeNeverDesc": "ترافیک بازنشانی نمی‌شود",
"cancelButton": "لغو", "cancelButton": "لغو",

View File

@@ -331,7 +331,8 @@
"trafficReset": { "trafficReset": {
"DAY": "Сброс ежедневно", "DAY": "Сброс ежедневно",
"WEEK": "Сброс еженедельно", "WEEK": "Сброс еженедельно",
"MONTH": "Сброс ежемесячно" "MONTH": "Сброс ежемесячно",
"MONTH_ROLLING": "Сброс раз в 30 дней"
}, },
"traffic": "Трафик", "traffic": "Трафик",
"unlimited": "Безлимит", "unlimited": "Безлимит",
@@ -1511,7 +1512,7 @@
"totalUsers": "Всего пользователей", "totalUsers": "Всего пользователей",
"nodesOnline": "Нод онлайн", "nodesOnline": "Нод онлайн",
"connections": "Подключений", "connections": "Подключений",
"bandwidth": "Пропускная способность", "bandwidth": "Трафик по inbounds",
"download": "Загрузка", "download": "Загрузка",
"upload": "Отдача", "upload": "Отдача",
"total": "Всего", "total": "Всего",
@@ -2712,6 +2713,8 @@
"resetModeWeeklyDesc": "Сброс каждую неделю", "resetModeWeeklyDesc": "Сброс каждую неделю",
"resetModeMonthly": "Ежемесячно", "resetModeMonthly": "Ежемесячно",
"resetModeMonthlyDesc": "Сброс каждый месяц", "resetModeMonthlyDesc": "Сброс каждый месяц",
"resetModeMonthRolling": "Скользящий месяц",
"resetModeMonthRollingDesc": "Сброс через 30 дней от первого подключения",
"resetModeNever": "Никогда", "resetModeNever": "Никогда",
"resetModeNeverDesc": "Трафик не сбрасывается", "resetModeNeverDesc": "Трафик не сбрасывается",
"cancelButton": "Отмена", "cancelButton": "Отмена",

View File

@@ -277,7 +277,8 @@
"trafficReset": { "trafficReset": {
"DAY": "每日重置", "DAY": "每日重置",
"WEEK": "每周重置", "WEEK": "每周重置",
"MONTH": "每月重置" "MONTH": "每月重置",
"MONTH_ROLLING": "每30天重置"
}, },
"traffic": "流量", "traffic": "流量",
"unlimited": "无限", "unlimited": "无限",
@@ -1890,6 +1891,8 @@
"resetModeWeeklyDesc": "每周重置", "resetModeWeeklyDesc": "每周重置",
"resetModeMonthly": "每月", "resetModeMonthly": "每月",
"resetModeMonthlyDesc": "每月重置", "resetModeMonthlyDesc": "每月重置",
"resetModeMonthRolling": "滚动月",
"resetModeMonthRollingDesc": "从首次连接起每30天重置",
"resetModeNever": "从不", "resetModeNever": "从不",
"resetModeNeverDesc": "流量不重置", "resetModeNeverDesc": "流量不重置",
"cancelButton": "取消", "cancelButton": "取消",

View File

@@ -405,24 +405,24 @@ function OverviewTab({ stats, isLoading, onRefresh }: OverviewTabProps) {
{/* Bandwidth */} {/* Bandwidth */}
<div> <div>
<h3 className="mb-3 text-sm font-medium text-dark-300"> <h3 className="mb-3 text-sm font-medium text-dark-300">
{t('admin.remnawave.overview.bandwidth', 'Realtime Bandwidth')} {t('admin.remnawave.overview.bandwidth', 'Inbound Traffic')}
</h3> </h3>
<div className="grid grid-cols-2 gap-3 sm:grid-cols-3"> <div className="grid grid-cols-2 gap-3 sm:grid-cols-3">
<StatCard <StatCard
label={t('admin.remnawave.overview.download', 'Download')} label={t('admin.remnawave.overview.download', 'Download')}
value={formatBytes(stats.bandwidth.realtime_download) + '/s'} value={formatBytes(stats.bandwidth.realtime_download)}
icon={<span className="text-lg"></span>} icon={<span className="text-lg"></span>}
color="green" color="green"
/> />
<StatCard <StatCard
label={t('admin.remnawave.overview.upload', 'Upload')} label={t('admin.remnawave.overview.upload', 'Upload')}
value={formatBytes(stats.bandwidth.realtime_upload) + '/s'} value={formatBytes(stats.bandwidth.realtime_upload)}
icon={<span className="text-lg"></span>} icon={<span className="text-lg"></span>}
color="blue" color="blue"
/> />
<StatCard <StatCard
label={t('admin.remnawave.overview.total', 'Total')} label={t('admin.remnawave.overview.total', 'Total')}
value={formatBytes(stats.bandwidth.realtime_total) + '/s'} value={formatBytes(stats.bandwidth.realtime_total)}
icon={<span className="text-lg"></span>} icon={<span className="text-lg"></span>}
color="purple" color="purple"
/> />

View File

@@ -1029,6 +1029,11 @@ export default function AdminTariffCreate() {
{ value: 'DAY', labelKey: 'admin.tariffs.resetModeDaily', emoji: '📅' }, { value: 'DAY', labelKey: 'admin.tariffs.resetModeDaily', emoji: '📅' },
{ value: 'WEEK', labelKey: 'admin.tariffs.resetModeWeekly', emoji: '📆' }, { value: 'WEEK', labelKey: 'admin.tariffs.resetModeWeekly', emoji: '📆' },
{ value: 'MONTH', labelKey: 'admin.tariffs.resetModeMonthly', emoji: '🗓️' }, { value: 'MONTH', labelKey: 'admin.tariffs.resetModeMonthly', emoji: '🗓️' },
{
value: 'MONTH_ROLLING',
labelKey: 'admin.tariffs.resetModeMonthRolling',
emoji: '🔄',
},
{ value: 'NO_RESET', labelKey: 'admin.tariffs.resetModeNever', emoji: '🚫' }, { value: 'NO_RESET', labelKey: 'admin.tariffs.resetModeNever', emoji: '🚫' },
].map((option) => ( ].map((option) => (
<button <button