fix: rétablir le dashboard production et ses moteurs IA
All checks were successful
Validation Dashboard / Tests backend et build frontend (push) Successful in 1m7s

This commit is contained in:
Santinova Deploy
2026-09-05 14:21:53 +00:00
parent 1c9a9eff8f
commit 692762674b
18 changed files with 229 additions and 56 deletions

View File

@@ -4,7 +4,7 @@
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Dashboard - Gestion des Applications</title>
<title>Dashboard Production - Gestion des Applications</title>
</head>
<body class="bg-dark-900 text-white">
<div id="root"></div>

View File

@@ -118,8 +118,9 @@ export default function AppCard({ app, commits, onRefresh }) {
const latestCommit = commits && commits.length > 0 ? commits[0] : null;
// Apps d'infrastructure : portail et dashboard
const isInfra = ['portail-santinova', 'manus-dashboard'].includes(app.id);
// Le manifeste est la seule source de vérité pour le type et les moteurs IA.
const isInfra = app.category === 'INFRA';
const aiEngines = Array.isArray(app.ai?.engines) ? app.ai.engines : [];
return (
<div className={`card overflow-hidden${isInfra ? ' border border-amber-500/30 bg-amber-950/10' : ''}`}>
@@ -217,7 +218,26 @@ export default function AppCard({ app, commits, onRefresh }) {
)}
{/* Info Grid */}
<div className="p-6 grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
<div className="p-6 grid grid-cols-1 md:grid-cols-2 xl:grid-cols-4 gap-4">
{/* Moteurs IA déclarés dans app.json */}
<div>
<span className="text-xs font-medium text-gray-500 uppercase tracking-wider">
Moteur IA
</span>
<div className="mt-1.5 space-y-2">
{aiEngines.length > 0 ? aiEngines.map((engine, index) => (
<div key={`${engine.provider}-${engine.model}-${index}`}>
<p className="text-sm text-gray-200">{engine.provider}</p>
<p className="text-xs text-primary-400 break-words">
{engine.model}{engine.role ? ` — ${engine.role}` : ''}
</p>
</div>
)) : (
<p className="text-sm text-gray-600">Non déclaré</p>
)}
</div>
</div>
{/* URLs */}
<div>
<span className="text-xs font-medium text-gray-500 uppercase tracking-wider">

View File

@@ -12,7 +12,6 @@ import { LayoutList, TerminalSquare, ShieldCheck,
Activity,
BookOpen,
} from 'lucide-react';
import { ENVIRONMENT_LABEL } from '../utils/environment';
const navItems = [
{ id: 'dashboard', label: 'Tableau de bord', icon: LayoutDashboard },
{ id: 'apps', label: 'Applications', icon: Box },
@@ -41,7 +40,7 @@ export default function Sidebar({
</div>
<div>
<h1 className="text-lg font-bold text-white">Dashboard</h1>
<p className="text-xs text-gray-500">{ENVIRONMENT_LABEL}</p>
<p className="text-xs text-gray-500">Production</p>
</div>
</div>
</div>

View File

@@ -13,7 +13,6 @@ import {
import { getApps, getSystemInfo } from '../utils/api';
import StatusBadge from '../components/StatusBadge';
import { sortAppsWithInfraFirst } from '../utils/appSorting';
import { ENVIRONMENT_LABEL, GITEA_HOST, GITEA_URL, SERVER_PUBLIC_IP } from '../utils/environment';
function StatCard({ icon: Icon, label, value, color, subtext }) {
return (
@@ -102,7 +101,7 @@ export default function DashboardPage({ apps }) {
<div className="flex items-center justify-between py-2 border-b border-dark-700">
<span className="text-sm text-gray-400">Serveur</span>
<span className="text-sm text-gray-200">
{SERVER_PUBLIC_IP} ({ENVIRONMENT_LABEL})
180.149.196.138 (Production)
</span>
</div>
<div className="flex items-center justify-between py-2 border-b border-dark-700">
@@ -115,12 +114,12 @@ export default function DashboardPage({ apps }) {
<div className="flex items-center justify-between py-2 border-b border-dark-700">
<span className="text-sm text-gray-400">Gitea</span>
<a
href={GITEA_URL}
href="https://git.santinova-soft.org"
target="_blank"
rel="noopener noreferrer"
className="text-sm text-primary-400 hover:text-primary-300"
>
{GITEA_HOST}
git.santinova-soft.org
</a>
</div>
<div className="flex items-center justify-between py-2 border-b border-dark-700">

View File

@@ -1,7 +1,6 @@
import React, { useState, useEffect } from 'react';
import { Table, RefreshCw, GitBranch, CheckCircle, XCircle, ExternalLink, Tag, AlertCircle, ArrowUp, ArrowDown, Minus, AlertTriangle } from 'lucide-react';
import api from '../utils/api';
import { ENVIRONMENT_LABEL } from '../utils/environment';
const APPS_CONFIG = [
{
@@ -90,7 +89,7 @@ const APPS_CONFIG = [
},
{
id: 'manus-dashboard',
name: `Dashboard ${ENVIRONMENT_LABEL}`,
name: 'Dashboard Production',
repoName: 'manus-dashboard',
urlRecette: 'https://dashboard.recette.santinova-soft.org',
urlProd: 'https://dashboard.santinova-soft.org',

View File

@@ -1,7 +1,6 @@
import React, { useState } from 'react';
import { Lock, User, AlertCircle, Server } from 'lucide-react';
import { login } from '../utils/api';
import { ENVIRONMENT_LABEL, ENVIRONMENT_LABEL_LOWER } from '../utils/environment';
export default function LoginPage({ onLogin }) {
const [username, setUsername] = useState('');
@@ -35,7 +34,7 @@ export default function LoginPage({ onLogin }) {
<div className="inline-flex items-center justify-center w-16 h-16 rounded-2xl bg-primary-600 mb-4">
<Server className="w-8 h-8 text-white" />
</div>
<h1 className="text-2xl font-bold text-white">Dashboard {ENVIRONMENT_LABEL}</h1>
<h1 className="text-2xl font-bold text-white">Dashboard Production</h1>
<p className="text-gray-400 mt-2">Gestion des applications</p>
</div>
@@ -131,7 +130,7 @@ export default function LoginPage({ onLogin }) {
</div>
<p className="text-center text-gray-600 text-sm mt-6">
Santinova Soft &mdash; Serveur de {ENVIRONMENT_LABEL_LOWER}
Santinova Soft &mdash; Serveur de production
</p>
</div>
</div>

View File

@@ -1,6 +1,5 @@
import React, { useState, useEffect, useRef, useCallback } from 'react';
import { Terminal, Wifi, WifiOff, X, Plus, ChevronDown } from 'lucide-react';
import { DEFAULT_SSH_PRESET, ENVIRONMENT_LABEL, SERVER_PUBLIC_IP } from '../utils/environment';
// Serveurs SSH prédéfinis
const PRESET_SERVERS = [
@@ -31,8 +30,8 @@ export default function TerminalPage() {
// Formulaire de connexion
const [form, setForm] = useState({
preset: DEFAULT_SSH_PRESET,
host: SERVER_PUBLIC_IP,
preset: 'recette',
host: '78.138.58.109',
port: 22,
username: 'root',
password: '',
@@ -117,7 +116,7 @@ export default function TerminalPage() {
fitAddonRef.current = fitAddon;
term.writeln('\x1b[1;34m╔══════════════════════════════════════════════════╗\x1b[0m');
term.writeln(`\x1b[1;34m║ Terminal SSH — Dashboard ${ENVIRONMENT_LABEL} Santinova ║\x1b[0m`);
term.writeln('\x1b[1;34m║ Terminal SSH — Dashboard Production Santinova ║\x1b[0m');
term.writeln('\x1b[1;34m╚══════════════════════════════════════════════════╝\x1b[0m');
term.writeln('');
term.writeln('\x1b[90mSélectionnez un serveur et connectez-vous pour démarrer.\x1b[0m');