18 Commits

Author SHA1 Message Date
headlessdev
1d02f5f237 Add m_cpu, m_gpu, m_ram, m_disk, and m_temp boolean fields to AddRequest and EditRequest interfaces 2025-05-01 19:29:33 +02:00
headlessdev
a2b9d92dd4 Bump version 2025-05-01 19:08:32 +02:00
headlessdev
109463f242 Migrations 2025-05-01 17:00:02 +02:00
headlessdev
2b9b7a5960 Add boolean fields for CPU, RAM, Disk, GPU, and Temperature in server model 2025-05-01 15:59:59 +02:00
headlessdev
9f3f1b56e2 Merge pull request #71 from maxi3390/add-spanish-language
Add spanish language
2025-05-01 12:17:30 +02:00
David Maximiliaon Sosa
b5d6b42100 Add spanish to docs 2025-04-30 22:07:22 -03:00
David Maximiliaon Sosa
275d332d23 Adding spanish to settings 2025-04-30 22:05:55 -03:00
David Maximiliaon Sosa
022465b383 [i18n] Feat: Adding spanish language 2025-04-30 19:41:46 -03:00
headlessdev
135b3684a9 Bump version 2025-04-30 20:59:17 +02:00
headlessdev
c212986fb5 Bcrypt to Bcryptjs to support ARM based systems 2025-04-30 19:53:15 +02:00
headlessdev
dbf86ab283 Add binary targets to prisma generator 2025-04-30 19:32:35 +02:00
headlessdev
1ad84e7ea3 Docker startup command fix 2025-04-30 18:59:05 +02:00
headlessdev
1b75d95be4 Dockerfile Arch fix 2025-04-30 18:47:09 +02:00
headlessdev
634c7aaec3 Fix i18n Notifications Desciption 2025-04-30 18:40:45 +02:00
headlessdev
799a292471 Merge branch 'main' of https://github.com/crocofied/CoreControl 2025-04-30 18:35:23 +02:00
headlessdev
c624ddafb2 Updated Dockerfile to support ARM 2025-04-30 18:35:22 +02:00
headlessdev
ce8739181a Update README.md 2025-04-30 16:09:53 +02:00
headlessdev
cf177d587c Readme screenshot fix 2025-04-30 16:08:39 +02:00
18 changed files with 584 additions and 78 deletions

View File

@@ -1,22 +1,22 @@
# Builder Stage
FROM --platform=$BUILDPLATFORM node:20-alpine AS builder
ARG TARGETARCH # Wird automatisch von Buildx gesetzt
ARG TARGETARCH # Automatically set by Buildx
WORKDIR /app
RUN case ${TARGETARCH} in \
"amd64") export PRISMA_CLI_BINARY_TARGETS="linux-musl-x64-openssl-3.0.x" ;; \
"arm64") export PRISMA_CLI_BINARY_TARGETS="linux-musl-arm64-openssl-3.0.x" ;; \
"arm") export PRISMA_CLI_BINARY_TARGETS="linux-musl-arm-openssl-3.0.x" ;; \
*) echo "Unsupported ARCH: ${TARGETARCH}" && exit 1 ;; \
esac
COPY package.json package-lock.json* ./
COPY ./prisma ./prisma
RUN npm install
RUN npx prisma generate
# Set PRISMA_CLI_BINARY_TARGETS based on TARGETARCH and install dependencies
RUN case ${TARGETARCH} in \
"amd64") export PRISMA_CLI_BINARY_TARGETS="linux-musl-openssl-3.0.x" ;; \
"arm64") export PRISMA_CLI_BINARY_TARGETS="linux-musl-arm64-openssl-3.0.x" ;; \
"arm") export PRISMA_CLI_BINARY_TARGETS="linux-musl-arm-openssl-3.0.x" ;; \
*) echo "Unsupported ARCH: ${TARGETARCH}" && exit 1 ;; \
esac && \
npm install && \
npx prisma generate
COPY . .
RUN npm run build
@@ -27,8 +27,8 @@ FROM --platform=$TARGETPLATFORM node:20-alpine AS production
WORKDIR /app
ENV NODE_ENV production
ENV PRISMA_CLI_BINARY_TARGETS="linux-musl-arm64-openssl-3.0.x"
# Copy built assets and dependencies from builder
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/prisma ./prisma
COPY --from=builder /app/.next ./.next
@@ -36,16 +36,18 @@ COPY --from=builder /app/public ./public
COPY --from=builder /app/package.json ./package.json
COPY --from=builder /app/next.config.js* ./
# Prune dev dependencies
RUN npm prune --production
EXPOSE 3000
CMD ["sh", "-c", "npx prisma migrate deploy && npm start"]
# - - BUILD COMMAND - -
# docker buildx build \
# --platform linux/amd64,linux/arm64,linux/arm/v7 \
# -t haedlessdev/corecontrol:1.0.0 \
# -t haedlessdev/corecontrol:latest \
# --push \
# .
# Dynamically set PRISMA_CLI_BINARY_TARGETS based on runtime architecture and start
CMD ["sh", "-c", "\
export PRISMA_CLI_BINARY_TARGETS=$(case $(uname -m) in \
x86_64) echo linux-musl-openssl-3.0.x ;; \
aarch64) echo linux-musl-arm64-openssl-3.0.x ;; \
armv7l) echo linux-musl-arm-openssl-3.0.x ;; \
*) echo \"Unsupported architecture: $(uname -m)\" && exit 1 ;; \
esac) && \
npx prisma migrate deploy && \
npm start"]

View File

@@ -96,7 +96,7 @@ __Password:__ admin
The application is build with:
- Next.js & Typescript
- Go (for the agent)
- Go (used for the agent)
- Tailwindcss with [shadcn](shadcn.com)
- PostgreSQL with [Prisma ORM](https://www.prisma.io/)
- Icons by [Lucide](https://lucide.dev/)

View File

@@ -1,7 +1,7 @@
import { NextResponse, NextRequest } from "next/server";
import jwt from 'jsonwebtoken';
import { prisma } from "@/lib/prisma";
import bcrypt from 'bcrypt';
import bcrypt from 'bcryptjs';
interface EditEmailRequest {
oldPassword: string;

View File

@@ -1,7 +1,7 @@
import { NextResponse, NextRequest } from "next/server";
import jwt from 'jsonwebtoken';
import { prisma } from "@/lib/prisma";
import bcrypt from 'bcrypt';
import bcrypt from 'bcryptjs';
interface LoginRequest {
username: string;

View File

@@ -15,13 +15,17 @@ interface AddRequest {
disk: string;
monitoring: boolean;
monitoringURL: string;
m_cpu: boolean;
m_gpu: boolean;
m_ram: boolean;
m_disk: boolean;
m_temp: boolean;
}
export async function POST(request: NextRequest) {
try {
const body: AddRequest = await request.json();
const { host, hostServer, name, icon, os, ip, url, cpu, gpu, ram, disk, monitoring, monitoringURL } = body;
const { host, hostServer, name, icon, os, ip, url, cpu, gpu, ram, disk, monitoring, monitoringURL, m_cpu, m_gpu, m_ram, m_disk, m_temp } = body;
const server = await prisma.server.create({
data: {
@@ -37,7 +41,12 @@ export async function POST(request: NextRequest) {
ram,
disk,
monitoring,
monitoringURL
monitoringURL,
m_cpu,
m_gpu,
m_ram,
m_disk,
m_temp
}
});

View File

@@ -16,12 +16,17 @@ interface EditRequest {
disk: string;
monitoring: boolean;
monitoringURL: string;
m_cpu: boolean;
m_gpu: boolean;
m_ram: boolean;
m_disk: boolean;
m_temp: boolean;
}
export async function PUT(request: NextRequest) {
try {
const body: EditRequest = await request.json();
const { host, hostServer, id, name, icon, os, ip, url, cpu, gpu, ram, disk, monitoring, monitoringURL } = body;
const { host, hostServer, id, name, icon, os, ip, url, cpu, gpu, ram, disk, monitoring, monitoringURL, m_cpu, m_gpu, m_ram, m_disk, m_temp } = body;
const existingServer = await prisma.server.findUnique({ where: { id } });
if (!existingServer) {
@@ -50,7 +55,12 @@ export async function PUT(request: NextRequest) {
ram,
disk,
monitoring,
monitoringURL
monitoringURL,
m_cpu,
m_gpu,
m_ram,
m_disk,
m_temp
}
});

View File

@@ -275,19 +275,33 @@ export default function Settings() {
useEffect(() => {
const language = Cookies.get("language")
if (language === "en") {
setLanguage("english")
} else if (language === "de") {
setLanguage("german")
switch (language) {
case "de":
setLanguage("german")
break;
case "es":
setLanguage("spanish")
break;
case "en":
default:
setLanguage("english")
break;
}
}, [])
const setLanguageFunc = (value: string) => {
setLanguage(value)
if (value === "english") {
Cookies.set("language", "en")
} else if (value === "german") {
Cookies.set("language", "de")
switch (value) {
case "german":
Cookies.set("language", "de")
break;
case "spanish":
Cookies.set("language", "es")
break;
case "english":
default:
Cookies.set("language", "en")
break;
}
// Reload the page
window.location.reload()
@@ -468,6 +482,7 @@ export default function Settings() {
<SelectContent>
<SelectItem value="english">{t('Settings.LanguageSettings.English')}</SelectItem>
<SelectItem value="german">{t('Settings.LanguageSettings.German')}</SelectItem>
<SelectItem value="spanish">{t('Settings.LanguageSettings.Spanish')}</SelectItem>
</SelectContent>
</Select>
</div>
@@ -653,8 +668,8 @@ export default function Settings() {
type="text"
onChange={(e) => setNtfyToken(e.target.value)}
/>
</div>
</div>
</div>
</div>
</div>
)}
@@ -699,7 +714,7 @@ export default function Settings() {
<span className="text-xs text-muted-foreground">{t('Settings.Notifications.AddNotification.Echobell.AddMessage')}</span>
</div>
)}
</Select>
</div>
</AlertDialogDescription>
@@ -810,7 +825,7 @@ export default function Settings() {
)}
<div className="space-y-1">
<h3 className="font-medium capitalize">
{notification.name ||
{notification.name ||
t(`Settings.Notifications.AddNotification.${notification.type.charAt(0).toUpperCase() + notification.type.slice(1)}.Title`)}
</h3>
<p className="text-xs text-muted-foreground">

File diff suppressed because one or more lines are too long

View File

@@ -14,7 +14,7 @@ With the theme settings you have the choice between light and dark mode. There i
## Language Settings
![Language Setting](../assets/screenshots/settings_language.png)
To promote internationalization (also often known as i18n), you can select the language in which you want everything to be displayed within CoreControl. Currently there is the standard language “English” and the language German.
To promote internationalization (also often known as i18n), you can select the language in which you want everything to be displayed within CoreControl. Currently there is the standard language “English”, German and Spanish.
## Notification Settings
![Notification Settings](../assets/screenshots/settings_notifications.png)

View File

@@ -350,6 +350,7 @@
"Type": "Typ",
"SMTP": {
"Title": "SMTP",
"Description": "Sende Benachrichtigungen via SMTP",
"Host": "SMTP-Host",
"Port": "SMTP-Port",
"Secure": "Sichere Verbindung (TLS/SSL)",
@@ -360,31 +361,37 @@
},
"Telegram": {
"Title": "Telegram",
"Description": "Sende Benachrichtigungen via Telegram",
"Token": "Bot-Token",
"ChatId": "Chat-ID"
},
"Discord": {
"Title": "Discord",
"Description": "Sende Benachrichtigungen via Discord",
"Webhook": "Webhook-URL"
},
"Gotify": {
"Title": "Gotify",
"Description": "Sende Benachrichtigungen via Gotify",
"Url": "Gotify-URL",
"Token": "Gotify-Token"
},
"Ntfy": {
"Title": "Ntfy",
"Description": "Sende Benachrichtigungen via Ntfy",
"Url": "Ntfy-URL",
"Token": "Ntfy-Token"
},
"Pushover": {
"Title": "Pushover",
"Description": "Sende Benachrichtigungen via Pushover",
"Url": "Pushover-URL",
"Token": "Pushover-Token",
"User": "Pushover-Benutzer"
},
"Echobell": {
"Title": "Echobell",
"Description": "Sende Benachrichtigungen via Echobell",
"Url": "Echobell-URL",
"AddMessage": "Füge in Echobell den \"message\" Feld hinzu."
}

View File

@@ -350,6 +350,7 @@
"Type": "Notification Type",
"SMTP": {
"Title": "SMTP",
"Description": "Send notifications via SMTP",
"Host": "SMTP Host",
"Port": "SMTP Port",
"Secure": "Secure Connection (TLS/SSL)",
@@ -360,31 +361,37 @@
},
"Telegram": {
"Title": "Telegram",
"Description": "Send notifications via Telegram",
"Token": "Bot Token",
"ChatId": "Chat ID"
},
"Discord": {
"Title": "Discord",
"Description": "Send notifications via Discord",
"Webhook": "Webhook URL"
},
"Gotify": {
"Title": "Gotify",
"Description": "Send notifications via Gotify",
"Url": "Gotify URL",
"Token": "Gotify Token"
},
"Ntfy": {
"Title": "Ntfy",
"Description": "Send notifications via Ntfy",
"Url": "Ntfy URL",
"Token": "Ntfy Token"
},
"Pushover": {
"Title": "Pushover",
"Description": "Send notifications via Pushover",
"Url": "Pushover URL",
"Token": "Pushover Token",
"User": "Pushover User"
},
"Echobell": {
"Title": "Echobell",
"Description": "Send notifications via Echobell",
"Url": "Echobell URL",
"AddMessage": "Add in Echobell the \"message\" field."
}

424
i18n/languages/es.json Normal file
View File

@@ -0,0 +1,424 @@
{
"Common": {
"ChangeView": "Cambiar Vista",
"ListView": "Vista de Lista",
"GridView": "Vista de Cuadrícula",
"optional": "opcional",
"cancel": "Cancelar",
"add": "Añadir",
"since": "desde {date}",
"notSet": "No establecido",
"noData": "Sin datos",
"Loading": "Cargando...",
"Refresh": "Refrescar",
"Save": "Guardar",
"Server": {
"CPU": "CPU",
"GPU": "GPU",
"RAM": "RAM",
"Disk": "Disco",
"OS": "SO",
"IP": "IP",
"Host": "Host",
"Temperature": "Temperatura",
"Usage": "Uso",
"Tabs": {
"General": "General",
"Hardware": "Hardware",
"Host": "Host",
"Monitoring": "Monitoreo"
}
},
"ItemsPerPage": {
"items": "elementos",
"item": "elemento",
"4": "4 elementos",
"5": "5 elementos",
"6": "6 elementos",
"10": "10 elementos",
"15": "15 elementos",
"20": "20 elementos",
"25": "25 elementos",
"Custom": "Personalizado (1-100)"
}
},
"Server": {
"Hardware": "Hardware",
"Network": "Red",
"CurrentUsage": "Uso Actual",
"UsageHistory": "Historial de Uso",
"ResourceUsageHistory": "Historial de Uso de Recursos",
"TimeRange": {
"Select": "Seleccionar rango de tiempo",
"LastHour": "Última Hora",
"Last24Hours": "Últimas 24 Horas",
"Last7Days": "Últimos 7 Días",
"Last30Days": "Últimos 30 Días"
},
"VirtualMachines": "Máquinas Virtuales",
"VirtualMachinesDescription": "Máquinas virtuales alojadas en este servidor",
"HardwareInformation": "Información del Hardware",
"ManagementURL": "URL de Administración",
"VM": "VM",
"Physical": "Físico",
"HostedOn": "Alojado en",
"NotFound": "Servidor no encontrado",
"NotFoundDescription": "El servidor que estás buscando no se pudo encontrar."
},
"Sidebar": {
"Main Navigation": "Navegación Principal",
"Dashboard": "Panel de Control",
"My Infrastructure": "Mi Infraestructura",
"Servers": "Servidores",
"Applications": "Aplicaciones",
"Uptime": "Uptime",
"Network": "Red",
"Settings": "Ajustes",
"Logout": "Cerrar Sesión"
},
"Home": {
"TitleUnder": "Panel de control para gestionar toda tu infraestructura de servidores",
"LoginCardTitle": "Iniciar Sesión",
"LoginCardDescription": "Introduce tus credenciales para continuar",
"AuthenticationError": "Error de Autenticación",
"Email": "Correo Electrónico",
"Password": "Contraseña",
"SigninButton": "Iniciar Sesión",
"SigninButtonSigningIn": "Iniciando sesión..."
},
"Dashboard": {
"Title": "Panel de Control",
"Servers": {
"Title": "Servidores",
"Description": "Descripción general de servidores físicos y virtuales",
"PhysicalServers": "Servidores Físicos",
"VirtualServers": "Servidores Virtuales",
"ManageServers": "Gestionar Servidores"
},
"Applications": {
"Title": "Aplicaciones",
"Description": "Gestiona tus aplicaciones desplegadas",
"OnlineApplications": "Aplicaciones En Línea",
"ViewAllApplications": "Ver todas las aplicaciones"
},
"Uptime": {
"Title": "Uptime",
"Description": "Monitoriza la disponibilidad de tus servicios",
"OnlineApplications": "Aplicaciones En Línea",
"ViewUptimeMetrics": "Ver métricas de uptime"
},
"Network": {
"Title": "Red",
"Description": "Gestionar la configuración de red",
"ActiveConnections": "Conexiones Activas",
"ViewNetworkDetails": "Ver detalles de la red"
}
},
"Servers": {
"Title": "Servidores",
"MyInfrastructure": "Mi Infraestructura",
"YourServers": "Tus Servidores",
"AddServer": {
"Title": "Añadir un servidor",
"General": {
"Title": "Añadir un servidor",
"CopyServer": "Copiar servidor",
"Icon": "Icono",
"IconPlaceholder": "Seleccionar un icono",
"IconSearchPlaceholder": "Buscar iconos...",
"Preview": "Previsualizar",
"Name": "Nombre",
"OperatingSystem": "Sistema Operativo",
"OperatingSystemPlaceholder": "Seleccionar SO",
"IPAdress": "Dirección IP",
"ManagementURL": "URL de Administración",
"ManagementURLTooltip": "Enlace a una interfaz web (ej. Proxmox o Portainer) con la que se puede administrar el servidor"
},
"Host": {
"MarkAsHostServer": "Marcar como servidor anfitrión",
"SelectHostServer": "Seleccionar un servidor anfitrión",
"SelectHostServerPlaceholder": "Seleccionar un servidor anfitrión",
"NoHostServer": "Sin servidor anfitrión"
},
"Monitoring": {
"Enable": "Activar la monitorización",
"URL": "URL de Monitorización",
"SetupTitle": "Configuración Requerida del Servidor",
"SetupDescription": "Para habilitar la monitorización, necesitas instalar Glances en tu servidor. Aquí tienes un ejemplo de configuración de Docker Compose:"
}
},
"ServerCard": {
"HardwareInformation": "Información del Hardware",
"ViewDetails": "Ver Detalles",
"OpenManagementURL": "Abrir URL de Administración",
"EditServer": "Editar Servidor",
"DeleteServer": "Eliminar Servidor",
"HostedVMs": "VMs Alojadas",
"ResourceUsage": "Uso de Recursos",
"DeleteConfirmation": {
"Title": "Eliminar {name}",
"Description": "¿Estás seguro de que quieres eliminar este servidor? Esta acción no se puede deshacer.",
"Cancel": "Cancelar",
"Delete": "Eliminar"
}
},
"EditServer": {
"Title": "Editar {name}",
"Save": "Guardar",
"General": {
"Title": "General",
"Icon": "Icono",
"Name": "Nombre",
"OperatingSystem": "Sistema Operativo",
"IPAddress": "Dirección IP",
"ManagementURL": "URL de Administración"
},
"Hardware": {
"Title": "Hardware",
"CPU": "CPU",
"GPU": "GPU",
"RAM": "RAM",
"Disk": "Disco"
},
"Host": {
"Title": "Anfitrión",
"MarkAsHostServer": "Marcar como servidor anfitrión",
"CannotDisableHost": "No se puede desactivar mientras aloja VMs",
"SelectHostServer": "Seleccionar un servidor anfitrión"
},
"Monitoring": {
"Title": "Monitoreo",
"Enable": "Activar el monitoreo",
"URL": "URL de Monitoreo",
"SetupTitle": "Configuración Requerida del Servidor",
"SetupDescription": "Para habilitar el monitoreo, necesitas instalar Glances en tu servidor. Aquí tienes un ejemplo de configuración de Docker Compose:"
}
},
"Pagination": {
"Showing": "Mostrando {start}-{end} de {total} servidores",
"NoServers": "No se encontraron servidores"
},
"Search": {
"Placeholder": "Escribe para buscar..."
}
},
"Applications": {
"Title": "Tus Aplicaciones",
"Breadcrumb": {
"MyInfrastructure": "Mi Infraestructura",
"Applications": "Aplicaciones"
},
"Views": {
"ChangeView": "Cambiar vista",
"ListView": "Vista de Lista",
"GridView": "Vista de Cuadrícula",
"CompactView": "Vista Compacta"
},
"Add": {
"Title": "Añadir una aplicación",
"Name": "Nombre",
"NamePlaceholder": "ej. Portainer",
"Server": "Servidor",
"SelectServer": "Seleccionar servidor",
"Description": "Descripción",
"DescriptionPlaceholder": "Descripción de la aplicación",
"IconURL": "URL del Icono",
"IconURLPlaceholder": "https://example.com/icon.png",
"PublicURL": "URL Pública",
"PublicURLPlaceholder": "https://example.com",
"LocalURL": "URL Local",
"LocalURLPlaceholder": "http://localhost:3000",
"CustomUptimeCheck": "URL Personalizada de Comprobación de Actividad",
"CustomUptimeCheckTooltip": "Cuando está activado, esta URL reemplaza la URL Pública para las comprobaciones de monitoreo de actividad",
"UptimeCheckURL": "URL de Comprobación de Actividad",
"UptimeCheckURLPlaceholder": "https://example.com/status"
},
"Edit": {
"Title": "Editar Aplicación",
"SaveButton": "Guardar Cambios"
},
"Card": {
"Server": "Servidor",
"NoServer": "Sin servidor",
"PublicURL": "URL Pública",
"LocalURL": "URL Local",
"Icon": "Icono",
"Image": "Imagen"
},
"Messages": {
"AddServerFirst": "Primero debes añadir un servidor.",
"AddSuccess": "Aplicación añadida correctamente",
"EditSuccess": "Aplicación editada correctamente",
"DeleteSuccess": "Aplicación eliminada correctamente",
"GetError": "Error al obtener las aplicaciones",
"EditError": "Error al editar la aplicación",
"DeleteError": "Error al eliminar la aplicación",
"NumberValidation": "Por favor, introduce un número entre 1 y 100"
},
"Pagination": {
"Showing": "Mostrando {start}-{end} de {total} aplicaciones",
"NoApplications": "No se encontraron aplicaciones"
},
"Search": {
"Placeholder": "Escribe para buscar..."
}
},
"Uptime": {
"Title": "Tiempo de Actividad",
"Breadcrumb": {
"MyInfrastructure": "Mi Infraestructura",
"Uptime": "Tiempo de Actividad"
},
"TimeRange": {
"Select": "Seleccionar periodo de tiempo",
"LastHour": "Última 1 hora",
"LastDay": "Último 1 día",
"Last7Days": "Últimos 7 días",
"Last30Days": "Últimos 30 días"
},
"Status": {
"Online": "En Línea",
"Offline": "Fuera de Línea",
"NoData": "Sin datos"
},
"Messages": {
"NumberValidation": "Por favor, introduce un número entre 1 y 100",
"NoItems": "No se encontraron elementos",
"Loading": "Cargando..."
},
"Pagination": {
"Showing": "Mostrando {start}-{end} de {total} elementos"
}
},
"Network": {
"Title": "Red",
"Breadcrumb": {
"MyInfrastructure": "Mi Infraestructura",
"Network": "Red"
}
},
"Settings": {
"Title": "Ajustes",
"Breadcrumb": {
"Dashboard": "Panel de Control",
"Settings": "Ajustes"
},
"UserSettings": {
"Title": "Ajustes de Usuario",
"Description": "Gestiona aquí tus ajustes de usuario. Puedes cambiar tu correo electrónico, contraseña y otros ajustes de cuenta.",
"ChangeEmail": {
"Title": "Cambiar Correo Electrónico",
"Placeholder": "Introduce nuevo correo electrónico",
"Button": "Cambiar Correo Electrónico",
"Success": "Correo electrónico cambiado correctamente.",
"Error": "Error"
},
"ChangePassword": {
"Title": "Cambiar Contraseña",
"OldPassword": "Introduce la contraseña antigua",
"NewPassword": "Introduce la nueva contraseña",
"ConfirmPassword": "Confirma la nueva contraseña",
"Button": "Cambiar Contraseña",
"Success": "Contraseña cambiada correctamente.",
"Error": "Error",
"PasswordsDontMatch": "Las contraseñas no coinciden",
"AllFieldsRequired": "Todos los campos son obligatorios"
}
},
"ThemeSettings": {
"Title": "Ajustes del Tema",
"Description": "Selecciona un tema para la aplicación. Puedes elegir entre tema claro, oscuro o del sistema.",
"Light": "Claro",
"Dark": "Oscuro",
"System": "Sistema"
},
"LanguageSettings": {
"Title": "Ajustes de Idioma",
"Description": "Selecciona un idioma para la aplicación.",
"English": "Inglés",
"German": "Alemán"
},
"Notifications": {
"Title": "Notificaciones",
"Description": "Configura las notificaciones para recibir alertas instantáneas cuando una aplicación cambie de estado.",
"AddChannel": "Añadir Canal de Notificación",
"NoNotifications": "No hay notificaciones configuradas",
"NoNotificationsDescription": "Añade un canal de notificación para recibir alertas cuando tus aplicaciones cambien de estado.",
"AddNotification": {
"Title": "Añadir Notificación",
"Name": "Nombre de la Notificación (opcional)",
"Type": "Tipo de Notificación",
"SMTP": {
"Title": "SMTP",
"Description": "Enviar notificaciones vía SMTP",
"Host": "Servidor SMTP",
"Port": "Puerto SMTP",
"Secure": "Conexión Segura (TLS/SSL)",
"Username": "Nombre de Usuario SMTP",
"Password": "Contraseña SMTP",
"From": "Dirección de Remitente",
"To": "Dirección de Destinatario"
},
"Telegram": {
"Title": "Telegram",
"Description": "Enviar notificaciones vía Telegram",
"Token": "Token del Bot",
"ChatId": "ID del Chat"
},
"Discord": {
"Title": "Discord",
"Description": "Enviar notificaciones vía Discord",
"Webhook": "URL del Webhook"
},
"Gotify": {
"Title": "Gotify",
"Description": "Enviar notificaciones vía Gotify",
"Url": "URL de Gotify",
"Token": "Token de Gotify"
},
"Ntfy": {
"Title": "Ntfy",
"Description": "Enviar notificaciones vía Ntfy",
"Url": "URL de Ntfy",
"Token": "Token de Ntfy"
},
"Pushover": {
"Title": "Pushover",
"Description": "Enviar notificaciones vía Pushover",
"Url": "URL de Pushover",
"Token": "Token de Pushover",
"User": "Usuario de Pushover"
},
"Echobell": {
"Title": "Echobell",
"Description": "Enviar notificaciones vía Echobell",
"Url": "URL de Echobell",
"AddMessage": "Añade en Echobell el campo \"message\"."
}
},
"CustomizeText": {
"Display": "Personalizar Texto de Notificación",
"Title": "Personalizar Texto de Notificación",
"Application": "Texto de Notificación para Aplicaciones",
"Server": "Texto de Notificación para Servidores",
"Placeholders": {
"Title": "Puedes usar los siguientes marcadores de posición en el texto:",
"Server": {
"Title": "Relacionado con el servidor:",
"Name": "!name - El nombre del servidor",
"Status": "!status - El estado actual del servidor (en línea/fuera de línea)"
},
"Application": {
"Title": "Relacionado con la aplicación:",
"Name": "!name - El nombre de la aplicación",
"Url": "!url - La URL donde está alojada la aplicación",
"Status": "!status - El estado actual de la aplicación (en línea/fuera de línea)"
}
}
},
"ActiveChannels": "Canales de Notificación Activos",
"Test": "Probar",
"Delete": "Eliminar"
}
}
}

82
package-lock.json generated
View File

@@ -31,6 +31,7 @@
"@xyflow/react": "^12.5.5",
"axios": "^1.8.4",
"bcrypt": "^5.1.1",
"bcryptjs": "^3.0.2",
"chart.js": "^4.4.9",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
@@ -50,12 +51,13 @@
},
"devDependencies": {
"@tailwindcss/postcss": "^4",
"@types/bcryptjs": "^2.4.6",
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",
"autoprefixer": "^10.4.21",
"postcss": "^8.5.3",
"prisma": "^6.6.0",
"prisma": "^6.7.0",
"tailwindcss": "^4.1.4",
"tsx": "^4.19.3",
"typescript": "^5"
@@ -1174,9 +1176,9 @@
}
},
"node_modules/@prisma/config": {
"version": "6.6.0",
"resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.6.0.tgz",
"integrity": "sha512-d8FlXRHsx72RbN8nA2QCRORNv5AcUnPXgtPvwhXmYkQSMF/j9cKaJg+9VcUzBRXGy9QBckNzEQDEJZdEOZ+ubA==",
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.7.0.tgz",
"integrity": "sha512-di8QDdvSz7DLUi3OOcCHSwxRNeW7jtGRUD2+Z3SdNE3A+pPiNT8WgUJoUyOwJmUr5t+JA2W15P78C/N+8RXrOA==",
"devOptional": true,
"license": "Apache-2.0",
"dependencies": {
@@ -1185,30 +1187,30 @@
}
},
"node_modules/@prisma/debug": {
"version": "6.6.0",
"resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.6.0.tgz",
"integrity": "sha512-DL6n4IKlW5k2LEXzpN60SQ1kP/F6fqaCgU/McgaYsxSf43GZ8lwtmXLke9efS+L1uGmrhtBUP4npV/QKF8s2ZQ==",
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.7.0.tgz",
"integrity": "sha512-RabHn9emKoYFsv99RLxvfG2GHzWk2ZI1BuVzqYtmMSIcuGboHY5uFt3Q3boOREM9de6z5s3bQoyKeWnq8Fz22w==",
"devOptional": true,
"license": "Apache-2.0"
},
"node_modules/@prisma/engines": {
"version": "6.6.0",
"resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.6.0.tgz",
"integrity": "sha512-nC0IV4NHh7500cozD1fBoTwTD1ydJERndreIjpZr/S3mno3P6tm8qnXmIND5SwUkibNeSJMpgl4gAnlqJ/gVlg==",
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.7.0.tgz",
"integrity": "sha512-3wDMesnOxPrOsq++e5oKV9LmIiEazFTRFZrlULDQ8fxdub5w4NgRBoxtWbvXmj2nJVCnzuz6eFix3OhIqsZ1jw==",
"devOptional": true,
"hasInstallScript": true,
"license": "Apache-2.0",
"dependencies": {
"@prisma/debug": "6.6.0",
"@prisma/engines-version": "6.6.0-53.f676762280b54cd07c770017ed3711ddde35f37a",
"@prisma/fetch-engine": "6.6.0",
"@prisma/get-platform": "6.6.0"
"@prisma/debug": "6.7.0",
"@prisma/engines-version": "6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed",
"@prisma/fetch-engine": "6.7.0",
"@prisma/get-platform": "6.7.0"
}
},
"node_modules/@prisma/engines-version": {
"version": "6.6.0-53.f676762280b54cd07c770017ed3711ddde35f37a",
"resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.6.0-53.f676762280b54cd07c770017ed3711ddde35f37a.tgz",
"integrity": "sha512-JzRaQ5Em1fuEcbR3nUsMNYaIYrOT1iMheenjCvzZblJcjv/3JIuxXN7RCNT5i6lRkLodW5ojCGhR7n5yvnNKrw==",
"version": "6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed",
"resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed.tgz",
"integrity": "sha512-EvpOFEWf1KkJpDsBCrih0kg3HdHuaCnXmMn7XFPObpFTzagK1N0Q0FMnYPsEhvARfANP5Ok11QyoTIRA2hgJTA==",
"devOptional": true,
"license": "Apache-2.0"
},
@@ -1224,25 +1226,25 @@
}
},
"node_modules/@prisma/fetch-engine": {
"version": "6.6.0",
"resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.6.0.tgz",
"integrity": "sha512-Ohfo8gKp05LFLZaBlPUApM0M7k43a0jmo86YY35u1/4t+vuQH9mRGU7jGwVzGFY3v+9edeb/cowb1oG4buM1yw==",
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.7.0.tgz",
"integrity": "sha512-zLlAGnrkmioPKJR4Yf7NfW3hftcvqeNNEHleMZK9yX7RZSkhmxacAYyfGsCcqRt47jiZ7RKdgE0Wh2fWnm7WsQ==",
"devOptional": true,
"license": "Apache-2.0",
"dependencies": {
"@prisma/debug": "6.6.0",
"@prisma/engines-version": "6.6.0-53.f676762280b54cd07c770017ed3711ddde35f37a",
"@prisma/get-platform": "6.6.0"
"@prisma/debug": "6.7.0",
"@prisma/engines-version": "6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed",
"@prisma/get-platform": "6.7.0"
}
},
"node_modules/@prisma/get-platform": {
"version": "6.6.0",
"resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.6.0.tgz",
"integrity": "sha512-3qCwmnT4Jh5WCGUrkWcc6VZaw0JY7eWN175/pcb5Z6FiLZZ3ygY93UX0WuV41bG51a6JN/oBH0uywJ90Y+V5eA==",
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.7.0.tgz",
"integrity": "sha512-i9IH5lO4fQwnMLvQLYNdgVh9TK3PuWBfQd7QLk/YurnAIg+VeADcZDbmhAi4XBBDD+hDif9hrKyASu0hbjwabw==",
"devOptional": true,
"license": "Apache-2.0",
"dependencies": {
"@prisma/debug": "6.6.0"
"@prisma/debug": "6.7.0"
}
},
"node_modules/@radix-ui/number": {
@@ -2476,6 +2478,13 @@
"@types/node": "*"
}
},
"node_modules/@types/bcryptjs": {
"version": "2.4.6",
"resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.6.tgz",
"integrity": "sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/d3-color": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz",
@@ -2746,6 +2755,15 @@
"node": ">= 10.0.0"
}
},
"node_modules/bcryptjs": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-3.0.2.tgz",
"integrity": "sha512-k38b3XOZKv60C4E2hVsXTolJWfkGRMbILBIe2IBITXciy5bOsTKot5kDrf3ZfufQtQOUN5mXceUEpU1rTl9Uog==",
"license": "BSD-3-Clause",
"bin": {
"bcrypt": "bin/bcrypt"
}
},
"node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -4577,15 +4595,15 @@
"license": "MIT"
},
"node_modules/prisma": {
"version": "6.6.0",
"resolved": "https://registry.npmjs.org/prisma/-/prisma-6.6.0.tgz",
"integrity": "sha512-SYCUykz+1cnl6Ugd8VUvtTQq5+j1Q7C0CtzKPjQ8JyA2ALh0EEJkMCS+KgdnvKW1lrxjtjCyJSHOOT236mENYg==",
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/prisma/-/prisma-6.7.0.tgz",
"integrity": "sha512-vArg+4UqnQ13CVhc2WUosemwh6hr6cr6FY2uzDvCIFwH8pu8BXVv38PktoMLVjtX7sbYThxbnZF5YiR8sN2clw==",
"devOptional": true,
"hasInstallScript": true,
"license": "Apache-2.0",
"dependencies": {
"@prisma/config": "6.6.0",
"@prisma/engines": "6.6.0"
"@prisma/config": "6.7.0",
"@prisma/engines": "6.7.0"
},
"bin": {
"prisma": "build/index.js"

View File

@@ -1,6 +1,6 @@
{
"name": "corecontrol",
"version": "1.0.0",
"version": "1.1.0",
"private": true,
"scripts": {
"dev": "next dev --turbopack",
@@ -32,6 +32,7 @@
"@xyflow/react": "^12.5.5",
"axios": "^1.8.4",
"bcrypt": "^5.1.1",
"bcryptjs": "^3.0.2",
"chart.js": "^4.4.9",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
@@ -51,12 +52,13 @@
},
"devDependencies": {
"@tailwindcss/postcss": "^4",
"@types/bcryptjs": "^2.4.6",
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",
"autoprefixer": "^10.4.21",
"postcss": "^8.5.3",
"prisma": "^6.6.0",
"prisma": "^6.7.0",
"tailwindcss": "^4.1.4",
"tsx": "^4.19.3",
"typescript": "^5"

View File

@@ -0,0 +1,6 @@
-- AlterTable
ALTER TABLE "server" ADD COLUMN "m_cpu" BOOLEAN NOT NULL DEFAULT true,
ADD COLUMN "m_disk" BOOLEAN NOT NULL DEFAULT true,
ADD COLUMN "m_gpu" BOOLEAN NOT NULL DEFAULT true,
ADD COLUMN "m_ram" BOOLEAN NOT NULL DEFAULT true,
ADD COLUMN "m_temp" BOOLEAN NOT NULL DEFAULT true;

View File

@@ -6,6 +6,7 @@
generator client {
provider = "prisma-client-js"
binaryTargets = ["native", "linux-musl-openssl-3.0.x", "linux-musl-arm64-openssl-3.0.x"]
}
datasource db {
@@ -67,6 +68,11 @@ model server {
uptime String?
gpuUsage String?
temp String?
m_cpu Boolean @default(true)
m_ram Boolean @default(true)
m_disk Boolean @default(true)
m_gpu Boolean @default(true)
m_temp Boolean @default(true)
}
model settings {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 130 KiB

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

After

Width:  |  Height:  |  Size: 83 KiB