From 61f578d50cdd7509aa3f38d0919113c0459636c1 Mon Sep 17 00:00:00 2001 From: Lucas Dillmann Date: Sun, 31 May 2026 11:47:03 -0300 Subject: [PATCH 01/13] New home dashboard --- frontend/src/domain/Routes.tsx | 7 + frontend/src/domain/help/HelpPage.css | 83 +++ frontend/src/domain/help/HelpPage.tsx | 225 +++++++ .../domain/{home => help}/videos/Videos.ts | 0 .../{home => help}/videos/access-lists.mp4 | Bin .../domain/{home => help}/videos/caches.mp4 | Bin .../domain/{home => help}/videos/hosts.mp4 | Bin .../{home => help}/videos/integrations.mp4 | Bin .../src/domain/{home => help}/videos/logs.mp4 | Bin .../domain/{home => help}/videos/settings.mp4 | Bin .../videos/ssl-certificates.mp4 | Bin .../domain/{home => help}/videos/streams.mp4 | Bin .../src/domain/{home => help}/videos/vpns.mp4 | Bin frontend/src/domain/home/HomePage.css | 164 +++-- frontend/src/domain/home/HomePage.tsx | 608 ++++++++++++------ .../src/domain/home/components/CountCard.tsx | 24 + .../home/components/NginxStatusCard.tsx | 150 +++++ frontend/src/domain/logs/LogsPage.tsx | 2 +- .../src/domain/onboarding/OnboardingPage.tsx | 2 +- .../domain/trafficstats/TrafficStatsPage.tsx | 2 +- .../domain/user/components/ShellUserMenu.tsx | 3 +- i18n/messages_bn.properties | 71 +- i18n/messages_de.properties | 71 +- i18n/messages_en.properties | 71 +- i18n/messages_es.properties | 71 +- i18n/messages_fr.properties | 71 +- i18n/messages_hi.properties | 71 +- i18n/messages_ja.properties | 71 +- i18n/messages_pt.properties | 71 +- i18n/messages_ru.properties | 71 +- i18n/messages_vi.properties | 71 +- i18n/messages_zh.properties | 71 +- 32 files changed, 1534 insertions(+), 517 deletions(-) create mode 100644 frontend/src/domain/help/HelpPage.css create mode 100644 frontend/src/domain/help/HelpPage.tsx rename frontend/src/domain/{home => help}/videos/Videos.ts (100%) rename frontend/src/domain/{home => help}/videos/access-lists.mp4 (100%) rename frontend/src/domain/{home => help}/videos/caches.mp4 (100%) rename frontend/src/domain/{home => help}/videos/hosts.mp4 (100%) rename frontend/src/domain/{home => help}/videos/integrations.mp4 (100%) rename frontend/src/domain/{home => help}/videos/logs.mp4 (100%) rename frontend/src/domain/{home => help}/videos/settings.mp4 (100%) rename frontend/src/domain/{home => help}/videos/ssl-certificates.mp4 (100%) rename frontend/src/domain/{home => help}/videos/streams.mp4 (100%) rename frontend/src/domain/{home => help}/videos/vpns.mp4 (100%) create mode 100644 frontend/src/domain/home/components/CountCard.tsx create mode 100644 frontend/src/domain/home/components/NginxStatusCard.tsx diff --git a/frontend/src/domain/Routes.tsx b/frontend/src/domain/Routes.tsx index 78eec0179..4c635b525 100644 --- a/frontend/src/domain/Routes.tsx +++ b/frontend/src/domain/Routes.tsx @@ -1,6 +1,7 @@ import React from "react" import LoginPage from "./authentication/LoginPage" import HomePage from "./home/HomePage" +import HelpPage from "./help/HelpPage" import AppRoute from "../core/components/router/AppRoute" import OnboardingPage from "./onboarding/OnboardingPage" import { @@ -237,6 +238,12 @@ const Routes: AppRoute[] = [ icon: , }, }, + { + path: "/help", + requiresAuthentication: true, + fullPage: false, + component: , + }, { path: "/", requiresAuthentication: true, diff --git a/frontend/src/domain/help/HelpPage.css b/frontend/src/domain/help/HelpPage.css new file mode 100644 index 000000000..8f7afcd2e --- /dev/null +++ b/frontend/src/domain/help/HelpPage.css @@ -0,0 +1,83 @@ +.help-guide-container h1 { + font-size: 38px; + margin: 0; + text-align: center; +} + +.help-guide-subtitle { + margin: 10px 0 0 !important; + font-size: 28px !important; + text-align: center; +} + +.help-guide-header-container { + background: var(--nginxIgnition-shellHeaderBg, var(--nginxIgnition-colorBgLayout)); + padding: 120px 40px; + margin-bottom: 50px; +} + +.help-guide-container h2 { + font-size: 28px; + margin-top: 20px; +} + +.help-guide-container p { + font-size: 16px; + margin: 10px 0; + padding: 0; +} + +.help-guide-right-side-video, +.help-guide-left-side-video { + flex-grow: 0; + flex-shrink: 0; + width: 40%; +} + +.help-guide-container video { + width: 100%; +} + +.help-guide-right-side-video { + margin: 0 0 0 40px; +} + +.help-guide-left-side-video { + margin: 0 40px 0 0; +} + +.help-guide-video-mask { + border-radius: 10px; + overflow: hidden; + height: fit-content; + line-height: 0; +} + +.help-guide-video-mask video { + margin: 0; + padding: 0; + line-height: 0 !important; +} + +.help-guide-section { + margin-bottom: 80px; + padding: 0 40px; +} + +.help-guide-section-content { + flex-grow: 1; + width: 60%; +} + +.help-guide-footer-container { + background: var(--nginxIgnition-shellHeaderBg, var(--nginxIgnition-colorBgLayout)); + padding: 60px 40px; +} + +.help-guide-footer-container h1 { + font-size: 24px; +} + +.help-guide-footer-container p { + font-size: 18px !important; +} diff --git a/frontend/src/domain/help/HelpPage.tsx b/frontend/src/domain/help/HelpPage.tsx new file mode 100644 index 000000000..90b193056 --- /dev/null +++ b/frontend/src/domain/help/HelpPage.tsx @@ -0,0 +1,225 @@ +import React from "react" +import AppShellContext from "../../core/components/shell/AppShellContext" +import "./HelpPage.css" +import { + AuditOutlined, + BlockOutlined, + FileProtectOutlined, + FileSearchOutlined, + HddOutlined, + MergeCellsOutlined, + SettingOutlined, + ApartmentOutlined, + RocketOutlined, +} from "@ant-design/icons" +import { Flex } from "antd" +import Videos from "./videos/Videos" +import { Link } from "react-router-dom" +import MessageKey from "../../core/i18n/model/MessageKey.generated" +import { I18n } from "../../core/i18n/I18n" + +export default class HelpPage extends React.PureComponent { + componentDidMount() { + AppShellContext.get().updateConfig({ + noContainerPadding: true, + }) + } + + render() { + return ( +
+
+

+ +

+

+ +

+
+ + + +

+ +

+

+ +

+

+ +

+

+ +

+
+ +
+
+
+
+ + + +
+
+
+ +

+ +

+

+ +

+

+ +

+
+
+ + + +

+ +

+

+ +

+

+ +

+

+ +

+
+ +
+
+
+
+ + + +
+
+
+ +

+ +

+

+ +

+

+ +

+
+
+ + + +

+ +

+

+ +

+
+ +
+
+
+
+ + + +
+
+
+ +

+ +

+

+ +

+
+
+ + + +

+ +

+

+ +

+
+ +
+
+
+
+ + + +
+
+
+ +

+ +

+

+ +

+

+ +

+
+
+ + + +

+ +

+

+ +

+

+ +

+

+ +

+
+ +
+
+
+
+ +
+

+ +

+

+ + + + . +

+
+
+ ) + } +} diff --git a/frontend/src/domain/home/videos/Videos.ts b/frontend/src/domain/help/videos/Videos.ts similarity index 100% rename from frontend/src/domain/home/videos/Videos.ts rename to frontend/src/domain/help/videos/Videos.ts diff --git a/frontend/src/domain/home/videos/access-lists.mp4 b/frontend/src/domain/help/videos/access-lists.mp4 similarity index 100% rename from frontend/src/domain/home/videos/access-lists.mp4 rename to frontend/src/domain/help/videos/access-lists.mp4 diff --git a/frontend/src/domain/home/videos/caches.mp4 b/frontend/src/domain/help/videos/caches.mp4 similarity index 100% rename from frontend/src/domain/home/videos/caches.mp4 rename to frontend/src/domain/help/videos/caches.mp4 diff --git a/frontend/src/domain/home/videos/hosts.mp4 b/frontend/src/domain/help/videos/hosts.mp4 similarity index 100% rename from frontend/src/domain/home/videos/hosts.mp4 rename to frontend/src/domain/help/videos/hosts.mp4 diff --git a/frontend/src/domain/home/videos/integrations.mp4 b/frontend/src/domain/help/videos/integrations.mp4 similarity index 100% rename from frontend/src/domain/home/videos/integrations.mp4 rename to frontend/src/domain/help/videos/integrations.mp4 diff --git a/frontend/src/domain/home/videos/logs.mp4 b/frontend/src/domain/help/videos/logs.mp4 similarity index 100% rename from frontend/src/domain/home/videos/logs.mp4 rename to frontend/src/domain/help/videos/logs.mp4 diff --git a/frontend/src/domain/home/videos/settings.mp4 b/frontend/src/domain/help/videos/settings.mp4 similarity index 100% rename from frontend/src/domain/home/videos/settings.mp4 rename to frontend/src/domain/help/videos/settings.mp4 diff --git a/frontend/src/domain/home/videos/ssl-certificates.mp4 b/frontend/src/domain/help/videos/ssl-certificates.mp4 similarity index 100% rename from frontend/src/domain/home/videos/ssl-certificates.mp4 rename to frontend/src/domain/help/videos/ssl-certificates.mp4 diff --git a/frontend/src/domain/home/videos/streams.mp4 b/frontend/src/domain/help/videos/streams.mp4 similarity index 100% rename from frontend/src/domain/home/videos/streams.mp4 rename to frontend/src/domain/help/videos/streams.mp4 diff --git a/frontend/src/domain/home/videos/vpns.mp4 b/frontend/src/domain/help/videos/vpns.mp4 similarity index 100% rename from frontend/src/domain/home/videos/vpns.mp4 rename to frontend/src/domain/help/videos/vpns.mp4 diff --git a/frontend/src/domain/home/HomePage.css b/frontend/src/domain/home/HomePage.css index d23b8a197..601fb4955 100644 --- a/frontend/src/domain/home/HomePage.css +++ b/frontend/src/domain/home/HomePage.css @@ -1,83 +1,147 @@ -.home-guide-container h1 { - font-size: 38px; - margin: 0; - text-align: center; +.home-dashboard-container { + gap: 24px; +} + +.home-dashboard-overview-row { + gap: 24px; + width: 100%; } -.home-guide-subtitle { - margin: 10px 0 0 !important; - font-size: 28px !important; - text-align: center; +.home-dashboard-totals-section { + flex: 1; + min-width: 280px; } -.home-guide-header-container { - background: var(--nginxIgnition-shellHeaderBg, var(--nginxIgnition-colorBgLayout)); - padding: 120px 40px; - margin-bottom: 50px; +.home-dashboard-nginx-section { + flex: 0 0 auto; + min-width: 220px; + margin-left: auto; } -.home-guide-container h2 { - font-size: 28px; - margin-top: 20px; +.home-dashboard-nginx-control { + padding: 16px; + border: 1px dashed var(--nginxIgnition-colorBorder); + border-radius: 8px; + background: transparent; } -.home-guide-container p { +.home-dashboard-section { + display: flex; + flex-direction: column; + gap: 16px; +} + +.home-dashboard-section-header { + align-items: center; + justify-content: space-between; +} + +.home-dashboard-section-title { font-size: 16px; - margin: 10px 0; - padding: 0; + font-weight: 500; + margin: 0; + color: var(--nginxIgnition-colorTextSecondary); +} + +.home-dashboard-cards-row { + display: flex; + flex-wrap: wrap; + gap: 16px; +} + +.home-dashboard-stat-card-link { + flex: 1; + min-width: 180px; + color: inherit; + text-decoration: none; + display: block; } -.home-guide-right-side-video, -.home-guide-left-side-video { - flex-grow: 0; +.home-dashboard-stat-card-link:hover .home-dashboard-stat-card { + background: var(--nginxIgnition-colorBgContainer); +} + +.home-dashboard-stat-card { + flex: 1; + min-width: 180px; + padding: 16px; + background: var(--nginxIgnition-colorBgLayout); + border-radius: 8px; + height: 100%; +} + +.home-dashboard-nginx-status-value { + font-size: 24px; + font-weight: 600; + line-height: 1.2; +} + +.home-dashboard-status-dot { + display: inline-block; + width: 10px; + height: 10px; + border-radius: 50%; + margin-right: 8px; flex-shrink: 0; - width: 40%; } -.home-guide-container video { - width: 100%; +.home-dashboard-nginx-actions { + margin-top: 12px; } -.home-guide-right-side-video { - margin: 0 0 0 40px; +.home-dashboard-split-row { + gap: 24px; + flex-wrap: wrap; } -.home-guide-left-side-video { - margin: 0 40px 0 0; +.home-dashboard-panel { + flex: 1; + min-width: 320px; + padding: 16px; + background: var(--nginxIgnition-colorBgLayout); + border-radius: 8px; + display: flex; + flex-direction: column; + gap: 16px; } -.home-guide-video-mask { - border-radius: 10px; - overflow: hidden; - height: fit-content; - line-height: 0; +.home-dashboard-cert-list { + gap: 8px; } -.home-guide-video-mask video { - margin: 0; - padding: 0; - line-height: 0 !important; +.home-dashboard-cert-item { + justify-content: space-between; + padding: 8px 12px; + background: var(--nginxIgnition-colorBgContainer); + border-radius: 6px; } -.home-guide-section { - margin-bottom: 80px; - padding: 0 40px; +.home-dashboard-cert-domains { + font-weight: 500; + color: inherit; } -.home-guide-section-content { - flex-grow: 1; - width: 60%; +.home-dashboard-cert-expiry { + color: var(--nginxIgnition-colorTextSecondary); + white-space: nowrap; + margin-left: 12px; } -.home-guide-footer-container { - background: var(--nginxIgnition-shellHeaderBg, var(--nginxIgnition-colorBgLayout)); - padding: 60px 40px; +.home-dashboard-log-panel .log-viewer-container { + max-height: 280px; } -.home-guide-footer-container h1 { - font-size: 24px; +.home-dashboard-empty { + padding: 16px 0; +} + +.home-dashboard-section .traffic-stats-cards-row { + display: flex; + flex-wrap: wrap; + gap: 16px; } -.home-guide-footer-container p { - font-size: 18px !important; +.home-dashboard-section .traffic-stats-stat-card { + flex: 1; + min-width: 180px; } diff --git a/frontend/src/domain/home/HomePage.tsx b/frontend/src/domain/home/HomePage.tsx index 3645846a5..984d27982 100644 --- a/frontend/src/domain/home/HomePage.tsx +++ b/frontend/src/domain/home/HomePage.tsx @@ -1,225 +1,435 @@ import React from "react" +import { Button, Empty, Flex } from "antd" import AppShellContext from "../../core/components/shell/AppShellContext" -import "./HomePage.css" -import { - AuditOutlined, - BlockOutlined, - FileProtectOutlined, - FileSearchOutlined, - HddOutlined, - MergeCellsOutlined, - SettingOutlined, - ApartmentOutlined, - RocketOutlined, -} from "@ant-design/icons" -import { Flex } from "antd" -import Videos from "./videos/Videos" -import { Link } from "react-router-dom" +import Preloader from "../../core/components/preloader/Preloader" +import EmptyStates from "../../core/components/emptystate/EmptyStates" +import { isAccessGranted } from "../../core/components/accesscontrol/IsAccessGranted" +import { UserAccessLevel } from "../user/model/UserAccessLevel" import MessageKey from "../../core/i18n/model/MessageKey.generated" import { I18n } from "../../core/i18n/I18n" +import NginxService from "../nginx/NginxService" +import NginxMetadata, { NginxSupportType } from "../nginx/model/NginxMetadata" +import HostService from "../host/HostService" +import StreamService from "../stream/StreamService" +import CertificateService from "../certificate/CertificateService" +import { CertificateResponse } from "../certificate/model/CertificateResponse" +import SettingsService from "../settings/SettingsService" +import SettingsDto from "../settings/model/SettingsDto" +import TrafficStatsService from "../trafficstats/TrafficStatsService" +import TrafficStatsResponse from "../trafficstats/model/TrafficStatsResponse" +import ZoneStatCards from "../trafficstats/components/ZoneStatCards" +import LogViewer from "../logs/components/LogViewer" +import LogLine from "../logs/model/LogLine" +import { Link } from "react-router-dom" +import { navigateTo } from "../../core/components/router/AppRouter" +import CountCard from "./components/CountCard" +import NginxStatusCard from "./components/NginxStatusCard" +import "./HomePage.css" +import "../trafficstats/TrafficStatsPage.css" +import "../logs/components/LogViewer.css" + +interface HomePageState { + loading: boolean + metadata?: NginxMetadata + nginxRunning?: boolean + settings?: SettingsDto + hostCount?: number + streamCount?: number + certificateCount?: number + expiringCertificates: CertificateResponse[] + errorLogs: LogLine[] + stats?: TrafficStatsResponse + error?: Error +} + +export default class HomePage extends React.Component { + private readonly nginxService: NginxService + private readonly hostService: HostService + private readonly streamService: StreamService + private readonly certificateService: CertificateService + private readonly settingsService: SettingsService + private readonly trafficStatsService: TrafficStatsService + + constructor(props: object) { + super(props) + this.nginxService = new NginxService() + this.hostService = new HostService() + this.streamService = new StreamService() + this.certificateService = new CertificateService() + this.settingsService = new SettingsService() + this.trafficStatsService = new TrafficStatsService() + this.state = { + loading: true, + expiringCertificates: [], + errorLogs: [], + } + } -export default class HomePage extends React.PureComponent { componentDidMount() { + this.configureShell() + this.fetchData() + } + + private canViewNginxServer(): boolean { + return isAccessGranted(UserAccessLevel.READ_ONLY, permissions => permissions.nginxServer) + } + + private canViewHosts(): boolean { + return isAccessGranted(UserAccessLevel.READ_ONLY, permissions => permissions.hosts) + } + + private canViewStreams(): boolean { + return isAccessGranted(UserAccessLevel.READ_ONLY, permissions => permissions.streams) + } + + private canViewCertificates(): boolean { + return isAccessGranted(UserAccessLevel.READ_ONLY, permissions => permissions.certificates) + } + + private canViewLogs(): boolean { + return isAccessGranted(UserAccessLevel.READ_ONLY, permissions => permissions.logs) + } + + private canViewTrafficStats(): boolean { + return isAccessGranted(UserAccessLevel.READ_ONLY, permissions => permissions.trafficStats) + } + + private canViewSettings(): boolean { + return isAccessGranted(UserAccessLevel.READ_ONLY, permissions => permissions.settings) + } + + private configureShell() { AppShellContext.get().updateConfig({ - noContainerPadding: true, + title: MessageKey.FrontendHomeTitle, + subtitle: MessageKey.FrontendHomeSubtitle, + actions: [ + { + description: MessageKey.CommonRefresh, + onClick: () => this.refreshData(), + }, + ], }) } - render() { + private refreshData() { + const { loading } = this.state + if (loading) return + + this.setState({ loading: true }, () => this.fetchData()) + } + + private filterExpiringCertificates(certificates: CertificateResponse[]): CertificateResponse[] { + const now = new Date() + const windowEnd = new Date(now.getTime() + 30 * 24 * 60 * 60 * 1000) + + return certificates + .filter(certificate => { + const validUntil = new Date(certificate.validUntil) + return validUntil >= now && validUntil <= windowEnd + }) + .sort((left, right) => new Date(left.validUntil).getTime() - new Date(right.validUntil).getTime()) + } + + private daysUntilExpiry(validUntil: string): number { + const now = new Date() + now.setHours(0, 0, 0, 0) + const expiry = new Date(validUntil) + expiry.setHours(0, 0, 0, 0) + return Math.ceil((expiry.getTime() - now.getTime()) / (24 * 60 * 60 * 1000)) + } + + private formatCertificateDomains(certificate: CertificateResponse): string { + if (certificate.domainNames.length === 0) return "" + return certificate.domainNames.join(", ") + } + + private async fetchData() { + this.setState({ loading: true }) + + try { + const canNginxServer = this.canViewNginxServer() + const canHosts = this.canViewHosts() + const canStreams = this.canViewStreams() + const canCertificates = this.canViewCertificates() + const canLogs = this.canViewLogs() + const canTrafficStats = this.canViewTrafficStats() + const needsMetadata = canNginxServer || canTrafficStats + const needsSettings = canLogs || canTrafficStats + + const [metadata, nginxRunning, settings, hostsPage, streamsPage, certificatesPage] = await Promise.all([ + needsMetadata ? this.nginxService.getMetadata() : Promise.resolve(undefined), + needsMetadata ? this.nginxService.isRunning() : Promise.resolve(undefined), + needsSettings ? this.settingsService.get() : Promise.resolve(undefined), + canHosts ? this.hostService.list(1, 0) : Promise.resolve(undefined), + canStreams ? this.streamService.list(1, 0) : Promise.resolve(undefined), + canCertificates ? this.certificateService.list(100, 0) : Promise.resolve(undefined), + ]) + + let errorLogs: LogLine[] = [] + if (canLogs && settings?.nginx.logs.serverLogsEnabled) { + errorLogs = await this.nginxService.logs(15, 0) + } + + let stats: TrafficStatsResponse | undefined + const statsSupported = metadata?.availableSupport.stats !== NginxSupportType.NONE + const statsEnabled = metadata?.stats.enabled === true + if (canTrafficStats && statsSupported && statsEnabled && nginxRunning) { + stats = await this.trafficStatsService.getStats() + } + + this.setState({ + loading: false, + error: undefined, + metadata, + nginxRunning, + settings, + hostCount: hostsPage?.totalItems, + streamCount: streamsPage?.totalItems, + certificateCount: certificatesPage?.totalItems, + expiringCertificates: certificatesPage + ? this.filterExpiringCertificates(certificatesPage.contents) + : [], + errorLogs, + stats, + }) + } catch (error) { + this.setState({ loading: false, error: error as Error }) + } + } + + private renderOverviewSection() { + const { hostCount, streamCount, certificateCount, metadata } = this.state + const countCards: React.ReactNode[] = [] + + if (this.canViewHosts() && hostCount !== undefined) { + countCards.push() + } + + if (this.canViewStreams() && streamCount !== undefined) { + countCards.push( + , + ) + } + + if (this.canViewCertificates() && certificateCount !== undefined) { + countCards.push( + , + ) + } + + const canViewNginx = this.canViewNginxServer() + if (countCards.length === 0 && !canViewNginx) return null + return ( -
-
-

- -

-

- -

-
- - - -

- -

-

- -

-

- -

-

- -

-
- -
-
-
-
+ + {countCards.length > 0 && ( +
+

+ +

+ {countCards} +
+ )} + {canViewNginx && ( +
+

+ +

+ +
+ )} +
+ ) + } - - -
-
-
- -

- -

-

- -

-

- -

-
-
+ private renderTrafficEmptyState() { + const { metadata, nginxRunning, stats } = this.state - - -

- -

-

- -

-

- -

-

- -

-
- -
-
-
-
+ if (metadata?.availableSupport?.stats === NginxSupportType.NONE) { + return ( + } + /> + ) + } - - -
-
-
- -

- -

-

- -

-

- -

-
-
+ if (metadata && !metadata.stats.enabled) { + return ( + } + > + {this.canViewSettings() && ( + + )} + + ) + } - - -

- -

-

- -

-
- -
-
-
-
+ if (nginxRunning === false) { + return ( + } + /> + ) + } - - -
-
-
- -

- -

-

- -

-
-
+ if (stats?.serverZones?.["*"]?.requestCounter === 0) { + return ( + } + /> + ) + } - - -

- -

-

- -

-
- -
-
-
-
+ return null + } - - -
-
-
- -

- -

-

- -

-

- -

-
+ private renderTrafficSection() { + if (!this.canViewTrafficStats()) return null + + const { stats } = this.state + const globalZone = stats?.serverZones?.["*"] + const emptyState = this.renderTrafficEmptyState() + + return ( +
+ +

+ +

+ {!emptyState && ( + + + + )}
+ {emptyState} + {!emptyState && globalZone && ( + + )} +
+ ) + } - - -

- -

-

- -

-

- -

-

- -

-
- -
-
+ private renderExpiringCertificateItem(certificate: CertificateResponse) { + const days = this.daysUntilExpiry(certificate.validUntil) + const expiryMessage = + days <= 0 ? ( + + ) : ( + + ) + + return ( + + + {this.formatCertificateDomains(certificate)} + + {expiryMessage} + + ) + } + + private renderExpiringCertificatesPanel() { + if (!this.canViewCertificates()) return null + + const { expiringCertificates } = this.state + + return ( +
+

+ +

+ {expiringCertificates.length === 0 ? ( + } + /> + ) : ( + + {expiringCertificates.map(certificate => this.renderExpiringCertificateItem(certificate))} - + )} +
+ ) + } -
-

- -

-

- - - - . -

-
+ private renderRecentErrorsPanel() { + if (!this.canViewLogs()) return null + + const { settings, errorLogs } = this.state + const serverLogsEnabled = settings?.nginx.logs.serverLogsEnabled === true + + return ( +
+

+ +

+ {!serverLogsEnabled ? ( + } + /> + ) : errorLogs.length === 0 ? ( + } + /> + ) : ( + + )}
) } + + private renderDetailsSection() { + const expiringPanel = this.renderExpiringCertificatesPanel() + const errorsPanel = this.renderRecentErrorsPanel() + + if (expiringPanel === null && errorsPanel === null) return null + + return ( + + {expiringPanel} + {errorsPanel} + + ) + } + + render() { + const { loading, error } = this.state + + if (error !== undefined) return EmptyStates.FailedToFetch + + return ( + + + {this.renderOverviewSection()} + {this.renderTrafficSection()} + {this.renderDetailsSection()} + + + ) + } } diff --git a/frontend/src/domain/home/components/CountCard.tsx b/frontend/src/domain/home/components/CountCard.tsx new file mode 100644 index 000000000..14b32d7bd --- /dev/null +++ b/frontend/src/domain/home/components/CountCard.tsx @@ -0,0 +1,24 @@ +import React from "react" +import { Statistic } from "antd" +import { Link } from "react-router-dom" +import { I18n, I18nMessage } from "../../../core/i18n/I18n" + +export interface CountCardProps { + title: I18nMessage + count: number + linkTo: string +} + +export default class CountCard extends React.PureComponent { + render() { + const { title, count, linkTo } = this.props + + return ( + +
+ } value={count} /> +
+ + ) + } +} diff --git a/frontend/src/domain/home/components/NginxStatusCard.tsx b/frontend/src/domain/home/components/NginxStatusCard.tsx new file mode 100644 index 000000000..6aa23e9cc --- /dev/null +++ b/frontend/src/domain/home/components/NginxStatusCard.tsx @@ -0,0 +1,150 @@ +import React from "react" +import { Button, ConfigProvider, Flex } from "antd" +import Preloader from "../../../core/components/preloader/Preloader" +import NginxService from "../../nginx/NginxService" +import NginxEventDispatcher from "../../nginx/listener/NginxEventDispatcher" +import { NginxEventListener } from "../../nginx/listener/NginxEventListener" +import UserConfirmation from "../../../core/components/confirmation/UserConfirmation" +import GenericNginxAction, { ActionType } from "../../nginx/actions/GenericNginxAction" +import { isAccessGranted } from "../../../core/components/accesscontrol/IsAccessGranted" +import { UserAccessLevel } from "../../user/model/UserAccessLevel" +import MessageKey from "../../../core/i18n/model/MessageKey.generated" +import { I18n, I18nMessage } from "../../../core/i18n/I18n" + +interface NginxStatusCardState { + loading: boolean + running?: boolean +} + +export default class NginxStatusCard extends React.Component { + private readonly service: NginxService + private readonly listener: NginxEventListener + + constructor(props: object) { + super(props) + this.service = new NginxService() + this.state = { loading: true } + this.listener = () => this.handleNginxEvent() + } + + componentDidMount() { + NginxEventDispatcher.register(this.listener) + this.refreshStatus() + } + + componentWillUnmount() { + NginxEventDispatcher.remove(this.listener) + } + + private handleNginxEvent() { + const { loading } = this.state + if (loading) return + + this.setState({ loading: true }, () => this.refreshStatus()) + } + + private refreshStatus() { + this.service + .isRunning() + .catch(() => undefined) + .then(running => this.setState({ running, loading: false })) + } + + private statusMetadata(): { color: string; label: I18nMessage } { + const { running } = this.state + + if (running === undefined) { + return { + color: "var(--nginxIgnition-colorWarning)", + label: MessageKey.FrontendHomeNginxUnknown, + } + } + + if (running) { + return { + color: "var(--nginxIgnition-colorSuccess)", + label: MessageKey.FrontendHomeNginxOnline, + } + } + + return { + color: "var(--nginxIgnition-colorError)", + label: MessageKey.FrontendHomeNginxOffline, + } + } + + private confirmStop() { + UserConfirmation.ask(MessageKey.FrontendHomeNginxStopConfirmation).then(() => { + this.performAction(ActionType.STOP) + }) + } + + private performAction(action: ActionType) { + this.setState({ loading: true }, () => { + new GenericNginxAction(action, "nginxIgnition.homeDashboard") + .execute() + .catch(() => {}) + .then(() => this.refreshStatus()) + }) + } + + private renderStatusValue() { + const { color, label } = this.statusMetadata() + + return ( + + + + + ) + } + + private renderActions() { + const { running } = this.state + const readOnly = !isAccessGranted(UserAccessLevel.READ_WRITE, permissions => permissions.nginxServer) + + if (!running) { + return ( + + ) + } + + return ( + + + + + ) + } + + render() { + const { loading } = this.state + + return ( + +
+
+
{this.renderStatusValue()}
+
+ {this.renderActions()} +
+
+ ) + } +} diff --git a/frontend/src/domain/logs/LogsPage.tsx b/frontend/src/domain/logs/LogsPage.tsx index 07ed86cfb..7d7a6e418 100644 --- a/frontend/src/domain/logs/LogsPage.tsx +++ b/frontend/src/domain/logs/LogsPage.tsx @@ -188,7 +188,7 @@ export default class LogsPage extends React.Component { private buildAutoRefreshOptions() { return [1, 5, 10, 30, 60].map(item => ({ - label: , + label: , value: item, })) } diff --git a/frontend/src/domain/onboarding/OnboardingPage.tsx b/frontend/src/domain/onboarding/OnboardingPage.tsx index b648424c4..c0a2d013a 100644 --- a/frontend/src/domain/onboarding/OnboardingPage.tsx +++ b/frontend/src/domain/onboarding/OnboardingPage.tsx @@ -238,7 +238,7 @@ export default class OnboardingPage extends React.Component + return } return {this.renderContent()} diff --git a/frontend/src/domain/trafficstats/TrafficStatsPage.tsx b/frontend/src/domain/trafficstats/TrafficStatsPage.tsx index 7ab2f2d0e..091eaba98 100644 --- a/frontend/src/domain/trafficstats/TrafficStatsPage.tsx +++ b/frontend/src/domain/trafficstats/TrafficStatsPage.tsx @@ -162,7 +162,7 @@ export default class TrafficStatsPage extends React.Component ({ - label: , + label: , value: item, })) } diff --git a/frontend/src/domain/user/components/ShellUserMenu.tsx b/frontend/src/domain/user/components/ShellUserMenu.tsx index d84be41d0..4a6ecc6d1 100644 --- a/frontend/src/domain/user/components/ShellUserMenu.tsx +++ b/frontend/src/domain/user/components/ShellUserMenu.tsx @@ -1,6 +1,6 @@ import React from "react" import { Flex } from "antd" -import { LockOutlined, LogoutOutlined } from "@ant-design/icons" +import { LockOutlined, LogoutOutlined, QuestionCircleOutlined } from "@ant-design/icons" import AppContext from "../../../core/components/context/AppContext" import ThemeToggle from "../../../core/components/theme/ThemeToggle" import "./ShellUserMenu.css" @@ -70,6 +70,7 @@ export default class ShellUserMenu extends React.Component this.securitySettingsModal(true, "password")} /> + navigateTo("/help")} />
this.securitySettingsModal(true, "profile")}> {user?.name} diff --git a/i18n/messages_bn.properties b/i18n/messages_bn.properties index 762c02e54..51547ce06 100644 --- a/i18n/messages_bn.properties +++ b/i18n/messages_bn.properties @@ -732,6 +732,7 @@ common/add-duration=সময়কাল যোগ করুন common/advanced=অ্যাডভান্সড common/app-name=nginx ignition common/at-least-one-required=অন্তত একটি মান প্রদান করতে হবে +common/auto-refresh-option=প্রতি ${seconds} সেকেন্ডে common/auto-refresh=স্বয়ংক্রিয় রিফ্রেশ common/between-values=মান অবশ্যই ${min} এবং ${max} এর মধ্যে হতে হবে common/binding=বাইন্ডিং @@ -1099,29 +1100,52 @@ frontend/export/section-database-title=ডাটাবেস ব্যাকআ frontend/export/section-nginx-description-1=যখনই আপনি nginx ignition ব্যবহার করে কোনো পরিবর্তন করেন এবং সার্ভার রিলোড করেন, আপনার সক্রিয় করা সমস্ত হোস্ট, স্ট্রিম, SSL সার্টিফিকেট এবং আরও অনেক কিছু দিয়ে nginx কনফিগারেশন ফাইল জেনারেট বা আপডেট করা হয়। frontend/export/section-nginx-description-2=nginx কনফিগারেশন ফাইল ডাউনলোড করে, আপনি এর বিষয়বস্তু বিশ্লেষণ/রিভিউ করতে পারেন অথবা এমনকি এই একই সেটিংস এবং আচরণ দিয়ে একটি nginx সার্ভার ডেপ্লয় করতে পারেন প্রায় একইভাবে যেভাবে nginx ignition করে। frontend/export/subtitle=ব্যাকআপ এবং পুনরুদ্ধারের জন্য nginx কনফিগারেশন ফাইল এবং ignition ডাটাবেস কন্টেন্ট ডাউনলোড করুন -frontend/home/access-lists-description=অ্যাক্সেস লিস্ট কোনো রাউট বা সম্পূর্ণ হোস্টকে রক্ষা করার একটি সহজ উপায় প্রদান করে, ব্যবহারকারী অনুমোদিত IP-র রেঞ্জ থেকে এসেছে কিনা বা একটি বৈধ ইউজারনেম এবং পাসওয়ার্ড দ্বারা চিহ্নিত কিনা (অথবা উভয়, IP এবং ক্রেডেনশিয়াল) তা পরীক্ষা করে। -frontend/home/cache-description-1=nginx-এর কন্টেন্ট ক্যাশিং ক্ষমতা সক্রিয় করে আপনার ওয়েবসাইটগুলোর গতি বাড়ান এবং আপস্ট্রিম সার্ভারের লোড কমান। Ignition ক্যাশ রুলস কনফিগার করা সহজ করে তোলে যা নির্ধারণ করে কোন অনুরোধগুলো ক্যাশ করা উচিত এবং কতক্ষণের জন্য। -frontend/home/cache-description-2=আপনি HTTP স্ট্যাটাস কোড, ফাইল এক্সটেনশন, রিকোয়েস্ট মেথড এবং আরও অনেক কিছু দ্বারা ক্যাশ আচরণ কাস্টমাইজ করতে পারেন। বাসি (stale) কন্টেন্ট হ্যান্ডলিং, ব্যাকগ্রাউন্ড আপডেট এবং কনকারেন্সি লকের মতো উন্নত বৈশিষ্ট্যগুলো আপনার কন্টেন্ট কীভাবে ক্যাশ এবং সার্ভ করা হয় তার উপর আপনাকে সূক্ষ্ম নিয়ন্ত্রণ দেয়। -frontend/home/footer-link=আমাদের গিটহাব পেজে যোগাযোগ করুন -frontend/home/footer-subtitle=আমরা আপনার থেকে কিছু প্রতিক্রিয়া পেতে চাই। -frontend/home/footer-title=এখনও প্রশ্ন আছে বা কিছু মিস করেছেন? -frontend/home/hosts-description-1=একটি ভার্চুয়াল হোস্ট, সংক্ষেপে হোস্ট, হলো একটি ওয়েবসাইট যা nginx সার্ভার ব্রাউজারে খোলার জন্য উপলব্ধ করবে। আপনি প্রধান মেনুতে বাম দিকে সমস্ত ম্যানেজ করা হোস্ট খুঁজে পেতে পারেন। -frontend/home/hosts-description-2=nginx ignition এই ধরনের ওয়েবসাইট কনফিগার করার একটি স্বজ্ঞাত উপায় প্রদান করে। উদাহরণস্বরূপ, যদি আপনার একটি NAS থাকে এবং এতে কিছু সার্ভিস চালু থাকে (যেমন Jellyfin, Vaultwarden এবং আরও অনেক কিছু), ignition আপনাকে jellyfin.myhome.com এর মতো একটি ডোমেইন থেকে এটি অ্যাক্সেস করার একটি সহজ উপায় সক্ষম করে, যা একটি IP এবং পোর্টের চেয়ে মনে রাখা এবং ব্যবহার করা অনেক সহজ। -frontend/home/hosts-description-3=প্রতিটি হোস্টের রাউটের একটি সেট থাকবে, যা হলো নিয়ম যা সংজ্ঞায়িত করে কোন রিকোয়েস্ট প্যাটার্নগুলো ফরোয়ার্ড করা উচিত এবং কোথায়, এবং বাইন্ডিং, যা হলো সংজ্ঞা যে কোন পোর্টে nginx এই ধরনের রিকোয়েস্টের জন্য অপেক্ষা করবে। -frontend/home/integrations-description=আপনার অ্যাপ কি Docker কন্টেইনারে বা TrueNAS-এ চলছে? আপনি nginx ignition-এর নেটিভ ইন্টিগ্রেশন সক্রিয় করতে পারেন এবং সহজেই হোস্ট রিকোয়েস্ট ফরোয়ার্ড করার গন্তব্য অ্যাপ হিসেবে একটি কন্টেইনার বা অ্যাপ বেছে নিতে পারেন। -frontend/home/logs-description-1=কী রিকোয়েস্ট করা হয়েছে বা কেন কিছু প্রত্যাশিতভাবে কাজ করছে না তা জানা দরকার? nginx ignition আপনাকে nginx লগগুলোও পরীক্ষা করার একটি সহজ উপায় প্রদান করে। শুধু হোস্ট (বা স্বয়ং nginx সার্ভার) নির্বাচন করুন যা আপনি পরীক্ষা করতে চান, এবং আমরা আপনার জন্য লগগুলো নিয়ে আসব। -frontend/home/logs-description-2=এবং আপনার ডিস্ক লগে পূর্ণ হওয়ার বিষয়ে চিন্তা করার দরকার নেই, ignition স্বয়ংক্রিয়ভাবে আপনার জন্য সেগুলো রোটেট করবে (এবং আপনি নিয়ন্ত্রণ করতে পারেন কতটুকু রাখতে হবে, অথবা যদি আপনার জন্য উপযুক্ত হয় তবে রোটেশন নিষ্ক্রিয় করতে পারেন)। -frontend/home/settings-description-1=Ignition nginx-এর কনফিগারেশন ফাইলের জটিলতা দূর করে, কিন্তু এর মানে এই নয় যে আপনি কিছু সূক্ষ্ম সমন্বয় প্রয়োগ করার ক্ষমতা হারাবেন। -frontend/home/settings-description-2=সেটিংস পেজ দিয়ে, আপনি কিছু গুরুত্বপূর্ণ সংজ্ঞা যেমন টাইমআউট মান, রিকোয়েস্টের সর্বোচ্চ আপলোড/বডি সাইজ, ডিফল্ট পোর্ট যা nginx রিকোয়েস্টের জন্য শুনবে এবং আরও অনেক কিছু সংজ্ঞায়িত করতে পারেন। -frontend/home/settings-description-3=এছাড়াও, আপনি সেখানে nginx ignition-এর কিছু বৈশিষ্ট্য কনফিগার করতে পারেন, যেমন SSL সার্টিফিকেটের স্বয়ংক্রিয় রিনিউয়াল এবং লগ রোটেশন। -frontend/home/ssl-description-1=আপনি যদি HTTPS এনক্রিপশন দিয়ে আপনার ডোমেইনগুলো রক্ষা করতে চান বা প্রয়োজন হয়, অ্যাপটি এই ধরনের SSL সার্টিফিকেট ম্যানেজ করার একটি সহজ উপায় নিয়ে আসে। -frontend/home/ssl-description-2=আপনার যদি Let's Encrypt দ্বারা সমর্থিত একটি বৈধ সার্টিফিকেটের প্রয়োজন হয়, একটি সেলফ-সাইনড, বা থার্ড-পার্টি প্রোভাইডার থেকে আপনার কাস্টম একটি নিয়ে আসেন, ignition এটি সহজেই অনুমতি দেবে। এমনকি যখন সার্টিফিকেটের মেয়াদ শেষ হতে চলেছে, অ্যাপটি স্বয়ংক্রিয়ভাবে আপনার জন্য এটি রিনিউ করবে। -frontend/home/ssl-description-3=একবার একটি SSL সার্টিফিকেট তৈরি বা ইম্পোর্ট করা হলে, আপনি ফর্মে একটি বিকল্প নির্বাচন করে এটি হোস্টগুলিতে ব্যবহার করতে পারেন। -frontend/home/streams-description-1=যদিও হোস্টগুলো আপনার HTTP এবং HTTPS-ভিত্তিক পরিষেবাগুলো প্রকাশ করার প্রধান উপায়, স্ট্রিমগুলো আপনাকে অন্যান্য পরিষেবাগুলো প্রকাশ করতে সক্ষম করে যা TCP, UDP এবং ইউনিক্স সকেটের উপর নির্ভর করে। -frontend/home/streams-description-2=আপনার যদি গেম সার্ভার, ডাটাবেস, DNS সার্ভার এবং অন্য কিছু যা HTTP প্রোটোকল ব্যবহার করে না তা প্রকাশ করার প্রয়োজন হয়, তবে স্ট্রিমগুলোই সঠিক উপায়। -frontend/home/vpns-description=আপনার VPN-এ সহজেই আপনার হোস্টগুলো প্রকাশ করুন। আপনি যদি Tailscale ব্যবহার করেন, nginx ignition স্বয়ংক্রিয়ভাবে আপনার নেটওয়ার্কে একটি ভার্চুয়াল মেশিন তৈরি করতে পারে এবং যখনই মেশিনের IP বা হোস্টনেম অ্যাক্সেস করা হয় তখনই হোস্টে রিকোয়েস্ট ফরোয়ার্ড করতে পারে। -frontend/home/welcome-subtitle=অ্যাপটি থেকে সর্বাধিক সুবিধা পেতে আপনাকে সাহায্য করার জন্য এখানে কিছু দ্রুত শুরুর তথ্য রয়েছে। আমরা আশা করি আপনি এটি উপভোগ করবেন। -frontend/home/welcome-title=হ্যালো, এবং nginx ignition-এ আপনাকে স্বাগতম 👋 +frontend/help/access-lists-description=অ্যাক্সেস লিস্ট কোনো রাউট বা সম্পূর্ণ হোস্টকে রক্ষা করার একটি সহজ উপায় প্রদান করে, ব্যবহারকারী অনুমোদিত IP-র রেঞ্জ থেকে এসেছে কিনা বা একটি বৈধ ইউজারনেম এবং পাসওয়ার্ড দ্বারা চিহ্নিত কিনা (অথবা উভয়, IP এবং ক্রেডেনশিয়াল) তা পরীক্ষা করে। +frontend/help/cache-description-1=nginx-এর কন্টেন্ট ক্যাশিং ক্ষমতা সক্রিয় করে আপনার ওয়েবসাইটগুলোর গতি বাড়ান এবং আপস্ট্রিম সার্ভারের লোড কমান। Ignition ক্যাশ রুলস কনফিগার করা সহজ করে তোলে যা নির্ধারণ করে কোন অনুরোধগুলো ক্যাশ করা উচিত এবং কতক্ষণের জন্য। +frontend/help/cache-description-2=আপনি HTTP স্ট্যাটাস কোড, ফাইল এক্সটেনশন, রিকোয়েস্ট মেথড এবং আরও অনেক কিছু দ্বারা ক্যাশ আচরণ কাস্টমাইজ করতে পারেন। বাসি (stale) কন্টেন্ট হ্যান্ডলিং, ব্যাকগ্রাউন্ড আপডেট এবং কনকারেন্সি লকের মতো উন্নত বৈশিষ্ট্যগুলো আপনার কন্টেন্ট কীভাবে ক্যাশ এবং সার্ভ করা হয় তার উপর আপনাকে সূক্ষ্ম নিয়ন্ত্রণ দেয়। +frontend/help/footer-link=আমাদের গিটহাব পেজে যোগাযোগ করুন +frontend/help/footer-subtitle=আমরা আপনার থেকে কিছু প্রতিক্রিয়া পেতে চাই। +frontend/help/footer-title=এখনও প্রশ্ন আছে বা কিছু মিস করেছেন? +frontend/help/hosts-description-1=একটি ভার্চুয়াল হোস্ট, সংক্ষেপে হোস্ট, হলো একটি ওয়েবসাইট যা nginx সার্ভার ব্রাউজারে খোলার জন্য উপলব্ধ করবে। আপনি প্রধান মেনুতে বাম দিকে সমস্ত ম্যানেজ করা হোস্ট খুঁজে পেতে পারেন। +frontend/help/hosts-description-2=nginx ignition এই ধরনের ওয়েবসাইট কনফিগার করার একটি স্বজ্ঞাত উপায় প্রদান করে। উদাহরণস্বরূপ, যদি আপনার একটি NAS থাকে এবং এতে কিছু সার্ভিস চালু থাকে (যেমন Jellyfin, Vaultwarden এবং আরও অনেক কিছু), ignition আপনাকে jellyfin.myhome.com এর মতো একটি ডোমেইন থেকে এটি অ্যাক্সেস করার একটি সহজ উপায় সক্ষম করে, যা একটি IP এবং পোর্টের চেয়ে মনে রাখা এবং ব্যবহার করা অনেক সহজ। +frontend/help/hosts-description-3=প্রতিটি হোস্টের রাউটের একটি সেট থাকবে, যা হলো নিয়ম যা সংজ্ঞায়িত করে কোন রিকোয়েস্ট প্যাটার্নগুলো ফরোয়ার্ড করা উচিত এবং কোথায়, এবং বাইন্ডিং, যা হলো সংজ্ঞা যে কোন পোর্টে nginx এই ধরনের রিকোয়েস্টের জন্য অপেক্ষা করবে। +frontend/help/integrations-description=আপনার অ্যাপ কি Docker কন্টেইনারে বা TrueNAS-এ চলছে? আপনি nginx ignition-এর নেটিভ ইন্টিগ্রেশন সক্রিয় করতে পারেন এবং সহজেই হোস্ট রিকোয়েস্ট ফরোয়ার্ড করার গন্তব্য অ্যাপ হিসেবে একটি কন্টেইনার বা অ্যাপ বেছে নিতে পারেন। +frontend/help/logs-description-1=কী রিকোয়েস্ট করা হয়েছে বা কেন কিছু প্রত্যাশিতভাবে কাজ করছে না তা জানা দরকার? nginx ignition আপনাকে nginx লগগুলোও পরীক্ষা করার একটি সহজ উপায় প্রদান করে। শুধু হোস্ট (বা স্বয়ং nginx সার্ভার) নির্বাচন করুন যা আপনি পরীক্ষা করতে চান, এবং আমরা আপনার জন্য লগগুলো নিয়ে আসব। +frontend/help/logs-description-2=এবং আপনার ডিস্ক লগে পূর্ণ হওয়ার বিষয়ে চিন্তা করার দরকার নেই, ignition স্বয়ংক্রিয়ভাবে আপনার জন্য সেগুলো রোটেট করবে (এবং আপনি নিয়ন্ত্রণ করতে পারেন কতটুকু রাখতে হবে, অথবা যদি আপনার জন্য উপযুক্ত হয় তবে রোটেশন নিষ্ক্রিয় করতে পারেন)। +frontend/help/settings-description-1=Ignition nginx-এর কনফিগারেশন ফাইলের জটিলতা দূর করে, কিন্তু এর মানে এই নয় যে আপনি কিছু সূক্ষ্ম সমন্বয় প্রয়োগ করার ক্ষমতা হারাবেন। +frontend/help/settings-description-2=সেটিংস পেজ দিয়ে, আপনি কিছু গুরুত্বপূর্ণ সংজ্ঞা যেমন টাইমআউট মান, রিকোয়েস্টের সর্বোচ্চ আপলোড/বডি সাইজ, ডিফল্ট পোর্ট যা nginx রিকোয়েস্টের জন্য শুনবে এবং আরও অনেক কিছু সংজ্ঞায়িত করতে পারেন। +frontend/help/settings-description-3=এছাড়াও, আপনি সেখানে nginx ignition-এর কিছু বৈশিষ্ট্য কনফিগার করতে পারেন, যেমন SSL সার্টিফিকেটের স্বয়ংক্রিয় রিনিউয়াল এবং লগ রোটেশন। +frontend/help/ssl-description-1=আপনি যদি HTTPS এনক্রিপশন দিয়ে আপনার ডোমেইনগুলো রক্ষা করতে চান বা প্রয়োজন হয়, অ্যাপটি এই ধরনের SSL সার্টিফিকেট ম্যানেজ করার একটি সহজ উপায় নিয়ে আসে। +frontend/help/ssl-description-2=আপনার যদি Let's Encrypt দ্বারা সমর্থিত একটি বৈধ সার্টিফিকেটের প্রয়োজন হয়, একটি সেলফ-সাইনড, বা থার্ড-পার্টি প্রোভাইডার থেকে আপনার কাস্টম একটি নিয়ে আসেন, ignition এটি সহজেই অনুমতি দেবে। এমনকি যখন সার্টিফিকেটের মেয়াদ শেষ হতে চলেছে, অ্যাপটি স্বয়ংক্রিয়ভাবে আপনার জন্য এটি রিনিউ করবে। +frontend/help/ssl-description-3=একবার একটি SSL সার্টিফিকেট তৈরি বা ইম্পোর্ট করা হলে, আপনি ফর্মে একটি বিকল্প নির্বাচন করে এটি হোস্টগুলিতে ব্যবহার করতে পারেন। +frontend/help/streams-description-1=যদিও হোস্টগুলো আপনার HTTP এবং HTTPS-ভিত্তিক পরিষেবাগুলো প্রকাশ করার প্রধান উপায়, স্ট্রিমগুলো আপনাকে অন্যান্য পরিষেবাগুলো প্রকাশ করতে সক্ষম করে যা TCP, UDP এবং ইউনিক্স সকেটের উপর নির্ভর করে। +frontend/help/streams-description-2=আপনার যদি গেম সার্ভার, ডাটাবেস, DNS সার্ভার এবং অন্য কিছু যা HTTP প্রোটোকল ব্যবহার করে না তা প্রকাশ করার প্রয়োজন হয়, তবে স্ট্রিমগুলোই সঠিক উপায়। +frontend/help/vpns-description=আপনার VPN-এ সহজেই আপনার হোস্টগুলো প্রকাশ করুন। আপনি যদি Tailscale ব্যবহার করেন, nginx ignition স্বয়ংক্রিয়ভাবে আপনার নেটওয়ার্কে একটি ভার্চুয়াল মেশিন তৈরি করতে পারে এবং যখনই মেশিনের IP বা হোস্টনেম অ্যাক্সেস করা হয় তখনই হোস্টে রিকোয়েস্ট ফরোয়ার্ড করতে পারে। +frontend/help/welcome-subtitle=অ্যাপটি থেকে সর্বাধিক সুবিধা পেতে আপনাকে সাহায্য করার জন্য এখানে কিছু দ্রুত শুরুর তথ্য রয়েছে। আমরা আশা করি আপনি এটি উপভোগ করবেন। +frontend/help/welcome-title=হ্যালো, এবং nginx ignition-এ আপনাকে স্বাগতম 👋 +frontend/home/certificates-expiring-title=30 দিনের মধ্যে মেয়াদ শেষ হওয়া সার্টিফিকেট +frontend/home/expires-in-days=${days} দিনে মেয়াদ শেষ +frontend/home/expires-today=আজ মেয়াদ শেষ +frontend/home/nginx-offline=Offline +frontend/home/nginx-online=Online +frontend/home/nginx-reload=কনফিগারেশন পুনরায় লোড করুন +frontend/home/nginx-section-title=nginx ${version} +frontend/home/nginx-start=সার্ভার শুরু করুন +frontend/home/nginx-stop-confirmation=nginx সার্ভার এখনই বন্ধ করবেন? +frontend/home/nginx-stop=সার্ভার বন্ধ করুন +frontend/home/nginx-unknown=অবস্থা অজানা +frontend/home/no-certificates-expiring=আগামী 30 দিনে কোনো সার্টিফিকেট মেয়াদ শেষ হচ্ছে না +frontend/home/recent-errors-disabled=সার্ভার ত্রুটি লগ সেটিংসে নিষ্ক্রিয় +frontend/home/recent-errors-empty=দেখানোর মতো কোনো সাম্প্রতিক ত্রুটি লগ এন্ট্রি নেই +frontend/home/recent-errors-title=সাম্প্রতিক ত্রুটি লগ +frontend/home/subtitle=আপনার nginx ignition ইনস্ট্যান্সের সংক্ষিপ্ত বিবরণ +frontend/home/title=হোম ওভারভিউ +frontend/home/totals-title=সম্পদ +frontend/home/traffic-disabled=ট্রাফিক পরিসংখ্যান সেটিংসে নিষ্ক্রিয় +frontend/home/traffic-no-data=এখনও কোনো ট্রাফিক ডেটা রেকর্ড হয়নি +frontend/home/traffic-offline=ট্রাফিক পরিসংখ্যানের জন্য nginx চালু থাকা প্রয়োজন +frontend/home/traffic-unsupported=এই nginx বিল্ড ট্রাফিক পরিসংখ্যান সমর্থন করে না +frontend/home/view-full-stats=সম্পূর্ণ ট্রাফিক পরিসংখ্যান দেখুন frontend/host/components/enable-https-help=HTTPS সার্টিফিকেটগুলি আপনার VPN প্রদানকারী দ্বারা পরিচালিত এবং স্বয়ংক্রিয়ভাবে প্রদান করা হয়। frontend/host/components/enable-https=HTTPS এন্ডপয়েন্ট সক্ষম করুন frontend/host/components/hostbindings/add-binding=বাইন্ডিং যোগ করুন @@ -1244,7 +1268,6 @@ frontend/locale/pagination/prev-page=পূর্ববর্তী পেজ frontend/logs/access-disabled=nginx কনফিগারেশনে হোস্ট অ্যাক্সেস লগ নিষ্ক্রিয় frontend/logs/access-logs=অ্যাক্সেস লগ frontend/logs/auto-refresh-disabled-reason=অটো রিফ্রেশ সক্রিয় -frontend/logs/auto-refresh-option=প্রতি ${seconds} সেকেন্ডে frontend/logs/auto-refresh=অটো-রিফ্রেশ frontend/logs/category=বিভাগ frontend/logs/error-disabled=nginx কনফিগারেশনে হোস্ট এরর লগ নিষ্ক্রিয় diff --git a/i18n/messages_de.properties b/i18n/messages_de.properties index 329d1726a..e1e701f1b 100644 --- a/i18n/messages_de.properties +++ b/i18n/messages_de.properties @@ -732,6 +732,7 @@ common/add-duration=Dauer hinzufügen common/advanced=Erweitert common/app-name=nginx ignition common/at-least-one-required=Mindestens ein Wert muss angegeben werden +common/auto-refresh-option=Alle ${seconds} Sekunden common/auto-refresh=Automatische Aktualisierung common/between-values=Wert muss zwischen ${min} und ${max} liegen common/binding=Bindung @@ -1099,29 +1100,52 @@ frontend/export/section-database-title=Datenbank-Backup frontend/export/section-nginx-description-1=Wann immer Sie eine Änderung mit nginx ignition vornehmen und den Server neu laden, werden die nginx-Konfigurationsdateien mit allen Hosts, Streams, SSL-Zertifikaten und mehr, die Sie aktiviert haben, generiert oder aktualisiert. frontend/export/section-nginx-description-2=Durch das Herunterladen der nginx-Konfigurationsdateien können Sie deren Inhalt analysieren/überprüfen oder sogar einen nginx-Server mit denselben Einstellungen und Verhaltensweisen bereitstellen, größtenteils genauso wie nginx ignition dies tut. frontend/export/subtitle=Nginx-Konfigurationsdateien und den Inhalt der ignition-Datenbank für Backup und Wiederherstellung herunterladen -frontend/home/access-lists-description=Zugriffslisten bieten eine einfache Möglichkeit, entweder eine Route oder den gesamten Host zu schützen, indem geprüft wird, ob der Benutzer aus einem Bereich autorisierter IPs stammt oder durch einen gültigen Benutzernamen und ein Passwort (oder sogar beides, IP und Anmeldedaten) identifiziert wird -frontend/home/cache-description-1=Beschleunigen Sie Ihre Websites und reduzieren Sie die Last auf Ihren Upstream-Servern, indem Sie die Content-Caching-Funktionen von nginx aktivieren. Ignition macht es einfach, Cache-Regeln zu konfigurieren, die bestimmen, welche Anfragen wie lange zwischengespeichert werden sollen. -frontend/home/cache-description-2=Sie können das Cache-Verhalten nach HTTP-Statuscodes, Dateierweiterungen, Anfragemethoden und mehr anpassen. Erweiterte Funktionen wie die Behandlung veralteter Inhalte, Hintergrundaktualisierungen und Concurrency Locks geben Ihnen feinkörnige Kontrolle darüber, wie Ihre Inhalte zwischengespeichert und bereitgestellt werden. -frontend/home/footer-link=Kontaktieren Sie uns auf unserer GitHub-Seite -frontend/home/footer-subtitle=Wir würden uns über Feedback von Ihnen freuen. -frontend/home/footer-title=Haben Sie noch Fragen oder etwas vermisst? -frontend/home/hosts-description-1=Ein Virtual Host, kurz Host, ist eine Website, die der nginx-Server verfügbar macht, um in einem Browser geöffnet zu werden. Sie finden alle verwalteten Hosts links im Hauptmenü. -frontend/home/hosts-description-2=nginx ignition bietet eine intuitive Möglichkeit, solche Websites zu konfigurieren. Wenn Sie zum Beispiel ein NAS haben und einige Dienste darauf laufen (wie Jellyfin, Vaultwarden und mehr), ermöglicht ignition einen einfachen Weg, darauf über eine Domain wie jellyfin.myhome.com zuzugreifen, was viel einfacher zu merken und zu verwenden ist als eine IP und ein Port. -frontend/home/hosts-description-3=Jeder Host hat einen Satz von Routen, das sind Regeln, die definieren, welche Anfragemuster weitergeleitet werden sollen und wohin, sowie Bindungen, welche die Definitionen sind, auf welchen Ports nginx auf solche Anfragen hören soll. -frontend/home/integrations-description=Läuft Ihre App in einem Docker-Container oder in einem TrueNAS? Sie können die native Integration aktivieren, die nginx ignition bietet, und einfach einen Container oder eine App als Ziel-App auswählen, an die der Host die Anfragen weiterleiten soll. -frontend/home/logs-description-1=Müssen Sie wissen, was angefordert wurde oder warum etwas nicht so funktioniert, wie es erwartet wurde? nginx ignition bietet auch eine einfache Möglichkeit für Sie, die nginx-Logs zu prüfen. Wählen Sie einfach den Host (oder den nginx-Server selbst), bei dem Sie prüfen wollen, was los ist, und wir holen die Logs für Sie. -frontend/home/logs-description-2=Und Sie müssen sich keine Sorgen machen, dass Ihre Festplatte mit Logs voll wird, ignition rotiert sie automatisch für Sie (und Sie können steuern, wie viel aufbewahrt werden soll, oder die Rotation sogar deaktivieren, wenn es Ihnen besser passt). -frontend/home/settings-description-1=Ignition abstrahiert die Komplexität der nginx-Konfigurationsdateien, aber das bedeutet nicht, dass Sie die Fähigkeit verlieren, einige Feinjustierungen vorzunehmen. -frontend/home/settings-description-2=Mit der Einstellungsseite können Sie einige wichtige Definitionen wie die Timeout-Werte, die maximale Upload-/Body-Größe der Anfragen, die Standard-Ports, auf denen nginx auf Anfragen hören wird, und mehr definieren. -frontend/home/settings-description-3=Darüber hinaus können Sie dort auch einige Funktionen von nginx ignition konfigurieren, wie die automatische Erneuerung von SSL-Zertifikaten und die Log-Rotation. -frontend/home/ssl-description-1=Wenn Sie Ihre Domains mit HTTPS-Verschlüsselung schützen wollen oder müssen, kommt die App auch mit einer einfachen Möglichkeit, solche SSL-Zertifikate zu verwalten. -frontend/home/ssl-description-2=Egal, ob Sie ein gültiges Zertifikat von Let's Encrypt, ein selbstsigniertes oder Ihr eigenes von einem Drittanbieter importieren müssen, ignition ermöglicht dies mit Leichtigkeit. Selbst wenn das Zertifikat kurz vor dem Ablauf steht, wird die App es automatisch für Sie erneuern. -frontend/home/ssl-description-3=Sobald ein SSL-Zertifikat erstellt oder importiert ist, können Sie es auf den Hosts verwenden, indem Sie einfach eine Option im Formular auswählen. -frontend/home/streams-description-1=Während Hosts der Hauptweg sind, um Ihre HTTP- und HTTPS-basierten Dienste offenzulegen, ermöglichen Streams Ihnen, andere Dienste offenzulegen, die auf TCP, UDP und Unix-Sockets basieren. -frontend/home/streams-description-2=Wenn Sie einen Spieleserver, eine Datenbank, einen DNS-Server und alles andere, das nicht das HTTP-Protokoll verwendet, offenlegen müssen, sind Streams der richtige Weg. -frontend/home/vpns-description=Legen Sie Ihre Hosts einfach in Ihren VPNs offen. Wenn Sie Tailscale verwenden, kann nginx ignition automatisch eine virtuelle Maschine in Ihrem Netzwerk erstellen und die Anfragen an den Host weiterleiten, wann immer auf die IP oder den Hostnamen der Maschine zugegriffen wird. -frontend/home/welcome-subtitle=Hier sind einige Schnellstart-Infos, um Ihnen zu helfen, das Beste aus der App zu machen. Wir hoffen, sie gefällt Ihnen. -frontend/home/welcome-title=Hallo und willkommen bei nginx ignition 👋 +frontend/help/access-lists-description=Zugriffslisten bieten eine einfache Möglichkeit, entweder eine Route oder den gesamten Host zu schützen, indem geprüft wird, ob der Benutzer aus einem Bereich autorisierter IPs stammt oder durch einen gültigen Benutzernamen und ein Passwort (oder sogar beides, IP und Anmeldedaten) identifiziert wird +frontend/help/cache-description-1=Beschleunigen Sie Ihre Websites und reduzieren Sie die Last auf Ihren Upstream-Servern, indem Sie die Content-Caching-Funktionen von nginx aktivieren. Ignition macht es einfach, Cache-Regeln zu konfigurieren, die bestimmen, welche Anfragen wie lange zwischengespeichert werden sollen. +frontend/help/cache-description-2=Sie können das Cache-Verhalten nach HTTP-Statuscodes, Dateierweiterungen, Anfragemethoden und mehr anpassen. Erweiterte Funktionen wie die Behandlung veralteter Inhalte, Hintergrundaktualisierungen und Concurrency Locks geben Ihnen feinkörnige Kontrolle darüber, wie Ihre Inhalte zwischengespeichert und bereitgestellt werden. +frontend/help/footer-link=Kontaktieren Sie uns auf unserer GitHub-Seite +frontend/help/footer-subtitle=Wir würden uns über Feedback von Ihnen freuen. +frontend/help/footer-title=Haben Sie noch Fragen oder etwas vermisst? +frontend/help/hosts-description-1=Ein Virtual Host, kurz Host, ist eine Website, die der nginx-Server verfügbar macht, um in einem Browser geöffnet zu werden. Sie finden alle verwalteten Hosts links im Hauptmenü. +frontend/help/hosts-description-2=nginx ignition bietet eine intuitive Möglichkeit, solche Websites zu konfigurieren. Wenn Sie zum Beispiel ein NAS haben und einige Dienste darauf laufen (wie Jellyfin, Vaultwarden und mehr), ermöglicht ignition einen einfachen Weg, darauf über eine Domain wie jellyfin.myhome.com zuzugreifen, was viel einfacher zu merken und zu verwenden ist als eine IP und ein Port. +frontend/help/hosts-description-3=Jeder Host hat einen Satz von Routen, das sind Regeln, die definieren, welche Anfragemuster weitergeleitet werden sollen und wohin, sowie Bindungen, welche die Definitionen sind, auf welchen Ports nginx auf solche Anfragen hören soll. +frontend/help/integrations-description=Läuft Ihre App in einem Docker-Container oder in einem TrueNAS? Sie können die native Integration aktivieren, die nginx ignition bietet, und einfach einen Container oder eine App als Ziel-App auswählen, an die der Host die Anfragen weiterleiten soll. +frontend/help/logs-description-1=Müssen Sie wissen, was angefordert wurde oder warum etwas nicht so funktioniert, wie es erwartet wurde? nginx ignition bietet auch eine einfache Möglichkeit für Sie, die nginx-Logs zu prüfen. Wählen Sie einfach den Host (oder den nginx-Server selbst), bei dem Sie prüfen wollen, was los ist, und wir holen die Logs für Sie. +frontend/help/logs-description-2=Und Sie müssen sich keine Sorgen machen, dass Ihre Festplatte mit Logs voll wird, ignition rotiert sie automatisch für Sie (und Sie können steuern, wie viel aufbewahrt werden soll, oder die Rotation sogar deaktivieren, wenn es Ihnen besser passt). +frontend/help/settings-description-1=Ignition abstrahiert die Komplexität der nginx-Konfigurationsdateien, aber das bedeutet nicht, dass Sie die Fähigkeit verlieren, einige Feinjustierungen vorzunehmen. +frontend/help/settings-description-2=Mit der Einstellungsseite können Sie einige wichtige Definitionen wie die Timeout-Werte, die maximale Upload-/Body-Größe der Anfragen, die Standard-Ports, auf denen nginx auf Anfragen hören wird, und mehr definieren. +frontend/help/settings-description-3=Darüber hinaus können Sie dort auch einige Funktionen von nginx ignition konfigurieren, wie die automatische Erneuerung von SSL-Zertifikaten und die Log-Rotation. +frontend/help/ssl-description-1=Wenn Sie Ihre Domains mit HTTPS-Verschlüsselung schützen wollen oder müssen, kommt die App auch mit einer einfachen Möglichkeit, solche SSL-Zertifikate zu verwalten. +frontend/help/ssl-description-2=Egal, ob Sie ein gültiges Zertifikat von Let's Encrypt, ein selbstsigniertes oder Ihr eigenes von einem Drittanbieter importieren müssen, ignition ermöglicht dies mit Leichtigkeit. Selbst wenn das Zertifikat kurz vor dem Ablauf steht, wird die App es automatisch für Sie erneuern. +frontend/help/ssl-description-3=Sobald ein SSL-Zertifikat erstellt oder importiert ist, können Sie es auf den Hosts verwenden, indem Sie einfach eine Option im Formular auswählen. +frontend/help/streams-description-1=Während Hosts der Hauptweg sind, um Ihre HTTP- und HTTPS-basierten Dienste offenzulegen, ermöglichen Streams Ihnen, andere Dienste offenzulegen, die auf TCP, UDP und Unix-Sockets basieren. +frontend/help/streams-description-2=Wenn Sie einen Spieleserver, eine Datenbank, einen DNS-Server und alles andere, das nicht das HTTP-Protokoll verwendet, offenlegen müssen, sind Streams der richtige Weg. +frontend/help/vpns-description=Legen Sie Ihre Hosts einfach in Ihren VPNs offen. Wenn Sie Tailscale verwenden, kann nginx ignition automatisch eine virtuelle Maschine in Ihrem Netzwerk erstellen und die Anfragen an den Host weiterleiten, wann immer auf die IP oder den Hostnamen der Maschine zugegriffen wird. +frontend/help/welcome-subtitle=Hier sind einige Schnellstart-Infos, um Ihnen zu helfen, das Beste aus der App zu machen. Wir hoffen, sie gefällt Ihnen. +frontend/help/welcome-title=Hallo und willkommen bei nginx ignition 👋 +frontend/home/certificates-expiring-title=Zertifikate, die in 30 Tagen ablaufen +frontend/home/expires-in-days=Läuft in ${days} Tagen ab +frontend/home/expires-today=Läuft heute ab +frontend/home/nginx-offline=Offline +frontend/home/nginx-online=Online +frontend/home/nginx-reload=Konfiguration neu laden +frontend/home/nginx-section-title=nginx ${version} +frontend/home/nginx-start=Server starten +frontend/home/nginx-stop-confirmation=Den nginx-Server jetzt stoppen? +frontend/home/nginx-stop=Server stoppen +frontend/home/nginx-unknown=Status unbekannt +frontend/home/no-certificates-expiring=Keine Zertifikate laufen in den nächsten 30 Tagen ab +frontend/home/recent-errors-disabled=Server-Fehlerprotokolle sind in den Einstellungen deaktiviert +frontend/home/recent-errors-empty=Keine aktuellen Fehlerprotokolleinträge vorhanden +frontend/home/recent-errors-title=Aktuelles Fehlerprotokoll +frontend/home/subtitle=Überblick über Ihre nginx-ignition-Instanz +frontend/home/title=Startübersicht +frontend/home/totals-title=Ressourcen +frontend/home/traffic-disabled=Verkehrsstatistiken sind in den Einstellungen deaktiviert +frontend/home/traffic-no-data=Noch keine Verkehrsdaten erfasst +frontend/home/traffic-offline=Verkehrsstatistiken erfordern einen laufenden nginx +frontend/home/traffic-unsupported=Dieser nginx-Build unterstützt keine Verkehrsstatistiken +frontend/home/view-full-stats=Vollständige Verkehrsstatistiken anzeigen frontend/host/components/enable-https-help=HTTPS-Zertifikate werden von Ihrem VPN-Anbieter verwaltet und automatisch bereitgestellt. frontend/host/components/enable-https=HTTPS-Endpunkte aktivieren frontend/host/components/hostbindings/add-binding=Bindung hinzufügen @@ -1244,7 +1268,6 @@ frontend/locale/pagination/prev-page=Vorherige Seite frontend/logs/access-disabled=Host-Zugriffslogs sind in der nginx-Konfiguration deaktiviert frontend/logs/access-logs=Zugriffslogs frontend/logs/auto-refresh-disabled-reason=Automatische Aktualisierung ist aktiviert -frontend/logs/auto-refresh-option=Alle ${seconds} Sekunden frontend/logs/auto-refresh=Automatische Aktualisierung frontend/logs/category=Kategorie frontend/logs/error-disabled=Host-Fehlerlogs sind in der nginx-Konfiguration deaktiviert diff --git a/i18n/messages_en.properties b/i18n/messages_en.properties index 9ea486c63..8822351fe 100644 --- a/i18n/messages_en.properties +++ b/i18n/messages_en.properties @@ -732,6 +732,7 @@ common/add-duration=Add duration common/advanced=Advanced common/app-name=nginx ignition common/at-least-one-required=At least one value must be informed +common/auto-refresh-option=Every ${seconds} seconds common/auto-refresh=Auto-refresh common/between-values=Value must be between ${min} and ${max} common/binding=Binding @@ -1099,29 +1100,52 @@ frontend/export/section-database-title=Database backup frontend/export/section-nginx-description-1=Whenever you make a change using nginx ignition and reload the server, the nginx configuration files are generated or updated with all the hosts, streams, SSL certificates and more that you've enabled. frontend/export/section-nginx-description-2=By downloading the nginx configuration files, you can analyze/review its contents or even deploy a nginx server with these same settings and behaviours mostly the same way nginx ignition does. frontend/export/subtitle=Download nginx configuration files and the ignition database contents for backup and recovery -frontend/home/access-lists-description=Access lists provide a simple way to protect either a route or the entire host by checking if the user is from a range of authorized IPs or is identified by a valid username and password (or even both, IP and credentials) -frontend/home/cache-description-1=Speed up your websites and reduce load on your upstream servers by enabling nginx's content caching capabilities. Ignition makes it easy to configure cache rules that determine which requests should be cached and for how long. -frontend/home/cache-description-2=You can customize cache behavior by HTTP status codes, file extensions, request methods, and more. Advanced features like stale content handling, background updates, and concurrency locks give you fine-grained control over how your content is cached and served. -frontend/home/footer-link=Reach us out at our GitHub page -frontend/home/footer-subtitle=We'd love some feedback from you. -frontend/home/footer-title=Still have questions or missed something? -frontend/home/hosts-description-1=A virtual host, host in short, is a website that the nginx server will make available to be opened in a browser. You can find all hosts managed at the left, on the main menu. -frontend/home/hosts-description-2=nginx ignition provides an intuitive way to configure such websites. For example, if you have a NAS and have some services running on it (like Jellyfin, Vaultwarden and more), ignition enables an easy way to access it from a domain like jellyfin.myhome.com, way easier to remember and use than an IP and port. -frontend/home/hosts-description-3=Each host will have a set of routes, which are rules that define which requests patterns should be forwarded and to where, and bindings, which are the definitions at what ports the nginx should listen for such requests. -frontend/home/integrations-description=Is your app running in a Docker container or in a TrueNAS? You can enable the native integration nginx ignition offers and easily pick a container or app as the destination app that the host should forward the requests to. -frontend/home/logs-description-1=Need to know what has been requested or why something isn't working the way it was expected? nginx ignition provides a simple way for you to check the nginx logs too. Just select the host (or the nginx server itself) that you want to check what's going on, and we will get the logs for you. -frontend/home/logs-description-2=And you don't need to worry about your disk getting full of logs, ignition will rotate them automatically for you (and you can control how much to keep, or even disable the rotation if it suits you best). -frontend/home/settings-description-1=Ignition abstracts away the complexity of the nginx's configuration files, but that doesn't mean that you lose the ability to apply some fine adjustments. -frontend/home/settings-description-2=With the settings page, you can define some important definitions such as the timeout values, the maximum upload/body size of the requests, the default ports that the nginx will listen for requests and more. -frontend/home/settings-description-3=Beyond that, you can also configure some of the nginx ignition's features there, like the automatic renewal of SSL certificates and log rotation. -frontend/home/ssl-description-1=If you want to or need to protect your domains with HTTPS encryption, the app comes with an easy way to manage such SSL certificates too. -frontend/home/ssl-description-2=Either if you need a valid certificate backed by Let's Encrypt, a self-signed, or bring your custom one for a third-party provider, ignition will allow it with ease. Even when the certificate is about to expire, the app will automatically renew it for you. -frontend/home/ssl-description-3=Once an SSL certificate is created or imported, you can use it on the hosts by simply selecting an option in the form. -frontend/home/streams-description-1=While hosts are the main way to expose your HTTP and HTTPS-based services, streams enable you to expose other services that rely on TCP, UDP and unix sockets. -frontend/home/streams-description-2=If you need to expose a game server, a database, a DNS server and anything else that don't use the HTTP protocol, streams are the way to go. -frontend/home/vpns-description=Easily expose your hosts in your VPNs. If you're using Tailscale, nginx ignition can automatically create a virtual machine in your network and forward the requests to the host whenever the machine IP or hostname is accessed. -frontend/home/welcome-subtitle=Here are some quick start info to help you make the most of the app. We hope you enjoy it. -frontend/home/welcome-title=Hello, and welcome to nginx ignition 👋 +frontend/help/access-lists-description=Access lists provide a simple way to protect either a route or the entire host by checking if the user is from a range of authorized IPs or is identified by a valid username and password (or even both, IP and credentials) +frontend/help/cache-description-1=Speed up your websites and reduce load on your upstream servers by enabling nginx's content caching capabilities. Ignition makes it easy to configure cache rules that determine which requests should be cached and for how long. +frontend/help/cache-description-2=You can customize cache behavior by HTTP status codes, file extensions, request methods, and more. Advanced features like stale content handling, background updates, and concurrency locks give you fine-grained control over how your content is cached and served. +frontend/help/footer-link=Reach us out at our GitHub page +frontend/help/footer-subtitle=We'd love some feedback from you. +frontend/help/footer-title=Still have questions or missed something? +frontend/help/hosts-description-1=A virtual host, host in short, is a website that the nginx server will make available to be opened in a browser. You can find all hosts managed at the left, on the main menu. +frontend/help/hosts-description-2=nginx ignition provides an intuitive way to configure such websites. For example, if you have a NAS and have some services running on it (like Jellyfin, Vaultwarden and more), ignition enables an easy way to access it from a domain like jellyfin.myhome.com, way easier to remember and use than an IP and port. +frontend/help/hosts-description-3=Each host will have a set of routes, which are rules that define which requests patterns should be forwarded and to where, and bindings, which are the definitions at what ports the nginx should listen for such requests. +frontend/help/integrations-description=Is your app running in a Docker container or in a TrueNAS? You can enable the native integration nginx ignition offers and easily pick a container or app as the destination app that the host should forward the requests to. +frontend/help/logs-description-1=Need to know what has been requested or why something isn't working the way it was expected? nginx ignition provides a simple way for you to check the nginx logs too. Just select the host (or the nginx server itself) that you want to check what's going on, and we will get the logs for you. +frontend/help/logs-description-2=And you don't need to worry about your disk getting full of logs, ignition will rotate them automatically for you (and you can control how much to keep, or even disable the rotation if it suits you best). +frontend/help/settings-description-1=Ignition abstracts away the complexity of the nginx's configuration files, but that doesn't mean that you lose the ability to apply some fine adjustments. +frontend/help/settings-description-2=With the settings page, you can define some important definitions such as the timeout values, the maximum upload/body size of the requests, the default ports that the nginx will listen for requests and more. +frontend/help/settings-description-3=Beyond that, you can also configure some of the nginx ignition's features there, like the automatic renewal of SSL certificates and log rotation. +frontend/help/ssl-description-1=If you want to or need to protect your domains with HTTPS encryption, the app comes with an easy way to manage such SSL certificates too. +frontend/help/ssl-description-2=Either if you need a valid certificate backed by Let's Encrypt, a self-signed, or bring your custom one for a third-party provider, ignition will allow it with ease. Even when the certificate is about to expire, the app will automatically renew it for you. +frontend/help/ssl-description-3=Once an SSL certificate is created or imported, you can use it on the hosts by simply selecting an option in the form. +frontend/help/streams-description-1=While hosts are the main way to expose your HTTP and HTTPS-based services, streams enable you to expose other services that rely on TCP, UDP and unix sockets. +frontend/help/streams-description-2=If you need to expose a game server, a database, a DNS server and anything else that don't use the HTTP protocol, streams are the way to go. +frontend/help/vpns-description=Easily expose your hosts in your VPNs. If you're using Tailscale, nginx ignition can automatically create a virtual machine in your network and forward the requests to the host whenever the machine IP or hostname is accessed. +frontend/help/welcome-subtitle=Here are some quick start info to help you make the most of the app. We hope you enjoy it. +frontend/help/welcome-title=Hello, and welcome to nginx ignition 👋 +frontend/home/certificates-expiring-title=Certificates expiring within 30 days +frontend/home/expires-in-days=Expires in ${days} days +frontend/home/expires-today=Expires today +frontend/home/nginx-offline=Offline +frontend/home/nginx-online=Online +frontend/home/nginx-reload=Reload config +frontend/home/nginx-section-title=nginx ${version} +frontend/home/nginx-start=Start server +frontend/home/nginx-stop-confirmation=Stop the nginx server now? +frontend/home/nginx-stop=Stop server +frontend/home/nginx-unknown=Status unknown +frontend/home/no-certificates-expiring=No certificates expiring within the next 30 days +frontend/home/recent-errors-disabled=Server error logs are disabled in settings +frontend/home/recent-errors-empty=No recent error log entries to show +frontend/home/recent-errors-title=Recent error log +frontend/home/subtitle=Overview of your nginx ignition instance +frontend/home/title=Home overview +frontend/home/totals-title=Resources +frontend/home/traffic-disabled=Traffic statistics are disabled in settings +frontend/home/traffic-no-data=No traffic data recorded yet +frontend/home/traffic-offline=Traffic statistics require nginx to be running +frontend/home/traffic-unsupported=This nginx build does not support traffic statistics +frontend/home/view-full-stats=View full traffic stats frontend/host/components/enable-https-help=HTTPS certificates are managed and automatically provisioned by your VPN provider. frontend/host/components/enable-https=Enable HTTPS endpoints frontend/host/components/hostbindings/add-binding=Add binding @@ -1244,7 +1268,6 @@ frontend/locale/pagination/prev-page=Previous page frontend/logs/access-disabled=Host access logs are disabled in the nginx configuration frontend/logs/access-logs=Access logs frontend/logs/auto-refresh-disabled-reason=Auto refresh is enabled -frontend/logs/auto-refresh-option=Every ${seconds} seconds frontend/logs/auto-refresh=Auto-refresh frontend/logs/category=Category frontend/logs/error-disabled=Host error logs are disabled in the nginx configuration diff --git a/i18n/messages_es.properties b/i18n/messages_es.properties index fc3452c08..7292cde68 100644 --- a/i18n/messages_es.properties +++ b/i18n/messages_es.properties @@ -732,6 +732,7 @@ common/add-duration=Añadir duración common/advanced=Avanzado common/app-name=nginx ignition common/at-least-one-required=Se debe informar al menos un valor +common/auto-refresh-option=Cada ${seconds} segundos common/auto-refresh=Actualización automática common/between-values=El valor debe estar entre ${min} y ${max} common/binding=Enlace (Binding) @@ -1099,29 +1100,52 @@ frontend/export/section-database-title=Copia de seguridad de la base de datos frontend/export/section-nginx-description-1=Cada vez que realiza un cambio utilizando nginx ignition y recarga el servidor, los archivos de configuración de nginx se generan o actualizan con todos los hosts, streams, certificados SSL y más que haya habilitado. frontend/export/section-nginx-description-2=Al descargar los archivos de configuración de nginx, puede analizar/revisar su contenido o incluso desplegar un servidor nginx con estas mismas configuraciones y comportamientos casi de la misma manera que lo hace nginx ignition. frontend/export/subtitle=Descargue los archivos de configuración de nginx y el contenido de la base de datos de ignition para copia de seguridad y recuperación -frontend/home/access-lists-description=Las listas de acceso proporcionan una forma sencilla de proteger una ruta o el host completo verificando si el usuario proviene de un rango de IPs autorizadas o se identifica con un nombre de usuario y contraseña válidos (o incluso ambos, IP y credenciales) -frontend/home/cache-description-1=Acelere sus sitios web y reduzca la carga en sus servidores upstream habilitando las capacidades de caché de contenido de nginx. Ignition facilita la configuración de reglas de caché que determinan qué solicitudes deben almacenarse en caché y por cuánto tiempo. -frontend/home/cache-description-2=Puede personalizar el comportamiento de la caché por códigos de estado HTTP, extensiones de archivo, métodos de solicitud y más. Características avanzadas como manejo de contenido obsoleto, actualizaciones en segundo plano y bloqueos de concurrencia le brindan un control detallado sobre cómo se almacena en caché y se sirve su contenido. -frontend/home/footer-link=Contáctenos en nuestra página de GitHub -frontend/home/footer-subtitle=Nos encantaría recibir sus comentarios. -frontend/home/footer-title=¿Todavía tiene preguntas o se perdió algo? -frontend/home/hosts-description-1=Un host virtual, o host para abreviar, es un sitio web que el servidor nginx pondrá a disposición para abrirse en un navegador. Puede encontrar todos los hosts gestionados a la izquierda, en el menú principal. -frontend/home/hosts-description-2=nginx ignition proporciona una forma intuitiva de configurar dichos sitios web. Por ejemplo, si tiene un NAS y tiene algunos servicios ejecutándose en él (como Jellyfin, Vaultwarden y más), ignition permite una forma fácil de acceder a él desde un dominio como jellyfin.micasa.com, mucho más fácil de recordar y usar que una IP y un puerto. -frontend/home/hosts-description-3=Cada host tendrá un conjunto de rutas, que son reglas que definen qué patrones de solicitudes deben reenviarse y a dónde, y enlaces (bindings), que son las definiciones en qué puertos el nginx debe escuchar dichas solicitudes. -frontend/home/integrations-description=¿Su aplicación se está ejecutando en un contenedor Docker o en un TrueNAS? Puede habilitar la integración nativa que ofrece nginx ignition y elegir fácilmente un contenedor o aplicación como la aplicación de destino a la que el host debe reenviar las solicitudes. -frontend/home/logs-description-1=¿Necesita saber qué se ha solicitado o por qué algo no funciona como se esperaba? nginx ignition proporciona una forma sencilla para que revise los registros de nginx también. Simplemente seleccione el host (o el servidor nginx en sí) del que desea verificar qué está sucediendo, y obtendremos los registros por usted. -frontend/home/logs-description-2=Y no necesita preocuparse de que su disco se llene de registros, ignition los rotará automáticamente por usted (y puede controlar cuánto mantener, o incluso deshabilitar la rotación si le conviene más). -frontend/home/settings-description-1=Ignition abstrae la complejidad de los archivos de configuración de nginx, pero eso no significa que pierda la capacidad de aplicar algunos ajustes finos. -frontend/home/settings-description-2=Con la página de configuración, puede definir algunas definiciones importantes como los valores de tiempo de espera, el tamaño máximo de carga/cuerpo de las solicitudes, los puertos predeterminados en los que nginx escuchará las solicitudes y más. -frontend/home/settings-description-3=Más allá de eso, también puede configurar algunas de las características de nginx ignition allí, como la renovación automática de certificados SSL y la rotación de registros. -frontend/home/ssl-description-1=Si desea o necesita proteger sus dominios con cifrado HTTPS, la aplicación también viene con una forma fácil de gestionar dichos certificados SSL. -frontend/home/ssl-description-2=Ya sea si necesita un certificado válido respaldado por Let's Encrypt, uno autofirmado, o traer el suyo personalizado de un proveedor externo, ignition lo permitirá con facilidad. Incluso cuando el certificado esté a punto de caducar, la aplicación lo renovará automáticamente por usted. -frontend/home/ssl-description-3=Una vez que se crea o importa un certificado SSL, puede usarlo en los hosts simplemente seleccionando una opción en el formulario. -frontend/home/streams-description-1=Mientras que los hosts son la forma principal de exponer sus servicios basados en HTTP y HTTPS, los streams le permiten exponer otros servicios que dependen de TCP, UDP y sockets unix. -frontend/home/streams-description-2=Si necesita exponer un servidor de juegos, una base de datos, un servidor DNS y cualquier otra cosa que no use el protocolo HTTP, los streams son el camino a seguir. -frontend/home/vpns-description=Exponga fácilmente sus hosts en sus VPNs. Si está utilizando Tailscale, nginx ignition puede crear automáticamente una máquina virtual en su red y reenviar las solicitudes al host cada vez que se acceda a la IP o nombre de host de la máquina. -frontend/home/welcome-subtitle=Aquí hay información de inicio rápido para ayudarle a aprovechar al máximo la aplicación. Esperamos que la disfrute. -frontend/home/welcome-title=Hola, y bienvenido a nginx ignition 👋 +frontend/help/access-lists-description=Las listas de acceso proporcionan una forma sencilla de proteger una ruta o el host completo verificando si el usuario proviene de un rango de IPs autorizadas o se identifica con un nombre de usuario y contraseña válidos (o incluso ambos, IP y credenciales) +frontend/help/cache-description-1=Acelere sus sitios web y reduzca la carga en sus servidores upstream habilitando las capacidades de caché de contenido de nginx. Ignition facilita la configuración de reglas de caché que determinan qué solicitudes deben almacenarse en caché y por cuánto tiempo. +frontend/help/cache-description-2=Puede personalizar el comportamiento de la caché por códigos de estado HTTP, extensiones de archivo, métodos de solicitud y más. Características avanzadas como manejo de contenido obsoleto, actualizaciones en segundo plano y bloqueos de concurrencia le brindan un control detallado sobre cómo se almacena en caché y se sirve su contenido. +frontend/help/footer-link=Contáctenos en nuestra página de GitHub +frontend/help/footer-subtitle=Nos encantaría recibir sus comentarios. +frontend/help/footer-title=¿Todavía tiene preguntas o se perdió algo? +frontend/help/hosts-description-1=Un host virtual, o host para abreviar, es un sitio web que el servidor nginx pondrá a disposición para abrirse en un navegador. Puede encontrar todos los hosts gestionados a la izquierda, en el menú principal. +frontend/help/hosts-description-2=nginx ignition proporciona una forma intuitiva de configurar dichos sitios web. Por ejemplo, si tiene un NAS y tiene algunos servicios ejecutándose en él (como Jellyfin, Vaultwarden y más), ignition permite una forma fácil de acceder a él desde un dominio como jellyfin.micasa.com, mucho más fácil de recordar y usar que una IP y un puerto. +frontend/help/hosts-description-3=Cada host tendrá un conjunto de rutas, que son reglas que definen qué patrones de solicitudes deben reenviarse y a dónde, y enlaces (bindings), que son las definiciones en qué puertos el nginx debe escuchar dichas solicitudes. +frontend/help/integrations-description=¿Su aplicación se está ejecutando en un contenedor Docker o en un TrueNAS? Puede habilitar la integración nativa que ofrece nginx ignition y elegir fácilmente un contenedor o aplicación como la aplicación de destino a la que el host debe reenviar las solicitudes. +frontend/help/logs-description-1=¿Necesita saber qué se ha solicitado o por qué algo no funciona como se esperaba? nginx ignition proporciona una forma sencilla para que revise los registros de nginx también. Simplemente seleccione el host (o el servidor nginx en sí) del que desea verificar qué está sucediendo, y obtendremos los registros por usted. +frontend/help/logs-description-2=Y no necesita preocuparse de que su disco se llene de registros, ignition los rotará automáticamente por usted (y puede controlar cuánto mantener, o incluso deshabilitar la rotación si le conviene más). +frontend/help/settings-description-1=Ignition abstrae la complejidad de los archivos de configuración de nginx, pero eso no significa que pierda la capacidad de aplicar algunos ajustes finos. +frontend/help/settings-description-2=Con la página de configuración, puede definir algunas definiciones importantes como los valores de tiempo de espera, el tamaño máximo de carga/cuerpo de las solicitudes, los puertos predeterminados en los que nginx escuchará las solicitudes y más. +frontend/help/settings-description-3=Más allá de eso, también puede configurar algunas de las características de nginx ignition allí, como la renovación automática de certificados SSL y la rotación de registros. +frontend/help/ssl-description-1=Si desea o necesita proteger sus dominios con cifrado HTTPS, la aplicación también viene con una forma fácil de gestionar dichos certificados SSL. +frontend/help/ssl-description-2=Ya sea si necesita un certificado válido respaldado por Let's Encrypt, uno autofirmado, o traer el suyo personalizado de un proveedor externo, ignition lo permitirá con facilidad. Incluso cuando el certificado esté a punto de caducar, la aplicación lo renovará automáticamente por usted. +frontend/help/ssl-description-3=Una vez que se crea o importa un certificado SSL, puede usarlo en los hosts simplemente seleccionando una opción en el formulario. +frontend/help/streams-description-1=Mientras que los hosts son la forma principal de exponer sus servicios basados en HTTP y HTTPS, los streams le permiten exponer otros servicios que dependen de TCP, UDP y sockets unix. +frontend/help/streams-description-2=Si necesita exponer un servidor de juegos, una base de datos, un servidor DNS y cualquier otra cosa que no use el protocolo HTTP, los streams son el camino a seguir. +frontend/help/vpns-description=Exponga fácilmente sus hosts en sus VPNs. Si está utilizando Tailscale, nginx ignition puede crear automáticamente una máquina virtual en su red y reenviar las solicitudes al host cada vez que se acceda a la IP o nombre de host de la máquina. +frontend/help/welcome-subtitle=Aquí hay información de inicio rápido para ayudarle a aprovechar al máximo la aplicación. Esperamos que la disfrute. +frontend/help/welcome-title=Hola, y bienvenido a nginx ignition 👋 +frontend/home/certificates-expiring-title=Certificados que expiran en 30 días +frontend/home/expires-in-days=Expira en ${days} días +frontend/home/expires-today=Expira hoy +frontend/home/nginx-offline=Desconectado +frontend/home/nginx-online=Conectado +frontend/home/nginx-reload=Recargar configuración +frontend/home/nginx-section-title=nginx ${version} +frontend/home/nginx-start=Iniciar servidor +frontend/home/nginx-stop-confirmation=¿Detener el servidor nginx ahora? +frontend/home/nginx-stop=Detener servidor +frontend/home/nginx-unknown=Estado desconocido +frontend/home/no-certificates-expiring=Ningún certificado expira en los próximos 30 días +frontend/home/recent-errors-disabled=Los registros de error del servidor están desactivados en la configuración +frontend/home/recent-errors-empty=No hay entradas recientes en el registro de errores +frontend/home/recent-errors-title=Registro de errores reciente +frontend/home/subtitle=Resumen de tu instancia de nginx ignition +frontend/home/title=Resumen principal +frontend/home/totals-title=Totales +frontend/home/traffic-disabled=Las estadísticas de tráfico están desactivadas en la configuración +frontend/home/traffic-no-data=Aún no hay datos de tráfico registrados +frontend/home/traffic-offline=Las estadísticas de tráfico requieren que nginx esté en ejecución +frontend/home/traffic-unsupported=Esta compilación de nginx no admite estadísticas de tráfico +frontend/home/view-full-stats=Ver estadísticas de tráfico completas frontend/host/components/enable-https-help=Los certificados HTTPS son administrados y provistos automáticamente por su proveedor de VPN. frontend/host/components/enable-https=Habilitar puntos de conexión HTTPS frontend/host/components/hostbindings/add-binding=Añadir enlace @@ -1244,7 +1268,6 @@ frontend/locale/pagination/prev-page=Página anterior frontend/logs/access-disabled=Los registros de acceso del host están deshabilitados en la configuración de nginx frontend/logs/access-logs=Registros de acceso frontend/logs/auto-refresh-disabled-reason=La actualización automática está habilitada -frontend/logs/auto-refresh-option=Cada ${seconds} segundos frontend/logs/auto-refresh=Actualización automática frontend/logs/category=Categoría frontend/logs/error-disabled=Los registros de error del host están deshabilitados en la configuración de nginx diff --git a/i18n/messages_fr.properties b/i18n/messages_fr.properties index bcdd0d1f0..53bb2004d 100644 --- a/i18n/messages_fr.properties +++ b/i18n/messages_fr.properties @@ -732,6 +732,7 @@ common/add-duration=Ajouter une durée common/advanced=Avancé common/app-name=nginx ignition common/at-least-one-required=Au moins une valeur doit être renseignée +common/auto-refresh-option=Toutes les ${seconds} secondes common/auto-refresh=Actualisation automatique common/between-values=La valeur doit être comprise entre ${min} et ${max} common/binding=Liaison @@ -1099,29 +1100,52 @@ frontend/export/section-database-title=Sauvegarde de base de données frontend/export/section-nginx-description-1=Chaque fois que vous faites un changement en utilisant nginx ignition et rechargez le serveur, les fichiers de configuration nginx sont générés ou mis à jour avec tous les hôtes, flux, certificats SSL et autres que vous avez activés. frontend/export/section-nginx-description-2=En téléchargeant les fichiers de configuration nginx, vous pouvez analyser/revoir leur contenu ou même déployer un serveur nginx avec ces mêmes paramètres et comportements presque de la même manière que le fait nginx ignition. frontend/export/subtitle=Télécharger les fichiers de configuration nginx et le contenu de la base de données ignition pour sauvegarde et récupération -frontend/home/access-lists-description=Les listes d'accès offrent un moyen simple de protéger soit une route soit l'hôte entier en vérifiant si l'utilisateur provient d'une plage d'IP autorisées ou est identifié par un nom d'utilisateur et un mot de passe valides (ou même les deux, IP et identifiants) -frontend/home/cache-description-1=Accélérez vos sites web et réduisez la charge sur vos serveurs amont en activant les capacités de mise en cache de contenu de nginx. Ignition facilite la configuration des règles de cache qui déterminent quelles requêtes doivent être mises en cache et pour combien de temps. -frontend/home/cache-description-2=Vous pouvez personnaliser le comportement du cache par codes d'état HTTP, extensions de fichier, méthodes de requête, et plus. Des fonctionnalités avancées comme la gestion du contenu périmé, les mises à jour en arrière-plan et les verrous de concurrence vous donnent un contrôle précis sur la façon dont votre contenu est mis en cache et servi. -frontend/home/footer-link=Contactez-nous sur notre page GitHub -frontend/home/footer-subtitle=Nous aimerions avoir vos retours. -frontend/home/footer-title=Vous avez encore des questions ou manqué quelque chose ? -frontend/home/hosts-description-1=Un hôte virtuel, hôte en bref, est un site web que le serveur nginx rendra disponible pour être ouvert dans un navigateur. Vous pouvez trouver tous les hôtes gérés à gauche, dans le menu principal. -frontend/home/hosts-description-2=nginx ignition fournit un moyen intuitif de configurer de tels sites web. Par exemple, si vous avez un NAS et avez des services qui tournent dessus (comme Jellyfin, Vaultwarden et plus), ignition permet un moyen facile d'y accéder depuis un domaine comme jellyfin.amaison.com, bien plus facile à retenir et utiliser qu'une IP et un port. -frontend/home/hosts-description-3=Chaque hôte aura un ensemble de routes, qui sont des règles définissant quels modèles de requêtes doivent être transférés et vers où, et des liaisons, qui sont les définitions des ports sur lesquels nginx doit écouter pour de telles requêtes. -frontend/home/integrations-description=Votre application tourne-t-elle dans un conteneur Docker ou dans un TrueNAS ? Vous pouvez activer l'intégration native offerte par nginx ignition et choisir facilement un conteneur ou une application comme application de destination vers laquelle l'hôte doit transférer les requêtes. -frontend/home/logs-description-1=Besoin de savoir ce qui a été demandé ou pourquoi quelque chose ne fonctionne pas comme prévu ? nginx ignition fournit un moyen simple pour vous de vérifier les logs nginx aussi. Sélectionnez simplement l'hôte (ou le serveur nginx lui-même) dont vous voulez vérifier ce qui se passe, et nous récupérerons les logs pour vous. -frontend/home/logs-description-2=Et vous n'avez pas à vous soucier que votre disque se remplisse de logs, ignition les fera tourner automatiquement pour vous (et vous pouvez contrôler combien en garder, ou même désactiver la rotation si cela vous convient mieux). -frontend/home/settings-description-1=Ignition abstrait la complexité des fichiers de configuration nginx, mais cela ne signifie pas que vous perdez la capacité d'appliquer certains ajustements fins. -frontend/home/settings-description-2=Avec la page des paramètres, vous pouvez définir certaines définitions importantes telles que les valeurs de délai d'attente, la taille maximale d'upload/corps des requêtes, les ports par défaut sur lesquels nginx écoutera les requêtes et plus. -frontend/home/settings-description-3=Au-delà de cela, vous pouvez également configurer certaines des fonctionnalités de nginx ignition là-bas, comme le renouvellement automatique des certificats SSL et la rotation des logs. -frontend/home/ssl-description-1=Si vous voulez ou devez protéger vos domaines avec le chiffrement HTTPS, l'application vient avec un moyen facile de gérer de tels certificats SSL aussi. -frontend/home/ssl-description-2=Que vous ayez besoin d'un certificat valide soutenu par Let's Encrypt, d'un auto-signé, ou d'apporter le vôtre personnalisé d'un fournisseur tiers, ignition le permettra avec facilité. Même lorsque le certificat est sur le point d'expirer, l'application le renouvellera automatiquement pour vous. -frontend/home/ssl-description-3=Une fois qu'un certificat SSL est créé ou importé, vous pouvez l'utiliser sur les hôtes en sélectionnant simplement une option dans le formulaire. -frontend/home/streams-description-1=Tandis que les hôtes sont le moyen principal d'exposer vos services basés sur HTTP et HTTPS, les flux vous permettent d'exposer d'autres services qui reposent sur TCP, UDP et les sockets unix. -frontend/home/streams-description-2=Si vous devez exposer un serveur de jeu, une base de données, un serveur DNS et tout autre chose n'utilisant pas le protocole HTTP, les flux sont la voie à suivre. -frontend/home/vpns-description=Exposez facilement vos hôtes dans vos VPNs. Si vous utilisez Tailscale, nginx ignition peut créer automatiquement une machine virtuelle dans votre réseau et transférer les requêtes vers l'hôte chaque fois que l'IP de la machine ou le nom d'hôte est accédé. -frontend/home/welcome-subtitle=Voici quelques infos de démarrage rapide pour vous aider à tirer le meilleur parti de l'application. Nous espérons que vous l'apprécierez. -frontend/home/welcome-title=Bonjour, et bienvenue sur nginx ignition 👋 +frontend/help/access-lists-description=Les listes d'accès offrent un moyen simple de protéger soit une route soit l'hôte entier en vérifiant si l'utilisateur provient d'une plage d'IP autorisées ou est identifié par un nom d'utilisateur et un mot de passe valides (ou même les deux, IP et identifiants) +frontend/help/cache-description-1=Accélérez vos sites web et réduisez la charge sur vos serveurs amont en activant les capacités de mise en cache de contenu de nginx. Ignition facilite la configuration des règles de cache qui déterminent quelles requêtes doivent être mises en cache et pour combien de temps. +frontend/help/cache-description-2=Vous pouvez personnaliser le comportement du cache par codes d'état HTTP, extensions de fichier, méthodes de requête, et plus. Des fonctionnalités avancées comme la gestion du contenu périmé, les mises à jour en arrière-plan et les verrous de concurrence vous donnent un contrôle précis sur la façon dont votre contenu est mis en cache et servi. +frontend/help/footer-link=Contactez-nous sur notre page GitHub +frontend/help/footer-subtitle=Nous aimerions avoir vos retours. +frontend/help/footer-title=Vous avez encore des questions ou manqué quelque chose ? +frontend/help/hosts-description-1=Un hôte virtuel, hôte en bref, est un site web que le serveur nginx rendra disponible pour être ouvert dans un navigateur. Vous pouvez trouver tous les hôtes gérés à gauche, dans le menu principal. +frontend/help/hosts-description-2=nginx ignition fournit un moyen intuitif de configurer de tels sites web. Par exemple, si vous avez un NAS et avez des services qui tournent dessus (comme Jellyfin, Vaultwarden et plus), ignition permet un moyen facile d'y accéder depuis un domaine comme jellyfin.amaison.com, bien plus facile à retenir et utiliser qu'une IP et un port. +frontend/help/hosts-description-3=Chaque hôte aura un ensemble de routes, qui sont des règles définissant quels modèles de requêtes doivent être transférés et vers où, et des liaisons, qui sont les définitions des ports sur lesquels nginx doit écouter pour de telles requêtes. +frontend/help/integrations-description=Votre application tourne-t-elle dans un conteneur Docker ou dans un TrueNAS ? Vous pouvez activer l'intégration native offerte par nginx ignition et choisir facilement un conteneur ou une application comme application de destination vers laquelle l'hôte doit transférer les requêtes. +frontend/help/logs-description-1=Besoin de savoir ce qui a été demandé ou pourquoi quelque chose ne fonctionne pas comme prévu ? nginx ignition fournit un moyen simple pour vous de vérifier les logs nginx aussi. Sélectionnez simplement l'hôte (ou le serveur nginx lui-même) dont vous voulez vérifier ce qui se passe, et nous récupérerons les logs pour vous. +frontend/help/logs-description-2=Et vous n'avez pas à vous soucier que votre disque se remplisse de logs, ignition les fera tourner automatiquement pour vous (et vous pouvez contrôler combien en garder, ou même désactiver la rotation si cela vous convient mieux). +frontend/help/settings-description-1=Ignition abstrait la complexité des fichiers de configuration nginx, mais cela ne signifie pas que vous perdez la capacité d'appliquer certains ajustements fins. +frontend/help/settings-description-2=Avec la page des paramètres, vous pouvez définir certaines définitions importantes telles que les valeurs de délai d'attente, la taille maximale d'upload/corps des requêtes, les ports par défaut sur lesquels nginx écoutera les requêtes et plus. +frontend/help/settings-description-3=Au-delà de cela, vous pouvez également configurer certaines des fonctionnalités de nginx ignition là-bas, comme le renouvellement automatique des certificats SSL et la rotation des logs. +frontend/help/ssl-description-1=Si vous voulez ou devez protéger vos domaines avec le chiffrement HTTPS, l'application vient avec un moyen facile de gérer de tels certificats SSL aussi. +frontend/help/ssl-description-2=Que vous ayez besoin d'un certificat valide soutenu par Let's Encrypt, d'un auto-signé, ou d'apporter le vôtre personnalisé d'un fournisseur tiers, ignition le permettra avec facilité. Même lorsque le certificat est sur le point d'expirer, l'application le renouvellera automatiquement pour vous. +frontend/help/ssl-description-3=Une fois qu'un certificat SSL est créé ou importé, vous pouvez l'utiliser sur les hôtes en sélectionnant simplement une option dans le formulaire. +frontend/help/streams-description-1=Tandis que les hôtes sont le moyen principal d'exposer vos services basés sur HTTP et HTTPS, les flux vous permettent d'exposer d'autres services qui reposent sur TCP, UDP et les sockets unix. +frontend/help/streams-description-2=Si vous devez exposer un serveur de jeu, une base de données, un serveur DNS et tout autre chose n'utilisant pas le protocole HTTP, les flux sont la voie à suivre. +frontend/help/vpns-description=Exposez facilement vos hôtes dans vos VPNs. Si vous utilisez Tailscale, nginx ignition peut créer automatiquement une machine virtuelle dans votre réseau et transférer les requêtes vers l'hôte chaque fois que l'IP de la machine ou le nom d'hôte est accédé. +frontend/help/welcome-subtitle=Voici quelques infos de démarrage rapide pour vous aider à tirer le meilleur parti de l'application. Nous espérons que vous l'apprécierez. +frontend/help/welcome-title=Bonjour, et bienvenue sur nginx ignition 👋 +frontend/home/certificates-expiring-title=Certificats expirant dans 30 jours +frontend/home/expires-in-days=Expire dans ${days} jours +frontend/home/expires-today=Expire aujourd'hui +frontend/home/nginx-offline=Hors ligne +frontend/home/nginx-online=En ligne +frontend/home/nginx-reload=Recharger la configuration +frontend/home/nginx-section-title=nginx ${version} +frontend/home/nginx-start=Démarrer le serveur +frontend/home/nginx-stop-confirmation=Arrêter le serveur nginx maintenant ? +frontend/home/nginx-stop=Arrêter le serveur +frontend/home/nginx-unknown=Statut inconnu +frontend/home/no-certificates-expiring=Aucun certificat n'expire dans les 30 prochains jours +frontend/home/recent-errors-disabled=Les journaux d'erreur du serveur sont désactivés dans les paramètres +frontend/home/recent-errors-empty=Aucune entrée récente dans le journal d'erreurs +frontend/home/recent-errors-title=Journal d'erreurs récent +frontend/home/subtitle=Aperçu de votre instance nginx ignition +frontend/home/title=Aperçu d'accueil +frontend/home/totals-title=Ressources +frontend/home/traffic-disabled=Les statistiques de trafic sont désactivées dans les paramètres +frontend/home/traffic-no-data=Aucune donnée de trafic enregistrée pour le moment +frontend/home/traffic-offline=Les statistiques de trafic nécessitent que nginx soit en cours d'exécution +frontend/home/traffic-unsupported=Cette compilation nginx ne prend pas en charge les statistiques de trafic +frontend/home/view-full-stats=Voir les statistiques de trafic complètes frontend/host/components/enable-https-help=Les certificats HTTPS sont gérés et automatiquement fournis par votre fournisseur VPN. frontend/host/components/enable-https=Activer les points de terminaison HTTPS frontend/host/components/hostbindings/add-binding=Ajouter une liaison @@ -1244,7 +1268,6 @@ frontend/locale/pagination/prev-page=Page précédente frontend/logs/access-disabled=Les logs d'accès de l'hôte sont désactivés dans la configuration nginx frontend/logs/access-logs=Logs d'accès frontend/logs/auto-refresh-disabled-reason=Le rafraîchissement auto est activé -frontend/logs/auto-refresh-option=Toutes les ${seconds} secondes frontend/logs/auto-refresh=Rafraîchissement auto frontend/logs/category=Catégorie frontend/logs/error-disabled=Les logs d'erreur de l'hôte sont désactivés dans la configuration nginx diff --git a/i18n/messages_hi.properties b/i18n/messages_hi.properties index 4564e1bd4..6408d2c3f 100644 --- a/i18n/messages_hi.properties +++ b/i18n/messages_hi.properties @@ -732,6 +732,7 @@ common/add-duration=अवधि जोड़ें common/advanced=एडवांस्ड common/app-name=nginx ignition common/at-least-one-required=कम से कम एक मान सूचित किया जाना चाहिए +common/auto-refresh-option=हर ${seconds} सेकंड common/auto-refresh=स्वतः रिफ्रेश common/between-values=मान ${min} और ${max} के बीच होना चाहिए common/binding=बाइंडिंग @@ -1099,29 +1100,52 @@ frontend/export/section-database-title=डेटाबेस बैकअप frontend/export/section-nginx-description-1=जब भी आप nginx ignition का उपयोग करके कोई बदलाव करते हैं और सर्वर को रिलोड करते हैं, तो nginx कॉन्फ़िगरेशन फ़ाइलें उन सभी होस्ट, स्ट्रीम, SSL प्रमाणपत्रों और बहुत कुछ के साथ जनरेट या अपडेट की जाती हैं जिन्हें आपने सक्षम किया है। frontend/export/section-nginx-description-2=nginx कॉन्फ़िगरेशन फ़ाइलों को डाउनलोड करके, आप इसकी सामग्री का विश्लेषण/समीक्षा कर सकते हैं या इन समान सेटिंग्स और व्यवहारों के साथ एक nginx सर्वर भी तैनात कर सकते हैं, ठीक उसी तरह जैसे nginx ignition करता है। frontend/export/subtitle=बैकअप और रिकवरी के लिए nginx कॉन्फ़िगरेशन फ़ाइलें और ignition डेटाबेस सामग्री डाउनलोड करें -frontend/home/access-lists-description=एक्सेस लिस्ट यह जाँचने का एक सरल तरीका प्रदान करती हैं कि क्या उपयोगकर्ता अधिकृत IPs की एक श्रृंखला से है या एक वैध यूज़रनेम और पासवर्ड (या दोनों, IP और क्रेडेंशियल) द्वारा पहचाना जाता है, जिससे रूट या पूरे होस्ट को सुरक्षित किया जा सके -frontend/home/cache-description-1=nginx की सामग्री कैशिंग क्षमताओं को सक्षम करके अपनी वेबसाइटों को गति दें और अपने अपस्ट्रीम सर्वर पर लोड कम करें। Ignition कैश नियमों को कॉन्फ़िगर करना आसान बनाता है जो यह निर्धारित करते हैं कि किन अनुरोधों को कैश किया जाना चाहिए और कितनी देर तक। -frontend/home/cache-description-2=आप HTTP स्टेटस कोड, फ़ाइल एक्सटेंशन, अनुरोध विधियों और बहुत कुछ द्वारा कैश व्यवहार को कस्टमाइज़ कर सकते हैं। स्टेल सामग्री हैंडलिंग, बैकग्राउंड अपडेट और कंकरेंसी लॉक जैसी उन्नत सुविधाएँ आपको इस पर बारीक नियंत्रण देती हैं कि आपकी सामग्री कैसे कैश और सर्व की जाती है। -frontend/home/footer-link=हमारे GitHub पेज पर हमसे संपर्क करें -frontend/home/footer-subtitle=हमें आपसे कुछ प्रतिक्रिया बहुत पसंद आएगी। -frontend/home/footer-title=अभी भी कोई सवाल है या कुछ छूट गया? -frontend/home/hosts-description-1=एक वर्चुअल होस्ट, संक्षेप में होस्ट, एक वेबसाइट है जिसे nginx सर्वर ब्राउज़र में खोलने के लिए उपलब्ध कराएगा। आप मुख्य मेनू पर, बाईं ओर प्रबंधित सभी होस्ट पा सकते हैं। -frontend/home/hosts-description-2=nginx ignition ऐसी वेबसाइटों को कॉन्फ़िगर करने का एक सहज तरीका प्रदान करता है। उदाहरण के लिए, यदि आपके पास एक NAS है और उस पर कुछ सेवाएँ चल रही हैं (जैसे Jellyfin, Vaultwarden और अधिक), ignition इसे jellyfin.myhome.com जैसे डोमेन से एक्सेस करने का एक आसान तरीका सक्षम करता है, जो IP और पोर्ट की तुलना में याद रखना और उपयोग करना बहुत आसान है। -frontend/home/hosts-description-3=प्रत्येक होस्ट के पास रूट्स का एक सेट होगा, जो ऐसे नियम हैं जो यह परिभाषित करते हैं कि किन अनुरोध पैटर्न को फॉरवर्ड किया जाना चाहिए और कहाँ, और बाइंडिंग्स, जो परिभाषाएँ हैं कि nginx को ऐसे अनुरोधों के लिए किन पोर्ट्स पर सुनना चाहिए। -frontend/home/integrations-description=क्या आपका ऐप Docker कंटेनर में या TrueNAS में चल रहा है? आप nginx ignition द्वारा प्रदान किए जाने वाले नेटिव इंटीग्रेशन को सक्षम कर सकते हैं और आसानी से एक कंटेनर या ऐप को डेस्टिनेशन ऐप के रूप में चुन सकते हैं जिसे होस्ट को अनुरोधों को फॉरवर्ड करना चाहिए। -frontend/home/logs-description-1=यह जानने की आवश्यकता है कि क्या अनुरोध किया गया है या कुछ अपेक्षा के अनुरूप काम क्यों नहीं कर रहा है? nginx ignition आपको nginx लॉग्स की जाँच करने का एक सरल तरीका भी प्रदान करता है। बस उस होस्ट (या स्वयं nginx सर्वर) का चयन करें जिसे आप देखना चाहते हैं कि क्या हो रहा है, और हम आपके लिए लॉग प्राप्त करेंगे। -frontend/home/logs-description-2=और आपको अपनी डिस्क के लॉग से भरने के बारे में चिंता करने की ज़रूरत नहीं है, ignition उन्हें आपके लिए स्वचालित रूप से रोटेट करेगा (और आप नियंत्रित कर सकते हैं कि कितना रखना है, या यदि यह आपको सबसे अच्छा लगता है तो रोटेशन को अक्षम भी कर सकते हैं)। -frontend/home/settings-description-1=Ignition nginx की कॉन्फ़िगरेशन फ़ाइलों की जटिलता को दूर करता है, लेकिन इसका मतलब यह नहीं है कि आप कुछ ठीक समायोजन लागू करने की क्षमता खो देते हैं। -frontend/home/settings-description-2=सेटिंग्स पेज के साथ, आप कुछ महत्वपूर्ण परिभाषाएँ जैसे टाइमआउट मान, अनुरोधों का अधिकतम अपलोड/बॉडी आकार, डिफ़ॉल्ट पोर्ट्स जिन पर nginx अनुरोधों के लिए सुनेगा और बहुत कुछ परिभाषित कर सकते हैं। -frontend/home/settings-description-3=इसके अलावा, आप वहाँ nginx ignition की कुछ विशेषताओं को भी कॉन्फ़िगर कर सकते हैं, जैसे SSL प्रमाणपत्रों का स्वचालित नवीनीकरण और लॉग रोटेशन। -frontend/home/ssl-description-1=यदि आप अपने डोमेन को HTTPS एन्क्रिप्शन के साथ सुरक्षित करना चाहते हैं या इसकी आवश्यकता है, तो ऐप ऐसे SSL प्रमाणपत्रों को प्रबंधित करने के लिए एक आसान तरीका भी प्रदान करता है। -frontend/home/ssl-description-2=चाहे आपको Let's Encrypt द्वारा समर्थित वैध प्रमाणपत्र की आवश्यकता हो, स्व-हस्ताक्षरित, या किसी तृतीय-पक्ष प्रदाता के लिए अपना कस्टम लाएं, ignition इसे आसानी से अनुमति देगा। यहां तक कि जब प्रमाणपत्र समाप्त होने वाला होता है, तो ऐप स्वचालित रूप से आपके लिए इसे नवीनीकृत कर देगा। -frontend/home/ssl-description-3=एक बार SSL प्रमाणपत्र बन जाने या आयात हो जाने के बाद, आप फ़ॉर्म में एक विकल्प का चयन करके इसे होस्ट पर उपयोग कर सकते हैं। -frontend/home/streams-description-1=जबकि होस्ट आपकी HTTP और HTTPS-आधारित सेवाओं को उजागर करने का मुख्य तरीका हैं, स्ट्रीम आपको अन्य सेवाओं को उजागर करने में सक्षम बनाती हैं जो TCP, UDP और यूनिक्स सॉकेट पर निर्भर करती हैं। -frontend/home/streams-description-2=यदि आपको गेम सर्वर, डेटाबेस, DNS सर्वर और कुछ भी जो HTTP प्रोटोकॉल का उपयोग नहीं करता है, को उजागर करने की आवश्यकता है, तो स्ट्रीम जाने का रास्ता है। -frontend/home/vpns-description=आसानी से अपने होस्ट को अपने VPN में उजागर करें। यदि आप Tailscale का उपयोग कर रहे हैं, तो nginx ignition स्वचालित रूप से आपके नेटवर्क में एक वर्चुअल मशीन बना सकता है और जब भी मशीन IP या होस्टनाम एक्सेस किया जाता है तो अनुरोधों को होस्ट को फॉरवर्ड कर सकता है। -frontend/home/welcome-subtitle=ऐप का अधिकतम लाभ उठाने में आपकी सहायता के लिए यहाँ कुछ त्वरित प्रारंभ जानकारी दी गई है। हमें उम्मीद है कि आप इसका आनंद लेंगे। -frontend/home/welcome-title=नमस्ते, और nginx ignition में आपका स्वागत है 👋 +frontend/help/access-lists-description=एक्सेस लिस्ट यह जाँचने का एक सरल तरीका प्रदान करती हैं कि क्या उपयोगकर्ता अधिकृत IPs की एक श्रृंखला से है या एक वैध यूज़रनेम और पासवर्ड (या दोनों, IP और क्रेडेंशियल) द्वारा पहचाना जाता है, जिससे रूट या पूरे होस्ट को सुरक्षित किया जा सके +frontend/help/cache-description-1=nginx की सामग्री कैशिंग क्षमताओं को सक्षम करके अपनी वेबसाइटों को गति दें और अपने अपस्ट्रीम सर्वर पर लोड कम करें। Ignition कैश नियमों को कॉन्फ़िगर करना आसान बनाता है जो यह निर्धारित करते हैं कि किन अनुरोधों को कैश किया जाना चाहिए और कितनी देर तक। +frontend/help/cache-description-2=आप HTTP स्टेटस कोड, फ़ाइल एक्सटेंशन, अनुरोध विधियों और बहुत कुछ द्वारा कैश व्यवहार को कस्टमाइज़ कर सकते हैं। स्टेल सामग्री हैंडलिंग, बैकग्राउंड अपडेट और कंकरेंसी लॉक जैसी उन्नत सुविधाएँ आपको इस पर बारीक नियंत्रण देती हैं कि आपकी सामग्री कैसे कैश और सर्व की जाती है। +frontend/help/footer-link=हमारे GitHub पेज पर हमसे संपर्क करें +frontend/help/footer-subtitle=हमें आपसे कुछ प्रतिक्रिया बहुत पसंद आएगी। +frontend/help/footer-title=अभी भी कोई सवाल है या कुछ छूट गया? +frontend/help/hosts-description-1=एक वर्चुअल होस्ट, संक्षेप में होस्ट, एक वेबसाइट है जिसे nginx सर्वर ब्राउज़र में खोलने के लिए उपलब्ध कराएगा। आप मुख्य मेनू पर, बाईं ओर प्रबंधित सभी होस्ट पा सकते हैं। +frontend/help/hosts-description-2=nginx ignition ऐसी वेबसाइटों को कॉन्फ़िगर करने का एक सहज तरीका प्रदान करता है। उदाहरण के लिए, यदि आपके पास एक NAS है और उस पर कुछ सेवाएँ चल रही हैं (जैसे Jellyfin, Vaultwarden और अधिक), ignition इसे jellyfin.myhome.com जैसे डोमेन से एक्सेस करने का एक आसान तरीका सक्षम करता है, जो IP और पोर्ट की तुलना में याद रखना और उपयोग करना बहुत आसान है। +frontend/help/hosts-description-3=प्रत्येक होस्ट के पास रूट्स का एक सेट होगा, जो ऐसे नियम हैं जो यह परिभाषित करते हैं कि किन अनुरोध पैटर्न को फॉरवर्ड किया जाना चाहिए और कहाँ, और बाइंडिंग्स, जो परिभाषाएँ हैं कि nginx को ऐसे अनुरोधों के लिए किन पोर्ट्स पर सुनना चाहिए। +frontend/help/integrations-description=क्या आपका ऐप Docker कंटेनर में या TrueNAS में चल रहा है? आप nginx ignition द्वारा प्रदान किए जाने वाले नेटिव इंटीग्रेशन को सक्षम कर सकते हैं और आसानी से एक कंटेनर या ऐप को डेस्टिनेशन ऐप के रूप में चुन सकते हैं जिसे होस्ट को अनुरोधों को फॉरवर्ड करना चाहिए। +frontend/help/logs-description-1=यह जानने की आवश्यकता है कि क्या अनुरोध किया गया है या कुछ अपेक्षा के अनुरूप काम क्यों नहीं कर रहा है? nginx ignition आपको nginx लॉग्स की जाँच करने का एक सरल तरीका भी प्रदान करता है। बस उस होस्ट (या स्वयं nginx सर्वर) का चयन करें जिसे आप देखना चाहते हैं कि क्या हो रहा है, और हम आपके लिए लॉग प्राप्त करेंगे। +frontend/help/logs-description-2=और आपको अपनी डिस्क के लॉग से भरने के बारे में चिंता करने की ज़रूरत नहीं है, ignition उन्हें आपके लिए स्वचालित रूप से रोटेट करेगा (और आप नियंत्रित कर सकते हैं कि कितना रखना है, या यदि यह आपको सबसे अच्छा लगता है तो रोटेशन को अक्षम भी कर सकते हैं)। +frontend/help/settings-description-1=Ignition nginx की कॉन्फ़िगरेशन फ़ाइलों की जटिलता को दूर करता है, लेकिन इसका मतलब यह नहीं है कि आप कुछ ठीक समायोजन लागू करने की क्षमता खो देते हैं। +frontend/help/settings-description-2=सेटिंग्स पेज के साथ, आप कुछ महत्वपूर्ण परिभाषाएँ जैसे टाइमआउट मान, अनुरोधों का अधिकतम अपलोड/बॉडी आकार, डिफ़ॉल्ट पोर्ट्स जिन पर nginx अनुरोधों के लिए सुनेगा और बहुत कुछ परिभाषित कर सकते हैं। +frontend/help/settings-description-3=इसके अलावा, आप वहाँ nginx ignition की कुछ विशेषताओं को भी कॉन्फ़िगर कर सकते हैं, जैसे SSL प्रमाणपत्रों का स्वचालित नवीनीकरण और लॉग रोटेशन। +frontend/help/ssl-description-1=यदि आप अपने डोमेन को HTTPS एन्क्रिप्शन के साथ सुरक्षित करना चाहते हैं या इसकी आवश्यकता है, तो ऐप ऐसे SSL प्रमाणपत्रों को प्रबंधित करने के लिए एक आसान तरीका भी प्रदान करता है। +frontend/help/ssl-description-2=चाहे आपको Let's Encrypt द्वारा समर्थित वैध प्रमाणपत्र की आवश्यकता हो, स्व-हस्ताक्षरित, या किसी तृतीय-पक्ष प्रदाता के लिए अपना कस्टम लाएं, ignition इसे आसानी से अनुमति देगा। यहां तक कि जब प्रमाणपत्र समाप्त होने वाला होता है, तो ऐप स्वचालित रूप से आपके लिए इसे नवीनीकृत कर देगा। +frontend/help/ssl-description-3=एक बार SSL प्रमाणपत्र बन जाने या आयात हो जाने के बाद, आप फ़ॉर्म में एक विकल्प का चयन करके इसे होस्ट पर उपयोग कर सकते हैं। +frontend/help/streams-description-1=जबकि होस्ट आपकी HTTP और HTTPS-आधारित सेवाओं को उजागर करने का मुख्य तरीका हैं, स्ट्रीम आपको अन्य सेवाओं को उजागर करने में सक्षम बनाती हैं जो TCP, UDP और यूनिक्स सॉकेट पर निर्भर करती हैं। +frontend/help/streams-description-2=यदि आपको गेम सर्वर, डेटाबेस, DNS सर्वर और कुछ भी जो HTTP प्रोटोकॉल का उपयोग नहीं करता है, को उजागर करने की आवश्यकता है, तो स्ट्रीम जाने का रास्ता है। +frontend/help/vpns-description=आसानी से अपने होस्ट को अपने VPN में उजागर करें। यदि आप Tailscale का उपयोग कर रहे हैं, तो nginx ignition स्वचालित रूप से आपके नेटवर्क में एक वर्चुअल मशीन बना सकता है और जब भी मशीन IP या होस्टनाम एक्सेस किया जाता है तो अनुरोधों को होस्ट को फॉरवर्ड कर सकता है। +frontend/help/welcome-subtitle=ऐप का अधिकतम लाभ उठाने में आपकी सहायता के लिए यहाँ कुछ त्वरित प्रारंभ जानकारी दी गई है। हमें उम्मीद है कि आप इसका आनंद लेंगे। +frontend/help/welcome-title=नमस्ते, और nginx ignition में आपका स्वागत है 👋 +frontend/home/certificates-expiring-title=30 दिनों में समाप्त होने वाले प्रमाणपत्र +frontend/home/expires-in-days=${days} दिनों में समाप्त +frontend/home/expires-today=आज समाप्त +frontend/home/nginx-offline=Offline +frontend/home/nginx-online=Online +frontend/home/nginx-reload=कॉन्फ़िगरेशन पुनः लोड करें +frontend/home/nginx-section-title=nginx ${version} +frontend/home/nginx-start=सर्वर शुरू करें +frontend/home/nginx-stop-confirmation=nginx सर्वर अभी रोकें? +frontend/home/nginx-stop=सर्वर रोकें +frontend/home/nginx-unknown=स्थिति अज्ञात +frontend/home/no-certificates-expiring=अगले 30 दिनों में कोई प्रमाणपत्र समाप्त नहीं हो रहा +frontend/home/recent-errors-disabled=सर्वर त्रुटि लॉग सेटिंग्स में अक्षम हैं +frontend/home/recent-errors-empty=दिखाने के लिए कोई हालिया त्रुटि लॉग प्रविष्टि नहीं +frontend/home/recent-errors-title=हालिया त्रुटि लॉग +frontend/home/subtitle=आपके nginx ignition इंस्टेंस का अवलोकन +frontend/home/title=होम अवलोकन +frontend/home/totals-title=संसाधन +frontend/home/traffic-disabled=ट्रैफ़िक आँकड़े सेटिंग्स में अक्षम हैं +frontend/home/traffic-no-data=अभी तक कोई ट्रैफ़िक डेटा दर्ज नहीं +frontend/home/traffic-offline=ट्रैफ़िक आँकड़ों के लिए nginx चल रहा होना आवश्यक है +frontend/home/traffic-unsupported=यह nginx बिल्ड ट्रैफ़िक आँकड़ों का समर्थन नहीं करता +frontend/home/view-full-stats=पूर्ण ट्रैफ़िक आँकड़े देखें frontend/host/components/enable-https-help=HTTPS प्रमाणपत्र आपके VPN प्रदाता द्वारा प्रबंधित और स्वचालित रूप से प्रदान किए जाते हैं। frontend/host/components/enable-https=HTTPS एंडपॉइंट सक्षम करें frontend/host/components/hostbindings/add-binding=बाइंडिंग जोड़ें @@ -1244,7 +1268,6 @@ frontend/locale/pagination/prev-page=पिछला पेज frontend/logs/access-disabled=nginx कॉन्फ़िगरेशन में होस्ट एक्सेस लॉग अक्षम हैं frontend/logs/access-logs=एक्सेस लॉग्स frontend/logs/auto-refresh-disabled-reason=ऑटो रिफ्रेश सक्षम है -frontend/logs/auto-refresh-option=हर ${seconds} सेकंड frontend/logs/auto-refresh=ऑटो-रिफ्रेश frontend/logs/category=श्रेणी frontend/logs/error-disabled=nginx कॉन्फ़िगरेशन में होस्ट त्रुटि लॉग अक्षम हैं diff --git a/i18n/messages_ja.properties b/i18n/messages_ja.properties index 8b76c2fd7..b4f40b0c3 100644 --- a/i18n/messages_ja.properties +++ b/i18n/messages_ja.properties @@ -732,6 +732,7 @@ common/add-duration=期間を追加 common/advanced=詳細設定 common/app-name=nginx ignition common/at-least-one-required=少なくとも1つの値を指定する必要があります +common/auto-refresh-option=${seconds} 秒ごと common/auto-refresh=自動更新 common/between-values=値は ${min} から ${max} の間である必要があります common/binding=バインディング @@ -1099,29 +1100,52 @@ frontend/export/section-database-title=データベースバックアップ frontend/export/section-nginx-description-1=nginx ignitionを使用して変更を加え、サーバーをリロードするたびに、有効にしたすべてのホスト、ストリーム、SSL証明書などを含むnginx設定ファイルが生成または更新されます。 frontend/export/section-nginx-description-2=nginx設定ファイルをダウンロードすることで、その内容を分析/レビューしたり、nginx ignitionとほぼ同じ方法でこれらの設定と動作を使用してnginxサーバーを展開したりできます。 frontend/export/subtitle=バックアップと復元のためにnginx設定ファイルとignitionデータベースの内容をダウンロードします -frontend/home/access-lists-description=アクセスリストは、ユーザーが許可されたIP範囲からのアクセスであるか、有効なユーザー名とパスワードで識別されているか(またはIPと認証情報の両方)を確認することで、ルートまたはホスト全体を保護する簡単な方法を提供します。 -frontend/home/cache-description-1=nginxのコンテンツキャッシュ機能を有効にすることで、Webサイトを高速化し、アップストリームサーバーの負荷を軽減します。Ignitionを使用すると、どのリクエストをどのくらいの期間キャッシュするかを決定するキャッシュルールを簡単に設定できます。 -frontend/home/cache-description-2=HTTPステータスコード、ファイル拡張子、リクエストメソッドなどによってキャッシュの動作をカスタマイズできます。古いコンテンツの処理、バックグラウンド更新、同時実行ロックなどの高度な機能により、コンテンツのキャッシュと提供方法を細かく制御できます。 -frontend/home/footer-link=GitHubページでお問い合わせください -frontend/home/footer-subtitle=フィードバックをお待ちしております。 -frontend/home/footer-title=質問がある場合や、何か見逃したことがありますか? -frontend/home/hosts-description-1=仮想ホスト(略してホスト)は、nginxサーバーがブラウザで開けるようにするWebサイトです。管理されているすべてのホストは、メインメニューの左側にあります。 -frontend/home/hosts-description-2=nginx ignitionは、このようなWebサイトを設定するための直感的な方法を提供します。たとえば、NASがあり、その上でいくつかのサービス(Jellyfin、Vaultwardenなど)を実行している場合、ignitionを使用すると、IPとポートよりもはるかに覚えやすく使いやすい jellyfin.myhome.com のようなドメインから簡単にアクセスできます。 -frontend/home/hosts-description-3=各ホストには、どのリクエストパターンをどこに転送するかを定義するルールであるルートと、nginxがそのようなリクエストをリッスンするポートの定義であるバインディングのセットがあります。 -frontend/home/integrations-description=アプリはDockerコンテナまたはTrueNASで実行されていますか?nginx ignitionが提供するネイティブ統合を有効にして、ホストがリクエストを転送する宛先アプリとしてコンテナまたはアプリを簡単に選択できます。 -frontend/home/logs-description-1=何が要求されたか、またはなぜ何かが期待どおりに機能しないのかを知る必要がありますか?nginx ignitionは、nginxログを確認するための簡単な方法も提供します。何が起こっているかを確認したいホスト(またはnginxサーバー自体)を選択するだけで、ログを取得します。 -frontend/home/logs-description-2=また、ディスクがログでいっぱいになることを心配する必要はありません。ignitionは自動的にログをローテーションします(保持する量を制御したり、必要に応じてローテーションを無効にしたりすることもできます)。 -frontend/home/settings-description-1=Ignitionはnginxの設定ファイルの複雑さを抽象化しますが、だからといって微調整を適用する機能が失われるわけではありません。 -frontend/home/settings-description-2=設定ページでは、タイムアウト値、リクエストの最大アップロード/ボディサイズ、nginxがリクエストをリッスンするデフォルトポートなどの重要な定義を定義できます。 -frontend/home/settings-description-3=さらに、SSL証明書の自動更新やログローテーションなど、nginx ignitionの機能の一部をそこで設定することもできます。 -frontend/home/ssl-description-1=ドメインをHTTPS暗号化で保護したい、または保護する必要がある場合、アプリにはそのようなSSL証明書を管理する簡単な方法も付属しています。 -frontend/home/ssl-description-2=Let's Encryptによる有効な証明書、自己署名証明書、またはサードパーティプロバイダーのカスタム証明書を持ち込む必要がある場合でも、ignitionを使用すると簡単に許可できます。証明書の有効期限が切れそうになっても、アプリが自動的に更新します。 -frontend/home/ssl-description-3=SSL証明書が作成またはインポートされたら、フォームのオプションを選択するだけでホストで使用できます。 -frontend/home/streams-description-1=ホストはHTTPおよびHTTPSベースのサービスを公開する主な方法ですが、ストリームを使用すると、TCP、UDP、およびUnixソケットに依存する他のサービスを公開できます。 -frontend/home/streams-description-2=ゲームサーバー、データベース、DNSサーバーなど、HTTPプロトコルを使用しないものを公開する必要がある場合は、ストリームが適しています。 -frontend/home/vpns-description=VPNでホストを簡単に公開できます。Tailscaleを使用している場合、nginx ignitionはネットワーク内に仮想マシンを自動的に作成し、マシンのIPまたはホスト名がアクセスされるたびにリクエストをホストに転送できます。 -frontend/home/welcome-subtitle=アプリを最大限に活用するためのクイックスタート情報をいくつか紹介します。楽しんでいただけることを願っています。 -frontend/home/welcome-title=こんにちは、nginx ignitionへようこそ 👋 +frontend/help/access-lists-description=アクセスリストは、ユーザーが許可されたIP範囲からのアクセスであるか、有効なユーザー名とパスワードで識別されているか(またはIPと認証情報の両方)を確認することで、ルートまたはホスト全体を保護する簡単な方法を提供します。 +frontend/help/cache-description-1=nginxのコンテンツキャッシュ機能を有効にすることで、Webサイトを高速化し、アップストリームサーバーの負荷を軽減します。Ignitionを使用すると、どのリクエストをどのくらいの期間キャッシュするかを決定するキャッシュルールを簡単に設定できます。 +frontend/help/cache-description-2=HTTPステータスコード、ファイル拡張子、リクエストメソッドなどによってキャッシュの動作をカスタマイズできます。古いコンテンツの処理、バックグラウンド更新、同時実行ロックなどの高度な機能により、コンテンツのキャッシュと提供方法を細かく制御できます。 +frontend/help/footer-link=GitHubページでお問い合わせください +frontend/help/footer-subtitle=フィードバックをお待ちしております。 +frontend/help/footer-title=質問がある場合や、何か見逃したことがありますか? +frontend/help/hosts-description-1=仮想ホスト(略してホスト)は、nginxサーバーがブラウザで開けるようにするWebサイトです。管理されているすべてのホストは、メインメニューの左側にあります。 +frontend/help/hosts-description-2=nginx ignitionは、このようなWebサイトを設定するための直感的な方法を提供します。たとえば、NASがあり、その上でいくつかのサービス(Jellyfin、Vaultwardenなど)を実行している場合、ignitionを使用すると、IPとポートよりもはるかに覚えやすく使いやすい jellyfin.myhome.com のようなドメインから簡単にアクセスできます。 +frontend/help/hosts-description-3=各ホストには、どのリクエストパターンをどこに転送するかを定義するルールであるルートと、nginxがそのようなリクエストをリッスンするポートの定義であるバインディングのセットがあります。 +frontend/help/integrations-description=アプリはDockerコンテナまたはTrueNASで実行されていますか?nginx ignitionが提供するネイティブ統合を有効にして、ホストがリクエストを転送する宛先アプリとしてコンテナまたはアプリを簡単に選択できます。 +frontend/help/logs-description-1=何が要求されたか、またはなぜ何かが期待どおりに機能しないのかを知る必要がありますか?nginx ignitionは、nginxログを確認するための簡単な方法も提供します。何が起こっているかを確認したいホスト(またはnginxサーバー自体)を選択するだけで、ログを取得します。 +frontend/help/logs-description-2=また、ディスクがログでいっぱいになることを心配する必要はありません。ignitionは自動的にログをローテーションします(保持する量を制御したり、必要に応じてローテーションを無効にしたりすることもできます)。 +frontend/help/settings-description-1=Ignitionはnginxの設定ファイルの複雑さを抽象化しますが、だからといって微調整を適用する機能が失われるわけではありません。 +frontend/help/settings-description-2=設定ページでは、タイムアウト値、リクエストの最大アップロード/ボディサイズ、nginxがリクエストをリッスンするデフォルトポートなどの重要な定義を定義できます。 +frontend/help/settings-description-3=さらに、SSL証明書の自動更新やログローテーションなど、nginx ignitionの機能の一部をそこで設定することもできます。 +frontend/help/ssl-description-1=ドメインをHTTPS暗号化で保護したい、または保護する必要がある場合、アプリにはそのようなSSL証明書を管理する簡単な方法も付属しています。 +frontend/help/ssl-description-2=Let's Encryptによる有効な証明書、自己署名証明書、またはサードパーティプロバイダーのカスタム証明書を持ち込む必要がある場合でも、ignitionを使用すると簡単に許可できます。証明書の有効期限が切れそうになっても、アプリが自動的に更新します。 +frontend/help/ssl-description-3=SSL証明書が作成またはインポートされたら、フォームのオプションを選択するだけでホストで使用できます。 +frontend/help/streams-description-1=ホストはHTTPおよびHTTPSベースのサービスを公開する主な方法ですが、ストリームを使用すると、TCP、UDP、およびUnixソケットに依存する他のサービスを公開できます。 +frontend/help/streams-description-2=ゲームサーバー、データベース、DNSサーバーなど、HTTPプロトコルを使用しないものを公開する必要がある場合は、ストリームが適しています。 +frontend/help/vpns-description=VPNでホストを簡単に公開できます。Tailscaleを使用している場合、nginx ignitionはネットワーク内に仮想マシンを自動的に作成し、マシンのIPまたはホスト名がアクセスされるたびにリクエストをホストに転送できます。 +frontend/help/welcome-subtitle=アプリを最大限に活用するためのクイックスタート情報をいくつか紹介します。楽しんでいただけることを願っています。 +frontend/help/welcome-title=こんにちは、nginx ignitionへようこそ 👋 +frontend/home/certificates-expiring-title=30日以内に期限切れになる証明書 +frontend/home/expires-in-days=あと${days}日で期限切れ +frontend/home/expires-today=本日期限切れ +frontend/home/nginx-offline=Offline +frontend/home/nginx-online=Online +frontend/home/nginx-reload=設定を再読み込み +frontend/home/nginx-section-title=nginx ${version} +frontend/home/nginx-start=サーバーを起動 +frontend/home/nginx-stop-confirmation=nginx サーバーを今すぐ停止しますか? +frontend/home/nginx-stop=サーバーを停止 +frontend/home/nginx-unknown=状態不明 +frontend/home/no-certificates-expiring=今後30日以内に期限切れになる証明書はありません +frontend/home/recent-errors-disabled=サーバーのエラーログは設定で無効になっています +frontend/home/recent-errors-empty=表示する最近のエラーログエントリがありません +frontend/home/recent-errors-title=最近のエラーログ +frontend/home/subtitle=nginx ignition インスタンスの概要 +frontend/home/title=ホーム概要 +frontend/home/totals-title=リソース +frontend/home/traffic-disabled=トラフィック統計は設定で無効になっています +frontend/home/traffic-no-data=まだトラフィックデータが記録されていません +frontend/home/traffic-offline=トラフィック統計には nginx の実行が必要です +frontend/home/traffic-unsupported=この nginx ビルドはトラフィック統計をサポートしていません +frontend/home/view-full-stats=トラフィック統計の詳細を表示 frontend/host/components/enable-https-help=HTTPS証明書はVPNプロバイダーによって管理され、自動的にプロビジョニングされます。 frontend/host/components/enable-https=HTTPSエンドポイントを有効にする frontend/host/components/hostbindings/add-binding=バインディングを追加 @@ -1244,7 +1268,6 @@ frontend/locale/pagination/prev-page=前のページ frontend/logs/access-disabled=ホストアクセスログはnginx設定で無効になっています frontend/logs/access-logs=アクセスログ frontend/logs/auto-refresh-disabled-reason=自動更新は有効です -frontend/logs/auto-refresh-option=${seconds} 秒ごと frontend/logs/auto-refresh=自動更新 frontend/logs/category=カテゴリ frontend/logs/error-disabled=ホストエラーログはnginx設定で無効になっています diff --git a/i18n/messages_pt.properties b/i18n/messages_pt.properties index b275227ef..dd20f5cdf 100644 --- a/i18n/messages_pt.properties +++ b/i18n/messages_pt.properties @@ -732,6 +732,7 @@ common/add-duration=Adicionar duração common/advanced=Avançado common/app-name=nginx ignition common/at-least-one-required=Pelo menos um valor deve ser informado +common/auto-refresh-option=A cada ${seconds} segundos common/auto-refresh=Atualização automática common/between-values=O valor deve estar entre ${min} e ${max} common/binding=Vínculo @@ -1099,29 +1100,52 @@ frontend/export/section-database-title=Backup do banco de dados frontend/export/section-nginx-description-1=Sempre que você faz uma alteração usando o nginx ignition e recarrega o servidor, os arquivos de configuração do nginx são gerados ou atualizados com todos os hosts, streams, certificados SSL e mais que você habilitou. frontend/export/section-nginx-description-2=Ao baixar os arquivos de configuração do nginx, você pode analisar/revisar seu conteúdo ou até mesmo implantar um servidor nginx com essas mesmas configurações e comportamentos, basicamente da mesma forma que o nginx ignition faz. frontend/export/subtitle=Baixe arquivos de configuração do nginx e o conteúdo do banco de dados ignition para backup e recuperação -frontend/home/access-lists-description=Listas de acesso fornecem uma maneira simples de proteger uma rota ou o host inteiro verificando se o usuário é de um intervalo de IPs autorizados ou é identificado por um nome de usuário e senha válidos (ou até mesmo ambos, IP e credenciais) -frontend/home/cache-description-1=Acelere seus sites e reduza a carga em seus servidores upstream habilitando os recursos de cache de conteúdo do nginx. O Ignition torna fácil configurar regras de cache que determinam quais requisições devem ser armazenadas em cache e por quanto tempo. -frontend/home/cache-description-2=Você pode personalizar o comportamento do cache por códigos de status HTTP, extensões de arquivo, métodos de requisição e mais. Recursos avançados como tratamento de conteúdo obsoleto, atualizações em segundo plano e bloqueios de concorrência oferecem controle refinado sobre como seu conteúdo é armazenado e servido. -frontend/home/footer-link=Fale conosco em nossa página no GitHub -frontend/home/footer-subtitle=Adoraríamos receber seu feedback. -frontend/home/footer-title=Ainda tem dúvidas ou perdeu algo? -frontend/home/hosts-description-1=Um host virtual, ou host em resumo, é um site que o servidor nginx disponibilizará para ser aberto em um navegador. Você pode encontrar todos os hosts gerenciados à esquerda, no menu principal. -frontend/home/hosts-description-2=O nginx ignition fornece uma maneira intuitiva de configurar tais sites. Por exemplo, se você tem um NAS e possui alguns serviços rodando nele (como Jellyfin, Vaultwarden e mais), o ignition permite uma maneira fácil de acessá-lo a partir de um domínio como jellyfin.minhacasa.com, muito mais fácil de lembrar e usar do que um IP e porta. -frontend/home/hosts-description-3=Cada host terá um conjunto de rotas, que são regras que definem quais padrões de requisições devem ser encaminhados e para onde, e vínculos, que são as definições em quais portas o nginx deve ouvir tais requisições. -frontend/home/integrations-description=Seu app está rodando em um container Docker ou em um TrueNAS? Você pode habilitar a integração nativa que o nginx ignition oferece e facilmente escolher um container ou app como o destino para o qual o host deve encaminhar as requisições. -frontend/home/logs-description-1=Precisa saber o que foi solicitado ou por que algo não está funcionando da maneira esperada? O nginx ignition fornece uma maneira simples para você verificar os logs do nginx também. Apenas selecione o host (ou o próprio servidor nginx) do qual você quer verificar o que está acontecendo, e nós buscaremos os logs para você. -frontend/home/logs-description-2=E você não precisa se preocupar com seu disco ficando cheio de logs, o ignition irá rotacioná-los automaticamente para você (e você pode controlar quanto manter, ou até mesmo desabilitar a rotação se preferir). -frontend/home/settings-description-1=O Ignition abstrai a complexidade dos arquivos de configuração do nginx, mas isso não significa que você perde a capacidade de aplicar alguns ajustes finos. -frontend/home/settings-description-2=Com a página de configurações, você pode definir algumas definições importantes como os valores de timeout, o tamanho máximo de upload/corpo das requisições, as portas padrão que o nginx ouvirá por requisições e mais. -frontend/home/settings-description-3=Além disso, você também pode configurar alguns recursos do nginx ignition lá, como a renovação automática de certificados SSL e rotação de logs. -frontend/home/ssl-description-1=Se você quer ou precisa proteger seus domínios com criptografia HTTPS, o app vem com uma maneira fácil de gerenciar tais certificados SSL também. -frontend/home/ssl-description-2=Seja se você precisa de um certificado válido apoiado pelo Let's Encrypt, um autoassinado, ou trazer o seu personalizado de um provedor terceirizado, o ignition permitirá isso com facilidade. Mesmo quando o certificado estiver prestes a expirar, o app irá renová-lo automaticamente para você. -frontend/home/ssl-description-3=Uma vez que um certificado SSL é criado ou importado, você pode usá-lo nos hosts simplesmente selecionando uma opção no formulário. -frontend/home/streams-description-1=Enquanto os hosts são a principal maneira de expor seus serviços baseados em HTTP e HTTPS, streams permitem que você exponha outros serviços que dependem de TCP, UDP e sockets unix. -frontend/home/streams-description-2=Se você precisa expor um servidor de jogo, um banco de dados, um servidor DNS e qualquer outra coisa que não use o protocolo HTTP, streams são o caminho a seguir. -frontend/home/vpns-description=Exponha facilmente seus hosts em suas VPNs. Se você estiver usando Tailscale, o nginx ignition pode criar automaticamente uma máquina virtual em sua rede e encaminhar as requisições para o host sempre que o IP da máquina ou hostname for acessado. -frontend/home/welcome-subtitle=Aqui estão algumas informações de início rápido para ajudá-lo a aproveitar ao máximo o app. Esperamos que você goste. -frontend/home/welcome-title=Olá, e bem-vindo ao nginx ignition 👋 +frontend/help/access-lists-description=Listas de acesso fornecem uma maneira simples de proteger uma rota ou o host inteiro verificando se o usuário é de um intervalo de IPs autorizados ou é identificado por um nome de usuário e senha válidos (ou até mesmo ambos, IP e credenciais) +frontend/help/cache-description-1=Acelere seus sites e reduza a carga em seus servidores upstream habilitando os recursos de cache de conteúdo do nginx. O Ignition torna fácil configurar regras de cache que determinam quais requisições devem ser armazenadas em cache e por quanto tempo. +frontend/help/cache-description-2=Você pode personalizar o comportamento do cache por códigos de status HTTP, extensões de arquivo, métodos de requisição e mais. Recursos avançados como tratamento de conteúdo obsoleto, atualizações em segundo plano e bloqueios de concorrência oferecem controle refinado sobre como seu conteúdo é armazenado e servido. +frontend/help/footer-link=Fale conosco em nossa página no GitHub +frontend/help/footer-subtitle=Adoraríamos receber seu feedback. +frontend/help/footer-title=Ainda tem dúvidas ou perdeu algo? +frontend/help/hosts-description-1=Um host virtual, ou host em resumo, é um site que o servidor nginx disponibilizará para ser aberto em um navegador. Você pode encontrar todos os hosts gerenciados à esquerda, no menu principal. +frontend/help/hosts-description-2=O nginx ignition fornece uma maneira intuitiva de configurar tais sites. Por exemplo, se você tem um NAS e possui alguns serviços rodando nele (como Jellyfin, Vaultwarden e mais), o ignition permite uma maneira fácil de acessá-lo a partir de um domínio como jellyfin.minhacasa.com, muito mais fácil de lembrar e usar do que um IP e porta. +frontend/help/hosts-description-3=Cada host terá um conjunto de rotas, que são regras que definem quais padrões de requisições devem ser encaminhados e para onde, e vínculos, que são as definições em quais portas o nginx deve ouvir tais requisições. +frontend/help/integrations-description=Seu app está rodando em um container Docker ou em um TrueNAS? Você pode habilitar a integração nativa que o nginx ignition oferece e facilmente escolher um container ou app como o destino para o qual o host deve encaminhar as requisições. +frontend/help/logs-description-1=Precisa saber o que foi solicitado ou por que algo não está funcionando da maneira esperada? O nginx ignition fornece uma maneira simples para você verificar os logs do nginx também. Apenas selecione o host (ou o próprio servidor nginx) do qual você quer verificar o que está acontecendo, e nós buscaremos os logs para você. +frontend/help/logs-description-2=E você não precisa se preocupar com seu disco ficando cheio de logs, o ignition irá rotacioná-los automaticamente para você (e você pode controlar quanto manter, ou até mesmo desabilitar a rotação se preferir). +frontend/help/settings-description-1=O Ignition abstrai a complexidade dos arquivos de configuração do nginx, mas isso não significa que você perde a capacidade de aplicar alguns ajustes finos. +frontend/help/settings-description-2=Com a página de configurações, você pode definir algumas definições importantes como os valores de timeout, o tamanho máximo de upload/corpo das requisições, as portas padrão que o nginx ouvirá por requisições e mais. +frontend/help/settings-description-3=Além disso, você também pode configurar alguns recursos do nginx ignition lá, como a renovação automática de certificados SSL e rotação de logs. +frontend/help/ssl-description-1=Se você quer ou precisa proteger seus domínios com criptografia HTTPS, o app vem com uma maneira fácil de gerenciar tais certificados SSL também. +frontend/help/ssl-description-2=Seja se você precisa de um certificado válido apoiado pelo Let's Encrypt, um autoassinado, ou trazer o seu personalizado de um provedor terceirizado, o ignition permitirá isso com facilidade. Mesmo quando o certificado estiver prestes a expirar, o app irá renová-lo automaticamente para você. +frontend/help/ssl-description-3=Uma vez que um certificado SSL é criado ou importado, você pode usá-lo nos hosts simplesmente selecionando uma opção no formulário. +frontend/help/streams-description-1=Enquanto os hosts são a principal maneira de expor seus serviços baseados em HTTP e HTTPS, streams permitem que você exponha outros serviços que dependem de TCP, UDP e sockets unix. +frontend/help/streams-description-2=Se você precisa expor um servidor de jogo, um banco de dados, um servidor DNS e qualquer outra coisa que não use o protocolo HTTP, streams são o caminho a seguir. +frontend/help/vpns-description=Exponha facilmente seus hosts em suas VPNs. Se você estiver usando Tailscale, o nginx ignition pode criar automaticamente uma máquina virtual em sua rede e encaminhar as requisições para o host sempre que o IP da máquina ou hostname for acessado. +frontend/help/welcome-subtitle=Aqui estão algumas informações de início rápido para ajudá-lo a aproveitar ao máximo o app. Esperamos que você goste. +frontend/help/welcome-title=Olá, e bem-vindo ao nginx ignition 👋 +frontend/home/certificates-expiring-title=Certificados expirando em 30 dias +frontend/home/expires-in-days=Expira em ${days} dias +frontend/home/expires-today=Expira hoje +frontend/home/nginx-offline=Offline +frontend/home/nginx-online=Online +frontend/home/nginx-reload=Recarregar configuração +frontend/home/nginx-section-title=nginx ${version} +frontend/home/nginx-start=Iniciar servidor +frontend/home/nginx-stop-confirmation=Parar o servidor nginx agora? +frontend/home/nginx-stop=Parar servidor +frontend/home/nginx-unknown=Status desconhecido +frontend/home/no-certificates-expiring=Nenhum certificado expira nos próximos 30 dias +frontend/home/recent-errors-disabled=Os logs de erro do servidor estão desativados nas configurações +frontend/home/recent-errors-empty=Nenhuma entrada recente no log de erros +frontend/home/recent-errors-title=Log de erros recente +frontend/home/subtitle=Visão geral da sua instância nginx ignition +frontend/home/title=Visão geral inicial +frontend/home/totals-title=Totais +frontend/home/traffic-disabled=As estatísticas de tráfego estão desativadas nas configurações +frontend/home/traffic-no-data=Nenhum dado de tráfego registrado ainda +frontend/home/traffic-offline=As estatísticas de tráfego exigem que o nginx esteja em execução +frontend/home/traffic-unsupported=Esta compilação do nginx não suporta estatísticas de tráfego +frontend/home/view-full-stats=Ver estatísticas completas de tráfego frontend/host/components/enable-https-help=Os certificados HTTPS são gerenciados e provisionados automaticamente pelo seu provedor de VPN. frontend/host/components/enable-https=Habilitar endpoints HTTPS frontend/host/components/hostbindings/add-binding=Adicionar vínculo @@ -1244,7 +1268,6 @@ frontend/locale/pagination/prev-page=Página anterior frontend/logs/access-disabled=Logs de acesso do host estão desabilitados na configuração do nginx frontend/logs/access-logs=Logs de acesso frontend/logs/auto-refresh-disabled-reason=Auto atualização está habilitada -frontend/logs/auto-refresh-option=A cada ${seconds} segundos frontend/logs/auto-refresh=Auto-atualização frontend/logs/category=Categoria frontend/logs/error-disabled=Logs de erro do host estão desabilitados na configuração do nginx diff --git a/i18n/messages_ru.properties b/i18n/messages_ru.properties index f92b3e364..9d76eda69 100644 --- a/i18n/messages_ru.properties +++ b/i18n/messages_ru.properties @@ -732,6 +732,7 @@ common/add-duration=Добавить длительность common/advanced=Дополнительно common/app-name=nginx ignition common/at-least-one-required=Должно быть указано хотя бы одно значение +common/auto-refresh-option=Каждые ${seconds} секунд common/auto-refresh=Автообновление common/between-values=Значение должно быть между ${min} и ${max} common/binding=Привязка @@ -1099,29 +1100,52 @@ frontend/export/section-database-title=Резервное копирование frontend/export/section-nginx-description-1=Каждый раз, когда вы вносите изменения с помощью nginx ignition и перезагружаете сервер, конфигурационные файлы nginx генерируются или обновляются со всеми хостами, потоками, SSL сертификатами и прочим, что вы включили. frontend/export/section-nginx-description-2=Скачав конфигурационные файлы nginx, вы можете проанализировать/просмотреть их содержимое или даже развернуть сервер nginx с этими же настройками и поведением практически так же, как это делает nginx ignition. frontend/export/subtitle=Скачать конфигурационные файлы nginx и содержимое базы данных ignition для резервного копирования и восстановления -frontend/home/access-lists-description=Списки доступа предоставляют простой способ защитить либо маршрут, либо весь хост, проверяя, принадлежит ли пользователь к диапазону разрешенных IP или идентифицируется ли он действительным именем пользователя и паролем (или даже обоими, IP и учетными данными) -frontend/home/cache-description-1=Ускорьте свои веб-сайты и снизьте нагрузку на ваши вышестоящие серверы (upstream), включив возможности кэширования содержимого nginx. Ignition позволяет легко настраивать правила кэширования, которые определяют, какие запросы должны кэшироваться и как долго. -frontend/home/cache-description-2=Вы можете настроить поведение кэша по кодам статуса HTTP, расширениям файлов, методам запросов и многому другому. Расширенные функции, такие как обработка устаревшего контента, фоновые обновления и блокировки конкурентности, дают вам детальный контроль над тем, как ваш контент кэшируется и обслуживается. -frontend/home/footer-link=Свяжитесь с нами на нашей странице GitHub -frontend/home/footer-subtitle=Мы будем рады получить от вас обратную связь. -frontend/home/footer-title=Остались вопросы или что-то упустили? -frontend/home/hosts-description-1=Виртуальный хост, или просто хост — это веб-сайт, который сервер nginx сделает доступным для открытия в браузере. Вы можете найти все управляемые хосты слева, в главном меню. -frontend/home/hosts-description-2=nginx ignition предоставляет интуитивно понятный способ настройки таких веб-сайтов. Например, если у вас есть NAS и на нем запущены некоторые сервисы (такие как Jellyfin, Vaultwarden и другие), ignition позволяет легко получить к ним доступ с домена типа jellyfin.myhome.com, что намного проще запомнить и использовать, чем IP и порт. -frontend/home/hosts-description-3=Каждый хост будет иметь набор маршрутов, которые представляют собой правила, определяющие, какие шаблоны запросов должны пересылаться и куда, и привязки (bindings), которые являются определениями того, на каких портах nginx должен ожидать такие запросы. -frontend/home/integrations-description=Ваше приложение работает в контейнере Docker или в TrueNAS? Вы можете включить нативную интеграцию, предлагаемую nginx ignition, и легко выбрать контейнер или приложение в качестве целевого приложения, которому хост должен пересылать запросы. -frontend/home/logs-description-1=Нужно знать, что было запрошено или почему что-то не работает так, как ожидалось? nginx ignition также предоставляет простой способ проверить логи nginx. Просто выберите хост (или сам сервер nginx), для которого вы хотите проверить, что происходит, и мы получим логи для вас. -frontend/home/logs-description-2=И вам не нужно беспокоиться о том, что ваш диск заполнится логами, ignition автоматически будет ротировать их для вас (и вы можете контролировать, сколько хранить, или даже отключить ротацию, если вам так удобнее). -frontend/home/settings-description-1=Ignition абстрагирует сложность конфигурационных файлов nginx, но это не значит, что вы теряете возможность применять некоторые точные настройки. -frontend/home/settings-description-2=С помощью страницы настроек вы можете определить некоторые важные параметры, такие как значения таймаута, максимальный размер загрузки/тела запросов, порты по умолчанию, на которых nginx будет ожидать запросы, и многое другое. -frontend/home/settings-description-3=Кроме того, вы также можете настроить некоторые функции nginx ignition там, такие как автоматическое обновление SSL сертификатов и ротация логов. -frontend/home/ssl-description-1=Если вы хотите или вам нужно защитить свои домены шифрованием HTTPS, приложение также предлагает простой способ управления такими SSL сертификатами. -frontend/home/ssl-description-2=Независимо от того, нужен ли вам действительный сертификат от Let's Encrypt, самоподписанный, или вы хотите использовать свой собственный от стороннего провайдера, ignition позволит сделать это с легкостью. Даже когда срок действия сертификата подходит к концу, приложение автоматически обновит его для вас. -frontend/home/ssl-description-3=Как только SSL сертификат создан или импортирован, вы можете использовать его на хостах, просто выбрав опцию в форме. -frontend/home/streams-description-1=В то время как хосты являются основным способом публикации ваших сервисов на базе HTTP и HTTPS, потоки (streams) позволяют вам публиковать другие сервисы, которые полагаются на TCP, UDP и unix сокеты. -frontend/home/streams-description-2=Если вам нужно опубликовать игровой сервер, базу данных, DNS сервер и что-либо еще, что не использует протокол HTTP, потоки — это то, что вам нужно. -frontend/home/vpns-description=Легко публикуйте свои хосты в ваших VPN. Если вы используете Tailscale, nginx ignition может автоматически создать виртуальную машину в вашей сети и пересылать запросы на хост всякий раз, когда осуществляется доступ к IP машины или имени хоста. -frontend/home/welcome-subtitle=Вот некоторая информация для быстрого старта, которая поможет вам максимально эффективно использовать приложение. Мы надеемся, что вам понравится. -frontend/home/welcome-title=Привет, и добро пожаловать в nginx ignition 👋 +frontend/help/access-lists-description=Списки доступа предоставляют простой способ защитить либо маршрут, либо весь хост, проверяя, принадлежит ли пользователь к диапазону разрешенных IP или идентифицируется ли он действительным именем пользователя и паролем (или даже обоими, IP и учетными данными) +frontend/help/cache-description-1=Ускорьте свои веб-сайты и снизьте нагрузку на ваши вышестоящие серверы (upstream), включив возможности кэширования содержимого nginx. Ignition позволяет легко настраивать правила кэширования, которые определяют, какие запросы должны кэшироваться и как долго. +frontend/help/cache-description-2=Вы можете настроить поведение кэша по кодам статуса HTTP, расширениям файлов, методам запросов и многому другому. Расширенные функции, такие как обработка устаревшего контента, фоновые обновления и блокировки конкурентности, дают вам детальный контроль над тем, как ваш контент кэшируется и обслуживается. +frontend/help/footer-link=Свяжитесь с нами на нашей странице GitHub +frontend/help/footer-subtitle=Мы будем рады получить от вас обратную связь. +frontend/help/footer-title=Остались вопросы или что-то упустили? +frontend/help/hosts-description-1=Виртуальный хост, или просто хост — это веб-сайт, который сервер nginx сделает доступным для открытия в браузере. Вы можете найти все управляемые хосты слева, в главном меню. +frontend/help/hosts-description-2=nginx ignition предоставляет интуитивно понятный способ настройки таких веб-сайтов. Например, если у вас есть NAS и на нем запущены некоторые сервисы (такие как Jellyfin, Vaultwarden и другие), ignition позволяет легко получить к ним доступ с домена типа jellyfin.myhome.com, что намного проще запомнить и использовать, чем IP и порт. +frontend/help/hosts-description-3=Каждый хост будет иметь набор маршрутов, которые представляют собой правила, определяющие, какие шаблоны запросов должны пересылаться и куда, и привязки (bindings), которые являются определениями того, на каких портах nginx должен ожидать такие запросы. +frontend/help/integrations-description=Ваше приложение работает в контейнере Docker или в TrueNAS? Вы можете включить нативную интеграцию, предлагаемую nginx ignition, и легко выбрать контейнер или приложение в качестве целевого приложения, которому хост должен пересылать запросы. +frontend/help/logs-description-1=Нужно знать, что было запрошено или почему что-то не работает так, как ожидалось? nginx ignition также предоставляет простой способ проверить логи nginx. Просто выберите хост (или сам сервер nginx), для которого вы хотите проверить, что происходит, и мы получим логи для вас. +frontend/help/logs-description-2=И вам не нужно беспокоиться о том, что ваш диск заполнится логами, ignition автоматически будет ротировать их для вас (и вы можете контролировать, сколько хранить, или даже отключить ротацию, если вам так удобнее). +frontend/help/settings-description-1=Ignition абстрагирует сложность конфигурационных файлов nginx, но это не значит, что вы теряете возможность применять некоторые точные настройки. +frontend/help/settings-description-2=С помощью страницы настроек вы можете определить некоторые важные параметры, такие как значения таймаута, максимальный размер загрузки/тела запросов, порты по умолчанию, на которых nginx будет ожидать запросы, и многое другое. +frontend/help/settings-description-3=Кроме того, вы также можете настроить некоторые функции nginx ignition там, такие как автоматическое обновление SSL сертификатов и ротация логов. +frontend/help/ssl-description-1=Если вы хотите или вам нужно защитить свои домены шифрованием HTTPS, приложение также предлагает простой способ управления такими SSL сертификатами. +frontend/help/ssl-description-2=Независимо от того, нужен ли вам действительный сертификат от Let's Encrypt, самоподписанный, или вы хотите использовать свой собственный от стороннего провайдера, ignition позволит сделать это с легкостью. Даже когда срок действия сертификата подходит к концу, приложение автоматически обновит его для вас. +frontend/help/ssl-description-3=Как только SSL сертификат создан или импортирован, вы можете использовать его на хостах, просто выбрав опцию в форме. +frontend/help/streams-description-1=В то время как хосты являются основным способом публикации ваших сервисов на базе HTTP и HTTPS, потоки (streams) позволяют вам публиковать другие сервисы, которые полагаются на TCP, UDP и unix сокеты. +frontend/help/streams-description-2=Если вам нужно опубликовать игровой сервер, базу данных, DNS сервер и что-либо еще, что не использует протокол HTTP, потоки — это то, что вам нужно. +frontend/help/vpns-description=Легко публикуйте свои хосты в ваших VPN. Если вы используете Tailscale, nginx ignition может автоматически создать виртуальную машину в вашей сети и пересылать запросы на хост всякий раз, когда осуществляется доступ к IP машины или имени хоста. +frontend/help/welcome-subtitle=Вот некоторая информация для быстрого старта, которая поможет вам максимально эффективно использовать приложение. Мы надеемся, что вам понравится. +frontend/help/welcome-title=Привет, и добро пожаловать в nginx ignition 👋 +frontend/home/certificates-expiring-title=Сертификаты, истекающие в течение 30 дней +frontend/home/expires-in-days=Истекает через ${days} дн. +frontend/home/expires-today=Истекает сегодня +frontend/home/nginx-offline=Офлайн +frontend/home/nginx-online=Онлайн +frontend/home/nginx-reload=Перезагрузить конфигурацию +frontend/home/nginx-section-title=nginx ${version} +frontend/home/nginx-start=Запустить сервер +frontend/home/nginx-stop-confirmation=Остановить сервер nginx сейчас? +frontend/home/nginx-stop=Остановить сервер +frontend/home/nginx-unknown=Статус неизвестен +frontend/home/no-certificates-expiring=Нет сертификатов, истекающих в ближайшие 30 дней +frontend/home/recent-errors-disabled=Журналы ошибок сервера отключены в настройках +frontend/home/recent-errors-empty=Нет недавних записей в журнале ошибок +frontend/home/recent-errors-title=Недавний журнал ошибок +frontend/home/subtitle=Обзор вашего экземпляра nginx ignition +frontend/home/title=Обзор главной +frontend/home/totals-title=Ресурсы +frontend/home/traffic-disabled=Статистика трафика отключена в настройках +frontend/home/traffic-no-data=Данные о трафике пока не записаны +frontend/home/traffic-offline=Для статистики трафика nginx должен быть запущен +frontend/home/traffic-unsupported=Эта сборка nginx не поддерживает статистику трафика +frontend/home/view-full-stats=Просмотреть полную статистику трафика frontend/host/components/enable-https-help=Сертификаты HTTPS управляются и автоматически предоставляются вашим VPN-провайдером. frontend/host/components/enable-https=Включить конечные точки HTTPS frontend/host/components/hostbindings/add-binding=Добавить привязку @@ -1244,7 +1268,6 @@ frontend/locale/pagination/prev-page=Пред. страница frontend/logs/access-disabled=Логи доступа хоста отключены в конфигурации nginx frontend/logs/access-logs=Логи доступа frontend/logs/auto-refresh-disabled-reason=Авто-обновление включено -frontend/logs/auto-refresh-option=Каждые ${seconds} секунд frontend/logs/auto-refresh=Авто-обновление frontend/logs/category=Категория frontend/logs/error-disabled=Логи ошибок хоста отключены в конфигурации nginx diff --git a/i18n/messages_vi.properties b/i18n/messages_vi.properties index e8bc2eda6..9151c066a 100644 --- a/i18n/messages_vi.properties +++ b/i18n/messages_vi.properties @@ -732,6 +732,7 @@ common/add-duration=Thêm khoảng thời gian common/advanced=Nâng cao common/app-name=nginx ignition common/at-least-one-required=Cần phải nhập ít nhất một giá trị +common/auto-refresh-option=Mỗi ${seconds} giây common/auto-refresh=Tự động làm mới common/between-values=Giá trị phải nằm trong khoảng từ ${min} đến ${max} common/binding=Binding @@ -1099,29 +1100,52 @@ frontend/export/section-database-title=Sao lưu cơ sở dữ liệu frontend/export/section-nginx-description-1=Bất cứ khi nào bạn thực hiện thay đổi bằng nginx ignition và tải lại máy chủ, các tập tin cấu hình nginx sẽ được tạo hoặc cập nhật với tất cả các host, stream, chứng chỉ SSL và những thứ khác mà bạn đã bật. frontend/export/section-nginx-description-2=Bằng cách tải xuống các tập tin cấu hình nginx, bạn có thể phân tích/xem lại nội dung của nó hoặc thậm chí triển khai một máy chủ nginx với các cài đặt và hành vi tương tự giống như cách nginx ignition làm. frontend/export/subtitle=Tải xuống các tập tin cấu hình nginx và nội dung cơ sở dữ liệu ignition để sao lưu và phục hồi -frontend/home/access-lists-description=Danh sách truy cập cung cấp một cách đơn giản để bảo vệ một tuyến đường hoặc toàn bộ host bằng cách kiểm tra xem người dùng có thuộc dải IP được ủy quyền hay được xác định bằng tên người dùng và mật khẩu hợp lệ (hoặc thậm chí cả hai, IP và thông tin xác thực) -frontend/home/cache-description-1=Tăng tốc trang web của bạn và giảm tải cho các máy chủ upstream bằng cách bật khả năng cache nội dung của nginx. Ignition giúp dễ dàng cấu hình các quy tắc cache xác định yêu cầu nào nên được cache và trong bao lâu. -frontend/home/cache-description-2=Bạn có thể tùy chỉnh hành vi cache theo mã trạng thái HTTP, phần mở rộng tập tin, phương thức yêu cầu và hơn thế nữa. Các tính năng nâng cao như xử lý nội dung cũ, cập nhật nền và khóa đồng thời cung cấp cho bạn quyền kiểm soát chi tiết cách nội dung của bạn được cache và phục vụ. -frontend/home/footer-link=Liên hệ với chúng tôi tại trang GitHub của chúng tôi -frontend/home/footer-subtitle=Chúng tôi rất muốn nhận được phản hồi từ bạn. -frontend/home/footer-title=Vẫn còn câu hỏi hoặc bỏ lỡ điều gì đó? -frontend/home/hosts-description-1=Một máy chủ ảo (virtual host), gọi tắt là host, là một trang web mà máy chủ nginx sẽ cung cấp để có thể mở trong trình duyệt. Bạn có thể tìm thấy tất cả các host được quản lý ở bên trái, trên menu chính. -frontend/home/hosts-description-2=nginx ignition cung cấp một cách trực quan để cấu hình các trang web như vậy. Ví dụ: nếu bạn có một NAS và có một số dịch vụ chạy trên đó (như Jellyfin, Vaultwarden và nhiều hơn nữa), ignition cho phép một cách dễ dàng để truy cập nó từ một tên miền như jellyfin.myhome.com, dễ nhớ và sử dụng hơn nhiều so với IP và cổng. -frontend/home/hosts-description-3=Mỗi host sẽ có một tập hợp các tuyến đường (routes), là các quy tắc xác định mẫu yêu cầu nào nên được chuyển tiếp và đến đâu, và các binding, là các định nghĩa tại cổng nào nginx sẽ lắng nghe các yêu cầu đó. -frontend/home/integrations-description=Ứng dụng của bạn đang chạy trong một Docker container hay trong TrueNAS? Bạn có thể bật tích hợp gốc mà nginx ignition cung cấp và dễ dàng chọn một container hoặc ứng dụng làm đích đến mà host sẽ chuyển tiếp các yêu cầu tới. -frontend/home/logs-description-1=Cần biết những gì đã được yêu cầu hoặc tại sao điều gì đó không hoạt động như mong đợi? nginx ignition cũng cung cấp một cách đơn giản để bạn kiểm tra nhật ký nginx. Chỉ cần chọn host (hoặc chính máy chủ nginx) mà bạn muốn kiểm tra xem chuyện gì đang xảy ra, và chúng tôi sẽ lấy nhật ký cho bạn. -frontend/home/logs-description-2=Và bạn không cần phải lo lắng về việc đĩa của mình bị đầy nhật ký, ignition sẽ tự động xoay chúng cho bạn (và bạn có thể kiểm soát lượng giữ lại, hoặc thậm chí tắt xoay vòng nếu phù hợp nhất với bạn). -frontend/home/settings-description-1=Ignition trừu tượng hóa sự phức tạp của các tập tin cấu hình nginx, nhưng điều đó không có nghĩa là bạn mất khả năng áp dụng một số điều chỉnh tinh vi. -frontend/home/settings-description-2=Với trang cài đặt, bạn có thể xác định một số định nghĩa quan trọng như giá trị timeout, kích thước tải lên/nội dung tối đa của yêu cầu, các cổng mặc định mà nginx sẽ lắng nghe yêu cầu và hơn thế nữa. -frontend/home/settings-description-3=Ngoài ra, bạn cũng có thể cấu hình một số tính năng của nginx ignition ở đó, như tự động gia hạn chứng chỉ SSL và xoay vòng nhật ký. -frontend/home/ssl-description-1=Nếu bạn muốn hoặc cần bảo vệ tên miền của mình bằng mã hóa HTTPS, ứng dụng cũng đi kèm với một cách dễ dàng để quản lý các chứng chỉ SSL như vậy. -frontend/home/ssl-description-2=Dù bạn cần một chứng chỉ hợp lệ được hỗ trợ bởi Let's Encrypt, tự ký, hoặc mang theo chứng chỉ tùy chỉnh của bạn từ nhà cung cấp bên thứ ba, ignition sẽ cho phép điều đó một cách dễ dàng. Ngay cả khi chứng chỉ sắp hết hạn, ứng dụng sẽ tự động gia hạn cho bạn. -frontend/home/ssl-description-3=Khi chứng chỉ SSL được tạo hoặc nhập, bạn có thể sử dụng nó trên các host bằng cách chọn một tùy chọn trong biểu mẫu. -frontend/home/streams-description-1=Trong khi các host là cách chính để hiển thị các dịch vụ dựa trên HTTP và HTTPS của bạn, các stream cho phép bạn hiển thị các dịch vụ khác dựa trên TCP, UDP và unix socket. -frontend/home/streams-description-2=Nếu bạn cần hiển thị một máy chủ trò chơi, cơ sở dữ liệu, máy chủ DNS và bất kỳ thứ gì khác không sử dụng giao thức HTTP, stream là lựa chọn phù hợp. -frontend/home/vpns-description=Dễ dàng hiển thị các host của bạn trong VPN. Nếu bạn đang sử dụng Tailscale, nginx ignition có thể tự động tạo một máy ảo trong mạng của bạn và chuyển tiếp các yêu cầu đến host bất cứ khi nào IP máy hoặc tên máy (hostname) được truy cập. -frontend/home/welcome-subtitle=Dưới đây là một số thông tin bắt đầu nhanh để giúp bạn tận dụng tối đa ứng dụng. Chúng tôi hy vọng bạn thích nó. -frontend/home/welcome-title=Xin chào, và chào mừng đến với nginx ignition 👋 +frontend/help/access-lists-description=Danh sách truy cập cung cấp một cách đơn giản để bảo vệ một tuyến đường hoặc toàn bộ host bằng cách kiểm tra xem người dùng có thuộc dải IP được ủy quyền hay được xác định bằng tên người dùng và mật khẩu hợp lệ (hoặc thậm chí cả hai, IP và thông tin xác thực) +frontend/help/cache-description-1=Tăng tốc trang web của bạn và giảm tải cho các máy chủ upstream bằng cách bật khả năng cache nội dung của nginx. Ignition giúp dễ dàng cấu hình các quy tắc cache xác định yêu cầu nào nên được cache và trong bao lâu. +frontend/help/cache-description-2=Bạn có thể tùy chỉnh hành vi cache theo mã trạng thái HTTP, phần mở rộng tập tin, phương thức yêu cầu và hơn thế nữa. Các tính năng nâng cao như xử lý nội dung cũ, cập nhật nền và khóa đồng thời cung cấp cho bạn quyền kiểm soát chi tiết cách nội dung của bạn được cache và phục vụ. +frontend/help/footer-link=Liên hệ với chúng tôi tại trang GitHub của chúng tôi +frontend/help/footer-subtitle=Chúng tôi rất muốn nhận được phản hồi từ bạn. +frontend/help/footer-title=Vẫn còn câu hỏi hoặc bỏ lỡ điều gì đó? +frontend/help/hosts-description-1=Một máy chủ ảo (virtual host), gọi tắt là host, là một trang web mà máy chủ nginx sẽ cung cấp để có thể mở trong trình duyệt. Bạn có thể tìm thấy tất cả các host được quản lý ở bên trái, trên menu chính. +frontend/help/hosts-description-2=nginx ignition cung cấp một cách trực quan để cấu hình các trang web như vậy. Ví dụ: nếu bạn có một NAS và có một số dịch vụ chạy trên đó (như Jellyfin, Vaultwarden và nhiều hơn nữa), ignition cho phép một cách dễ dàng để truy cập nó từ một tên miền như jellyfin.myhome.com, dễ nhớ và sử dụng hơn nhiều so với IP và cổng. +frontend/help/hosts-description-3=Mỗi host sẽ có một tập hợp các tuyến đường (routes), là các quy tắc xác định mẫu yêu cầu nào nên được chuyển tiếp và đến đâu, và các binding, là các định nghĩa tại cổng nào nginx sẽ lắng nghe các yêu cầu đó. +frontend/help/integrations-description=Ứng dụng của bạn đang chạy trong một Docker container hay trong TrueNAS? Bạn có thể bật tích hợp gốc mà nginx ignition cung cấp và dễ dàng chọn một container hoặc ứng dụng làm đích đến mà host sẽ chuyển tiếp các yêu cầu tới. +frontend/help/logs-description-1=Cần biết những gì đã được yêu cầu hoặc tại sao điều gì đó không hoạt động như mong đợi? nginx ignition cũng cung cấp một cách đơn giản để bạn kiểm tra nhật ký nginx. Chỉ cần chọn host (hoặc chính máy chủ nginx) mà bạn muốn kiểm tra xem chuyện gì đang xảy ra, và chúng tôi sẽ lấy nhật ký cho bạn. +frontend/help/logs-description-2=Và bạn không cần phải lo lắng về việc đĩa của mình bị đầy nhật ký, ignition sẽ tự động xoay chúng cho bạn (và bạn có thể kiểm soát lượng giữ lại, hoặc thậm chí tắt xoay vòng nếu phù hợp nhất với bạn). +frontend/help/settings-description-1=Ignition trừu tượng hóa sự phức tạp của các tập tin cấu hình nginx, nhưng điều đó không có nghĩa là bạn mất khả năng áp dụng một số điều chỉnh tinh vi. +frontend/help/settings-description-2=Với trang cài đặt, bạn có thể xác định một số định nghĩa quan trọng như giá trị timeout, kích thước tải lên/nội dung tối đa của yêu cầu, các cổng mặc định mà nginx sẽ lắng nghe yêu cầu và hơn thế nữa. +frontend/help/settings-description-3=Ngoài ra, bạn cũng có thể cấu hình một số tính năng của nginx ignition ở đó, như tự động gia hạn chứng chỉ SSL và xoay vòng nhật ký. +frontend/help/ssl-description-1=Nếu bạn muốn hoặc cần bảo vệ tên miền của mình bằng mã hóa HTTPS, ứng dụng cũng đi kèm với một cách dễ dàng để quản lý các chứng chỉ SSL như vậy. +frontend/help/ssl-description-2=Dù bạn cần một chứng chỉ hợp lệ được hỗ trợ bởi Let's Encrypt, tự ký, hoặc mang theo chứng chỉ tùy chỉnh của bạn từ nhà cung cấp bên thứ ba, ignition sẽ cho phép điều đó một cách dễ dàng. Ngay cả khi chứng chỉ sắp hết hạn, ứng dụng sẽ tự động gia hạn cho bạn. +frontend/help/ssl-description-3=Khi chứng chỉ SSL được tạo hoặc nhập, bạn có thể sử dụng nó trên các host bằng cách chọn một tùy chọn trong biểu mẫu. +frontend/help/streams-description-1=Trong khi các host là cách chính để hiển thị các dịch vụ dựa trên HTTP và HTTPS của bạn, các stream cho phép bạn hiển thị các dịch vụ khác dựa trên TCP, UDP và unix socket. +frontend/help/streams-description-2=Nếu bạn cần hiển thị một máy chủ trò chơi, cơ sở dữ liệu, máy chủ DNS và bất kỳ thứ gì khác không sử dụng giao thức HTTP, stream là lựa chọn phù hợp. +frontend/help/vpns-description=Dễ dàng hiển thị các host của bạn trong VPN. Nếu bạn đang sử dụng Tailscale, nginx ignition có thể tự động tạo một máy ảo trong mạng của bạn và chuyển tiếp các yêu cầu đến host bất cứ khi nào IP máy hoặc tên máy (hostname) được truy cập. +frontend/help/welcome-subtitle=Dưới đây là một số thông tin bắt đầu nhanh để giúp bạn tận dụng tối đa ứng dụng. Chúng tôi hy vọng bạn thích nó. +frontend/help/welcome-title=Xin chào, và chào mừng đến với nginx ignition 👋 +frontend/home/certificates-expiring-title=Chứng chỉ hết hạn trong 30 ngày +frontend/home/expires-in-days=Hết hạn sau ${days} ngày +frontend/home/expires-today=Hết hạn hôm nay +frontend/home/nginx-offline=Ngoại tuyến +frontend/home/nginx-online=Trực tuyến +frontend/home/nginx-reload=Tải lại cấu hình +frontend/home/nginx-section-title=nginx ${version} +frontend/home/nginx-start=Khởi động máy chủ +frontend/home/nginx-stop-confirmation=Dừng máy chủ nginx ngay bây giờ? +frontend/home/nginx-stop=Dừng máy chủ +frontend/home/nginx-unknown=Trạng thái không xác định +frontend/home/no-certificates-expiring=Không có chứng chỉ hết hạn trong 30 ngày tới +frontend/home/recent-errors-disabled=Nhật ký lỗi máy chủ đã bị tắt trong cài đặt +frontend/home/recent-errors-empty=Không có mục nhật ký lỗi gần đây để hiển thị +frontend/home/recent-errors-title=Nhật ký lỗi gần đây +frontend/home/subtitle=Tổng quan về phiên bản nginx ignition của bạn +frontend/home/title=Tổng quan trang chủ +frontend/home/totals-title=Tài nguyên +frontend/home/traffic-disabled=Thống kê lưu lượng đã bị tắt trong cài đặt +frontend/home/traffic-no-data=Chưa có dữ liệu lưu lượng được ghi +frontend/home/traffic-offline=Thống kê lưu lượng yêu cầu nginx đang chạy +frontend/home/traffic-unsupported=Bản dựng nginx này không hỗ trợ thống kê lưu lượng +frontend/home/view-full-stats=Xem thống kê lưu lượng đầy đủ frontend/host/components/enable-https-help=Xác thực HTTPS được quản lý và cung cấp tự động bởi nhà cung cấp VPN của bạn. frontend/host/components/enable-https=Bật các điểm cuối HTTPS frontend/host/components/hostbindings/add-binding=Thêm binding @@ -1244,7 +1268,6 @@ frontend/locale/pagination/prev-page=Trang trước frontend/logs/access-disabled=Nhật ký truy cập host bị tắt trong cấu hình nginx frontend/logs/access-logs=Nhật ký truy cập frontend/logs/auto-refresh-disabled-reason=Tự động làm mới đang bật -frontend/logs/auto-refresh-option=Mỗi ${seconds} giây frontend/logs/auto-refresh=Tự động làm mới frontend/logs/category=Danh mục frontend/logs/error-disabled=Nhật ký lỗi host bị tắt trong cấu hình nginx diff --git a/i18n/messages_zh.properties b/i18n/messages_zh.properties index 89fe7dec0..0fbfc2514 100644 --- a/i18n/messages_zh.properties +++ b/i18n/messages_zh.properties @@ -732,6 +732,7 @@ common/add-duration=添加时长 common/advanced=高级 common/app-name=nginx ignition common/at-least-one-required=必须提供至少一个值 +common/auto-refresh-option=每 ${seconds} 秒 common/auto-refresh=自动刷新 common/between-values=值必须在 ${min} 和 ${max} 之间 common/binding=绑定 @@ -1099,29 +1100,52 @@ frontend/export/section-database-title=数据库备份 frontend/export/section-nginx-description-1=每当您使用 nginx ignition 进行更改并重新加载服务器时,nginx 配置文件都会生成或更新,其中包含您启用的所有主机、流、SSL 证书等。 frontend/export/section-nginx-description-2=通过下载 nginx 配置文件,您可以分析/审查其内容,甚至可以部署具有相同设置和行为的 nginx 服务器,这与 nginx ignition 的方式大致相同。 frontend/export/subtitle=下载 nginx 配置文件和 ignition 数据库内容以进行备份和恢复 -frontend/home/access-lists-description=访问列表提供了一种简单的方法来保护路由或整个主机,通过检查用户是否来自授权 IP 范围或通过有效的用户名和密码(甚至两者,IP 和凭据)进行识别 -frontend/home/cache-description-1=通过启用 nginx 的内容缓存功能,加速您的网站并减少上游服务器的负载。Ignition 使配置缓存规则变得容易,这些规则确定哪些请求应被缓存以及缓存多长时间。 -frontend/home/cache-description-2=您可以根据 HTTP 状态码、文件扩展名、请求方法等自定义缓存行为。诸如陈旧内容处理、后台更新和并发锁等高级功能让您可以精细控制内容的缓存和传输方式。 -frontend/home/footer-link=在我们的 GitHub 页面联系我们 -frontend/home/footer-subtitle=我们希望能收到您的反馈。 -frontend/home/footer-title=还有问题或错过了什么? -frontend/home/hosts-description-1=虚拟主机,简称主机,是 nginx 服务器使其可以在浏览器中打开的网站。您可以在左侧主菜单中找到所有管理的主机。 -frontend/home/hosts-description-2=nginx ignition 提供了一种直观的方式来配置此类网站。例如,如果您有一个 NAS 并且运行了一些服务(如 Jellyfin, Vaultwarden 等),ignition 提供了一种简单的方法,可以通过像 jellyfin.myhome.com 这样的域名访问它,这比 IP 和端口更容易记忆和使用。 -frontend/home/hosts-description-3=每个主机都有一组路由,这些规则定义了哪些请求模式应被转发以及转发到哪里,还有绑定,这些是定义 nginx 应在哪些端口监听此类请求的定义。 -frontend/home/integrations-description=您的应用是否运行在 Docker 容器或 TrueNAS 中?您可以启用 nginx ignition 提供的原生集成,并轻松选择容器或应用作为主机转发请求的目标应用。 -frontend/home/logs-description-1=需要知道请求了什么或为什么某些东西没有按预期工作?nginx ignition 也为您提供了一种简单的方法来检查 nginx 日志。只需选择您想要检查的主机(或 nginx 服务器本身),我们将为您获取日志。 -frontend/home/logs-description-2=而且您不需要担心磁盘被日志占满,ignition 会自动为您轮换日志(您可以控制保留多少,或者如果适合您最好,甚至可以禁用轮换)。 -frontend/home/settings-description-1=Ignition 抽象了 nginx 配置文件的复杂性,但这并不意味着您失去了进行一些微调的能力。 -frontend/home/settings-description-2=通过设置页面,您可以定义一些重要的定义,例如超时值、请求的最大上传/正文大小、nginx 监听请求的默认端口等。 -frontend/home/settings-description-3=除此之外,您还可以配置一些 nginx ignition 的功能,如 SSL 证书的自动续期和日志轮换。 -frontend/home/ssl-description-1=如果您想要或需要使用 HTTPS 加密保护您的域名,该应用也提供了一种简单的方法来管理此类 SSL 证书。 -frontend/home/ssl-description-2=无论您是需要由 Let's Encrypt 支持的有效证书、自签名证书,还是导入第三方提供商的自定义证书,ignition 都能轻松实现。即使在证书即将过期时,该应用也会自动为您续期。 -frontend/home/ssl-description-3=一旦创建或导入了 SSL 证书,您只需在表单中选择一个选项即可在主机上使用它。 -frontend/home/streams-description-1=虽然主机是公开基于 HTTP 和 HTTPS 服务的主要方式,但流使您能够公开其他依赖 TCP、UDP 和 unix 套接字的服务。 -frontend/home/streams-description-2=如果您需要公开游戏服务器、数据库、DNS 服务器以及其他任何不使用 HTTP 协议的内容,流是最佳选择。 -frontend/home/vpns-description=轻松地在您的 VPN 中公开您的主机。如果您正在使用 Tailscale,nginx ignition 可以自动在您的网络中创建一个虚拟机,并在访问机器 IP 或主机名时将请求转发到主机。 -frontend/home/welcome-subtitle=这里有一些快速入门信息,帮助您充分利用该应用。希望您喜欢。 -frontend/home/welcome-title=您好,欢迎使用 nginx ignition 👋 +frontend/help/access-lists-description=访问列表提供了一种简单的方法来保护路由或整个主机,通过检查用户是否来自授权 IP 范围或通过有效的用户名和密码(甚至两者,IP 和凭据)进行识别 +frontend/help/cache-description-1=通过启用 nginx 的内容缓存功能,加速您的网站并减少上游服务器的负载。Ignition 使配置缓存规则变得容易,这些规则确定哪些请求应被缓存以及缓存多长时间。 +frontend/help/cache-description-2=您可以根据 HTTP 状态码、文件扩展名、请求方法等自定义缓存行为。诸如陈旧内容处理、后台更新和并发锁等高级功能让您可以精细控制内容的缓存和传输方式。 +frontend/help/footer-link=在我们的 GitHub 页面联系我们 +frontend/help/footer-subtitle=我们希望能收到您的反馈。 +frontend/help/footer-title=还有问题或错过了什么? +frontend/help/hosts-description-1=虚拟主机,简称主机,是 nginx 服务器使其可以在浏览器中打开的网站。您可以在左侧主菜单中找到所有管理的主机。 +frontend/help/hosts-description-2=nginx ignition 提供了一种直观的方式来配置此类网站。例如,如果您有一个 NAS 并且运行了一些服务(如 Jellyfin, Vaultwarden 等),ignition 提供了一种简单的方法,可以通过像 jellyfin.myhome.com 这样的域名访问它,这比 IP 和端口更容易记忆和使用。 +frontend/help/hosts-description-3=每个主机都有一组路由,这些规则定义了哪些请求模式应被转发以及转发到哪里,还有绑定,这些是定义 nginx 应在哪些端口监听此类请求的定义。 +frontend/help/integrations-description=您的应用是否运行在 Docker 容器或 TrueNAS 中?您可以启用 nginx ignition 提供的原生集成,并轻松选择容器或应用作为主机转发请求的目标应用。 +frontend/help/logs-description-1=需要知道请求了什么或为什么某些东西没有按预期工作?nginx ignition 也为您提供了一种简单的方法来检查 nginx 日志。只需选择您想要检查的主机(或 nginx 服务器本身),我们将为您获取日志。 +frontend/help/logs-description-2=而且您不需要担心磁盘被日志占满,ignition 会自动为您轮换日志(您可以控制保留多少,或者如果适合您最好,甚至可以禁用轮换)。 +frontend/help/settings-description-1=Ignition 抽象了 nginx 配置文件的复杂性,但这并不意味着您失去了进行一些微调的能力。 +frontend/help/settings-description-2=通过设置页面,您可以定义一些重要的定义,例如超时值、请求的最大上传/正文大小、nginx 监听请求的默认端口等。 +frontend/help/settings-description-3=除此之外,您还可以配置一些 nginx ignition 的功能,如 SSL 证书的自动续期和日志轮换。 +frontend/help/ssl-description-1=如果您想要或需要使用 HTTPS 加密保护您的域名,该应用也提供了一种简单的方法来管理此类 SSL 证书。 +frontend/help/ssl-description-2=无论您是需要由 Let's Encrypt 支持的有效证书、自签名证书,还是导入第三方提供商的自定义证书,ignition 都能轻松实现。即使在证书即将过期时,该应用也会自动为您续期。 +frontend/help/ssl-description-3=一旦创建或导入了 SSL 证书,您只需在表单中选择一个选项即可在主机上使用它。 +frontend/help/streams-description-1=虽然主机是公开基于 HTTP 和 HTTPS 服务的主要方式,但流使您能够公开其他依赖 TCP、UDP 和 unix 套接字的服务。 +frontend/help/streams-description-2=如果您需要公开游戏服务器、数据库、DNS 服务器以及其他任何不使用 HTTP 协议的内容,流是最佳选择。 +frontend/help/vpns-description=轻松地在您的 VPN 中公开您的主机。如果您正在使用 Tailscale,nginx ignition 可以自动在您的网络中创建一个虚拟机,并在访问机器 IP 或主机名时将请求转发到主机。 +frontend/help/welcome-subtitle=这里有一些快速入门信息,帮助您充分利用该应用。希望您喜欢。 +frontend/help/welcome-title=您好,欢迎使用 nginx ignition 👋 +frontend/home/certificates-expiring-title=30天内到期的证书 +frontend/home/expires-in-days=${days}天后到期 +frontend/home/expires-today=今天到期 +frontend/home/nginx-offline=Offline +frontend/home/nginx-online=Online +frontend/home/nginx-reload=重新加载配置 +frontend/home/nginx-section-title=nginx ${version} +frontend/home/nginx-start=启动服务器 +frontend/home/nginx-stop-confirmation=现在停止 nginx 服务器吗? +frontend/home/nginx-stop=停止服务器 +frontend/home/nginx-unknown=状态未知 +frontend/home/no-certificates-expiring=未来30天内没有到期的证书 +frontend/home/recent-errors-disabled=服务器错误日志已在设置中禁用 +frontend/home/recent-errors-empty=没有可显示的最近错误日志条目 +frontend/home/recent-errors-title=最近的错误日志 +frontend/home/subtitle=nginx ignition 实例概览 +frontend/home/title=首页概览 +frontend/home/totals-title=资源 +frontend/home/traffic-disabled=流量统计已在设置中禁用 +frontend/home/traffic-no-data=尚未记录流量数据 +frontend/home/traffic-offline=流量统计需要 nginx 正在运行 +frontend/home/traffic-unsupported=此 nginx 构建不支持流量统计 +frontend/home/view-full-stats=查看完整流量统计 frontend/host/components/enable-https-help=HTTPS 证书由您的 VPN 提供商管理并自动配置。 frontend/host/components/enable-https=启用 HTTPS 端点 frontend/host/components/hostbindings/add-binding=添加绑定 @@ -1244,7 +1268,6 @@ frontend/locale/pagination/prev-page=上一页 frontend/logs/access-disabled=nginx 配置中已禁用主机访问日志 frontend/logs/access-logs=访问日志 frontend/logs/auto-refresh-disabled-reason=自动刷新已启用 -frontend/logs/auto-refresh-option=每 ${seconds} 秒 frontend/logs/auto-refresh=自动刷新 frontend/logs/category=类别 frontend/logs/error-disabled=nginx 配置中已禁用主机错误日志 From 9912ed7c123b57d78527def877acd37375ae84b7 Mon Sep 17 00:00:00 2001 From: Lucas Dillmann Date: Sun, 31 May 2026 11:49:50 -0300 Subject: [PATCH 02/13] New home dashboard --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c7c3313f1..35e019f74 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## 2.41.0 +- The home page is now an operator dashboard with the nginx status, resource counts, expiring certificates, recent error + logs, and a traffic summary. +- The feature tour with help videos moved to a dedicated Help page, accessible from the question-mark icon in the + header menu. - Development workflow improvements - Fixed double scrollbar on the logs page after the UI overhaul From a5e88778c989e45d3ab71ae6362f44ac660c97d5 Mon Sep 17 00:00:00 2001 From: Lucas Dillmann Date: Sun, 31 May 2026 12:00:12 -0300 Subject: [PATCH 03/13] New home dashboard --- frontend/src/domain/home/HomePage.tsx | 36 +++++++++++++++------------ 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/frontend/src/domain/home/HomePage.tsx b/frontend/src/domain/home/HomePage.tsx index 984d27982..fc372fccd 100644 --- a/frontend/src/domain/home/HomePage.tsx +++ b/frontend/src/domain/home/HomePage.tsx @@ -6,7 +6,7 @@ import EmptyStates from "../../core/components/emptystate/EmptyStates" import { isAccessGranted } from "../../core/components/accesscontrol/IsAccessGranted" import { UserAccessLevel } from "../user/model/UserAccessLevel" import MessageKey from "../../core/i18n/model/MessageKey.generated" -import { I18n } from "../../core/i18n/I18n" +import { I18n, I18nMessage } from "../../core/i18n/I18n" import NginxService from "../nginx/NginxService" import NginxMetadata, { NginxSupportType } from "../nginx/model/NginxMetadata" import HostService from "../host/HostService" @@ -375,30 +375,34 @@ export default class HomePage extends React.Component { ) } - private renderRecentErrorsPanel() { - if (!this.canViewLogs()) return null + private renderRecentErrorsEmpty(message: I18nMessage) { + return } /> + } + private renderRecentErrorsContent() { const { settings, errorLogs } = this.state const serverLogsEnabled = settings?.nginx.logs.serverLogsEnabled === true + if (!serverLogsEnabled) { + return this.renderRecentErrorsEmpty(MessageKey.FrontendHomeRecentErrorsDisabled) + } + + if (errorLogs.length === 0) { + return this.renderRecentErrorsEmpty(MessageKey.FrontendHomeRecentErrorsEmpty) + } + + return + } + + private renderRecentErrorsPanel() { + if (!this.canViewLogs()) return null + return (

- {!serverLogsEnabled ? ( - } - /> - ) : errorLogs.length === 0 ? ( - } - /> - ) : ( - - )} + {this.renderRecentErrorsContent()}
) } From 62a652ed7951b58894eb394c0b44b3d18c0a83fb Mon Sep 17 00:00:00 2001 From: Lucas Dillmann Date: Sun, 31 May 2026 12:34:13 -0300 Subject: [PATCH 04/13] New home dashboard --- frontend/src/domain/home/HomePage.css | 230 ++++++++++++++---- frontend/src/domain/home/HomePage.tsx | 91 ++++--- .../src/domain/home/components/CountCard.tsx | 4 +- .../home/components/NginxStatusCard.tsx | 12 +- .../domain/nginx/components/NginxControl.css | 95 +------- .../domain/nginx/components/NginxControl.tsx | 6 +- .../domain/trafficstats/TrafficStatsPage.css | 20 ++ i18n/messages_bn.properties | 5 +- i18n/messages_de.properties | 5 +- i18n/messages_en.properties | 5 +- i18n/messages_es.properties | 5 +- i18n/messages_fr.properties | 5 +- i18n/messages_hi.properties | 5 +- i18n/messages_ja.properties | 5 +- i18n/messages_pt.properties | 5 +- i18n/messages_ru.properties | 5 +- i18n/messages_vi.properties | 5 +- i18n/messages_zh.properties | 5 +- 18 files changed, 310 insertions(+), 203 deletions(-) diff --git a/frontend/src/domain/home/HomePage.css b/frontend/src/domain/home/HomePage.css index 601fb4955..7d244d251 100644 --- a/frontend/src/domain/home/HomePage.css +++ b/frontend/src/domain/home/HomePage.css @@ -1,108 +1,233 @@ .home-dashboard-container { - gap: 24px; + gap: 36px; + padding-bottom: 16px; } .home-dashboard-overview-row { gap: 24px; width: 100%; + display: grid; + align-items: stretch; } .home-dashboard-totals-section { + min-width: 0; +} + +.home-dashboard-overview-row-count-1 { + grid-template-columns: repeat(1, minmax(180px, 1fr)); +} + +.home-dashboard-overview-row-count-2 { + grid-template-columns: repeat(2, minmax(180px, 1fr)); +} + +.home-dashboard-overview-row-count-3 { + grid-template-columns: repeat(3, minmax(180px, 1fr)); +} + +.home-dashboard-overview-row-with-nginx.home-dashboard-overview-row-count-0 { + grid-template-columns: repeat(1, minmax(180px, 1fr)); +} + +.home-dashboard-overview-row-with-nginx.home-dashboard-overview-row-count-1 { + grid-template-columns: repeat(2, minmax(180px, 1fr)); +} + +.home-dashboard-overview-row-with-nginx.home-dashboard-overview-row-count-2 { + grid-template-columns: repeat(3, minmax(180px, 1fr)); +} + +.home-dashboard-overview-row-with-nginx.home-dashboard-overview-row-count-3 { + grid-template-columns: repeat(4, minmax(180px, 1fr)); +} + +.home-dashboard-overview-row-count-1 .home-dashboard-totals-section { + grid-column: span 1; +} + +.home-dashboard-overview-row-count-2 .home-dashboard-totals-section { + grid-column: span 2; +} + +.home-dashboard-overview-row-count-3 .home-dashboard-totals-section { + grid-column: span 3; +} + +.home-dashboard-overview-row-count-1 .home-dashboard-totals-section .traffic-stats-cards-row { + grid-template-columns: repeat(1, minmax(180px, 1fr)); +} + +.home-dashboard-overview-row-count-2 .home-dashboard-totals-section .traffic-stats-cards-row { + grid-template-columns: repeat(2, minmax(180px, 1fr)); +} + +.home-dashboard-overview-row-count-3 .home-dashboard-totals-section .traffic-stats-cards-row { + grid-template-columns: repeat(3, minmax(180px, 1fr)); +} + +.home-dashboard-totals-section .traffic-stats-cards-row { + display: grid; + gap: 16px; + align-items: stretch; flex: 1; min-width: 280px; } .home-dashboard-nginx-section { - flex: 0 0 auto; - min-width: 220px; - margin-left: auto; + grid-column: span 1; + min-width: 180px; +} + +.home-dashboard-nginx-slot { + display: flex; + flex: 1; + min-width: 180px; } .home-dashboard-nginx-control { padding: 16px; - border: 1px dashed var(--nginxIgnition-colorBorder); border-radius: 8px; background: transparent; + display: flex; + flex-direction: column; + gap: 12px; + flex: 1; + min-width: 180px; + height: 100%; + box-sizing: border-box; } .home-dashboard-section { display: flex; flex-direction: column; - gap: 16px; + gap: 20px; + padding-top: 4px; } .home-dashboard-section-header { align-items: center; justify-content: space-between; + margin-top: 4px; } -.home-dashboard-section-title { - font-size: 16px; - font-weight: 500; - margin: 0; +.home-dashboard-view-all-link, +.home-dashboard-view-all-link:hover, +.home-dashboard-view-all-link:focus, +.home-dashboard-view-all-link:active { + display: inline-flex; + align-items: center; + padding: 1px 8px; + font-size: 12px; + font-weight: 400; + line-height: 20px; color: var(--nginxIgnition-colorTextSecondary); + background: var(--nginxIgnition-colorBgLayout); + border: 1px solid var(--nginxIgnition-colorBorderSecondary); + border-radius: 4px; + text-decoration: none; + transition: + background 0.2s, + border-color 0.2s, + color 0.2s; } -.home-dashboard-cards-row { - display: flex; - flex-wrap: wrap; - gap: 16px; +html:not([data-theme="dark"]) .home-dashboard-view-all-link, +html:not([data-theme="dark"]) .home-dashboard-view-all-link:hover, +html:not([data-theme="dark"]) .home-dashboard-view-all-link:focus, +html:not([data-theme="dark"]) .home-dashboard-view-all-link:active { + color: var(--nginxIgnition-colorTextSecondary) !important; } -.home-dashboard-stat-card-link { - flex: 1; - min-width: 180px; - color: inherit; - text-decoration: none; - display: block; +.home-dashboard-view-all-link:hover, +.home-dashboard-view-all-link:focus { + color: var(--nginxIgnition-colorTextTertiary); + background: var(--nginxIgnition-colorBgElevated); } -.home-dashboard-stat-card-link:hover .home-dashboard-stat-card { - background: var(--nginxIgnition-colorBgContainer); +html:not([data-theme="dark"]) .home-dashboard-view-all-link:hover, +html:not([data-theme="dark"]) .home-dashboard-view-all-link:focus { + color: var(--nginxIgnition-colorTextTertiary) !important; } -.home-dashboard-stat-card { - flex: 1; - min-width: 180px; - padding: 16px; - background: var(--nginxIgnition-colorBgLayout); - border-radius: 8px; - height: 100%; +.home-dashboard-section-title { + font-size: 16px; + font-weight: 500; + margin: 0; + color: var(--nginxIgnition-colorTextSecondary); +} + +html:not([data-theme="dark"]) .home-dashboard-section-title { + color: var(--nginxIgnition-colorTextTertiary); } -.home-dashboard-nginx-status-value { - font-size: 24px; - font-weight: 600; - line-height: 1.2; +.home-dashboard-nginx-status { + font-size: 14px; + font-weight: 500; + line-height: 1.4; } -.home-dashboard-status-dot { +.home-dashboard-nginx-status-dot { display: inline-block; - width: 10px; - height: 10px; + width: 8px; + height: 8px; border-radius: 50%; margin-right: 8px; flex-shrink: 0; } -.home-dashboard-nginx-actions { - margin-top: 12px; -} - .home-dashboard-split-row { gap: 24px; flex-wrap: wrap; + align-items: stretch; } -.home-dashboard-panel { - flex: 1; +.home-dashboard-details-column { + flex: 1 1 320px; min-width: 320px; + display: flex; + flex-direction: column; + gap: 20px; + padding-top: 4px; +} + +.home-dashboard-panel { padding: 16px; background: var(--nginxIgnition-colorBgLayout); border-radius: 8px; display: flex; flex-direction: column; - gap: 16px; + flex: 1; + min-height: 312px; +} + +.home-dashboard-details-column .home-dashboard-panel .home-dashboard-cert-list { + max-height: 280px; + overflow: auto; +} + +.home-dashboard-log-content { + display: flex; + flex-direction: column; + flex: 1; + min-height: 312px; +} + +.home-dashboard-log-content .log-viewer-container { + flex: 1; + min-height: 280px; +} + +.home-dashboard-panel .home-dashboard-empty, +.home-dashboard-log-content .home-dashboard-empty, +.home-dashboard-section > .home-dashboard-empty { + flex: 1; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 0; + min-height: 280px; } .home-dashboard-cert-list { @@ -127,21 +252,30 @@ margin-left: 12px; } -.home-dashboard-log-panel .log-viewer-container { - max-height: 280px; -} - .home-dashboard-empty { padding: 16px 0; } -.home-dashboard-section .traffic-stats-cards-row { +.home-dashboard-section:not(.home-dashboard-totals-section) .traffic-stats-cards-row { display: flex; flex-wrap: wrap; gap: 16px; + align-items: stretch; + flex: 1; +} + +.home-dashboard-section:not(.home-dashboard-totals-section) .traffic-stats-stat-card-link, +.home-dashboard-totals-section .traffic-stats-stat-card-link { + display: flex; + flex-direction: column; + flex: 1; + min-width: 180px; } .home-dashboard-section .traffic-stats-stat-card { flex: 1; min-width: 180px; + width: 100%; + height: 100%; + box-sizing: border-box; } diff --git a/frontend/src/domain/home/HomePage.tsx b/frontend/src/domain/home/HomePage.tsx index fc372fccd..7273b1bc0 100644 --- a/frontend/src/domain/home/HomePage.tsx +++ b/frontend/src/domain/home/HomePage.tsx @@ -224,15 +224,18 @@ export default class HomePage extends React.Component { const canViewNginx = this.canViewNginxServer() if (countCards.length === 0 && !canViewNginx) return null + const overviewClassName = `home-dashboard-overview-row home-dashboard-overview-row-count-${countCards.length}${ + canViewNginx ? " home-dashboard-overview-row-with-nginx" : "" + }` return ( - + {countCards.length > 0 && (

- {countCards} + {countCards}
)} {canViewNginx && ( @@ -245,7 +248,9 @@ export default class HomePage extends React.Component { }} /> - +
+ +
)} @@ -300,6 +305,14 @@ export default class HomePage extends React.Component { return null } + private renderViewAllLink(to: string) { + return ( + + + + ) + } + private renderTrafficSection() { if (!this.canViewTrafficStats()) return null @@ -313,11 +326,7 @@ export default class HomePage extends React.Component {

- {!emptyState && ( - - - - )} + {!emptyState && this.renderViewAllLink("/traffic-stats")} {emptyState} {!emptyState && globalZone && ( @@ -351,26 +360,37 @@ export default class HomePage extends React.Component { ) } + private renderExpiringCertificatesContent() { + const { expiringCertificates } = this.state + + if (expiringCertificates.length === 0) { + return ( + } + /> + ) + } + + return ( + + {expiringCertificates.map(certificate => this.renderExpiringCertificateItem(certificate))} + + ) + } + private renderExpiringCertificatesPanel() { if (!this.canViewCertificates()) return null - const { expiringCertificates } = this.state - return ( -
-

- -

- {expiringCertificates.length === 0 ? ( - } - /> - ) : ( - - {expiringCertificates.map(certificate => this.renderExpiringCertificateItem(certificate))} - - )} +
+ +

+ +

+ {this.renderViewAllLink("/certificates")} +
+
{this.renderExpiringCertificatesContent()}
) } @@ -398,11 +418,14 @@ export default class HomePage extends React.Component { if (!this.canViewLogs()) return null return ( -
-

- -

- {this.renderRecentErrorsContent()} +
+ +

+ +

+ {this.renderViewAllLink("/logs")} +
+
{this.renderRecentErrorsContent()}
) } @@ -426,13 +449,13 @@ export default class HomePage extends React.Component { if (error !== undefined) return EmptyStates.FailedToFetch + if (loading) return + return ( - - {this.renderOverviewSection()} - {this.renderTrafficSection()} - {this.renderDetailsSection()} - + {this.renderOverviewSection()} + {this.renderTrafficSection()} + {this.renderDetailsSection()} ) } diff --git a/frontend/src/domain/home/components/CountCard.tsx b/frontend/src/domain/home/components/CountCard.tsx index 14b32d7bd..2f4011c3a 100644 --- a/frontend/src/domain/home/components/CountCard.tsx +++ b/frontend/src/domain/home/components/CountCard.tsx @@ -14,8 +14,8 @@ export default class CountCard extends React.PureComponent { const { title, count, linkTo } = this.props return ( - -
+ +
} value={count} />
diff --git a/frontend/src/domain/home/components/NginxStatusCard.tsx b/frontend/src/domain/home/components/NginxStatusCard.tsx index 6aa23e9cc..622023650 100644 --- a/frontend/src/domain/home/components/NginxStatusCard.tsx +++ b/frontend/src/domain/home/components/NginxStatusCard.tsx @@ -88,12 +88,12 @@ export default class NginxStatusCard extends React.Component - + + ) @@ -118,7 +118,7 @@ export default class NginxStatusCard extends React.Component - - )} - - ) + return this.renderDashboardEmpty(MessageKey.FrontendHomeTrafficDisabled) } if (nginxRunning === false) { - return ( - } - /> - ) + return this.renderDashboardEmpty(MessageKey.FrontendHomeTrafficOffline) } if (stats?.serverZones?.["*"]?.requestCounter === 0) { - return ( - } - /> - ) + return this.renderDashboardEmpty(MessageKey.FrontendHomeTrafficNoData) } return null @@ -313,6 +305,34 @@ export default class HomePage extends React.Component { ) } + private renderTrafficSectionHeader(emptyState: React.ReactNode | null) { + return ( + +

+ +

+ {emptyState === null && this.renderViewAllLink("/traffic-stats")} +
+ ) + } + + private renderTrafficSectionContent(emptyState: React.ReactNode | null, globalZone: ZoneData | undefined) { + if (emptyState !== null) { + return
{emptyState}
+ } + + if (globalZone === undefined) return null + + return ( + + ) + } + private renderTrafficSection() { if (!this.canViewTrafficStats()) return null @@ -322,38 +342,26 @@ export default class HomePage extends React.Component { return (
- -

- -

- {!emptyState && this.renderViewAllLink("/traffic-stats")} -
- {emptyState} - {!emptyState && globalZone && ( - - )} + {this.renderTrafficSectionHeader(emptyState)} + {this.renderTrafficSectionContent(emptyState, globalZone)}
) } + private renderCertificateExpiryMessage(days: number) { + if (days <= 0) return + + return + } + private renderExpiringCertificateItem(certificate: CertificateResponse) { const days = this.daysUntilExpiry(certificate.validUntil) - const expiryMessage = - days <= 0 ? ( - - ) : ( - - ) + const expiryMessage = this.renderCertificateExpiryMessage(days) return ( - {this.formatCertificateDomains(certificate)} + {expiryMessage} @@ -364,12 +372,7 @@ export default class HomePage extends React.Component { const { expiringCertificates } = this.state if (expiringCertificates.length === 0) { - return ( - } - /> - ) + return this.renderDashboardEmpty(MessageKey.FrontendHomeNoCertificatesExpiring) } return ( @@ -395,28 +398,36 @@ export default class HomePage extends React.Component { ) } - private renderRecentErrorsEmpty(message: I18nMessage) { - return } /> - } - private renderRecentErrorsContent() { const { settings, errorLogs } = this.state const serverLogsEnabled = settings?.nginx.logs.serverLogsEnabled === true if (!serverLogsEnabled) { - return this.renderRecentErrorsEmpty(MessageKey.FrontendHomeRecentErrorsDisabled) + return this.renderDashboardEmpty(MessageKey.FrontendHomeRecentErrorsDisabled) } if (errorLogs.length === 0) { - return this.renderRecentErrorsEmpty(MessageKey.FrontendHomeRecentErrorsEmpty) + return this.renderDashboardEmpty(MessageKey.FrontendHomeRecentErrorsEmpty) } return } + private renderRecentErrorsBody(content: React.ReactNode) { + const serverLogsEnabled = this.state.settings?.nginx.logs.serverLogsEnabled === true + + if (serverLogsEnabled) { + return
{content}
+ } + + return
{content}
+ } + private renderRecentErrorsPanel() { if (!this.canViewLogs()) return null + const content = this.renderRecentErrorsContent() + return (
@@ -425,7 +436,7 @@ export default class HomePage extends React.Component { {this.renderViewAllLink("/logs")} -
{this.renderRecentErrorsContent()}
+ {this.renderRecentErrorsBody(content)}
) } From a100057c32cee52cd017996e479290c272268657 Mon Sep 17 00:00:00 2001 From: Lucas Dillmann Date: Sun, 31 May 2026 14:38:57 -0300 Subject: [PATCH 06/13] New home dashboard --- .../domain/certificate/CertificateService.ts | 17 +++++++++++++++++ frontend/src/domain/home/HomePage.tsx | 18 +++++------------- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/frontend/src/domain/certificate/CertificateService.ts b/frontend/src/domain/certificate/CertificateService.ts index 46f929783..dec22d17c 100644 --- a/frontend/src/domain/certificate/CertificateService.ts +++ b/frontend/src/domain/certificate/CertificateService.ts @@ -27,6 +27,23 @@ export default class CertificateService { return this.gateway.getPage(pageSize, pageNumber, searchTerms).then(requireSuccessPayload) } + async listAll(searchTerms?: string): Promise { + const pageSize = 100 + const certificates: CertificateResponse[] = [] + let pageNumber = 0 + + while (true) { + const page = await this.list(pageSize, pageNumber, searchTerms) + certificates.push(...page.contents) + + if (page.contents.length === 0 || certificates.length >= page.totalItems) break + + pageNumber++ + } + + return certificates + } + async delete(id: string): Promise { return this.gateway.delete(id).then(requireSuccessResponse) } diff --git a/frontend/src/domain/home/HomePage.tsx b/frontend/src/domain/home/HomePage.tsx index ce74126b0..b26b38c6d 100644 --- a/frontend/src/domain/home/HomePage.tsx +++ b/frontend/src/domain/home/HomePage.tsx @@ -111,7 +111,7 @@ export default class HomePage extends React.Component { const { loading } = this.state if (loading) return - this.setState({ loading: true }, () => this.fetchData()) + this.setState({ loading: true, error: undefined }, () => this.fetchData()) } private filterExpiringCertificates(certificates: CertificateResponse[]): CertificateResponse[] { @@ -134,14 +134,6 @@ export default class HomePage extends React.Component { return Math.ceil((expiry.getTime() - now.getTime()) / (24 * 60 * 60 * 1000)) } - private filterExpiringCertificatesFromPage( - certificatesPage: { contents: CertificateResponse[] } | undefined, - ): CertificateResponse[] { - if (certificatesPage === undefined) return [] - - return this.filterExpiringCertificates(certificatesPage.contents) - } - private overviewClassName(countCardsLength: number, canViewNginx: boolean): string { let className = `home-dashboard-overview-row home-dashboard-overview-row-count-${countCardsLength}` @@ -163,13 +155,13 @@ export default class HomePage extends React.Component { const needsMetadata = canNginxServer || canTrafficStats const needsSettings = canLogs || canTrafficStats - const [metadata, nginxRunning, settings, hostsPage, streamsPage, certificatesPage] = await Promise.all([ + const [metadata, nginxRunning, settings, hostsPage, streamsPage, certificates] = await Promise.all([ needsMetadata ? this.nginxService.getMetadata() : Promise.resolve(undefined), needsMetadata ? this.nginxService.isRunning() : Promise.resolve(undefined), needsSettings ? this.settingsService.get() : Promise.resolve(undefined), canHosts ? this.hostService.list(1, 0) : Promise.resolve(undefined), canStreams ? this.streamService.list(1, 0) : Promise.resolve(undefined), - canCertificates ? this.certificateService.list(100, 0) : Promise.resolve(undefined), + canCertificates ? this.certificateService.listAll() : Promise.resolve([]), ]) let errorLogs: LogLine[] = [] @@ -192,8 +184,8 @@ export default class HomePage extends React.Component { settings, hostCount: hostsPage?.totalItems, streamCount: streamsPage?.totalItems, - certificateCount: certificatesPage?.totalItems, - expiringCertificates: this.filterExpiringCertificatesFromPage(certificatesPage), + certificateCount: canCertificates ? certificates.length : undefined, + expiringCertificates: canCertificates ? this.filterExpiringCertificates(certificates) : [], errorLogs, stats, }) From 75b7b9a870b19a1d43cdfbc2e401baf5c5013ed3 Mon Sep 17 00:00:00 2001 From: Lucas Dillmann Date: Sun, 31 May 2026 15:01:22 -0300 Subject: [PATCH 07/13] New home dashboard --- frontend/src/domain/home/HomePage.tsx | 32 ++--- .../domain/home/components/HomeHeaderCard.css | 79 +++++++++++ .../domain/home/components/HomeHeaderCard.tsx | 128 ++++++++++++++++++ i18n/messages_bn.properties | 6 +- i18n/messages_de.properties | 6 +- i18n/messages_en.properties | 6 +- i18n/messages_es.properties | 6 +- i18n/messages_fr.properties | 6 +- i18n/messages_hi.properties | 6 +- i18n/messages_ja.properties | 6 +- i18n/messages_pt.properties | 6 +- i18n/messages_ru.properties | 6 +- i18n/messages_vi.properties | 6 +- i18n/messages_zh.properties | 6 +- 14 files changed, 272 insertions(+), 33 deletions(-) create mode 100644 frontend/src/domain/home/components/HomeHeaderCard.css create mode 100644 frontend/src/domain/home/components/HomeHeaderCard.tsx diff --git a/frontend/src/domain/home/HomePage.tsx b/frontend/src/domain/home/HomePage.tsx index b26b38c6d..9b42d89ad 100644 --- a/frontend/src/domain/home/HomePage.tsx +++ b/frontend/src/domain/home/HomePage.tsx @@ -23,6 +23,7 @@ import LogLine from "../logs/model/LogLine" import { Link } from "react-router-dom" import TagGroup from "../../core/components/taggroup/TagGroup" import CountCard from "./components/CountCard" +import HomeHeaderCard from "./components/HomeHeaderCard" import NginxStatusCard from "./components/NginxStatusCard" import "./HomePage.css" import "../trafficstats/TrafficStatsPage.css" @@ -95,23 +96,14 @@ export default class HomePage extends React.Component { } private configureShell() { - AppShellContext.get().updateConfig({ - title: MessageKey.FrontendHomeTitle, - subtitle: MessageKey.FrontendHomeSubtitle, - actions: [ - { - description: MessageKey.CommonRefresh, - onClick: () => this.refreshData(), - }, - ], - }) + AppShellContext.get().updateConfig({}) } private refreshData() { const { loading } = this.state if (loading) return - this.setState({ loading: true, error: undefined }, () => this.fetchData()) + this.setState({ error: undefined }, () => this.fetchData()) } private filterExpiringCertificates(certificates: CertificateResponse[]): CertificateResponse[] { @@ -143,8 +135,6 @@ export default class HomePage extends React.Component { } private async fetchData() { - this.setState({ loading: true }) - try { const canNginxServer = this.canViewNginxServer() const canHosts = this.canViewHosts() @@ -195,7 +185,7 @@ export default class HomePage extends React.Component { } private renderOverviewSection() { - const { hostCount, streamCount, certificateCount, metadata } = this.state + const { hostCount, streamCount, certificateCount } = this.state const countCards: React.ReactNode[] = [] if (this.canViewHosts() && hostCount !== undefined) { @@ -225,7 +215,7 @@ export default class HomePage extends React.Component { return ( {this.renderOverviewTotalsSection(countCards)} - {this.renderOverviewNginxSection(canViewNginx, metadata?.version)} + {this.renderOverviewNginxSection(canViewNginx)} ) } @@ -243,18 +233,13 @@ export default class HomePage extends React.Component { ) } - private renderOverviewNginxSection(canViewNginx: boolean, version: string | undefined) { + private renderOverviewNginxSection(canViewNginx: boolean) { if (!canViewNginx) return null return (

- +

@@ -454,8 +439,11 @@ export default class HomePage extends React.Component { if (loading) return + const { metadata } = this.state + return ( + this.refreshData()} /> {this.renderOverviewSection()} {this.renderTrafficSection()} {this.renderDetailsSection()} diff --git a/frontend/src/domain/home/components/HomeHeaderCard.css b/frontend/src/domain/home/components/HomeHeaderCard.css new file mode 100644 index 000000000..aad758106 --- /dev/null +++ b/frontend/src/domain/home/components/HomeHeaderCard.css @@ -0,0 +1,79 @@ +.home-header-card { + padding: 20px; + background: var(--nginxIgnition-colorBgLayout); + border-radius: 8px; + width: 100%; + box-sizing: border-box; +} + +.home-header-card-columns { + gap: 24px; + width: 100%; +} + +.home-header-card-greeting { + flex: 1; + min-width: 240px; + gap: 8px; +} + +.home-header-card-title { + font-size: 28px; + font-weight: 600; + margin: 0; + line-height: 1.2; +} + +.home-header-card-subtitle { + font-size: 16px; + font-weight: 400; + margin: 0; + color: var(--nginxIgnition-colorTextSecondary); + line-height: 1.5; +} + +html:not([data-theme="dark"]) .home-header-card-subtitle { + color: var(--nginxIgnition-colorTextTertiary); +} + +.home-header-card-sidebar { + gap: 0; + min-width: 200px; +} + +.home-header-card-meta-group { + gap: 2px; + line-height: 1.2; +} + +.home-header-card-actions { + margin-top: 20px; +} + +.home-header-card-update-button.ant-btn { + color: var(--ant-color-warning-text) !important; + background: var(--ant-color-warning-bg) !important; + border-color: var(--ant-color-warning-border) !important; +} + +.home-header-card-update-button.ant-btn:hover:not(:disabled) { + color: var(--nginxIgnition-colorWarning) !important; + background: var(--ant-color-warning-bg) !important; + border-color: var(--nginxIgnition-colorWarning) !important; +} + +.home-header-card-meta-line { + font-size: 14px; + color: var(--nginxIgnition-colorTextSecondary); +} + +html:not([data-theme="dark"]) .home-header-card-meta-line { + color: var(--nginxIgnition-colorTextTertiary); +} + +.home-header-card-social-icon { + font-size: 16px; + cursor: pointer; + color: var(--nginxIgnition-colorTextSecondary); + margin-top: 5px; +} diff --git a/frontend/src/domain/home/components/HomeHeaderCard.tsx b/frontend/src/domain/home/components/HomeHeaderCard.tsx new file mode 100644 index 000000000..d509a0dd2 --- /dev/null +++ b/frontend/src/domain/home/components/HomeHeaderCard.tsx @@ -0,0 +1,128 @@ +import React from "react" +import { Button, Flex } from "antd" +import { GithubFilled, LinkedinFilled } from "@ant-design/icons" +import AppContext from "../../../core/components/context/AppContext" +import MessageKey from "../../../core/i18n/model/MessageKey.generated" +import { I18n } from "../../../core/i18n/I18n" +import NginxMetadata from "../../nginx/model/NginxMetadata" +import "./HomeHeaderCard.css" +import If from "../../../core/components/flowcontrol/If" + +export interface HomeHeaderCardProps { + metadata?: NginxMetadata + onRefresh: () => void +} + +export default class HomeHeaderCard extends React.PureComponent { + private firstName(): string { + const user = AppContext.get().user + if (user === undefined) return "" + + const trimmedName = user.name.trim() + if (trimmedName.length > 0) return trimmedName.split(/\s+/)[0] + + return user.username + } + + private releaseUrl(latest: string): string { + return `https://github.com/lucasdillmann/nginx-ignition/releases/${latest}` + } + + private handleGithubClick() { + window.open("https://github.com/lucasdillmann/nginx-ignition", "_blank", "noopener") + } + + private handleLinkedInClick() { + window.open("https://linkedin.com/in/lucasdillmann", "_blank", "noopener") + } + + private renderAppVersion() { + const { current } = AppContext.get().configuration.version + + return ( + + + + ) + } + + private renderNginxVersion() { + const { metadata } = this.props + if (metadata === undefined) return null + + return ( + + + + ) + } + + private renderSocialIcons() { + return ( + + this.handleLinkedInClick()} /> + this.handleGithubClick()} /> + + ) + } + + private renderActions(onRefresh: () => void) { + const { current, latest } = AppContext.get().configuration.version + const updateAvailable = current !== undefined && latest !== undefined && current !== latest + + return ( + + + + + + + ) + } + + render() { + const { onRefresh } = this.props + + return ( +
+ + +

+ +

+

+ +

+
+ + + {this.renderAppVersion()} + {this.renderNginxVersion()} + {this.renderSocialIcons()} + + {this.renderActions(onRefresh)} + +
+
+ ) + } +} diff --git a/i18n/messages_bn.properties b/i18n/messages_bn.properties index 57290ebd0..b15d7d91c 100644 --- a/i18n/messages_bn.properties +++ b/i18n/messages_bn.properties @@ -1126,14 +1126,17 @@ frontend/help/welcome-title=হ্যালো, এবং nginx ignition-এ আ frontend/home/certificates-expiring-title=30 দিনের মধ্যে মেয়াদ শেষ হওয়া সার্টিফিকেট frontend/home/expires-in-days=${days} দিনে মেয়াদ শেষ frontend/home/expires-today=আজ মেয়াদ শেষ +frontend/home/greeting-subtitle=nginx ignition-এ স্বাগতম। নিচে আপনার ইনস্ট্যান্সের একটি সংক্ষিপ্ত বিবরণ পাওয়া যাবে। +frontend/home/greeting-title=হ্যালো, ${userName} frontend/home/nginx-offline=Offline frontend/home/nginx-online=Online frontend/home/nginx-reload=কনফিগারেশন পুনরায় লোড করুন -frontend/home/nginx-section-title=nginx ${version} স্থিতি +frontend/home/nginx-section-title=nginx স্থিতি frontend/home/nginx-start=সার্ভার শুরু করুন frontend/home/nginx-stop-confirmation=nginx সার্ভার এখনই বন্ধ করবেন? frontend/home/nginx-stop=সার্ভার বন্ধ করুন frontend/home/nginx-unknown=অবস্থা অজানা +frontend/home/nginx-version=nginx ${version} mainline frontend/home/no-certificates-expiring=আগামী 30 দিনে কোনো সার্টিফিকেট মেয়াদ শেষ হচ্ছে না frontend/home/recent-errors-disabled=সার্ভার ত্রুটি লগ সেটিংসে নিষ্ক্রিয় frontend/home/recent-errors-empty=দেখানোর মতো কোনো সাম্প্রতিক ত্রুটি লগ এন্ট্রি নেই @@ -1145,6 +1148,7 @@ frontend/home/traffic-disabled=ট্রাফিক পরিসংখ্যা frontend/home/traffic-no-data=এখনও কোনো ট্রাফিক ডেটা রেকর্ড হয়নি frontend/home/traffic-offline=ট্রাফিক পরিসংখ্যানের জন্য nginx চালু থাকা প্রয়োজন frontend/home/traffic-unsupported=এই nginx বিল্ড ট্রাফিক পরিসংখ্যান সমর্থন করে না +frontend/home/update-available=আপডেট উপলব্ধ frontend/home/view-all=সব দেখুন frontend/home/view-full-stats=সম্পূর্ণ ট্রাফিক পরিসংখ্যান দেখুন frontend/host/components/enable-https-help=HTTPS সার্টিফিকেটগুলি আপনার VPN প্রদানকারী দ্বারা পরিচালিত এবং স্বয়ংক্রিয়ভাবে প্রদান করা হয়। diff --git a/i18n/messages_de.properties b/i18n/messages_de.properties index d06cea498..2ca55804d 100644 --- a/i18n/messages_de.properties +++ b/i18n/messages_de.properties @@ -1126,14 +1126,17 @@ frontend/help/welcome-title=Hallo und willkommen bei nginx ignition 👋 frontend/home/certificates-expiring-title=Zertifikate, die in 30 Tagen ablaufen frontend/home/expires-in-days=Läuft in ${days} Tagen ab frontend/home/expires-today=Läuft heute ab +frontend/home/greeting-subtitle=Willkommen bei nginx ignition. Unten finden Sie eine Übersicht Ihrer Instanz. +frontend/home/greeting-title=Hallo, ${userName} frontend/home/nginx-offline=Offline frontend/home/nginx-online=Online frontend/home/nginx-reload=Konfiguration neu laden -frontend/home/nginx-section-title=nginx ${version} Status +frontend/home/nginx-section-title=nginx Status frontend/home/nginx-start=Server starten frontend/home/nginx-stop-confirmation=Den nginx-Server jetzt stoppen? frontend/home/nginx-stop=Server stoppen frontend/home/nginx-unknown=Status unbekannt +frontend/home/nginx-version=nginx ${version} mainline frontend/home/no-certificates-expiring=Keine Zertifikate laufen in den nächsten 30 Tagen ab frontend/home/recent-errors-disabled=Server-Fehlerprotokolle sind in den Einstellungen deaktiviert frontend/home/recent-errors-empty=Keine aktuellen Fehlerprotokolleinträge vorhanden @@ -1145,6 +1148,7 @@ frontend/home/traffic-disabled=Verkehrsstatistiken sind in den Einstellungen dea frontend/home/traffic-no-data=Noch keine Verkehrsdaten erfasst frontend/home/traffic-offline=Verkehrsstatistiken erfordern einen laufenden nginx frontend/home/traffic-unsupported=Dieser nginx-Build unterstützt keine Verkehrsstatistiken +frontend/home/update-available=Update verfügbar frontend/home/view-all=Alle anzeigen frontend/home/view-full-stats=Vollständige Verkehrsstatistiken anzeigen frontend/host/components/enable-https-help=HTTPS-Zertifikate werden von Ihrem VPN-Anbieter verwaltet und automatisch bereitgestellt. diff --git a/i18n/messages_en.properties b/i18n/messages_en.properties index 523958d9a..2d5a35c9b 100644 --- a/i18n/messages_en.properties +++ b/i18n/messages_en.properties @@ -1126,14 +1126,17 @@ frontend/help/welcome-title=Hello, and welcome to nginx ignition 👋 frontend/home/certificates-expiring-title=Certificates expiring within 30 days frontend/home/expires-in-days=Expires in ${days} days frontend/home/expires-today=Expires today +frontend/home/greeting-subtitle=Welcome to nginx ignition. An overview of your instance is available below. +frontend/home/greeting-title=Hello, ${userName} frontend/home/nginx-offline=Offline frontend/home/nginx-online=Online frontend/home/nginx-reload=Reload config -frontend/home/nginx-section-title=nginx ${version} status +frontend/home/nginx-section-title=nginx status frontend/home/nginx-start=Start server frontend/home/nginx-stop-confirmation=Stop the nginx server now? frontend/home/nginx-stop=Stop server frontend/home/nginx-unknown=Status unknown +frontend/home/nginx-version=nginx ${version} mainline frontend/home/no-certificates-expiring=No certificates expiring within the next 30 days frontend/home/recent-errors-disabled=Server error logs are disabled in settings frontend/home/recent-errors-empty=No recent error log entries to show @@ -1145,6 +1148,7 @@ frontend/home/traffic-disabled=Traffic statistics are disabled in settings frontend/home/traffic-no-data=No traffic data recorded yet frontend/home/traffic-offline=Traffic statistics require nginx to be running frontend/home/traffic-unsupported=This nginx build does not support traffic statistics +frontend/home/update-available=Update available frontend/home/view-all=View all frontend/home/view-full-stats=View full traffic stats frontend/host/components/enable-https-help=HTTPS certificates are managed and automatically provisioned by your VPN provider. diff --git a/i18n/messages_es.properties b/i18n/messages_es.properties index 13708ffba..5380b85c2 100644 --- a/i18n/messages_es.properties +++ b/i18n/messages_es.properties @@ -1126,14 +1126,17 @@ frontend/help/welcome-title=Hola, y bienvenido a nginx ignition 👋 frontend/home/certificates-expiring-title=Certificados que expiran en 30 días frontend/home/expires-in-days=Expira en ${days} días frontend/home/expires-today=Expira hoy +frontend/home/greeting-subtitle=Bienvenido a nginx ignition. A continuación hay una vista general de su instancia. +frontend/home/greeting-title=Hola, ${userName} frontend/home/nginx-offline=Desconectado frontend/home/nginx-online=Conectado frontend/home/nginx-reload=Recargar configuración -frontend/home/nginx-section-title=nginx ${version} estado +frontend/home/nginx-section-title=nginx estado frontend/home/nginx-start=Iniciar servidor frontend/home/nginx-stop-confirmation=¿Detener el servidor nginx ahora? frontend/home/nginx-stop=Detener servidor frontend/home/nginx-unknown=Estado desconocido +frontend/home/nginx-version=nginx ${version} mainline frontend/home/no-certificates-expiring=Ningún certificado expira en los próximos 30 días frontend/home/recent-errors-disabled=Los registros de error del servidor están desactivados en la configuración frontend/home/recent-errors-empty=No hay entradas recientes en el registro de errores @@ -1145,6 +1148,7 @@ frontend/home/traffic-disabled=Las estadísticas de tráfico están desactivadas frontend/home/traffic-no-data=Aún no hay datos de tráfico registrados frontend/home/traffic-offline=Las estadísticas de tráfico requieren que nginx esté en ejecución frontend/home/traffic-unsupported=Esta compilación de nginx no admite estadísticas de tráfico +frontend/home/update-available=Actualización disponible frontend/home/view-all=Ver todo frontend/home/view-full-stats=Ver estadísticas de tráfico completas frontend/host/components/enable-https-help=Los certificados HTTPS son administrados y provistos automáticamente por su proveedor de VPN. diff --git a/i18n/messages_fr.properties b/i18n/messages_fr.properties index 3298628f6..a2ddf7154 100644 --- a/i18n/messages_fr.properties +++ b/i18n/messages_fr.properties @@ -1126,14 +1126,17 @@ frontend/help/welcome-title=Bonjour, et bienvenue sur nginx ignition 👋 frontend/home/certificates-expiring-title=Certificats expirant dans 30 jours frontend/home/expires-in-days=Expire dans ${days} jours frontend/home/expires-today=Expire aujourd'hui +frontend/home/greeting-subtitle=Bienvenue sur nginx ignition. Un aperçu de votre instance est disponible ci-dessous. +frontend/home/greeting-title=Bonjour, ${userName} frontend/home/nginx-offline=Hors ligne frontend/home/nginx-online=En ligne frontend/home/nginx-reload=Recharger la configuration -frontend/home/nginx-section-title=nginx ${version} statut +frontend/home/nginx-section-title=nginx statut frontend/home/nginx-start=Démarrer le serveur frontend/home/nginx-stop-confirmation=Arrêter le serveur nginx maintenant ? frontend/home/nginx-stop=Arrêter le serveur frontend/home/nginx-unknown=Statut inconnu +frontend/home/nginx-version=nginx ${version} mainline frontend/home/no-certificates-expiring=Aucun certificat n'expire dans les 30 prochains jours frontend/home/recent-errors-disabled=Les journaux d'erreur du serveur sont désactivés dans les paramètres frontend/home/recent-errors-empty=Aucune entrée récente dans le journal d'erreurs @@ -1145,6 +1148,7 @@ frontend/home/traffic-disabled=Les statistiques de trafic sont désactivées dan frontend/home/traffic-no-data=Aucune donnée de trafic enregistrée pour le moment frontend/home/traffic-offline=Les statistiques de trafic nécessitent que nginx soit en cours d'exécution frontend/home/traffic-unsupported=Cette compilation nginx ne prend pas en charge les statistiques de trafic +frontend/home/update-available=Mise à jour disponible frontend/home/view-all=Voir tout frontend/home/view-full-stats=Voir les statistiques de trafic complètes frontend/host/components/enable-https-help=Les certificats HTTPS sont gérés et automatiquement fournis par votre fournisseur VPN. diff --git a/i18n/messages_hi.properties b/i18n/messages_hi.properties index 412dc8fbd..62e3f005d 100644 --- a/i18n/messages_hi.properties +++ b/i18n/messages_hi.properties @@ -1126,14 +1126,17 @@ frontend/help/welcome-title=नमस्ते, और nginx ignition में frontend/home/certificates-expiring-title=30 दिनों में समाप्त होने वाले प्रमाणपत्र frontend/home/expires-in-days=${days} दिनों में समाप्त frontend/home/expires-today=आज समाप्त +frontend/home/greeting-subtitle=nginx ignition में आपका स्वागत है। नीचे आपके इंस्टेंस का अवलोकन उपलब्ध है। +frontend/home/greeting-title=नमस्ते, ${userName} frontend/home/nginx-offline=Offline frontend/home/nginx-online=Online frontend/home/nginx-reload=कॉन्फ़िगरेशन पुनः लोड करें -frontend/home/nginx-section-title=nginx ${version} स्थिति +frontend/home/nginx-section-title=nginx स्थिति frontend/home/nginx-start=सर्वर शुरू करें frontend/home/nginx-stop-confirmation=nginx सर्वर अभी रोकें? frontend/home/nginx-stop=सर्वर रोकें frontend/home/nginx-unknown=स्थिति अज्ञात +frontend/home/nginx-version=nginx ${version} mainline frontend/home/no-certificates-expiring=अगले 30 दिनों में कोई प्रमाणपत्र समाप्त नहीं हो रहा frontend/home/recent-errors-disabled=सर्वर त्रुटि लॉग सेटिंग्स में अक्षम हैं frontend/home/recent-errors-empty=दिखाने के लिए कोई हालिया त्रुटि लॉग प्रविष्टि नहीं @@ -1145,6 +1148,7 @@ frontend/home/traffic-disabled=ट्रैफ़िक आँकड़े स frontend/home/traffic-no-data=अभी तक कोई ट्रैफ़िक डेटा दर्ज नहीं frontend/home/traffic-offline=ट्रैफ़िक आँकड़ों के लिए nginx चल रहा होना आवश्यक है frontend/home/traffic-unsupported=यह nginx बिल्ड ट्रैफ़िक आँकड़ों का समर्थन नहीं करता +frontend/home/update-available=अपडेट उपलब्ध frontend/home/view-all=सभी देखें frontend/home/view-full-stats=पूर्ण ट्रैफ़िक आँकड़े देखें frontend/host/components/enable-https-help=HTTPS प्रमाणपत्र आपके VPN प्रदाता द्वारा प्रबंधित और स्वचालित रूप से प्रदान किए जाते हैं। diff --git a/i18n/messages_ja.properties b/i18n/messages_ja.properties index e3d822375..ef0bb77d6 100644 --- a/i18n/messages_ja.properties +++ b/i18n/messages_ja.properties @@ -1126,14 +1126,17 @@ frontend/help/welcome-title=こんにちは、nginx ignitionへようこそ 👋 frontend/home/certificates-expiring-title=30日以内に期限切れになる証明書 frontend/home/expires-in-days=あと${days}日で期限切れ frontend/home/expires-today=本日期限切れ +frontend/home/greeting-subtitle=nginx ignition へようこそ。インスタンスの概要を以下で確認できます。 +frontend/home/greeting-title=こんにちは、${userName} さん frontend/home/nginx-offline=Offline frontend/home/nginx-online=Online frontend/home/nginx-reload=設定を再読み込み -frontend/home/nginx-section-title=nginx ${version} ステータス +frontend/home/nginx-section-title=nginx ステータス frontend/home/nginx-start=サーバーを起動 frontend/home/nginx-stop-confirmation=nginx サーバーを今すぐ停止しますか? frontend/home/nginx-stop=サーバーを停止 frontend/home/nginx-unknown=状態不明 +frontend/home/nginx-version=nginx ${version} mainline frontend/home/no-certificates-expiring=今後30日以内に期限切れになる証明書はありません frontend/home/recent-errors-disabled=サーバーのエラーログは設定で無効になっています frontend/home/recent-errors-empty=表示する最近のエラーログエントリがありません @@ -1145,6 +1148,7 @@ frontend/home/traffic-disabled=トラフィック統計は設定で無効にな frontend/home/traffic-no-data=まだトラフィックデータが記録されていません frontend/home/traffic-offline=トラフィック統計には nginx の実行が必要です frontend/home/traffic-unsupported=この nginx ビルドはトラフィック統計をサポートしていません +frontend/home/update-available=アップデートあり frontend/home/view-all=すべて表示 frontend/home/view-full-stats=トラフィック統計の詳細を表示 frontend/host/components/enable-https-help=HTTPS証明書はVPNプロバイダーによって管理され、自動的にプロビジョニングされます。 diff --git a/i18n/messages_pt.properties b/i18n/messages_pt.properties index b1494f10f..d001a6e21 100644 --- a/i18n/messages_pt.properties +++ b/i18n/messages_pt.properties @@ -1126,14 +1126,17 @@ frontend/help/welcome-title=Olá, e bem-vindo ao nginx ignition 👋 frontend/home/certificates-expiring-title=Certificados expirando em 30 dias frontend/home/expires-in-days=Expira em ${days} dias frontend/home/expires-today=Expira hoje +frontend/home/greeting-subtitle=Bem-vindo ao nginx ignition. Uma visão geral da sua instância está disponível abaixo. +frontend/home/greeting-title=Olá, ${userName} frontend/home/nginx-offline=Offline frontend/home/nginx-online=Online frontend/home/nginx-reload=Recarregar configuração -frontend/home/nginx-section-title=nginx ${version} status +frontend/home/nginx-section-title=nginx status frontend/home/nginx-start=Iniciar servidor frontend/home/nginx-stop-confirmation=Parar o servidor nginx agora? frontend/home/nginx-stop=Parar servidor frontend/home/nginx-unknown=Status desconhecido +frontend/home/nginx-version=nginx ${version} mainline frontend/home/no-certificates-expiring=Nenhum certificado expira nos próximos 30 dias frontend/home/recent-errors-disabled=Os logs de erro do servidor estão desativados nas configurações frontend/home/recent-errors-empty=Nenhuma entrada recente no log de erros @@ -1145,6 +1148,7 @@ frontend/home/traffic-disabled=As estatísticas de tráfego estão desativadas n frontend/home/traffic-no-data=Nenhum dado de tráfego registrado ainda frontend/home/traffic-offline=As estatísticas de tráfego exigem que o nginx esteja em execução frontend/home/traffic-unsupported=Esta compilação do nginx não suporta estatísticas de tráfego +frontend/home/update-available=Atualização disponível frontend/home/view-all=Ver tudo frontend/home/view-full-stats=Ver estatísticas completas de tráfego frontend/host/components/enable-https-help=Os certificados HTTPS são gerenciados e provisionados automaticamente pelo seu provedor de VPN. diff --git a/i18n/messages_ru.properties b/i18n/messages_ru.properties index b60bc5925..d934b929d 100644 --- a/i18n/messages_ru.properties +++ b/i18n/messages_ru.properties @@ -1126,14 +1126,17 @@ frontend/help/welcome-title=Привет, и добро пожаловать в frontend/home/certificates-expiring-title=Сертификаты, истекающие в течение 30 дней frontend/home/expires-in-days=Истекает через ${days} дн. frontend/home/expires-today=Истекает сегодня +frontend/home/greeting-subtitle=Добро пожаловать в nginx ignition. Ниже доступен обзор вашего экземпляра. +frontend/home/greeting-title=Здравствуйте, ${userName} frontend/home/nginx-offline=Офлайн frontend/home/nginx-online=Онлайн frontend/home/nginx-reload=Перезагрузить конфигурацию -frontend/home/nginx-section-title=nginx ${version} статус +frontend/home/nginx-section-title=nginx статус frontend/home/nginx-start=Запустить сервер frontend/home/nginx-stop-confirmation=Остановить сервер nginx сейчас? frontend/home/nginx-stop=Остановить сервер frontend/home/nginx-unknown=Статус неизвестен +frontend/home/nginx-version=nginx ${version} mainline frontend/home/no-certificates-expiring=Нет сертификатов, истекающих в ближайшие 30 дней frontend/home/recent-errors-disabled=Журналы ошибок сервера отключены в настройках frontend/home/recent-errors-empty=Нет недавних записей в журнале ошибок @@ -1145,6 +1148,7 @@ frontend/home/traffic-disabled=Статистика трафика отключ frontend/home/traffic-no-data=Данные о трафике пока не записаны frontend/home/traffic-offline=Для статистики трафика nginx должен быть запущен frontend/home/traffic-unsupported=Эта сборка nginx не поддерживает статистику трафика +frontend/home/update-available=Доступно обновление frontend/home/view-all=Показать все frontend/home/view-full-stats=Просмотреть полную статистику трафика frontend/host/components/enable-https-help=Сертификаты HTTPS управляются и автоматически предоставляются вашим VPN-провайдером. diff --git a/i18n/messages_vi.properties b/i18n/messages_vi.properties index 91ea7d363..9f045b42e 100644 --- a/i18n/messages_vi.properties +++ b/i18n/messages_vi.properties @@ -1126,14 +1126,17 @@ frontend/help/welcome-title=Xin chào, và chào mừng đến với nginx ignit frontend/home/certificates-expiring-title=Chứng chỉ hết hạn trong 30 ngày frontend/home/expires-in-days=Hết hạn sau ${days} ngày frontend/home/expires-today=Hết hạn hôm nay +frontend/home/greeting-subtitle=Chào mừng đến nginx ignition. Tổng quan về phiên bản của bạn có ở bên dưới. +frontend/home/greeting-title=Xin chào, ${userName} frontend/home/nginx-offline=Ngoại tuyến frontend/home/nginx-online=Trực tuyến frontend/home/nginx-reload=Tải lại cấu hình -frontend/home/nginx-section-title=nginx ${version} trạng thái +frontend/home/nginx-section-title=nginx trạng thái frontend/home/nginx-start=Khởi động máy chủ frontend/home/nginx-stop-confirmation=Dừng máy chủ nginx ngay bây giờ? frontend/home/nginx-stop=Dừng máy chủ frontend/home/nginx-unknown=Trạng thái không xác định +frontend/home/nginx-version=nginx ${version} mainline frontend/home/no-certificates-expiring=Không có chứng chỉ hết hạn trong 30 ngày tới frontend/home/recent-errors-disabled=Nhật ký lỗi máy chủ đã bị tắt trong cài đặt frontend/home/recent-errors-empty=Không có mục nhật ký lỗi gần đây để hiển thị @@ -1145,6 +1148,7 @@ frontend/home/traffic-disabled=Thống kê lưu lượng đã bị tắt trong c frontend/home/traffic-no-data=Chưa có dữ liệu lưu lượng được ghi frontend/home/traffic-offline=Thống kê lưu lượng yêu cầu nginx đang chạy frontend/home/traffic-unsupported=Bản dựng nginx này không hỗ trợ thống kê lưu lượng +frontend/home/update-available=Có bản cập nhật frontend/home/view-all=Xem tất cả frontend/home/view-full-stats=Xem thống kê lưu lượng đầy đủ frontend/host/components/enable-https-help=Xác thực HTTPS được quản lý và cung cấp tự động bởi nhà cung cấp VPN của bạn. diff --git a/i18n/messages_zh.properties b/i18n/messages_zh.properties index 7486cb524..b18836cf9 100644 --- a/i18n/messages_zh.properties +++ b/i18n/messages_zh.properties @@ -1126,14 +1126,17 @@ frontend/help/welcome-title=您好,欢迎使用 nginx ignition 👋 frontend/home/certificates-expiring-title=30天内到期的证书 frontend/home/expires-in-days=${days}天后到期 frontend/home/expires-today=今天到期 +frontend/home/greeting-subtitle=欢迎使用 nginx ignition。下方可查看实例概览。 +frontend/home/greeting-title=你好,${userName} frontend/home/nginx-offline=Offline frontend/home/nginx-online=Online frontend/home/nginx-reload=重新加载配置 -frontend/home/nginx-section-title=nginx ${version} 状态 +frontend/home/nginx-section-title=nginx 状态 frontend/home/nginx-start=启动服务器 frontend/home/nginx-stop-confirmation=现在停止 nginx 服务器吗? frontend/home/nginx-stop=停止服务器 frontend/home/nginx-unknown=状态未知 +frontend/home/nginx-version=nginx ${version} mainline frontend/home/no-certificates-expiring=未来30天内没有到期的证书 frontend/home/recent-errors-disabled=服务器错误日志已在设置中禁用 frontend/home/recent-errors-empty=没有可显示的最近错误日志条目 @@ -1145,6 +1148,7 @@ frontend/home/traffic-disabled=流量统计已在设置中禁用 frontend/home/traffic-no-data=尚未记录流量数据 frontend/home/traffic-offline=流量统计需要 nginx 正在运行 frontend/home/traffic-unsupported=此 nginx 构建不支持流量统计 +frontend/home/update-available=有可用更新 frontend/home/view-all=查看全部 frontend/home/view-full-stats=查看完整流量统计 frontend/host/components/enable-https-help=HTTPS 证书由您的 VPN 提供商管理并自动配置。 From 9eae1c5b3be56229c278118f229026614ed62a9b Mon Sep 17 00:00:00 2001 From: Lucas Dillmann Date: Sun, 31 May 2026 15:27:41 -0300 Subject: [PATCH 08/13] New home dashboard --- api/nginx/status_handler.go | 7 +++- api/nginx/status_handler_test.go | 8 ++-- core/nginx/commands.go | 2 +- core/nginx/model.go | 5 +++ core/nginx/process_manager_test.go | 10 +++++ core/nginx/process_manager_unix.go | 41 +++++++++++++++++++ core/nginx/process_manager_windows.go | 32 +++++++++++++++ core/nginx/service.go | 17 +++++++- core/nginx/service_test.go | 18 ++++++-- .../domain/home/components/HomeHeaderCard.tsx | 2 +- .../domain/nginx/model/NginxStatusResponse.ts | 1 + go.work.sum | 22 ++++++++++ tools/go.mod | 14 +++---- tools/go.sum | 39 +++--------------- 14 files changed, 164 insertions(+), 54 deletions(-) diff --git a/api/nginx/status_handler.go b/api/nginx/status_handler.go index e4da8a09d..e3e89fd57 100644 --- a/api/nginx/status_handler.go +++ b/api/nginx/status_handler.go @@ -13,6 +13,9 @@ type statusHandler struct { } func (h statusHandler) handle(ctx *gin.Context) { - running := h.commands.GetStatus(ctx.Request.Context()) - ctx.JSON(http.StatusOK, gin.H{"running": running}) + status := h.commands.GetStatus(ctx.Request.Context()) + ctx.JSON(http.StatusOK, gin.H{ + "running": status.Running, + "uptimeSeconds": status.UptimeSeconds, + }) } diff --git a/api/nginx/status_handler_test.go b/api/nginx/status_handler_test.go index bb9af51bb..1d249a81d 100644 --- a/api/nginx/status_handler_test.go +++ b/api/nginx/status_handler_test.go @@ -23,10 +23,11 @@ func Test_statusHandler(t *testing.T) { controller := gomock.NewController(t) defer controller.Finish() + uptime := int64(3600) commands := nginx.NewMockedCommands(controller) commands.EXPECT(). GetStatus(gomock.Any()). - Return(true) + Return(nginx.Status{Running: true, UptimeSeconds: &uptime}) handler := statusHandler{ commands: commands, @@ -39,9 +40,10 @@ func Test_statusHandler(t *testing.T) { engine.ServeHTTP(recorder, request) assert.Equal(t, http.StatusOK, recorder.Code) - var response map[string]bool + var response map[string]any json.Unmarshal(recorder.Body.Bytes(), &response) - assert.True(t, response["running"]) + assert.True(t, response["running"].(bool)) + assert.Equal(t, float64(3600), response["uptimeSeconds"].(float64)) }) }) } diff --git a/core/nginx/commands.go b/core/nginx/commands.go index dd7644ce9..dc0ba2bc2 100644 --- a/core/nginx/commands.go +++ b/core/nginx/commands.go @@ -30,7 +30,7 @@ type Commands interface { search *LogSearch, ) ([]logline.LogLine, error) GetMainLogs(ctx context.Context, lines int, search *LogSearch) ([]logline.LogLine, error) - GetStatus(ctx context.Context) bool + GetStatus(ctx context.Context) Status GetTrafficStats(ctx context.Context) (*Stats, error) GetConfigFiles(ctx context.Context, input GetConfigFilesInput) ([]byte, error) GetMetadata(ctx context.Context) (*Metadata, error) diff --git a/core/nginx/model.go b/core/nginx/model.go index dc74f02f3..e2aa3c561 100644 --- a/core/nginx/model.go +++ b/core/nginx/model.go @@ -8,6 +8,11 @@ const ( NoneSupportType SupportType = "NONE" ) +type Status struct { + UptimeSeconds *int64 + Running bool +} + type Stats struct { ServerZones map[string]StatsZoneData FilterZones map[string]map[string]StatsZoneData diff --git a/core/nginx/process_manager_test.go b/core/nginx/process_manager_test.go index 3f6a34168..ef9145ad9 100644 --- a/core/nginx/process_manager_test.go +++ b/core/nginx/process_manager_test.go @@ -3,6 +3,7 @@ package nginx import ( "os" "path/filepath" + "strconv" "testing" "github.com/stretchr/testify/assert" @@ -52,4 +53,13 @@ func Test_processManager(t *testing.T) { assert.NoFileExists(t, socketFile) }) }) + + t.Run("uptimeSeconds", func(t *testing.T) { + pidFile := filepath.Join(tmpDir, "nginx.pid") + _ = os.WriteFile(pidFile, []byte(strconv.Itoa(os.Getpid())), 0o644) + + uptime, err := manager.uptimeSeconds() + assert.NoError(t, err) + assert.GreaterOrEqual(t, uptime, int64(0)) + }) } diff --git a/core/nginx/process_manager_unix.go b/core/nginx/process_manager_unix.go index 17a023dbb..78e253ae5 100644 --- a/core/nginx/process_manager_unix.go +++ b/core/nginx/process_manager_unix.go @@ -3,8 +3,13 @@ package nginx import ( + "errors" "os" + "os/exec" + "strconv" + "strings" "syscall" + "time" "dillmann.com.br/nginx-ignition/core/common/log" ) @@ -27,3 +32,39 @@ func (m *processManager) start() error { log.Infof("nginx started") return nil } + +func (m *processManager) uptimeSeconds() (int64, error) { + pid, err := m.currentPid() + if err != nil { + return 0, err + } + if pid == 0 { + return 0, errors.New("nginx is not running") + } + + return processUptimeSeconds(pid) +} + +func processUptimeSeconds(pid int64) (int64, error) { + command := exec.Command("ps", "-o", "lstart=", "-p", strconv.FormatInt(pid, 10)) + output, err := command.Output() + if err != nil { + return 0, err + } + + startText := strings.TrimSpace(string(output)) + if startText == "" { + return 0, errors.New("process not found") + } + + startTime, err := time.ParseInLocation("Mon Jan _2 15:04:05 2006", startText, time.Local) + if err != nil { + return 0, err + } + + seconds := int64(time.Since(startTime).Seconds()) + if seconds < 0 { + return 0, nil + } + return seconds, nil +} diff --git a/core/nginx/process_manager_windows.go b/core/nginx/process_manager_windows.go index 11d4ee88d..c2482416f 100644 --- a/core/nginx/process_manager_windows.go +++ b/core/nginx/process_manager_windows.go @@ -7,6 +7,7 @@ import ( "errors" "os" "strings" + "syscall" "time" "dillmann.com.br/nginx-ignition/core/common/log" @@ -27,6 +28,37 @@ func (m *processManager) start() error { return nil } +func (m *processManager) uptimeSeconds() (int64, error) { + pid, err := m.currentPid() + if err != nil { + return 0, err + } + + if pid == 0 { + return 0, errors.New("nginx is not running") + } + + handle, err := syscall.OpenProcess(syscall.PROCESS_QUERY_INFORMATION, false, uint32(pid)) + if err != nil { + return 0, err + } + + defer syscall.CloseHandle(handle) + var creationTime, exitTime, kernelTime, userTime syscall.Filetime + + if err := syscall.GetProcessTimes(handle, &creationTime, &exitTime, &kernelTime, &userTime); err != nil { + return 0, err + } + + startTime := time.Unix(0, creationTime.Nanoseconds()) + seconds := int64(time.Since(startTime).Seconds()) + if seconds < 0 { + return 0, nil + } + + return seconds, nil +} + func (m *processManager) runBackgroundCommand(waitDelay time.Duration, extraArgs ...string) error { cmd := m.prepareCommand(extraArgs...) diff --git a/core/nginx/service.go b/core/nginx/service.go index 806de1de0..eff49140a 100644 --- a/core/nginx/service.go +++ b/core/nginx/service.go @@ -133,8 +133,21 @@ func (s *service) Stop(ctx context.Context) error { }) } -func (s *service) GetStatus(_ context.Context) bool { - return s.semaphore.currentState() == runningState +func (s *service) GetStatus(_ context.Context) Status { + running := s.semaphore.currentState() == runningState + status := Status{Running: running} + if !running { + return status + } + + uptime, err := s.processManager.uptimeSeconds() + if err != nil { + log.Warnf("unable to resolve nginx uptime: %v", err) + return status + } + + status.UptimeSeconds = &uptime + return status } func (s *service) GetHostLogs( diff --git a/core/nginx/service_test.go b/core/nginx/service_test.go index 94293635f..2f0afe9c6 100644 --- a/core/nginx/service_test.go +++ b/core/nginx/service_test.go @@ -169,22 +169,32 @@ func Test_service(t *testing.T) { }) t.Run("GetStatus", func(t *testing.T) { - t.Run("returns true when running", func(t *testing.T) { + t.Run("returns running when running", func(t *testing.T) { + tmpDir, err := os.MkdirTemp("", "nginx-status-test") + assert.NoError(t, err) + defer os.RemoveAll(tmpDir) + nginxService := &service{ semaphore: &semaphore{ state: runningState, }, + processManager: &processManager{ + configPath: tmpDir, + }, } - assert.True(t, nginxService.GetStatus(t.Context())) + status := nginxService.GetStatus(t.Context()) + assert.True(t, status.Running) }) - t.Run("returns false when stopped", func(t *testing.T) { + t.Run("returns not running when stopped", func(t *testing.T) { nginxService := &service{ semaphore: &semaphore{ state: stoppedState, }, } - assert.False(t, nginxService.GetStatus(t.Context())) + status := nginxService.GetStatus(t.Context()) + assert.False(t, status.Running) + assert.Nil(t, status.UptimeSeconds) }) }) } diff --git a/frontend/src/domain/home/components/HomeHeaderCard.tsx b/frontend/src/domain/home/components/HomeHeaderCard.tsx index d509a0dd2..c421e7c69 100644 --- a/frontend/src/domain/home/components/HomeHeaderCard.tsx +++ b/frontend/src/domain/home/components/HomeHeaderCard.tsx @@ -75,7 +75,7 @@ export default class HomeHeaderCard extends React.PureComponent void) { const { current, latest } = AppContext.get().configuration.version - const updateAvailable = current !== undefined && latest !== undefined && current !== latest + const updateAvailable = Boolean(current) && Boolean(latest) && current !== latest return ( diff --git a/frontend/src/domain/nginx/model/NginxStatusResponse.ts b/frontend/src/domain/nginx/model/NginxStatusResponse.ts index 2cc405c64..8b685722c 100644 --- a/frontend/src/domain/nginx/model/NginxStatusResponse.ts +++ b/frontend/src/domain/nginx/model/NginxStatusResponse.ts @@ -1,3 +1,4 @@ export interface NginxStatusResponse { running: boolean + uptimeSeconds?: number } diff --git a/go.work.sum b/go.work.sum index b475b2f12..18e5e6e3a 100644 --- a/go.work.sum +++ b/go.work.sum @@ -547,6 +547,7 @@ github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMo github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8= github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= +github.com/OpenPeeDeeP/depguard/v2 v2.2.1/go.mod h1:q4DKzC4UcVaAvcfd41CZh0PWpGgzrVxUYBlgKNGquUo= github.com/ProtonMail/go-crypto v1.1.6 h1:ZcV+Ropw6Qn0AX9brlQLAUXfqLBc7Bl+f/DmNxpLfdw= github.com/ProtonMail/go-crypto v1.1.6/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= @@ -645,6 +646,7 @@ github.com/aws/aws-sdk-go-v2/service/lightsail v1.53.2/go.mod h1:Etcg8xorq1b0g0V github.com/aws/aws-sdk-go-v2/service/s3 v1.99.0/go.mod h1:uoA43SdFwacedBfSgfFSjjCvYe8aYBS7EnU5GZ/YKMM= github.com/aws/aws-sdk-go-v2/service/ssm v1.44.7/go.mod h1:Q7XIWsMo0JcMpI/6TGD6XXcXcV1DbTj6e9BKNntIMIM= github.com/axiomhq/hyperloglog v0.0.0-20240319100328-84253e514e02/go.mod h1:k08r+Yj1PRAmuayFiRK6MYuR5Ve4IuZtTfxErMIh0+c= +github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/aymanbagabas/go-udiff v0.2.0 h1:TK0fH4MteXUDspT88n8CKzvK0X9O2xu9yQjWpi6yML8= github.com/aymanbagabas/go-udiff v0.2.0/go.mod h1:RE4Ex0qsGkTAJoQdQQCA0uG+nAzJO/pI/QwceO5fgrA= github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= @@ -661,6 +663,8 @@ github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQ github.com/bitly/go-simplejson v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y= github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bits-and-blooms/bitset v1.22.0 h1:Tquv9S8+SGaS3EhyA+up3FXzmkhxPGjQQCkcs2uw7w4= +github.com/bits-and-blooms/bitset v1.22.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/bits-and-blooms/bitset v1.24.4 h1:95H15Og1clikBrKr/DuzMXkQzECs1M6hhoGXLwLQOZE= github.com/bits-and-blooms/bitset v1.24.4/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c h1:+0HFd5KSZ/mm3JmhmrDukiId5iR6w4+BdFtfSy4yWIc= @@ -671,6 +675,7 @@ github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdn github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= +github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/boltdb/bolt v1.3.1 h1:JQmyP4ZBrce+ZQu0dY660FMfatumYDLun9hBCUVIkF4= @@ -729,8 +734,13 @@ github.com/charmbracelet/bubbles v0.21.0 h1:9TdC97SdRVg/1aaXNVWfFH3nnLAwOXr8Fn6u github.com/charmbracelet/bubbles v0.21.0/go.mod h1:HF+v6QUR4HkEpz62dx7ym2xc71/KBHg+zKwJtMw+qtg= github.com/charmbracelet/bubbletea v1.3.10 h1:otUDHWMMzQSB0Pkc87rm691KZ3SWa4KUlvF9nRvCICw= github.com/charmbracelet/bubbletea v1.3.10/go.mod h1:ORQfo0fk8U+po9VaNvnV95UPWA1BitP1E0N6xJPlHr4= +github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc/go.mod h1:X4/0JoqgTIPSFcRA/P6INZzIuyqdFY5rm8tb41s9okk= +github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30= +github.com/charmbracelet/x/ansi v0.10.1/go.mod h1:3RQDQ6lDnROptfpWuUVIUG64bD2g2BgntdxH0Ya5TeE= +github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs= github.com/charmbracelet/x/exp/golden v0.0.0-20240806155701-69247e0abc2a h1:G99klV19u0QnhiizODirwVksQB91TJKV/UaTnACcG30= github.com/charmbracelet/x/exp/golden v0.0.0-20240806155701-69247e0abc2a/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U= +github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg= github.com/chavacava/garif v0.1.0 h1:2JHa3hbYf5D9dsgseMKAmc/MZ109otzgNFk5s87H9Pc= github.com/chavacava/garif v0.1.0/go.mod h1:XMyYCkEL58DF0oyW4qDjjnPWONs2HBqYKI+UIPD+Gww= github.com/checkpoint-restore/go-criu/v4 v4.1.0 h1:WW2B2uxx9KWF6bGlHqhm8Okiafwwx7Y2kcpn8lCpjgo= @@ -757,6 +767,7 @@ github.com/cilium/ebpf v0.12.3/go.mod h1:TctK1ivibvI3znr66ljgi4hqOT8EYQjz1KWBfb1 github.com/cilium/ebpf v0.16.0/go.mod h1:L7u2Blt2jMM/vLAVgjxluxtBKlz3/GWjB0dMOEngfwE= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible h1:C29Ae4G5GtYyYMm1aztcyj/J5ckgJm2zwdDajFbx1NY= github.com/circonus-labs/circonusllhist v0.1.3 h1:TJH+oke8D16535+jHExHj4nQvzlZrj7ug5D7I/orNUA= +github.com/ckaznocha/intrange v0.3.1/go.mod h1:QVepyz1AkUoFQkpEqksSYpNpUo3c5W7nWh/s6SHIJJk= github.com/clbanning/mxj v1.8.4 h1:HuhwZtbyvyOw+3Z1AowPkU87JkJUSv751ELWaiTpj8I= github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= github.com/clipperhouse/stringish v0.1.1 h1:+NSqMOr3GR6k1FdRhhnXrLfztGzuG+VuFDfatpWHKCs= @@ -1605,6 +1616,7 @@ github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8Hm github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/josharian/native v1.1.0 h1:uuaP0hAbW7Y4l0ZRQ6C9zfb7Mg1mbFKry/xzDAfmtLA= github.com/josharian/native v1.1.0/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w= +github.com/josharian/txtarfs v0.0.0-20210218200122-0702f000015a/go.mod h1:izVPOvVRsHiKkeGCT6tYBNWyDVuzj9wAaBb5R9qamfw= github.com/joshdk/go-junit v1.0.0 h1:S86cUKIdwBHWwA6xCmFlf3RTLfVXYQfvanM5Uh+K6GE= github.com/joshdk/go-junit v1.0.0/go.mod h1:TiiV0PqkaNfFXjEiyjWM3XXrhVyCa1K4Zfga6W52ung= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= @@ -1683,6 +1695,7 @@ github.com/linode/linodego v1.69.0/go.mod h1:QPzvRKCy9oz1lRaIACPRORoAI9AAfKKg2AR github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3 h1:jUp75lepDg0phMUJBCmvaeFDldD2N3S1lBuPwUTszio= github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= github.com/liquidweb/go-lwApi v0.0.5 h1:CT4cdXzJXmo0bon298kS7NeSk+Gt8/UHpWBBol1NGCA= +github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lufeee/execinquery v1.2.1 h1:hf0Ems4SHcUGBxpGN7Jz78z1ppVkP/837ZlETPCEtOM= github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= @@ -1716,6 +1729,7 @@ github.com/marstr/guid v1.1.0 h1:/M4H/1G4avsieL6BbUwCOBzulmoeKVP5ux/3mQNnbyI= github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= github.com/maruel/natural v1.1.1 h1:Hja7XhhmvEFhcByqDoHz9QZbkWey+COd9xWfCfn1ioo= github.com/maruel/natural v1.1.1/go.mod h1:v+Rfd79xlw1AgVBjbO0BEQmptqb5HvL/k9GRHB7ZKEg= +github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= github.com/mattbaird/jsonpatch v0.0.0-20171005235357-81af80346b1a h1:+J2gw7Bw77w/fbK7wnNJJDKmw1IbWft2Ul5BzrG1Qm8= github.com/mattbaird/jsonpatch v0.0.0-20171005235357-81af80346b1a/go.mod h1:M1qoD/MqPgTZIk0EWKB38wE28ACRfVcn+cU08jyArI0= github.com/mattermost/xml-roundtrip-validator v0.1.0/go.mod h1:qccnGMcpgwcNaBnxqpJpWWUiPNr5H3O8eDgGV9gT5To= @@ -1726,6 +1740,7 @@ github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk= @@ -1843,6 +1858,7 @@ github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo= github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= +github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mutecomm/go-sqlcipher/v4 v4.4.0 h1:sV1tWCWGAVlPhNGT95Q+z/txFxuhAYWwHD1afF5bMZg= github.com/mutecomm/go-sqlcipher/v4 v4.4.0/go.mod h1:PyN04SaWalavxRGH9E8ZftG6Ju7rsPrGmQRjrEaVpiY= @@ -2047,6 +2063,8 @@ github.com/rainycape/memcache v0.0.0-20150622160815-1031fa0ce2f2/go.mod h1:7tZKc github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/redis/go-redis/v9 v9.7.3/go.mod h1:bGUrSggJ9X9GUmZpZNEOQKaANxSGgOEBRltRTZHSvrA= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/robert-nix/ansihtml v1.0.1 h1:VTiyQ6/+AxSJoSSLsMecnkh8i0ZqOEdiRl/odOc64fc= github.com/robert-nix/ansihtml v1.0.1/go.mod h1:CJwclxYaTPc2RfcxtanEACsYuTksh4yDXcNeHHKZINE= github.com/rogpeppe/fastuuid v1.2.0 h1:Ppwyp6VYCF1nvBTXL3trRso7mXMlRrw9ooo375wvi2s= @@ -2159,6 +2177,7 @@ github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c h1:km8GpoQut05eY3GiY github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c/go.mod h1:cNQ3dwVJtS5Hmnjxy6AgTPd0Inb3pW05ftPSX7NZO7Q= github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef h1:Ch6Q+AZUxDBCVqdkI8FSpFyZDtCVBc2VmejdNrm5rRQ= github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef/go.mod h1:nXTWP6+gD5+LUJ8krVhhoeHjvHTutPxMYl5SvkcnJNE= +github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= github.com/stacklok/frizbee v0.1.7 h1:IgrZy8dqKy+vBxNWrZTbDoctnV0doQKrFC6bNbWP5ho= github.com/stacklok/frizbee v0.1.7/go.mod h1:eqMjHEgRYDSlpYpir3wXO6jyGpxr1dnFTvrTdrTIF7E= github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= @@ -2315,6 +2334,7 @@ github.com/xiang90/probing v0.0.0-20221125231312-a49e3df8f510 h1:S2dVYn90KE98chq github.com/xiang90/probing v0.0.0-20221125231312-a49e3df8f510/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ= github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 h1:ESFSdwYZvkeru3RtdrYueztKhOBCSAAzS4Gf+k0tEow= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4= @@ -2627,6 +2647,7 @@ golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2693,6 +2714,7 @@ golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDq golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8= golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= diff --git a/tools/go.mod b/tools/go.mod index bbf867b14..c085e6133 100644 --- a/tools/go.mod +++ b/tools/go.mod @@ -63,14 +63,12 @@ require ( github.com/ccojocar/zxcvbn-go v1.0.4 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/charithe/durationcheck v0.0.11 // indirect - github.com/charmbracelet/colorprofile v0.4.2 // indirect + github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect github.com/charmbracelet/lipgloss v1.1.0 // indirect - github.com/charmbracelet/x/ansi v0.11.6 // indirect - github.com/charmbracelet/x/cellbuf v0.0.15 // indirect - github.com/charmbracelet/x/term v0.2.2 // indirect + github.com/charmbracelet/x/ansi v0.10.1 // indirect + github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect + github.com/charmbracelet/x/term v0.2.1 // indirect github.com/ckaznocha/intrange v0.3.1 // indirect - github.com/clipperhouse/displaywidth v0.11.0 // indirect - github.com/clipperhouse/uax29/v2 v2.7.0 // indirect github.com/curioswitch/go-reassign v0.3.0 // indirect github.com/daixiang0/gci v0.14.0 // indirect github.com/dave/dst v0.27.3 // indirect @@ -137,7 +135,7 @@ require ( github.com/ldez/tagliatelle v0.7.2 // indirect github.com/ldez/usetesting v0.5.0 // indirect github.com/leonklingele/grouper v1.1.2 // indirect - github.com/lucasb-eyer/go-colorful v1.3.0 // indirect + github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/macabu/inamedparam v0.2.0 // indirect github.com/manuelarte/embeddedstructfieldcheck v0.4.0 // indirect github.com/manuelarte/funcorder v0.5.0 // indirect @@ -146,7 +144,7 @@ require ( github.com/matoous/godox v1.1.0 // indirect github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.22 // indirect - github.com/mattn/go-runewidth v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect github.com/mgechev/revive v1.14.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/moricho/tparallel v0.3.2 // indirect diff --git a/tools/go.sum b/tools/go.sum index 4b00a6b7d..9cb932008 100644 --- a/tools/go.sum +++ b/tools/go.sum @@ -33,7 +33,6 @@ github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lpr github.com/MirrexOne/unqueryvet v1.5.4 h1:38QOxShO7JmMWT+eCdDMbcUgGCOeJphVkzzRgyLJgsQ= github.com/MirrexOne/unqueryvet v1.5.4/go.mod h1:fs9Zq6eh1LRIhsDIsxf9PONVUjYdFHdtkHIgZdJnyPU= github.com/OpenPeeDeeP/depguard/v2 v2.2.1 h1:vckeWVESWp6Qog7UZSARNqfu/cZqvki8zsuj3piCMx4= -github.com/OpenPeeDeeP/depguard/v2 v2.2.1/go.mod h1:q4DKzC4UcVaAvcfd41CZh0PWpGgzrVxUYBlgKNGquUo= github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0= github.com/alecthomas/chroma/v2 v2.23.1 h1:nv2AVZdTyClGbVQkIzlDm/rnhk1E9bU9nXwmZ/Vk/iY= github.com/alecthomas/chroma/v2 v2.23.1/go.mod h1:NqVhfBR0lte5Ouh3DcthuUCTUpDC9cxBOfyMbMQPs3o= @@ -59,13 +58,11 @@ github.com/ashanbrown/forbidigo/v2 v2.3.0/go.mod h1:5p6VmsG5/1xx3E785W9fouMxIOkv github.com/ashanbrown/makezero/v2 v2.1.0 h1:snuKYMbqosNokUKm+R6/+vOPs8yVAi46La7Ck6QYSaE= github.com/ashanbrown/makezero/v2 v2.1.0/go.mod h1:aEGT/9q3S8DHeE57C88z2a6xydvgx8J5hgXIGWgo0MY= github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= -github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bkielbasa/cyclop v1.2.3 h1:faIVMIGDIANuGPWH031CZJTi2ymOQBULs9H21HSMa5w= github.com/bkielbasa/cyclop v1.2.3/go.mod h1:kHTwA9Q0uZqOADdupvcFJQtp/ksSnytRMe8ztxG8Fuo= github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ089M= -github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k= github.com/bombsimon/wsl/v4 v4.7.0 h1:1Ilm9JBPRczjyUs6hvOPKvd7VL1Q++PL8M0SXBDf+jQ= github.com/bombsimon/wsl/v4 v4.7.0/go.mod h1:uV/+6BkffuzSAVYD+yGyld1AChO7/EuLrCF/8xTiapg= github.com/bombsimon/wsl/v5 v5.6.0 h1:4z+/sBqC5vUmSp1O0mS+czxwH9+LKXtCWtHH9rZGQL8= @@ -86,22 +83,12 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/charithe/durationcheck v0.0.11 h1:g1/EX1eIiKS57NTWsYtHDZ/APfeXKhye1DidBcABctk= github.com/charithe/durationcheck v0.0.11/go.mod h1:x5iZaixRNl8ctbM+3B2RrPG5t856TxRyVQEnbIEM2X4= -github.com/charmbracelet/colorprofile v0.4.2 h1:BdSNuMjRbotnxHSfxy+PCSa4xAmz7szw70ktAtWRYrY= -github.com/charmbracelet/colorprofile v0.4.2/go.mod h1:0rTi81QpwDElInthtrQ6Ni7cG0sDtwAd4C4le060fT8= +github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc h1:4pZI35227imm7yK2bGPcfpFEmuY1gc2YSTShr4iJBfs= github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY= -github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30= -github.com/charmbracelet/x/ansi v0.11.6 h1:GhV21SiDz/45W9AnV2R61xZMRri5NlLnl6CVF7ihZW8= -github.com/charmbracelet/x/ansi v0.11.6/go.mod h1:2JNYLgQUsyqaiLovhU2Rv/pb8r6ydXKS3NIttu3VGZQ= -github.com/charmbracelet/x/cellbuf v0.0.15 h1:ur3pZy0o6z/R7EylET877CBxaiE1Sp1GMxoFPAIztPI= -github.com/charmbracelet/x/cellbuf v0.0.15/go.mod h1:J1YVbR7MUuEGIFPCaaZ96KDl5NoS0DAWkskup+mOY+Q= -github.com/charmbracelet/x/term v0.2.2 h1:xVRT/S2ZcKdhhOuSP4t5cLi5o+JxklsoEObBSgfgZRk= -github.com/charmbracelet/x/term v0.2.2/go.mod h1:kF8CY5RddLWrsgVwpw4kAa6TESp6EB5y3uxGLeCqzAI= +github.com/charmbracelet/x/ansi v0.10.1 h1:rL3Koar5XvX0pHGfovN03f5cxLbCF2YvLeyz7D2jVDQ= +github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd h1:vy0GVL4jeHEwG5YOXDmi86oYw2yuYUGqz6a8sLwg0X8= +github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ= github.com/ckaznocha/intrange v0.3.1 h1:j1onQyXvHUsPWujDH6WIjhyH26gkRt/txNlV7LspvJs= -github.com/ckaznocha/intrange v0.3.1/go.mod h1:QVepyz1AkUoFQkpEqksSYpNpUo3c5W7nWh/s6SHIJJk= -github.com/clipperhouse/displaywidth v0.11.0 h1:lBc6kY44VFw+TDx4I8opi/EtL9m20WSEFgwIwO+UVM8= -github.com/clipperhouse/displaywidth v0.11.0/go.mod h1:bkrFNkf81G8HyVqmKGxsPufD3JhNl3dSqnGhOoSD/o0= -github.com/clipperhouse/uax29/v2 v2.7.0 h1:+gs4oBZ2gPfVrKPthwbMzWZDaAFPGYK72F0NJv2v7Vk= -github.com/clipperhouse/uax29/v2 v2.7.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/curioswitch/go-reassign v0.3.0 h1:dh3kpQHuADL3cobV/sSGETA8DOv457dwl+fbBAhrQPs= github.com/curioswitch/go-reassign v0.3.0/go.mod h1:nApPCCTtqLJN/s8HfItCcKV0jIPwluBOvZP+dsJGA88= @@ -259,8 +246,7 @@ github.com/ldez/usetesting v0.5.0 h1:3/QtzZObBKLy1F4F8jLuKJiKBjjVFi1IavpoWbmqLwc github.com/ldez/usetesting v0.5.0/go.mod h1:Spnb4Qppf8JTuRgblLrEWb7IE6rDmUpGvxY3iRrzvDQ= github.com/leonklingele/grouper v1.1.2 h1:o1ARBDLOmmasUaNDesWqWCIFH3u7hoFlM84YrjT3mIY= github.com/leonklingele/grouper v1.1.2/go.mod h1:6D0M/HVkhs2yRKRFZUoGjeDy7EZTfFBE9gl4kjmIGkA= -github.com/lucasb-eyer/go-colorful v1.3.0 h1:2/yBRLdWBZKrf7gB40FoiKfAWYQ0lqNcbuQwVHXptag= -github.com/lucasb-eyer/go-colorful v1.3.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/macabu/inamedparam v0.2.0 h1:VyPYpOc10nkhI2qeNUdh3Zket4fcZjEWe35poddBCpE= github.com/macabu/inamedparam v0.2.0/go.mod h1:+Pee9/YfGe5LJ62pYXqB89lJ+0k5bsR8Wgz/C0Zlq3U= github.com/manuelarte/embeddedstructfieldcheck v0.4.0 h1:3mAIyaGRtjK6EO9E73JlXLtiy7ha80b2ZVGyacxgfww= @@ -274,13 +260,11 @@ github.com/maratori/testpackage v1.1.2/go.mod h1:8F24GdVDFW5Ew43Et02jamrVMNXLUNa github.com/matoous/godox v1.1.0 h1:W5mqwbyWrwZv6OQ5Z1a/DHGMOvXYCBP3+Ht7KMoJhq4= github.com/matoous/godox v1.1.0/go.mod h1:jgE/3fUXiTurkdHOLT5WEkThTSuE7yxHv5iWPa80afs= github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= -github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.22 h1:j8l17JJ9i6VGPUFUYoTUKPSgKe/83EYU2zBC7YNKMw4= github.com/mattn/go-isatty v0.0.22/go.mod h1:ZXfXG4SQHsB/w3ZeOYbR0PrPwLy+n6xiMrJlRFqopa4= -github.com/mattn/go-runewidth v0.0.20 h1:WcT52H91ZUAwy8+HUkdM3THM6gXqXuLJi9O3rjcQQaQ= -github.com/mattn/go-runewidth v0.0.20/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mgechev/revive v1.14.0 h1:CC2Ulb3kV7JFYt+izwORoS3VT/+Plb8BvslI/l1yZsc= github.com/mgechev/revive v1.14.0/go.mod h1:MvnujelCZBZCaoDv5B3foPo6WWgULSSFxvfxp7GsPfo= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= @@ -288,7 +272,6 @@ github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrk github.com/moricho/tparallel v0.3.2 h1:odr8aZVFA3NZrNybggMkYO3rgPRcqjeQUlBBFVxKHTI= github.com/moricho/tparallel v0.3.2/go.mod h1:OQ+K3b4Ln3l2TZveGCywybl68glfLEwFGqvnjok8b+U= github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc= -github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/nakabonne/nestif v0.3.1 h1:wm28nZjhQY5HyYPx+weN3Q65k6ilSBxDb8v5S81B81U= @@ -333,7 +316,6 @@ github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8 github.com/raeperd/recvcheck v0.2.0 h1:GnU+NsbiCqdC2XX5+vMZzP+jAJC5fht7rcVTAhX74UI= github.com/raeperd/recvcheck v0.2.0/go.mod h1:n04eYkwIR0JbgD73wT8wL4JjPC3wm0nFtzBnWNocnYU= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= -github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -378,7 +360,6 @@ github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3A github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU= github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY= github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= -github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= github.com/stbenjam/no-sprintf-host-port v0.3.1 h1:AyX7+dxI4IdLBPtDbsGAyqiTSLpCP9hWRrXQDU4Cm/g= github.com/stbenjam/no-sprintf-host-port v0.3.1/go.mod h1:ODbZesTCHMVKthBHskvUUexdcNHAQRXk9NpSsL8p/HQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -424,7 +405,6 @@ github.com/xen0n/gosmopolitan v1.3.0/go.mod h1:rckfr5T6o4lBtM1ga7mLGKZmLxswUoH1z github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc= github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= -github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= github.com/yagipy/maintidx v1.0.0 h1:h5NvIsCz+nRDapQ0exNv4aJ0yXSI0420omVANTv3GJM= github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= github.com/yeya24/promlinter v0.3.0 h1:JVDbMp08lVCP7Y6NP3qHroGAO6z2yGKQtS5JsjqtoFs= @@ -432,7 +412,6 @@ github.com/yeya24/promlinter v0.3.0/go.mod h1:cDfJQQYv9uYciW60QT0eeHlFodotkYZlL+ github.com/ykadowak/zerologlint v0.1.5 h1:Gy/fMz1dFQN9JZTPjv1hxEk+sRWm05row04Yoolgdiw= github.com/ykadowak/zerologlint v0.1.5/go.mod h1:KaUskqF3e/v59oPmdq1U1DnKcuHokl2/K1U4pmIELKg= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= @@ -470,7 +449,6 @@ golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl golang.org/x/exp/typeparams v0.0.0-20260218203240-3dfff04db8fa h1:6Wi43P0isP8Nl8D4qJmA3VC4FswVH0RJkr5cauo67SQ= golang.org/x/exp/typeparams v0.0.0-20260218203240-3dfff04db8fa/go.mod h1:PqrXSW65cXDZH0k4IeUbhmg/bcAZDbzNz3byBpKCsXo= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= @@ -481,7 +459,6 @@ golang.org/x/mod v0.36.0/go.mod h1:moc6ELqsWcOw5Ef3xVprK5ul/MvtVvkIXLziUOICjUQ= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= @@ -491,7 +468,6 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -500,7 +476,6 @@ golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -509,7 +484,6 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -530,7 +504,6 @@ golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= From 0a43653caeddaba338c32dd36b58503733021703 Mon Sep 17 00:00:00 2001 From: Lucas Dillmann Date: Sun, 31 May 2026 15:33:25 -0300 Subject: [PATCH 09/13] New home dashboard --- .../home/components/NginxStatusCard.tsx | 45 +++++++++++++++++-- frontend/src/domain/nginx/NginxService.ts | 10 +++-- .../tabs/NginxIgnitionSettingsTab.tsx | 4 +- i18n/messages_bn.properties | 10 +++-- i18n/messages_de.properties | 8 +++- i18n/messages_en.properties | 8 +++- i18n/messages_es.properties | 8 +++- i18n/messages_fr.properties | 8 +++- i18n/messages_hi.properties | 10 +++-- i18n/messages_ja.properties | 10 +++-- i18n/messages_pt.properties | 8 +++- i18n/messages_ru.properties | 8 +++- i18n/messages_vi.properties | 10 +++-- i18n/messages_zh.properties | 10 +++-- 14 files changed, 120 insertions(+), 37 deletions(-) diff --git a/frontend/src/domain/home/components/NginxStatusCard.tsx b/frontend/src/domain/home/components/NginxStatusCard.tsx index 622023650..1f880e662 100644 --- a/frontend/src/domain/home/components/NginxStatusCard.tsx +++ b/frontend/src/domain/home/components/NginxStatusCard.tsx @@ -9,11 +9,13 @@ import GenericNginxAction, { ActionType } from "../../nginx/actions/GenericNginx import { isAccessGranted } from "../../../core/components/accesscontrol/IsAccessGranted" import { UserAccessLevel } from "../../user/model/UserAccessLevel" import MessageKey from "../../../core/i18n/model/MessageKey.generated" -import { I18n, I18nMessage } from "../../../core/i18n/I18n" +import { I18n, I18nMessage, i18n } from "../../../core/i18n/I18n" +import If from "../../../core/components/flowcontrol/If" interface NginxStatusCardState { loading: boolean running?: boolean + uptimeSeconds?: number } export default class NginxStatusCard extends React.Component { @@ -45,9 +47,32 @@ export default class NginxStatusCard extends React.Component undefined) - .then(running => this.setState({ running, loading: false })) + .then(status => + this.setState({ + running: status?.running, + uptimeSeconds: status?.uptimeSeconds, + loading: false, + }), + ) + } + + private formatCountUnit(count: number, singularKey: I18nMessage, pluralKey: I18nMessage): string { + const unit = i18n(count === 1 ? singularKey : pluralKey) + return `${count} ${unit}` + } + + private uptimeLabelParams(totalSeconds: number): { days: string; hours: string; seconds: string } { + const dayCount = Math.floor(totalSeconds / 86400) + const hourCount = Math.floor((totalSeconds % 86400) / 3600) + const secondCount = Math.floor((totalSeconds % 3600) / 60) * 60 + (totalSeconds % 60) + + return { + days: this.formatCountUnit(dayCount, MessageKey.CommonTimeUnitDay, MessageKey.CommonTimeUnitDays), + hours: this.formatCountUnit(hourCount, MessageKey.CommonTimeUnitHour, MessageKey.CommonTimeUnitHours), + seconds: this.formatCountUnit(secondCount, MessageKey.CommonTimeUnitSecond, MessageKey.CommonUnitSeconds), + } } private statusMetadata(): { color: string; label: I18nMessage } { @@ -89,12 +114,24 @@ export default class NginxStatusCard extends React.Component - + + + + + + ) } diff --git a/frontend/src/domain/nginx/NginxService.ts b/frontend/src/domain/nginx/NginxService.ts index 5d80932f4..433e7e4ca 100644 --- a/frontend/src/domain/nginx/NginxService.ts +++ b/frontend/src/domain/nginx/NginxService.ts @@ -4,6 +4,7 @@ import NginxEventDispatcher from "./listener/NginxEventDispatcher" import { NginxOperation } from "./listener/NginxEventListener" import NginxMetadata from "./model/NginxMetadata" import LogLine from "../logs/model/LogLine" +import { NginxStatusResponse } from "./model/NginxStatusResponse" export default class NginxService { private readonly gateway: NginxGateway @@ -13,10 +14,11 @@ export default class NginxService { } async isRunning(): Promise { - return this.gateway - .getStatus() - .then(requireSuccessPayload) - .then(response => response.running) + return this.getStatus().then(response => response.running) + } + + async getStatus(): Promise { + return this.gateway.getStatus().then(requireSuccessPayload) } async getMetadata(): Promise { diff --git a/frontend/src/domain/settings/tabs/NginxIgnitionSettingsTab.tsx b/frontend/src/domain/settings/tabs/NginxIgnitionSettingsTab.tsx index 0f71c4659..3b3216b04 100644 --- a/frontend/src/domain/settings/tabs/NginxIgnitionSettingsTab.tsx +++ b/frontend/src/domain/settings/tabs/NginxIgnitionSettingsTab.tsx @@ -7,8 +7,8 @@ import { I18n } from "../../../core/i18n/I18n" import MessageKey from "../../../core/i18n/model/MessageKey.generated" const IGNITION_TIME_UNIT_OPTIONS_DATA = [ - { value: TimeUnit.DAYS, messageKey: MessageKey.FrontendSettingsTabsIgnitionTimeUnitDays }, - { value: TimeUnit.HOURS, messageKey: MessageKey.FrontendSettingsTabsIgnitionTimeUnitHours }, + { value: TimeUnit.DAYS, messageKey: MessageKey.CommonTimeUnitDays }, + { value: TimeUnit.HOURS, messageKey: MessageKey.CommonTimeUnitHours }, { value: TimeUnit.MINUTES, messageKey: MessageKey.FrontendSettingsTabsIgnitionTimeUnitMinutes }, ] diff --git a/i18n/messages_bn.properties b/i18n/messages_bn.properties index b15d7d91c..2aba19f58 100644 --- a/i18n/messages_bn.properties +++ b/i18n/messages_bn.properties @@ -809,6 +809,11 @@ common/stream=স্ট্রিম common/streams=স্ট্রিমসমূহ common/success-message=অপারেশনটি সফলভাবে সম্পন্ন হয়েছে common/that-didnt-work=কাজটি সম্পন্ন হয়নি +common/time-unit-day=দিন +common/time-unit-days=দিনের +common/time-unit-hour=ঘণ্টা +common/time-unit-hours=ঘণ্টার +common/time-unit-second=সেকেন্ড common/traffic-stats=পরিসংখ্যান common/try-again-later=আমরা বর্তমানে ডেটা ফেচ করতে অক্ষম। অনুগ্রহ করে পরে আবার চেষ্টা করুন। common/two-factor-authentication=দ্বি-ফ্যাক্টর প্রমাণীকরণ @@ -828,7 +833,7 @@ common/unexpected-error-try-again=একটি অপ্রত্যাশিত common/unit-kb-each=প্রতিটি KB common/unit-kb=KB common/unit-mb=MB -common/unit-seconds=সেকেন্ড +common/unit-seconds=সেকেন্ডের common/user=ইউজার common/username=ইউজারনেম common/users=ইউজাররা @@ -1129,6 +1134,7 @@ frontend/home/expires-today=আজ মেয়াদ শেষ frontend/home/greeting-subtitle=nginx ignition-এ স্বাগতম। নিচে আপনার ইনস্ট্যান্সের একটি সংক্ষিপ্ত বিবরণ পাওয়া যাবে। frontend/home/greeting-title=হ্যালো, ${userName} frontend/home/nginx-offline=Offline +frontend/home/nginx-online-uptime=${days}, ${hours} এবং ${seconds} ধরে অনলাইন frontend/home/nginx-online=Online frontend/home/nginx-reload=কনফিগারেশন পুনরায় লোড করুন frontend/home/nginx-section-title=nginx স্থিতি @@ -1353,8 +1359,6 @@ frontend/settings/tabs/ignition/log-rotation=লগ রোটেশন frontend/settings/tabs/ignition/section-scheduled-tasks-help=nginx ignition-এর হাউসকিপিং টাস্কের সংজ্ঞা frontend/settings/tabs/ignition/section-scheduled-tasks=নির্ধারিত টাস্ক frontend/settings/tabs/ignition/ssl-auto-renew=SSL সার্টিফিকেট অটো রিনিউ -frontend/settings/tabs/ignition/time-unit-days=দিন -frontend/settings/tabs/ignition/time-unit-hours=ঘণ্টা frontend/settings/tabs/ignition/time-unit-minutes=মিনিট frontend/settings/tabs/nginx/access-logs-enabled=অ্যাক্সেস লগ সক্রিয় frontend/settings/tabs/nginx/client-body-timeout=ক্লায়েন্ট বডি টাইমআউট diff --git a/i18n/messages_de.properties b/i18n/messages_de.properties index 2ca55804d..791607a66 100644 --- a/i18n/messages_de.properties +++ b/i18n/messages_de.properties @@ -809,6 +809,11 @@ common/stream=Stream common/streams=Streams common/success-message=Der Vorgang wurde erfolgreich abgeschlossen common/that-didnt-work=Das hat nicht funktioniert +common/time-unit-day=Tag +common/time-unit-days=Tage +common/time-unit-hour=Stunde +common/time-unit-hours=Stunden +common/time-unit-second=Sekunde common/traffic-stats=Statistiken common/try-again-later=Wir können die Daten derzeit nicht abrufen. Bitte versuchen Sie es später erneut. common/two-factor-authentication=Zwei-Faktor-Authentifizierung @@ -1129,6 +1134,7 @@ frontend/home/expires-today=Läuft heute ab frontend/home/greeting-subtitle=Willkommen bei nginx ignition. Unten finden Sie eine Übersicht Ihrer Instanz. frontend/home/greeting-title=Hallo, ${userName} frontend/home/nginx-offline=Offline +frontend/home/nginx-online-uptime=Online seit ${days}, ${hours} und ${seconds} frontend/home/nginx-online=Online frontend/home/nginx-reload=Konfiguration neu laden frontend/home/nginx-section-title=nginx Status @@ -1353,8 +1359,6 @@ frontend/settings/tabs/ignition/log-rotation=Log-Rotation frontend/settings/tabs/ignition/section-scheduled-tasks-help=Definition der Wartungsaufgaben von nginx ignition frontend/settings/tabs/ignition/section-scheduled-tasks=Geplante Aufgaben frontend/settings/tabs/ignition/ssl-auto-renew=SSL-Zertifikate automatisch erneuern -frontend/settings/tabs/ignition/time-unit-days=Tage -frontend/settings/tabs/ignition/time-unit-hours=Stunden frontend/settings/tabs/ignition/time-unit-minutes=Minuten frontend/settings/tabs/nginx/access-logs-enabled=Zugriffslogs aktiviert frontend/settings/tabs/nginx/client-body-timeout=Client Body Timeout diff --git a/i18n/messages_en.properties b/i18n/messages_en.properties index 2d5a35c9b..6e1c72578 100644 --- a/i18n/messages_en.properties +++ b/i18n/messages_en.properties @@ -809,6 +809,11 @@ common/stream=Stream common/streams=Streams common/success-message=The operation was completed successfully common/that-didnt-work=That didn't work +common/time-unit-day=day +common/time-unit-days=days +common/time-unit-hour=hour +common/time-unit-hours=hours +common/time-unit-second=second common/traffic-stats=Stats common/try-again-later=We're unable to fetch the data at this time. Please try again later. common/two-factor-authentication=Two-factor authentication @@ -1129,6 +1134,7 @@ frontend/home/expires-today=Expires today frontend/home/greeting-subtitle=Welcome to nginx ignition. An overview of your instance is available below. frontend/home/greeting-title=Hello, ${userName} frontend/home/nginx-offline=Offline +frontend/home/nginx-online-uptime=Online for ${days}, ${hours} and ${seconds} frontend/home/nginx-online=Online frontend/home/nginx-reload=Reload config frontend/home/nginx-section-title=nginx status @@ -1353,8 +1359,6 @@ frontend/settings/tabs/ignition/log-rotation=Log rotation frontend/settings/tabs/ignition/section-scheduled-tasks-help=Definition of the nginx ignition's housekeeping tasks frontend/settings/tabs/ignition/section-scheduled-tasks=Scheduled tasks frontend/settings/tabs/ignition/ssl-auto-renew=SSL certificates auto renew -frontend/settings/tabs/ignition/time-unit-days=days -frontend/settings/tabs/ignition/time-unit-hours=hours frontend/settings/tabs/ignition/time-unit-minutes=minutes frontend/settings/tabs/nginx/access-logs-enabled=Access logs enabled frontend/settings/tabs/nginx/client-body-timeout=Client body timeout diff --git a/i18n/messages_es.properties b/i18n/messages_es.properties index 5380b85c2..2d5be3200 100644 --- a/i18n/messages_es.properties +++ b/i18n/messages_es.properties @@ -809,6 +809,11 @@ common/stream=Stream common/streams=Streams common/success-message=La operación se completó con éxito common/that-didnt-work=Eso no funcionó +common/time-unit-day=día +common/time-unit-days=días +common/time-unit-hour=hora +common/time-unit-hours=horas +common/time-unit-second=segundo common/traffic-stats=Estadísticas common/try-again-later=No podemos obtener los datos en este momento. Por favor, inténtelo de nuevo más tarde. common/two-factor-authentication=Autenticación de dos factores @@ -1129,6 +1134,7 @@ frontend/home/expires-today=Expira hoy frontend/home/greeting-subtitle=Bienvenido a nginx ignition. A continuación hay una vista general de su instancia. frontend/home/greeting-title=Hola, ${userName} frontend/home/nginx-offline=Desconectado +frontend/home/nginx-online-uptime=Conectado durante ${days}, ${hours} y ${seconds} frontend/home/nginx-online=Conectado frontend/home/nginx-reload=Recargar configuración frontend/home/nginx-section-title=nginx estado @@ -1353,8 +1359,6 @@ frontend/settings/tabs/ignition/log-rotation=Rotación de registros frontend/settings/tabs/ignition/section-scheduled-tasks-help=Definición de las tareas de mantenimiento de nginx ignition frontend/settings/tabs/ignition/section-scheduled-tasks=Tareas programadas frontend/settings/tabs/ignition/ssl-auto-renew=Renovación automática de certificados SSL -frontend/settings/tabs/ignition/time-unit-days=días -frontend/settings/tabs/ignition/time-unit-hours=horas frontend/settings/tabs/ignition/time-unit-minutes=minutos frontend/settings/tabs/nginx/access-logs-enabled=Registros de acceso habilitados frontend/settings/tabs/nginx/client-body-timeout=Tiempo de espera del cuerpo del cliente diff --git a/i18n/messages_fr.properties b/i18n/messages_fr.properties index a2ddf7154..289ada6f8 100644 --- a/i18n/messages_fr.properties +++ b/i18n/messages_fr.properties @@ -809,6 +809,11 @@ common/stream=Flux common/streams=Flux common/success-message=L'opération s'est terminée avec succès common/that-didnt-work=Cela n'a pas fonctionné +common/time-unit-day=jour +common/time-unit-days=jours +common/time-unit-hour=heure +common/time-unit-hours=heures +common/time-unit-second=seconde common/traffic-stats=Statistiques common/try-again-later=Nous ne pouvons pas récupérer les données pour le moment. Veuillez réessayer plus tard. common/two-factor-authentication=Authentification à deux facteurs @@ -1129,6 +1134,7 @@ frontend/home/expires-today=Expire aujourd'hui frontend/home/greeting-subtitle=Bienvenue sur nginx ignition. Un aperçu de votre instance est disponible ci-dessous. frontend/home/greeting-title=Bonjour, ${userName} frontend/home/nginx-offline=Hors ligne +frontend/home/nginx-online-uptime=En ligne depuis ${days}, ${hours} et ${seconds} frontend/home/nginx-online=En ligne frontend/home/nginx-reload=Recharger la configuration frontend/home/nginx-section-title=nginx statut @@ -1353,8 +1359,6 @@ frontend/settings/tabs/ignition/log-rotation=Rotation des logs frontend/settings/tabs/ignition/section-scheduled-tasks-help=Définition des tâches de maintenance de nginx ignition frontend/settings/tabs/ignition/section-scheduled-tasks=Tâches planifiées frontend/settings/tabs/ignition/ssl-auto-renew=Renouvellement auto certificats SSL -frontend/settings/tabs/ignition/time-unit-days=jours -frontend/settings/tabs/ignition/time-unit-hours=heures frontend/settings/tabs/ignition/time-unit-minutes=minutes frontend/settings/tabs/nginx/access-logs-enabled=Logs d'accès activés frontend/settings/tabs/nginx/client-body-timeout=Délai d'attente corps client diff --git a/i18n/messages_hi.properties b/i18n/messages_hi.properties index 62e3f005d..8e00247ec 100644 --- a/i18n/messages_hi.properties +++ b/i18n/messages_hi.properties @@ -809,6 +809,11 @@ common/stream=स्ट्रीम common/streams=स्ट्रीम्स common/success-message=ऑपरेशन सफलतापूर्वक पूरा हुआ common/that-didnt-work=कुछ गड़बड़ हो गई +common/time-unit-day=दिन +common/time-unit-days=दिनों +common/time-unit-hour=घंटा +common/time-unit-hours=घंटे +common/time-unit-second=सेकंड common/traffic-stats=आँकड़े common/try-again-later=हम इस समय डेटा प्राप्त करने में असमर्थ हैं। कृपया बाद में पुनः प्रयास करें। common/two-factor-authentication=दो-कारक प्रमाणीकरण @@ -828,7 +833,7 @@ common/unexpected-error-try-again=एक अप्रत्याशित त common/unit-kb-each=KB प्रत्येक common/unit-kb=KB common/unit-mb=MB -common/unit-seconds=सेकंड +common/unit-seconds=सेकंडों common/user=यूज़र common/username=यूज़रनेम common/users=यूज़र्स @@ -1129,6 +1134,7 @@ frontend/home/expires-today=आज समाप्त frontend/home/greeting-subtitle=nginx ignition में आपका स्वागत है। नीचे आपके इंस्टेंस का अवलोकन उपलब्ध है। frontend/home/greeting-title=नमस्ते, ${userName} frontend/home/nginx-offline=Offline +frontend/home/nginx-online-uptime=${days}, ${hours} और ${seconds} से ऑनलाइन frontend/home/nginx-online=Online frontend/home/nginx-reload=कॉन्फ़िगरेशन पुनः लोड करें frontend/home/nginx-section-title=nginx स्थिति @@ -1353,8 +1359,6 @@ frontend/settings/tabs/ignition/log-rotation=लॉग रोटेशन frontend/settings/tabs/ignition/section-scheduled-tasks-help=nginx ignition के हाउसकीपिंग कार्यों की परिभाषा frontend/settings/tabs/ignition/section-scheduled-tasks=अनुसूचित कार्य frontend/settings/tabs/ignition/ssl-auto-renew=SSL प्रमाणपत्र ऑटो रिन्यू -frontend/settings/tabs/ignition/time-unit-days=दिन -frontend/settings/tabs/ignition/time-unit-hours=घंटे frontend/settings/tabs/ignition/time-unit-minutes=मिनट frontend/settings/tabs/nginx/access-logs-enabled=एक्सेस लॉग सक्षम frontend/settings/tabs/nginx/client-body-timeout=क्लाइंट बॉडी टाइमआउट diff --git a/i18n/messages_ja.properties b/i18n/messages_ja.properties index ef0bb77d6..3223a2868 100644 --- a/i18n/messages_ja.properties +++ b/i18n/messages_ja.properties @@ -809,6 +809,11 @@ common/stream=ストリーム common/streams=ストリーム一覧 common/success-message=操作が正常に完了しました common/that-didnt-work=うまくいきませんでした +common/time-unit-day=日 +common/time-unit-days=日間 +common/time-unit-hour=時 +common/time-unit-hours=時間 +common/time-unit-second=秒 common/traffic-stats=統計 common/try-again-later=現在データを取得できません。後でもう一度お試しください。 common/two-factor-authentication=二要素認証 @@ -828,7 +833,7 @@ common/unexpected-error-try-again=予期しないエラーが発生しました common/unit-kb-each=KB (各) common/unit-kb=KB common/unit-mb=MB -common/unit-seconds=秒 +common/unit-seconds=秒間 common/user=ユーザー common/username=ユーザー名 common/users=ユーザー一覧 @@ -1129,6 +1134,7 @@ frontend/home/expires-today=本日期限切れ frontend/home/greeting-subtitle=nginx ignition へようこそ。インスタンスの概要を以下で確認できます。 frontend/home/greeting-title=こんにちは、${userName} さん frontend/home/nginx-offline=Offline +frontend/home/nginx-online-uptime=${days}、${hours}、${seconds}オンライン frontend/home/nginx-online=Online frontend/home/nginx-reload=設定を再読み込み frontend/home/nginx-section-title=nginx ステータス @@ -1353,8 +1359,6 @@ frontend/settings/tabs/ignition/log-rotation=ログローテーション frontend/settings/tabs/ignition/section-scheduled-tasks-help=nginx ignitionのハウスキーピングタスクの定義 frontend/settings/tabs/ignition/section-scheduled-tasks=スケジュールされたタスク frontend/settings/tabs/ignition/ssl-auto-renew=SSL証明書の自動更新 -frontend/settings/tabs/ignition/time-unit-days=日 -frontend/settings/tabs/ignition/time-unit-hours=時間 frontend/settings/tabs/ignition/time-unit-minutes=分 frontend/settings/tabs/nginx/access-logs-enabled=アクセスログが有効 frontend/settings/tabs/nginx/client-body-timeout=クライアントボディタイムアウト diff --git a/i18n/messages_pt.properties b/i18n/messages_pt.properties index d001a6e21..2102a39c3 100644 --- a/i18n/messages_pt.properties +++ b/i18n/messages_pt.properties @@ -809,6 +809,11 @@ common/stream=Stream common/streams=Streams common/success-message=A operação foi concluída com sucesso common/that-didnt-work=Isso não funcionou +common/time-unit-day=dia +common/time-unit-days=dias +common/time-unit-hour=hora +common/time-unit-hours=horas +common/time-unit-second=segundo common/traffic-stats=Estatísticas common/try-again-later=Não foi possível buscar os dados neste momento. Por favor, tente novamente mais tarde. common/two-factor-authentication=Autenticação de dois fatores @@ -1129,6 +1134,7 @@ frontend/home/expires-today=Expira hoje frontend/home/greeting-subtitle=Bem-vindo ao nginx ignition. Uma visão geral da sua instância está disponível abaixo. frontend/home/greeting-title=Olá, ${userName} frontend/home/nginx-offline=Offline +frontend/home/nginx-online-uptime=Online há ${days}, ${hours} e ${seconds} frontend/home/nginx-online=Online frontend/home/nginx-reload=Recarregar configuração frontend/home/nginx-section-title=nginx status @@ -1353,8 +1359,6 @@ frontend/settings/tabs/ignition/log-rotation=Rotação de log frontend/settings/tabs/ignition/section-scheduled-tasks-help=Definição das tarefas de manutenção do nginx ignition frontend/settings/tabs/ignition/section-scheduled-tasks=Tarefas agendadas frontend/settings/tabs/ignition/ssl-auto-renew=Renovação automática de certificados SSL -frontend/settings/tabs/ignition/time-unit-days=dias -frontend/settings/tabs/ignition/time-unit-hours=horas frontend/settings/tabs/ignition/time-unit-minutes=minutos frontend/settings/tabs/nginx/access-logs-enabled=Logs de acesso habilitados frontend/settings/tabs/nginx/client-body-timeout=Timeout do corpo do cliente diff --git a/i18n/messages_ru.properties b/i18n/messages_ru.properties index d934b929d..669e5bb3d 100644 --- a/i18n/messages_ru.properties +++ b/i18n/messages_ru.properties @@ -809,6 +809,11 @@ common/stream=Поток common/streams=Потоки common/success-message=Операция была успешно завершена common/that-didnt-work=Это не сработало +common/time-unit-day=день +common/time-unit-days=дней +common/time-unit-hour=час +common/time-unit-hours=часов +common/time-unit-second=секунда common/traffic-stats=Статистика common/try-again-later=Мы не можем получить данные в данный момент. Пожалуйста, попробуйте позже. common/two-factor-authentication=Двухфакторная аутентификация @@ -1129,6 +1134,7 @@ frontend/home/expires-today=Истекает сегодня frontend/home/greeting-subtitle=Добро пожаловать в nginx ignition. Ниже доступен обзор вашего экземпляра. frontend/home/greeting-title=Здравствуйте, ${userName} frontend/home/nginx-offline=Офлайн +frontend/home/nginx-online-uptime=Онлайн ${days}, ${hours} и ${seconds} frontend/home/nginx-online=Онлайн frontend/home/nginx-reload=Перезагрузить конфигурацию frontend/home/nginx-section-title=nginx статус @@ -1353,8 +1359,6 @@ frontend/settings/tabs/ignition/log-rotation=Ротация логов frontend/settings/tabs/ignition/section-scheduled-tasks-help=Определение задач по обслуживанию nginx ignition frontend/settings/tabs/ignition/section-scheduled-tasks=Запланированные задачи frontend/settings/tabs/ignition/ssl-auto-renew=Авто-обновление SSL сертификатов -frontend/settings/tabs/ignition/time-unit-days=дней -frontend/settings/tabs/ignition/time-unit-hours=часов frontend/settings/tabs/ignition/time-unit-minutes=минут frontend/settings/tabs/nginx/access-logs-enabled=Логи доступа включены frontend/settings/tabs/nginx/client-body-timeout=Таймаут тела клиента diff --git a/i18n/messages_vi.properties b/i18n/messages_vi.properties index 9f045b42e..9039e4184 100644 --- a/i18n/messages_vi.properties +++ b/i18n/messages_vi.properties @@ -809,6 +809,11 @@ common/stream=Stream common/streams=Các Stream common/success-message=Thao tác đã hoàn tất thành công common/that-didnt-work=Đã có lỗi xảy ra +common/time-unit-day=ngày +common/time-unit-days=ngày liên tiếp +common/time-unit-hour=giờ +common/time-unit-hours=giờ liên tiếp +common/time-unit-second=giây common/traffic-stats=Thống kê common/try-again-later=Chúng tôi không thể lấy dữ liệu vào lúc này. Vui lòng thử lại sau. common/two-factor-authentication=Xác thực hai yếu tố @@ -828,7 +833,7 @@ common/unexpected-error-try-again=Đã xảy ra lỗi không mong muốn. Vui l common/unit-kb-each=KB mỗi common/unit-kb=KB common/unit-mb=MB -common/unit-seconds=giây +common/unit-seconds=giây thời gian common/user=Người dùng common/username=Tên đăng nhập common/users=Người dùng @@ -1129,6 +1134,7 @@ frontend/home/expires-today=Hết hạn hôm nay frontend/home/greeting-subtitle=Chào mừng đến nginx ignition. Tổng quan về phiên bản của bạn có ở bên dưới. frontend/home/greeting-title=Xin chào, ${userName} frontend/home/nginx-offline=Ngoại tuyến +frontend/home/nginx-online-uptime=Trực tuyến ${days}, ${hours} và ${seconds} frontend/home/nginx-online=Trực tuyến frontend/home/nginx-reload=Tải lại cấu hình frontend/home/nginx-section-title=nginx trạng thái @@ -1353,8 +1359,6 @@ frontend/settings/tabs/ignition/log-rotation=Xoay vòng nhật ký frontend/settings/tabs/ignition/section-scheduled-tasks-help=Định nghĩa các tác vụ dọn dẹp của nginx ignition frontend/settings/tabs/ignition/section-scheduled-tasks=Tác vụ đã lên lịch frontend/settings/tabs/ignition/ssl-auto-renew=Tự động gia hạn chứng chỉ SSL -frontend/settings/tabs/ignition/time-unit-days=ngày -frontend/settings/tabs/ignition/time-unit-hours=giờ frontend/settings/tabs/ignition/time-unit-minutes=phút frontend/settings/tabs/nginx/access-logs-enabled=Bật nhật ký truy cập frontend/settings/tabs/nginx/client-body-timeout=Client body timeout diff --git a/i18n/messages_zh.properties b/i18n/messages_zh.properties index b18836cf9..5b5853335 100644 --- a/i18n/messages_zh.properties +++ b/i18n/messages_zh.properties @@ -809,6 +809,11 @@ common/stream=流 common/streams=流 common/success-message=操作已成功完成 common/that-didnt-work=操作失败 +common/time-unit-day=天 +common/time-unit-days=天数 +common/time-unit-hour=时 +common/time-unit-hours=小时 +common/time-unit-second=秒 common/traffic-stats=统计 common/try-again-later=我们目前无法获取数据。请稍后再试。 common/two-factor-authentication=双重身份验证 @@ -828,7 +833,7 @@ common/unexpected-error-try-again=发现意外错误。请稍后再试。 common/unit-kb-each=KB 每个 common/unit-kb=KB common/unit-mb=MB -common/unit-seconds=秒 +common/unit-seconds=秒钟 common/user=用户 common/username=用户名 common/users=用户 @@ -1129,6 +1134,7 @@ frontend/home/expires-today=今天到期 frontend/home/greeting-subtitle=欢迎使用 nginx ignition。下方可查看实例概览。 frontend/home/greeting-title=你好,${userName} frontend/home/nginx-offline=Offline +frontend/home/nginx-online-uptime=已在线 ${days}、${hours}和${seconds} frontend/home/nginx-online=Online frontend/home/nginx-reload=重新加载配置 frontend/home/nginx-section-title=nginx 状态 @@ -1353,8 +1359,6 @@ frontend/settings/tabs/ignition/log-rotation=日志轮换 frontend/settings/tabs/ignition/section-scheduled-tasks-help=nginx ignition 维护任务的定义 frontend/settings/tabs/ignition/section-scheduled-tasks=计划任务 frontend/settings/tabs/ignition/ssl-auto-renew=SSL 证书自动续期 -frontend/settings/tabs/ignition/time-unit-days=天 -frontend/settings/tabs/ignition/time-unit-hours=小时 frontend/settings/tabs/ignition/time-unit-minutes=分钟 frontend/settings/tabs/nginx/access-logs-enabled=访问日志已启用 frontend/settings/tabs/nginx/client-body-timeout=客户端正文超时 From a1cdb12944f4557325a2b4220749a5f5dcdc79a6 Mon Sep 17 00:00:00 2001 From: Lucas Dillmann Date: Sun, 31 May 2026 15:39:04 -0300 Subject: [PATCH 10/13] New home dashboard --- frontend/src/domain/home/HomePage.css | 2 +- frontend/src/domain/home/HomePage.tsx | 20 ++++---- .../{HomeHeaderCard.css => HomeHeader.css} | 39 +++++++-------- .../{HomeHeaderCard.tsx => HomeHeader.tsx} | 47 ++++++------------- 4 files changed, 43 insertions(+), 65 deletions(-) rename frontend/src/domain/home/components/{HomeHeaderCard.css => HomeHeader.css} (57%) rename frontend/src/domain/home/components/{HomeHeaderCard.tsx => HomeHeader.tsx} (64%) diff --git a/frontend/src/domain/home/HomePage.css b/frontend/src/domain/home/HomePage.css index b74f93970..82cdccad7 100644 --- a/frontend/src/domain/home/HomePage.css +++ b/frontend/src/domain/home/HomePage.css @@ -1,6 +1,6 @@ .home-dashboard-container { gap: 36px; - padding-bottom: 16px; + padding: 0 40px 16px; } .home-dashboard-overview-row { diff --git a/frontend/src/domain/home/HomePage.tsx b/frontend/src/domain/home/HomePage.tsx index 9b42d89ad..4b64ad634 100644 --- a/frontend/src/domain/home/HomePage.tsx +++ b/frontend/src/domain/home/HomePage.tsx @@ -23,7 +23,7 @@ import LogLine from "../logs/model/LogLine" import { Link } from "react-router-dom" import TagGroup from "../../core/components/taggroup/TagGroup" import CountCard from "./components/CountCard" -import HomeHeaderCard from "./components/HomeHeaderCard" +import HomeHeader from "./components/HomeHeader" import NginxStatusCard from "./components/NginxStatusCard" import "./HomePage.css" import "../trafficstats/TrafficStatsPage.css" @@ -96,7 +96,9 @@ export default class HomePage extends React.Component { } private configureShell() { - AppShellContext.get().updateConfig({}) + AppShellContext.get().updateConfig({ + noContainerPadding: true, + }) } private refreshData() { @@ -442,12 +444,14 @@ export default class HomePage extends React.Component { const { metadata } = this.state return ( - - this.refreshData()} /> - {this.renderOverviewSection()} - {this.renderTrafficSection()} - {this.renderDetailsSection()} - + <> + this.refreshData()} /> + + {this.renderOverviewSection()} + {this.renderTrafficSection()} + {this.renderDetailsSection()} + + ) } } diff --git a/frontend/src/domain/home/components/HomeHeaderCard.css b/frontend/src/domain/home/components/HomeHeader.css similarity index 57% rename from frontend/src/domain/home/components/HomeHeaderCard.css rename to frontend/src/domain/home/components/HomeHeader.css index aad758106..1d67d2cac 100644 --- a/frontend/src/domain/home/components/HomeHeaderCard.css +++ b/frontend/src/domain/home/components/HomeHeader.css @@ -1,30 +1,30 @@ -.home-header-card { - padding: 20px; - background: var(--nginxIgnition-colorBgLayout); - border-radius: 8px; +.home-header { + background: var(--nginxIgnition-shellHeaderBg, var(--nginxIgnition-colorBgLayout)); + padding: 48px 40px; + margin-bottom: 36px; width: 100%; box-sizing: border-box; } -.home-header-card-columns { +.home-header-columns { gap: 24px; width: 100%; } -.home-header-card-greeting { +.home-header-greeting { flex: 1; min-width: 240px; gap: 8px; } -.home-header-card-title { +.home-header-title { font-size: 28px; font-weight: 600; margin: 0; line-height: 1.2; } -.home-header-card-subtitle { +.home-header-subtitle { font-size: 16px; font-weight: 400; margin: 0; @@ -32,48 +32,41 @@ line-height: 1.5; } -html:not([data-theme="dark"]) .home-header-card-subtitle { +html:not([data-theme="dark"]) .home-header-subtitle { color: var(--nginxIgnition-colorTextTertiary); } -.home-header-card-sidebar { +.home-header-sidebar { gap: 0; min-width: 200px; } -.home-header-card-meta-group { +.home-header-meta-group { gap: 2px; line-height: 1.2; } -.home-header-card-actions { +.home-header-actions { margin-top: 20px; } -.home-header-card-update-button.ant-btn { +.home-header-update-button.ant-btn { color: var(--ant-color-warning-text) !important; background: var(--ant-color-warning-bg) !important; border-color: var(--ant-color-warning-border) !important; } -.home-header-card-update-button.ant-btn:hover:not(:disabled) { +.home-header-update-button.ant-btn:hover:not(:disabled) { color: var(--nginxIgnition-colorWarning) !important; background: var(--ant-color-warning-bg) !important; border-color: var(--nginxIgnition-colorWarning) !important; } -.home-header-card-meta-line { +.home-header-meta-line { font-size: 14px; color: var(--nginxIgnition-colorTextSecondary); } -html:not([data-theme="dark"]) .home-header-card-meta-line { +html:not([data-theme="dark"]) .home-header-meta-line { color: var(--nginxIgnition-colorTextTertiary); } - -.home-header-card-social-icon { - font-size: 16px; - cursor: pointer; - color: var(--nginxIgnition-colorTextSecondary); - margin-top: 5px; -} diff --git a/frontend/src/domain/home/components/HomeHeaderCard.tsx b/frontend/src/domain/home/components/HomeHeader.tsx similarity index 64% rename from frontend/src/domain/home/components/HomeHeaderCard.tsx rename to frontend/src/domain/home/components/HomeHeader.tsx index c421e7c69..3d46a50ee 100644 --- a/frontend/src/domain/home/components/HomeHeaderCard.tsx +++ b/frontend/src/domain/home/components/HomeHeader.tsx @@ -1,19 +1,18 @@ import React from "react" import { Button, Flex } from "antd" -import { GithubFilled, LinkedinFilled } from "@ant-design/icons" import AppContext from "../../../core/components/context/AppContext" import MessageKey from "../../../core/i18n/model/MessageKey.generated" import { I18n } from "../../../core/i18n/I18n" import NginxMetadata from "../../nginx/model/NginxMetadata" -import "./HomeHeaderCard.css" +import "./HomeHeader.css" import If from "../../../core/components/flowcontrol/If" -export interface HomeHeaderCardProps { +export interface HomeHeaderProps { metadata?: NginxMetadata onRefresh: () => void } -export default class HomeHeaderCard extends React.PureComponent { +export default class HomeHeader extends React.PureComponent { private firstName(): string { const user = AppContext.get().user if (user === undefined) return "" @@ -28,19 +27,11 @@ export default class HomeHeaderCard extends React.PureComponent + + ) } - private renderSocialIcons() { - return ( - - this.handleLinkedInClick()} /> - this.handleGithubClick()} /> - - ) - } - private renderActions(onRefresh: () => void) { const { current, latest } = AppContext.get().configuration.version const updateAvailable = Boolean(current) && Boolean(latest) && current !== latest return ( - +