Enhance API with OIDC support, including login and callback endpoints. Update environment variables for OIDC configuration in .env.example. Add new features to the catalog service for listing software families, Minecraft versions, and deployment regions. Implement server management actions such as kill, delete, and update in the servers module. Integrate feature flags for maintenance mode in server operations. Update pnpm-lock.yaml with new dependencies and versions.
This commit is contained in:
@@ -15,10 +15,19 @@
|
||||
"cancel": "Cancel",
|
||||
"back": "Back",
|
||||
"footer": "Self-hosted Minecraft server platform.",
|
||||
"servers": "Servers"
|
||||
"servers": "Servers",
|
||||
"features": "Features",
|
||||
"pricing": "Pricing",
|
||||
"docs": "Documentation",
|
||||
"status": "Status",
|
||||
"impressum": "Legal notice",
|
||||
"privacy": "Privacy",
|
||||
"terms": "Terms",
|
||||
"admin": "Admin",
|
||||
"phaseBadge": "MVP · Phases 0–9"
|
||||
},
|
||||
"landing": {
|
||||
"badge": "Phase 0 · Control Plane",
|
||||
"badge": "MVP · Phase 9 complete",
|
||||
"title": "Minecraft servers on demand",
|
||||
"subtitle": "Create, configure, and operate Minecraft servers through a central web panel — multi-tenant, scalable, and production-ready.",
|
||||
"ctaPrimary": "Get started",
|
||||
@@ -205,7 +214,36 @@
|
||||
"players": "Players",
|
||||
"worlds": "Worlds",
|
||||
"backups": "Backups",
|
||||
"addons": "Add-ons"
|
||||
"addons": "Add-ons",
|
||||
"software": "Software",
|
||||
"schedules": "Schedules",
|
||||
"access": "Access"
|
||||
},
|
||||
"wizard": {
|
||||
"stepsLabel": "Creation steps",
|
||||
"steps": {
|
||||
"basics": "Basics",
|
||||
"software": "Software",
|
||||
"review": "Review"
|
||||
},
|
||||
"next": "Next",
|
||||
"back": "Back"
|
||||
},
|
||||
"software": {
|
||||
"title": "Software",
|
||||
"description": "Installed server software and version.",
|
||||
"loading": "Loading…",
|
||||
"loadError": "Could not load software information.",
|
||||
"family": "Software family",
|
||||
"version": "Minecraft version",
|
||||
"edition": "Edition",
|
||||
"changeHint": "Software switching will be supported in a future release.",
|
||||
"reinstall": "Reinstall software",
|
||||
"reinstalling": "Reinstalling…",
|
||||
"reinstallConfirm": "Reinstall server software? A backup will be created first.",
|
||||
"reinstallStarted": "Reinstall started. The server will be unavailable during installation.",
|
||||
"reinstallError": "Could not start reinstall.",
|
||||
"reinstallStoppedHint": "Stop the server before reinstalling software."
|
||||
},
|
||||
"console": {
|
||||
"loading": "Loading…",
|
||||
@@ -233,10 +271,27 @@
|
||||
"save": "Save",
|
||||
"saving": "Saving…",
|
||||
"saved": "File saved.",
|
||||
"upload": "Upload",
|
||||
"uploading": "Uploading…",
|
||||
"uploaded": "File uploaded.",
|
||||
"delete": "Delete",
|
||||
"deleted": "Deleted.",
|
||||
"deleteConfirm": "Delete {name}?",
|
||||
"archive": "Archive selected",
|
||||
"archiving": "Archiving…",
|
||||
"archived": "Archive created.",
|
||||
"unarchive": "Extract archive",
|
||||
"unarchiving": "Extracting…",
|
||||
"unarchived": "Archive extraction started.",
|
||||
"unarchiveConfirm": "Extract {name} into the current directory?",
|
||||
"errors": {
|
||||
"loadFailed": "Could not load directory.",
|
||||
"readFailed": "Could not read file.",
|
||||
"saveFailed": "Could not save file."
|
||||
"saveFailed": "Could not save file.",
|
||||
"deleteFailed": "Could not delete file.",
|
||||
"uploadFailed": "Could not upload file.",
|
||||
"archiveFailed": "Could not create archive.",
|
||||
"unarchiveFailed": "Could not extract archive."
|
||||
}
|
||||
},
|
||||
"properties": {
|
||||
@@ -280,14 +335,32 @@
|
||||
"loading": "Loading…",
|
||||
"onlineCount": "Online players",
|
||||
"whitelistCount": "Whitelist entries",
|
||||
"operatorsCount": "Operators",
|
||||
"onlineTitle": "Online players",
|
||||
"whitelistTitle": "Whitelist",
|
||||
"operatorsTitle": "Operators",
|
||||
"bansTitle": "Banned players",
|
||||
"bansEmpty": "No banned players.",
|
||||
"empty": "No players online.",
|
||||
"retry": "Retry",
|
||||
"kick": "Kick",
|
||||
"addWhitelist": "Add to whitelist",
|
||||
"addOperator": "Add operator",
|
||||
"addBan": "Ban player",
|
||||
"remove": "Remove",
|
||||
"fields": {
|
||||
"name": "Player name",
|
||||
"uuid": "UUID",
|
||||
"reason": "Reason"
|
||||
},
|
||||
"columns": {
|
||||
"name": "Player",
|
||||
"ping": "Ping"
|
||||
"ping": "Ping",
|
||||
"actions": "Actions"
|
||||
},
|
||||
"errors": {
|
||||
"loadFailed": "Could not load player list."
|
||||
"loadFailed": "Could not load player list.",
|
||||
"actionFailed": "Action failed."
|
||||
}
|
||||
},
|
||||
"worlds": {
|
||||
@@ -347,6 +420,473 @@
|
||||
"remove": "Remove",
|
||||
"installed": "Installed",
|
||||
"empty": "No add-ons installed yet."
|
||||
},
|
||||
"schedules": {
|
||||
"title": "Schedules",
|
||||
"description": "Scheduled start, stop, and maintenance actions.",
|
||||
"loading": "Loading…",
|
||||
"empty": "No schedules yet.",
|
||||
"create": "Create schedule",
|
||||
"edit": "Edit",
|
||||
"save": "Save changes",
|
||||
"cancel": "Cancel",
|
||||
"delete": "Delete",
|
||||
"enable": "Enable",
|
||||
"disable": "Disable",
|
||||
"saving": "Saving…",
|
||||
"deleteConfirm": "Delete schedule \"{name}\"?",
|
||||
"fields": {
|
||||
"name": "Name",
|
||||
"cron": "Cron expression",
|
||||
"timezone": "Timezone",
|
||||
"taskType": "Task",
|
||||
"enabled": "Enabled",
|
||||
"command": "Console command",
|
||||
"commandPlaceholder": "say Server restarting"
|
||||
},
|
||||
"columns": {
|
||||
"name": "Name",
|
||||
"cron": "Cron",
|
||||
"task": "Task",
|
||||
"status": "Status",
|
||||
"actions": "Actions"
|
||||
},
|
||||
"status": {
|
||||
"enabled": "Enabled",
|
||||
"disabled": "Disabled"
|
||||
},
|
||||
"taskTypes": {
|
||||
"START": "Start server",
|
||||
"STOP": "Stop server",
|
||||
"RESTART": "Restart server",
|
||||
"BACKUP": "Create backup",
|
||||
"CONSOLE_COMMAND": "Run command",
|
||||
"UPDATE_CHECK": "Check for updates",
|
||||
"MAINTENANCE": "Maintenance"
|
||||
},
|
||||
"errors": {
|
||||
"loadFailed": "Could not load schedules.",
|
||||
"saveFailed": "Could not save schedule.",
|
||||
"deleteFailed": "Could not delete schedule."
|
||||
}
|
||||
},
|
||||
"access": {
|
||||
"title": "Access",
|
||||
"description": "Sharing and permissions for this server.",
|
||||
"loading": "Loading…",
|
||||
"empty": "No members yet. Invite someone to share this server.",
|
||||
"invite": "Invite member",
|
||||
"sendInvite": "Send invite",
|
||||
"inviting": "Sending…",
|
||||
"cancel": "Cancel",
|
||||
"remove": "Remove",
|
||||
"inviteSuccess": "Member invited successfully.",
|
||||
"invitePending": "Invite noted. The user must register before they can access this server.",
|
||||
"removeConfirm": "Remove {name} from this server?",
|
||||
"fields": {
|
||||
"email": "Email address",
|
||||
"emailPlaceholder": "user@example.com",
|
||||
"role": "Role"
|
||||
},
|
||||
"columns": {
|
||||
"member": "Member",
|
||||
"email": "Email",
|
||||
"role": "Role",
|
||||
"status": "Status",
|
||||
"actions": "Actions"
|
||||
},
|
||||
"roles": {
|
||||
"OWNER": "Owner",
|
||||
"ADMIN": "Admin",
|
||||
"OPERATOR": "Operator",
|
||||
"DEVELOPER": "Developer",
|
||||
"VIEWER": "Viewer"
|
||||
},
|
||||
"status": {
|
||||
"active": "Active",
|
||||
"pending": "Pending"
|
||||
},
|
||||
"errors": {
|
||||
"loadFailed": "Could not load members.",
|
||||
"inviteFailed": "Could not send invite.",
|
||||
"removeFailed": "Could not remove member."
|
||||
}
|
||||
}
|
||||
},
|
||||
"account": {
|
||||
"nav": {
|
||||
"label": "Account navigation",
|
||||
"dashboard": "Dashboard",
|
||||
"servers": "Servers",
|
||||
"billing": "Billing",
|
||||
"profile": "Profile",
|
||||
"notifications": "Notifications",
|
||||
"security": "Security"
|
||||
},
|
||||
"billing": {
|
||||
"title": "Billing",
|
||||
"subtitle": "Credits and transaction history.",
|
||||
"loading": "Loading…",
|
||||
"loadError": "Could not load billing data.",
|
||||
"balanceTitle": "Current balance",
|
||||
"periodStart": "Billing period from {date}",
|
||||
"creditsLabel": "Credits remaining",
|
||||
"transactionsTitle": "Transactions",
|
||||
"transactionsEmpty": "No transactions in this period yet.",
|
||||
"columns": {
|
||||
"date": "Date",
|
||||
"type": "Type",
|
||||
"amount": "Amount",
|
||||
"reference": "Reference"
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
"title": "Profile",
|
||||
"subtitle": "Your account information.",
|
||||
"loading": "Loading…",
|
||||
"notSignedIn": "Not signed in.",
|
||||
"accountInfo": "Account details",
|
||||
"accountInfoDescription": "Profile information from your account.",
|
||||
"fields": {
|
||||
"email": "Email",
|
||||
"username": "Username",
|
||||
"displayName": "Display name",
|
||||
"emailVerified": "Email verified",
|
||||
"twoFactor": "Two-factor auth"
|
||||
},
|
||||
"yes": "Yes",
|
||||
"no": "No",
|
||||
"enabled": "Enabled",
|
||||
"disabled": "Disabled",
|
||||
"securityHint": "Manage password, 2FA, and sessions at",
|
||||
"securityLink": "Security"
|
||||
},
|
||||
"notifications": {
|
||||
"title": "Notifications",
|
||||
"subtitle": "Email and in-app notifications.",
|
||||
"loading": "Loading…",
|
||||
"listTitle": "Recent notifications",
|
||||
"unreadCount": "{count, plural, one {# unread notification} other {# unread notifications}}",
|
||||
"allRead": "All caught up.",
|
||||
"markRead": "Mark read",
|
||||
"markAllRead": "Mark all read",
|
||||
"emptyTitle": "No notifications",
|
||||
"emptyDescription": "You have not received any notifications yet.",
|
||||
"preferencesTitle": "Preferences",
|
||||
"preferencesDescription": "Choose which notifications you receive on each channel.",
|
||||
"enabled": "Enabled",
|
||||
"disabled": "Disabled",
|
||||
"channels": {
|
||||
"IN_APP": "In-app",
|
||||
"EMAIL": "Email",
|
||||
"WEBHOOK": "Webhook",
|
||||
"DISCORD": "Discord"
|
||||
},
|
||||
"types": {
|
||||
"SERVER_READY": "Server ready",
|
||||
"SERVER_START_FAILED": "Server start failed",
|
||||
"SERVER_STOPPED": "Server stopped",
|
||||
"IDLE_STOP_WARNING": "Idle stop warning",
|
||||
"BACKUP_SUCCESS": "Backup succeeded",
|
||||
"BACKUP_FAILED": "Backup failed",
|
||||
"RESTORE_SUCCESS": "Restore succeeded",
|
||||
"RESTORE_FAILED": "Restore failed",
|
||||
"CREDITS_LOW": "Low credits",
|
||||
"BILLING_ISSUE": "Billing issue",
|
||||
"INVITE": "Invite",
|
||||
"NODE_INCIDENT": "Node incident",
|
||||
"MAINTENANCE": "Maintenance",
|
||||
"SECURITY": "Security",
|
||||
"NEW_LOGIN": "New login",
|
||||
"TWO_FA_CHANGED": "Two-factor changed"
|
||||
},
|
||||
"errors": {
|
||||
"loadFailed": "Could not load notifications.",
|
||||
"markReadFailed": "Could not update notification.",
|
||||
"preferencesFailed": "Could not save preferences."
|
||||
}
|
||||
}
|
||||
},
|
||||
"admin": {
|
||||
"backToPanel": "Back to panel",
|
||||
"nav": {
|
||||
"label": "Admin navigation",
|
||||
"dashboard": "Dashboard",
|
||||
"nodes": "Nodes",
|
||||
"users": "Users",
|
||||
"jobs": "Jobs",
|
||||
"audit": "Audit"
|
||||
},
|
||||
"dashboard": {
|
||||
"title": "Admin dashboard",
|
||||
"subtitle": "Platform-wide metrics and system status.",
|
||||
"loading": "Loading…",
|
||||
"loadError": "Could not load dashboard data.",
|
||||
"generatedAt": "As of {time}",
|
||||
"stats": {
|
||||
"activeUsers": "Active users",
|
||||
"totalServers": "Total servers",
|
||||
"runningServers": "Running servers",
|
||||
"queueLength": "Queue length",
|
||||
"onlineNodes": "Online nodes",
|
||||
"failedJobs24h": "Failed jobs (24h)",
|
||||
"openAbuseReports": "Open abuse reports",
|
||||
"openTickets": "Open tickets"
|
||||
}
|
||||
},
|
||||
"nodes": {
|
||||
"title": "Game nodes",
|
||||
"subtitle": "Node status and maintenance actions.",
|
||||
"loading": "Loading…",
|
||||
"loadError": "Could not load nodes.",
|
||||
"empty": "No nodes registered.",
|
||||
"drain": "Drain",
|
||||
"maintenance": "Maintenance",
|
||||
"exitMaintenance": "Exit maintenance",
|
||||
"actionError": "Action failed.",
|
||||
"columns": {
|
||||
"name": "Node",
|
||||
"status": "Status",
|
||||
"servers": "Servers",
|
||||
"ram": "RAM",
|
||||
"actions": "Actions"
|
||||
}
|
||||
},
|
||||
"users": {
|
||||
"title": "Users",
|
||||
"subtitle": "Search and manage user accounts.",
|
||||
"loading": "Loading…",
|
||||
"loadError": "Could not load users.",
|
||||
"empty": "No users found.",
|
||||
"searchPlaceholder": "Email or username…",
|
||||
"search": "Search",
|
||||
"suspend": "Suspend",
|
||||
"unsuspend": "Unsuspend",
|
||||
"actionError": "Action failed.",
|
||||
"columns": {
|
||||
"user": "User",
|
||||
"status": "Status",
|
||||
"roles": "Roles",
|
||||
"servers": "Servers",
|
||||
"actions": "Actions"
|
||||
}
|
||||
},
|
||||
"jobs": {
|
||||
"title": "Background jobs",
|
||||
"subtitle": "Current and recently completed queue jobs.",
|
||||
"loading": "Loading…",
|
||||
"loadError": "Could not load jobs.",
|
||||
"empty": "No jobs found.",
|
||||
"columns": {
|
||||
"queue": "Queue",
|
||||
"job": "Job",
|
||||
"status": "Status",
|
||||
"attempts": "Attempts",
|
||||
"created": "Created"
|
||||
}
|
||||
},
|
||||
"audit": {
|
||||
"title": "Audit log",
|
||||
"subtitle": "Platform-wide security and lifecycle events.",
|
||||
"loading": "Loading…",
|
||||
"loadError": "Could not load audit events.",
|
||||
"empty": "No events found.",
|
||||
"loadMore": "Load more",
|
||||
"columns": {
|
||||
"time": "Time",
|
||||
"action": "Action",
|
||||
"user": "User",
|
||||
"entity": "Entity"
|
||||
}
|
||||
}
|
||||
},
|
||||
"public": {
|
||||
"pricing": {
|
||||
"title": "Pricing",
|
||||
"description": "Transparent plans for Minecraft server hosting.",
|
||||
"cta": "Register now →",
|
||||
"tiers": {
|
||||
"starter": {
|
||||
"name": "Starter",
|
||||
"description": "Great for trying things out.",
|
||||
"price": "Free",
|
||||
"features": ["2 GB RAM", "1 server", "Idle shutdown", "Community support"]
|
||||
},
|
||||
"standard": {
|
||||
"name": "Standard",
|
||||
"description": "For small communities.",
|
||||
"price": "Credits",
|
||||
"features": ["4 GB RAM", "3 servers", "Backups", "Modrinth add-ons"]
|
||||
},
|
||||
"pro": {
|
||||
"name": "Pro",
|
||||
"description": "For demanding worlds.",
|
||||
"price": "Credits",
|
||||
"features": ["8+ GB RAM", "Unlimited servers*", "Priority queue", "WHMCS integration"]
|
||||
}
|
||||
}
|
||||
},
|
||||
"features": {
|
||||
"title": "Features",
|
||||
"description": "Everything for professional Minecraft server hosting.",
|
||||
"items": {
|
||||
"control": {
|
||||
"title": "Central control",
|
||||
"description": "Lifecycle, console, files, and properties through a unified panel."
|
||||
},
|
||||
"nodes": {
|
||||
"title": "Multi-node",
|
||||
"description": "Horizontal scaling with agent-based orchestration."
|
||||
},
|
||||
"security": {
|
||||
"title": "Security",
|
||||
"description": "Sessions, 2FA, CSRF protection, and auditable actions."
|
||||
},
|
||||
"billing": {
|
||||
"title": "Credit billing",
|
||||
"description": "Runtime-based billing with transparent balance."
|
||||
},
|
||||
"backups": {
|
||||
"title": "Backups & worlds",
|
||||
"description": "Manual and scheduled backups, world upload and download."
|
||||
},
|
||||
"whmcs": {
|
||||
"title": "WHMCS integration",
|
||||
"description": "Provisioning, SSO, and billing through WHMCS."
|
||||
}
|
||||
}
|
||||
},
|
||||
"status": {
|
||||
"title": "System status",
|
||||
"description": "Current operational status of platform components.",
|
||||
"operational": "Operational",
|
||||
"selfHostedNote": "Status reflects self-hosted deployment. Configure health checks for live monitoring.",
|
||||
"components": {
|
||||
"api": {
|
||||
"name": "API",
|
||||
"description": "REST control plane at /api/v1"
|
||||
},
|
||||
"worker": {
|
||||
"name": "Worker",
|
||||
"description": "BullMQ background processing"
|
||||
},
|
||||
"panel": {
|
||||
"name": "Web panel",
|
||||
"description": "Next.js user interface"
|
||||
},
|
||||
"dns": {
|
||||
"name": "DNS / Edge",
|
||||
"description": "Join-to-start and edge gateway"
|
||||
}
|
||||
}
|
||||
},
|
||||
"docs": {
|
||||
"title": "Documentation",
|
||||
"description": "Getting started, API reference, and operations guides.",
|
||||
"openapi": "Interactive API documentation:",
|
||||
"openapiLink": "OpenAPI / Swagger",
|
||||
"cta": "Create account →",
|
||||
"sections": {
|
||||
"gettingStarted": {
|
||||
"title": "Getting started",
|
||||
"body": "Register, verify your email, create a server through the multi-step wizard, and start it from the dashboard."
|
||||
},
|
||||
"api": {
|
||||
"title": "API",
|
||||
"body": "The REST API at /api/v1 provides endpoints for auth, server lifecycle, files, backups, and admin functions. Authentication uses session cookies."
|
||||
},
|
||||
"operations": {
|
||||
"title": "Operations",
|
||||
"body": "Deploy control plane, worker, and node agent via Docker Compose or Ansible. See docs/operations in the repository."
|
||||
},
|
||||
"whmcs": {
|
||||
"title": "WHMCS",
|
||||
"body": "The server module provisions services automatically. SSO enables seamless access from the WHMCS client area."
|
||||
}
|
||||
}
|
||||
},
|
||||
"impressum": {
|
||||
"title": "Legal notice",
|
||||
"description": "Information according to applicable law (German Impressum).",
|
||||
"notice": "This is a template legal notice. Replace placeholder details before production use.",
|
||||
"sections": {
|
||||
"operator": {
|
||||
"title": "Service provider",
|
||||
"body": "HexaHost\nGame server hosting platform"
|
||||
},
|
||||
"address": {
|
||||
"title": "Address",
|
||||
"body": "HexaHost\nMusterstraße 1\n12345 Musterstadt\nGermany"
|
||||
},
|
||||
"contact": {
|
||||
"title": "Contact",
|
||||
"body": "Email: kontakt@hexahost.example\nPhone: +49 (0) 123 456789"
|
||||
},
|
||||
"responsible": {
|
||||
"title": "Responsible for content (§ 55 Abs. 2 RStV)",
|
||||
"body": "Max Mustermann\nHexaHost\nMusterstraße 1\n12345 Musterstadt"
|
||||
},
|
||||
"register": {
|
||||
"title": "Commercial register",
|
||||
"body": "Register court: Amtsgericht Musterstadt\nRegistration number: HRB 12345\nVAT ID: DE123456789"
|
||||
},
|
||||
"dispute": {
|
||||
"title": "Dispute resolution",
|
||||
"body": "We are not obliged or willing to participate in dispute resolution proceedings before a consumer arbitration board."
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacy": {
|
||||
"title": "Privacy policy",
|
||||
"description": "Information on processing personal data.",
|
||||
"sections": {
|
||||
"controller": {
|
||||
"title": "Controller",
|
||||
"body": "The operator of this self-hosted instance is responsible for data processing. Adapt this policy to your organization."
|
||||
},
|
||||
"data": {
|
||||
"title": "Data collected",
|
||||
"body": "We process account data (email, username), session information, server metadata, and usage data for billing."
|
||||
},
|
||||
"cookies": {
|
||||
"title": "Cookies",
|
||||
"body": "Session cookies (hgc_session) and CSRF cookies (hgc_csrf) are required for authentication."
|
||||
},
|
||||
"rights": {
|
||||
"title": "Your rights",
|
||||
"body": "You have the right to access, rectify, delete, and port your data under applicable privacy law."
|
||||
},
|
||||
"contact": {
|
||||
"title": "Contact",
|
||||
"body": "For privacy requests, contact the operator listed in your legal notice."
|
||||
}
|
||||
}
|
||||
},
|
||||
"terms": {
|
||||
"title": "Terms of service",
|
||||
"description": "Terms of use for the platform.",
|
||||
"sections": {
|
||||
"scope": {
|
||||
"title": "Scope",
|
||||
"body": "These terms apply to use of the Minecraft server hosting platform by registered users."
|
||||
},
|
||||
"usage": {
|
||||
"title": "Usage",
|
||||
"body": "Servers may only be operated for lawful purposes. Abuse may result in suspension."
|
||||
},
|
||||
"billing": {
|
||||
"title": "Billing",
|
||||
"body": "Credits are consumed based on runtime. Balance is non-transferable unless otherwise agreed."
|
||||
},
|
||||
"liability": {
|
||||
"title": "Liability",
|
||||
"body": "The operator is liable only for intent and gross negligence. Protect against data loss with your own backups."
|
||||
},
|
||||
"changes": {
|
||||
"title": "Changes",
|
||||
"body": "The operator may change these terms with reasonable notice. Continued use constitutes acceptance."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user