# Agents Source: https://docs.mogenius.com/ai/agents Configure AI agents that monitor your Kubernetes workloads, generate troubleshooting reports, and propose fixes for your approval. Agents are configurable AI workers that run against your cluster. Each agent has its own instruction, scope, triggers, and tools, and files its findings as **reports** with actionable proposals that you review and approve. mogenius ships a set of **curated default agents** for common use cases — such as workload troubleshooting — and you can adapt them or create your own. Agents require a connected AI model. If you haven't configured one yet, see [AI Models & Setup](/ai/setup). ## Where to find agents Open the **Agents** section at either level: * **Cluster** — agents and reports across every namespace the operator manages. * **Workspace** — the same view, scoped to that workspace's namespaces. The landing page has two views, switched with the toggle at the top: * **Reports** — the inbox of findings your agents have produced, with **Open** and **All** tabs. * **Agents** — one box per configured agent, with its trigger summary, open‑proposal count, and last run. ## Managing agents From the **Agents** view, each agent box offers: * **Run now** — Trigger the agent immediately, independent of its schedule or event triggers. * **Enable / disable** — Turn the agent's automatic triggers on or off without deleting it. * **Configure** — Open the full configuration page. * Selecting the box opens the **agent detail** page with its run history. To create a new agent, choose **New agent** and fill in the configuration below. To remove one, open its configuration page and use **Delete agent** in the danger zone at the bottom — this is only available for existing agents and asks for confirmation before deleting. ## Configuring an agent The configuration page is organized into sections. A live preview shows the resulting `Agent` resource (`mogenius.com/v1alpha1`) as YAML. ### Identity * **Display name** — The human‑readable name shown in the UI. * **Resource name** — The technical name (lowercase letters, digits, and dashes). Generated from the display name and fixed once the agent exists. * **Description** — A one‑line summary of what the agent looks after. * **Icon** — An icon for the agent box. * **Instruction** — Free‑text guidance appended to the base system prompt on every run. This is where you describe what the agent should focus on. * **Enabled** — Whether the agent's automatic triggers are active. ### Model * **Use cluster default** — The agent uses the model marked as the cluster default. * **Specific model** — Turn the default off to pick a particular model for this agent. Models are managed in [AI Models & Setup](/ai/setup). ### Scope Scope defines what the agent may access. Choose one of: * **Namespaces** — Select specific namespaces, or enable **All namespaces (`*`)**. * **Workspace** — Reference a workspace; all of its namespaces are in scope. ### Triggers Triggers decide when the agent runs. You can combine them, and you can always run an agent manually. * **Cron** — Periodic runs on a schedule. Presets cover hourly, daily, weekly, and monthly, or you can enter a custom 5‑field cron expression. * **On change** — Runs when resources in scope change. Configure which **kinds** wake the agent (e.g. `Pod`, `Deployment` — leave empty for all watched types), which **change types** apply (`created`, `updated`, `deleted`), and a **minimum interval** (cooldown) to debounce noisy resources. * **Manual** — Every agent can be triggered on demand with **Run now** in the UI, or from the CLI with `mocli agent run `. ### Tools Tools determine what the agent can do. See [Tools & Custom MCP Servers](/ai/tools) for details. * **Built‑in — Kubernetes** — Read and manage Kubernetes resources in scope. * **Built‑in — Helm** — Install, upgrade, and inspect Helm releases in scope. * **Custom MCP servers** — Reference one or more [custom MCP servers](/ai/tools#custom-mcp-servers) to give the agent access to their tools. ### Budgets Budgets override the model defaults for this agent: * **Max tool calls per run** — Caps how many tool calls a single run may make. * **Token budget per run** — Caps tokens per run (`0` = unlimited). ## Reports and proposals When an agent runs, it produces **reports** collected in the Reports inbox. The inbox has two tabs: * **Open** — Reports that still need attention (pending, in progress, proposed, or executing). * **All** — Every report, including resolved and dismissed ones. Reports carry a status that reflects their progress: * **Pending** — Queued for processing. * **In progress** — The agent is analyzing. * **Proposal** — The agent has a proposed change awaiting your decision. * **Executing / Executed** — An approved proposal is being applied, or has been applied. * **Solved** — The proposed solution was accepted and the issue resolved. * **Ignored / Rejected** — Dismissed by a user; hidden from dashboards and resource views. * **Failed** — The report or its execution could not complete. ### Approving proposals When an agent is confident in a fix, it attaches a **proposal** — a create, update, or delete operation on a resource. You can: * **Show diff** — Review a visual diff between the current manifest and the agent's proposed version. * **Approve** — Apply the proposal. mogenius executes the change and marks the report solved. Destructive operations (such as deleting a resource) ask for explicit confirmation first. * **Reject / Ignore** — Dismiss the proposal without applying it. * **Solve** — Mark the report as resolved manually. * **Replay** — Re‑queue the report for a fresh analysis. ### Agent runs and the reasoning timeline The **agent detail** page groups findings into **runs**. Each run shows how it was triggered (event, cron, or manual), its duration, and token usage. Open a run to see the agent's step‑by‑step **reasoning timeline** — the think → act → observe loop, including the tools it called and the findings it produced — updated live while the run is in progress. ## Reports on a resource When you view a specific Kubernetes resource, a banner appears if an agent has detected an issue with it. The resource's report view is filtered to that resource, so you can review and act on findings in context. # Chat with AI Source: https://docs.mogenius.com/ai/chat Use the interactive AI chat to ask questions, investigate issues, and manage your Kubernetes cluster through natural language. The AI chat lets you interact with the mogenius AI directly through a conversational interface. You can ask questions, investigate issues, and give instructions — the assistant has access to your cluster and uses its tools to find answers and take action, reasoning step by step in a think → act → observe loop. Chat requires a connected AI model. If you haven't configured one yet, see [AI Models & Setup](/ai/setup). ## Opening the chat Open the chat from the **chat button** in the platform header — it appears in a sidebar next to your current view. You can also open it as a **separate window** to keep the conversation visible while you work elsewhere. The chat is available at both the **Cluster** and **Workspace** level, and automatically scopes its responses to the context you're working in. ## What you can do The assistant understands natural language and can use its tools to interact with your cluster on your behalf. Common uses include: * Investigating issues such as misconfigured resources, unreachable applications, or networking problems. * Querying cluster resources like Pods, Deployments, Services, and ConfigMaps. * Getting guidance on resource optimization, node allocation, and resource limits. * Reviewing and drafting Kubernetes manifests or Helm values. * Troubleshooting interactively by feeding the assistant additional context. ## Chat modes A mode selector tailors how the assistant responds: * **Ask** — Answer questions and explain, without proposing changes. * **Code** — Focus on writing and editing manifests, values, and configuration. * **Plan** — Break a task down into a step‑by‑step plan before acting. You can **clear the conversation** at any time to start fresh. ## Choosing a model A model picker lets you switch between the models marked as **chat enabled** in [AI Models & Setup](/ai/setup). The cluster default is preselected. Switching models starts a fresh connection for the next message. ## Tools and reasoning The chat uses the same tools as agents. As the assistant works, it shows which tools it is calling so you can follow its reasoning: * **Kubernetes** — Query resources, read logs, describe Pods, inspect events, and retrieve manifests in real time. * **Helm** — List releases, inspect chart values, and review release history. * **Custom tools** — Any [custom MCP servers](/ai/tools#custom-mcp-servers) and integrations connected to your cluster. See [Tools & Custom MCP Servers](/ai/tools) for the full picture. ## Streaming and cancelling Responses stream in as they are generated, with an indicator while the assistant is thinking. If a response is heading in the wrong direction, use **Cancel** to stop it immediately and refine your prompt. Each message offers quick actions — copy, retry, and edit & resend — plus feedback controls, and code blocks have their own copy button. ## Permissions The assistant operates under the same permissions as the logged‑in user. If your role grants **View** access to specific namespaces, the chat can only query resources in those namespaces. It never exposes data beyond what you are authorized to see. ## Token usage Chat conversations count toward the token limits of the model in use. A usage indicator shows how much of the budget has been consumed. Once a limit is reached, further messages are queued until it resets. See [token and budget limits](/ai/setup#token-and-budget-limits). ## Session persistence Chat sessions are preserved across page reloads and browser refreshes, scoped to your user and the current organization, cluster, and workspace. You can close the chat, navigate elsewhere, and return to an ongoing conversation without losing context. # mogenius MCP Server Source: https://docs.mogenius.com/ai/mcp-server Connect external AI tools and IDEs to your mogenius cluster through the mogenius Model Context Protocol (MCP) server. mogenius exposes its own **Model Context Protocol (MCP) server**, so external AI‑powered tools — such as IDE assistants, Claude Desktop, or custom automations — can interact with your Kubernetes cluster through the same AI infrastructure that powers [Agents](/ai/agents) and [Chat](/ai/chat). This is the **outbound** direction: external clients connect **to** mogenius. To connect external tools **to your agents** (for example a GitHub or GitLab MCP server), see [Tools & Custom MCP Servers](/ai/tools#custom-mcp-servers) instead. ## Authentication & permissions Access to the mogenius MCP server requires a valid **API key** generated in the platform. Each API key is tied to a specific user and inherits that user's workspace permissions. This means: * The MCP client can only access namespaces and resources the API key owner is permitted to view or manage. * You can create separate API keys per workspace, each scoped to that workspace's resources and permissions. * API keys can be revoked at any time from the platform settings. You can create an API key from the settings of a **Cluster** or **Workspace**. ## Connecting a client Add the mogenius MCP server to your client's configuration. The exact steps depend on the tool, but typically you edit a local config file that lists the client's MCP servers. Replace the endpoint and API key to match your setup. ### Claude Desktop For remote MCP servers, Claude uses Connectors. mogenius is not yet available as a Connector, but you can configure it as a local MCP server. Adapt the following and add it to your `claude_desktop_config.json`: ```json theme={null} "mcpServers": { "mogenius": { "command": "PATH-TO-YOUR-NODE-INSTALLATION/.nvm/versions/node/v23.3.0/bin/npx", "args": [ "-y", "mcp-remote", "https://platform-api.mogenius.com/mcp", "--header", "Authorization: bearer YOUR-MOGENIUS-API-KEY" ], "env": { "PATH": "PATH-TO-YOUR-NODE-INSTALLATION/.nvm/versions/node/v23.3.0/bin:/usr/local/bin:/opt/homebrew/bin:/usr/bin:/bin" } } } ``` ### Cursor In the Cursor Desktop app, open **Settings** and go to **Tools & MCP**. Add a new MCP server — Cursor opens your `mcp.json`, where you can add the mogenius server: ```json theme={null} { "mcpServers": { "mogenius": { "type": "streamable-http", "url": "https://platform-api.mogenius.com/mcp", "headers": { "Authorization" : "bearer YOUR-MOGENIUS-API-KEY" } } } } ``` ## Tools & capabilities The mogenius MCP server exposes the same tools available to agents and chat, so external clients can perform cluster operations through natural language or structured requests. ### Kubernetes * List and describe Pods, Deployments, Services, ConfigMaps, and other resources. * Read Pod logs and events for troubleshooting. * Retrieve resource manifests and status information. * Inspect namespace‑level overviews. * Create and modify resources and workloads. ### Helm * List installed Helm releases across namespaces. * Inspect chart values and release configuration. * Review release history and rollback information. * Deploy Helm charts. ## Auditing MCP activity Requests made through the mogenius MCP server are recorded in the cluster [audit log](/cluster-management/audit-log) and tagged as MCP requests, so you can trace which actions were taken by external clients. # AI on mogenius Source: https://docs.mogenius.com/ai/overview Configurable AI agents, an interactive chat, and connectable models and tools — the AI capabilities built into your mogenius cluster. mogenius brings AI directly into your Kubernetes operations. Instead of a single fixed assistant, you get a **toolbox of configurable agents**, an interactive **chat**, and a shared foundation of **models** and **tools** that both build on. Everything runs against your own cluster through the mogenius operator and respects your existing roles and permissions. ## The building blocks * **Agents** — Configurable AI workers that watch your cluster and produce troubleshooting reports and actionable proposals. You can run the curated defaults, adapt them, or create your own. See [Agents](/ai/agents). * **Chat** — An interactive assistant for asking questions, investigating issues, and drafting manifests through natural language. See [Chat](/ai/chat). * **AI Models** — One or more language models (OpenAI, Anthropic, or any OpenAI‑compatible / Ollama endpoint) that power agents and chat. See [AI Models & Setup](/ai/setup). * **Tools** — Built‑in Kubernetes and Helm access, plus custom [MCP](https://modelcontextprotocol.io) servers you connect as additional agent tools. See [Tools & Custom MCP Servers](/ai/tools). All AI features require at least one connected AI model. If you haven't set one up yet, start with [AI Models & Setup](/ai/setup). ## Agents vs. Chat Both use the same models and tools, but serve different jobs: * **Agents** run **autonomously** — on a schedule, on cluster events, or on demand — and file their findings as **reports** you review and approve. Use them for continuous monitoring and remediation. * **Chat** is **interactive** — you drive the conversation in real time. Use it for ad‑hoc investigation, questions, and quick edits. ## Where to find it The AI features live under the **Agents** section in the platform: * **Cluster level** — cluster‑wide agents and reports across every namespace the operator manages. * **Workspace level** — the same view, scoped to the namespaces belonging to that workspace. Models, tools, and custom MCP servers are managed centrally under **Cluster Settings → AI** and shared across the whole cluster. ## Get started Add at least one AI model and mark a default. See [AI Models & Setup](/ai/setup). Use a curated default agent or configure your own scope, triggers, and tools. See [Agents](/ai/agents). Approve, reject, or apply the proposals your agents generate. See [Reports & proposals](/ai/agents#reports-and-proposals). Open the chat for interactive investigation. See [Chat](/ai/chat). # AI Models & Setup Source: https://docs.mogenius.com/ai/setup Connect one or more AI models, set a default, and configure token and budget limits for mogenius AI features. All AI features in mogenius — [Agents](/ai/agents) and [Chat](/ai/chat) — run on the AI models you connect to your cluster. You can register **several models** and choose which one is the default and which are available in chat. Models are managed centrally under **Cluster Settings → AI** and shared across the whole cluster. ## Connecting an AI model Open **Cluster Settings → AI** and add a model. Each model has the following fields: * **SDK** — The provider: **OpenAI**, **Anthropic**, or **Ollama**. Choose OpenAI for any OpenAI‑compatible endpoint. * **Model** — The model identifier. Pick from the list the provider returns; if none appear, check the endpoint and authentication. * **API URL** — The endpoint URL. Required for Ollama and for OpenAI‑compatible providers; the standard OpenAI and Anthropic endpoints are used by default otherwise. Any [OpenAI‑compatible API endpoint](https://bentoml.com/llm/llm-inference-basics/openai-compatible-api) works. * **API Key** — Authentication for the endpoint. Enter a key as plain text and mogenius stores it as a managed Kubernetes secret, or reference an existing secret. Ollama endpoints that require no authentication can be left without a key. After saving, mogenius validates the connection and the model becomes available to your cluster. You can add multiple models — for example a fast model for chat and a more capable model for agents. Each is stored as its own resource and can be edited, tested, or removed independently. ## Default and chat‑enabled models * **Default** — Mark one model as the cluster default. Agents that don't specify their own model, and new chat sessions, use it automatically. * **Chat enabled** — Toggle whether a model appears in the chat model picker. This lets you keep some models for agents only. ## Token and budget limits Limits are configured **per model**, so each model carries its own budget: * **Daily token limit** — The maximum tokens the model may consume per day across agents and chat (`0` = unlimited). Once reached, further work is queued until the limit resets. * **Token budget per run** — A per‑run cap on tokens (`0` = unlimited). Agents can override this in their own [budget settings](/ai/agents#budgets). * **Max tool calls per run** — A per‑run cap on how many tool calls the model may make. Agents can override this too. Each model shows its current usage, and you can **reset the usage** counter manually at any time. ## Testing and maintenance The model list provides administrative controls per model: * **Test** — Runs a connectivity probe against the endpoint and reports whether the model is reachable and correctly authenticated. A readiness badge reflects the current state. * **Reset usage** — Resets the recorded token usage for that model to zero. ## Next steps * Configure what your agents do in [Agents](/ai/agents). * Give agents extra capabilities in [Tools & Custom MCP Servers](/ai/tools). * Start an interactive session in [Chat](/ai/chat). # Tools & Custom MCP Servers Source: https://docs.mogenius.com/ai/tools Give agents and chat access to your cluster with built-in tools, and extend them with custom MCP servers and integrations. Tools are what let mogenius AI *do* things rather than just answer. Both [agents](/ai/agents) and [chat](/ai/chat) draw on the same set of tools: built‑in Kubernetes and Helm access, plus any custom [MCP](https://modelcontextprotocol.io) servers and integrations you connect. ## Built‑in tools These tools are always available once an AI model is configured. Agents enable them per agent; chat uses them automatically. * **Kubernetes** — Query and inspect resources (Pods, Deployments, Services, ConfigMaps, events), read logs, describe resources, and retrieve manifests. With write access in scope, agents can also create and modify resources. * **Helm** — List releases, inspect chart values, review release history, and install or upgrade releases in scope. During an agent run or chat conversation, tool usage is shown so you can see which tools are being used to reach an answer. ## Custom MCP servers The [Model Context Protocol (MCP)](https://modelcontextprotocol.io) is an open standard for connecting AI models to external tools. mogenius lets you register **custom MCP servers** and expose their tools to your agents — for example a GitHub, GitLab, or Atlassian server, or your own internal tooling. Custom MCP servers are managed centrally under **Cluster Settings → AI**, alongside your models. Define a server once and reference it from any number of agents. ### Adding an MCP server Each MCP server has the following configuration: * **Display name & description** — A name for the server and a short note on what its tools are for. The description helps the agent decide when to use it. * **Transport** — How mogenius connects to the server: **Streamable HTTP** (recommended) or **SSE**. Local `stdio` servers are not supported. * **URL** — The server endpoint. Required. * **Authentication** — One of **None**, **Bearer token**, or **API key**. For bearer/API‑key auth, enter the token (stored as a managed secret) or reference an existing secret; the API‑key header defaults to `X-Api-Key` and can be customized. * **Allowed tools** — An optional allowlist restricting which of the server's tools agents may use. Leave empty to expose all discovered tools. * **Headers** — Optional additional request headers. Once connected, mogenius discovers the server's tools and shows a readiness state, the number of available tools, and when it last connected. ### Assigning MCP servers to an agent In an agent's [Tools configuration](/ai/agents#tools), select the MCP servers it may use. The agent then has access to the tools those servers expose (filtered by each server's allowlist). The agent detail page shows the connected tools as tags. ## GitHub & memory repository mogenius also supports connecting a **GitHub** account and a **memory repository** as chat integrations, configured under **Cluster Settings → AI**: * **GitHub** — Provide a personal access token so the assistant can look up source code, configuration, and CI/CD pipelines in your linked repositories and cross‑reference them with cluster state. * **Memory repository** — A GitHub repository the assistant uses to read and write long‑term context, so it can recall recurring issues, environment‑specific quirks, and team conventions over time. You can use an [agents.md](https://agents.md/) file to provide organization‑specific guidance. For connecting external clients such as Cursor or Claude Desktop **to** mogenius — rather than connecting tools **to** your agents — see the [mogenius MCP Server](/ai/mcp-server). # Clusters & contexts Source: https://docs.mogenius.com/cli/clusters-and-contexts List every reachable cluster and target a mogenius platform cluster or a local kubeconfig context `mocli` reaches a cluster either through the mogenius platform or straight through your kubeconfig. A **context** stores which cluster you are pointed at (plus a default namespace) so that resource commands run without re-selecting it every time. ## List every reachable cluster `get-contexts` shows the mogenius clusters of every organization you belong to **and** the contexts in your kubeconfig, in one table. The active one is marked with `*`. ```bash theme={null} # Both sources side by side mocli config get-contexts # kubeconfig contexts only mocli config get-contexts --direct ``` mogenius clusters are only listed when you are already logged in — `get-contexts` never opens a browser. A kubeconfig is read regardless of login. ## Set your context ```bash theme={null} # Interactive setup — pick a platform cluster (org + cluster + default namespace) mocli config use-context # Non-interactive platform cluster mocli config use-context --org acme --cluster prod -n acme-staging # Pin a kubeconfig context (direct access) mocli config use-context --context kind-dev # Use a specific kubeconfig file mocli config use-context --kubeconfig ~/clusters/dev.yaml --context dev # Show what you are currently pointed at mocli config current-context # List available organizations and clusters (platform) mocli config list ``` The context is stored locally and used by all resource commands. You can override it per command with the flags below. ## Connection flags These flags work on any command and select the connection for that invocation: | Flag | Meaning | | - | - | | `--kubeconfig ` | Path to a kubeconfig file (implies direct access) | | `--context ` | kubeconfig context to use (implies direct access) | | `--direct` | Use the kubeconfig's current-context | | `--platform` | Force the mogenius connection even if a direct one is saved | | `--org`, `--cluster`, `-n` | Override the platform organization, cluster, and namespace | ## kubeconfig resolution Direct access follows standard kubeconfig resolution: `$KUBECONFIG` first, then `~/.kube/config`, including multi-file merging. `exec` credential plugins work out of the box — for example `aws eks get-token` or `gke-gcloud-auth-plugin` — so cloud clusters authenticate exactly as they do with `kubectl`. `mocli cluster connect` (registering a cluster with the platform and installing the operator) is a platform action and has no meaning on a direct kubeconfig connection. See [Installing the mogenius operator](/cluster-management/installing-the-mogenius-operator). # CLI commands Source: https://docs.mogenius.com/cli/commands kubectl-style verbs for scripting and automation with mocli In addition to the [Terminal UI](/cli/terminal-ui), `mocli` provides kubectl-style CLI commands for scripting and automation. They run against your active [context](/cli/clusters-and-contexts) and accept the same connection flags (`--org/--cluster/-n`, `--context`, `--kubeconfig`, `--direct`, `--platform`). ## Listing and getting resources ```bash theme={null} # List all pods in a namespace mocli get pods -n acme-staging # Get a specific resource mocli get deployment my-app -n acme-staging # Output as YAML or JSON mocli get configmap my-config -n acme-staging -o yaml mocli get secret db-credentials -n acme-staging -o json # Wide output with additional columns mocli get pods -n acme-staging -o wide # List cluster-scoped resources mocli get crd mocli get namespaces ``` `mocli list` is an alias for `mocli get` when listing all resources of a kind: ```bash theme={null} mocli list pods -n acme-staging mocli list cronjobs -n acme-staging ``` ## Describing resources Show a detailed, human-readable view of a resource — its spec, status, and recent events: ```bash theme={null} mocli describe pod my-pod-abc123 -n acme-staging mocli describe deployment my-app -n acme-staging ``` ## Creating resources Create resources from manifest files or directly via CLI: ```bash theme={null} # Create from a YAML manifest (supports multi-document files) mocli create -f manifest.yaml -n acme-staging # Create a namespace mocli create namespace acme-staging # Create a Job with a container image mocli create job db-migration --image=postgres:15 -n acme-staging # Create a Job with a custom command mocli create job db-migration --image=postgres:15 -n acme-staging -- pg_dump -h db # Create a Job from a CronJob template (trigger a one-off run) mocli create job --from=cronjob/nightly-backup -n acme-staging ``` ## Applying resources Apply a manifest with create-or-update semantics — resources that don't exist yet are created, and resources that already exist are updated in place. Applying the same manifest twice is safe (idempotent): ```bash theme={null} mocli apply -f deployment.yaml -n acme-staging mocli apply -f manifests.yaml -n acme-staging ``` Unlike `mocli create`, which fails when a resource already exists, `mocli apply` reconciles the cluster to match your manifest — making it the safer choice for repeatable deployments and CI/CD pipelines. ## Editing resources Open a resource in your editor and apply the changes on save (uses `$KUBE_EDITOR` or `$EDITOR`): ```bash theme={null} mocli edit deployment my-app -n acme-staging mocli edit configmap my-config -n acme-staging ``` ## Scaling and restarting workloads ```bash theme={null} # Scale a deployment mocli scale deployment my-app --replicas=3 -n acme-staging # Roll out a fresh set of pods (restart) mocli rollout restart deployment my-app -n acme-staging ``` ## Resource usage Show CPU and memory usage for pods and nodes: ```bash theme={null} mocli top pod -n acme-staging mocli top node ``` On a direct kubeconfig connection, `top` and pod CPU/RAM columns require a [metrics-server](https://github.com/kubernetes-sigs/metrics-server) on the cluster. ## Deleting resources ```bash theme={null} # Delete a specific resource (prompts for confirmation) mocli delete pod my-pod-abc123 -n acme-staging mocli delete job db-migration -n acme-staging # Skip confirmation prompt mocli delete pod my-pod-abc123 -n acme-staging -y # Delete resources defined in a manifest mocli delete -f manifest.yaml ``` ## Shell access Open an interactive shell in a running container: ```bash theme={null} # Shell into a pod (uses first container if multiple) mocli shell my-pod -n acme-staging # Specify a container mocli shell my-pod -c app -n acme-staging ``` `mocli exec` is an alias for `mocli shell`. ## Viewing logs Stream or fetch logs from pods and jobs: ```bash theme={null} # View logs from a pod mocli logs my-pod -n acme-staging # View logs from a specific container (multi-container pods) mocli logs my-pod -c app -n acme-staging # Stream logs in real-time mocli logs my-pod -f -n acme-staging # View logs from a Job (automatically finds the pod) mocli logs job/db-migration -n acme-staging ``` ## Waiting for conditions Wait for a resource to reach a specific condition — useful in CI/CD pipelines: ```bash theme={null} # Wait for a Job to complete mocli wait job/db-migration --for=condition=complete -n acme-staging # With a timeout mocli wait job/db-migration --for=condition=complete --timeout=10m -n acme-staging # Wait for a Pod to be ready mocli wait pod/my-pod --for=condition=ready -n acme-staging # Wait for a resource to be deleted mocli wait pod/my-pod --for=delete -n acme-staging ``` **Supported conditions:** * `condition=complete` — Job completed successfully * `condition=failed` — Job failed * `condition=ready` — Pod is ready * `delete` — Resource has been deleted ## Shell autocompletion `mocli` can complete commands, flags, and even live resource names, namespaces, and kinds directly in your shell. The quickest way is to let `mocli` detect your shell and set everything up automatically: ```bash theme={null} mocli completion install ``` This adds a source line to your shell's config file (`~/.zshrc`, `~/.bashrc`) or writes a completion file for fish (`~/.config/fish/completions/`). The command is idempotent — running it twice does nothing. Restart your shell or re-source the config file to activate it. To set it up manually, generate the completion script for your shell: ```bash theme={null} mocli completion zsh mocli completion bash mocli completion fish mocli completion powershell ``` Autocompletion is dynamic: when you tab-complete a resource name, namespace, or kind, `mocli` queries your active context live — so you get the real names from your cluster, not just static command names. ## Version ```bash theme={null} mocli version ``` # Installation Source: https://docs.mogenius.com/cli/installation Install mocli, sign in for platform features, and configure self-hosted or API-key access ## Install ### Mac, Linux Use [homebrew](https://brew.sh) to install `mocli`: ```bash theme={null} brew tap mogenius/mocli brew install mocli ``` On Linux with a headless machine, `mocli login` requires a browser for the initial login. After the first login, your session persists locally. ### Windows ```bash theme={null} scoop bucket add mocli https://github.com/mogenius/homebrew-mocli scoop install mocli ``` ## Login (optional) Signing in to mogenius is **optional** — you only need it for the platform features (organizations, workspaces, operator-connected clusters, tunnels). Working against a local kubeconfig needs no login. To use platform features, authenticate once. Your browser opens automatically to complete the login: ```bash theme={null} mocli login ``` Your session is stored locally, so you only need to log in once per machine. ```bash theme={null} # Log out again mocli logout ``` ## Self-hosted instances By default, `mocli` connects to the mogenius cloud at `app.mogenius.com`. If you run a self-hosted mogenius platform, point `mocli` at your own instance by editing its configuration file. The config file lives at: | OS | Path | | - | - | | Mac, Linux | `~/.mocli/config.yaml` | | Windows | `%USERPROFILE%\.mocli\config.yaml` | Replace the endpoints in the `services` block with the URLs of your self-hosted deployment: ```yaml theme={null} services: api: "https://platform-api.mogenius.example.com/" user: "https://platform-user.mogenius.example.com/" platform: "https://app.mogenius.example.com/" ws: "wss://k8s-cmd-stream.mogenius.example.com" socket: "https://platform-ws.mogenius.example.com" ``` All five endpoints refer to the same self-hosted instance. Ask your platform administrator for the exact hostnames if you are unsure — they follow the DNS scheme configured during installation. `mocli` must be able to reach these endpoints over the network from the machine it runs on. In restricted environments where the platform is only reachable from inside a managed desktop or jump host (for example via a VDI or bastion), run `mocli` there rather than on your local machine. ## API-key authentication For automated pipelines — or locked-down environments where the browser callback used by `mocli login` is blocked — authenticate with an API key instead. It needs no local callback server: ```bash theme={null} # API-key login mocli login --api-key mo_pat: # Or via environment variable export MOGENIUS_API_KEY=mo_pat: mocli login --api-key ``` Create the API key in your mogenius profile settings. The key is a single opaque token starting with `mo_pat:`. When `MOGENIUS_API_KEY` is set, `mocli` automatically uses API-key authentication. **CI/CD integration:** set the `MOGENIUS_API_KEY` environment variable in your pipeline and `mocli` picks it up automatically — no interactive step required. # Overview Source: https://docs.mogenius.com/cli/overview Manage Kubernetes clusters, resources, and workloads from your terminal with mocli — through the mogenius platform or straight through your kubeconfig `mocli` is the mogenius command-line tool. It ships an interactive Terminal UI (k9s-style navigation) and kubectl-style commands for scripting — browse resources, stream logs, open shells, and set up port-forwards, all from your terminal. ## Two ways to connect `mocli` reaches a cluster in one of two ways, and lists both side by side: * **mogenius platform** — clusters connected to your mogenius organization through the operator. Authentication is handled by the platform, so you get secure access to any connected cluster from anywhere without a local kubeconfig. * **Local kubeconfig (direct access)** — point `mocli` at a kubeconfig context and go. No operator, no `mocli login` required. Standard kubeconfig resolution applies, including `exec` credential plugins like `aws eks get-token`. You choose the connection when you set your context or with connection flags — see [Clusters & contexts](/cli/clusters-and-contexts). ## What works where Features a plain kubeconfig connection cannot provide are hidden rather than failing when you reach for them. | Capability | mogenius | kubeconfig | | - | :-: | :-: | | Browse, describe, edit and delete resources | ✅ | ✅ | | Logs, shell, port-forward | ✅ | ✅ | | Organizations and workspaces | ✅ | — | | Public tunnel URLs | ✅ | local only | | RBAC-enforced access without handing out a kubeconfig | ✅ | — | | `mocli ssh-proxy` / `setup-ssh` | ✅ | — | | Operator install and upgrade (`mocli cluster connect`) | ✅ | — | | Pod CPU/RAM columns | ✅ | needs metrics-server | | Server-side search and sorting | ✅ | done locally | ## Get started Install `mocli`, sign in (optional), and configure self-hosted or API-key access. List every reachable cluster and pick a platform cluster or a kubeconfig context. Launch `mocli tui` for a full-screen, k9s-style view of your cluster. kubectl-style verbs for scripting and automation. # Port forwarding Source: https://docs.mogenius.com/cli/port-forwarding Create secure TCP tunnels to Kubernetes workloads from the terminal with mocli Use the CLI to create TCP tunnels to Kubernetes workloads: ```bash theme={null} mocli port-forward -n -k -w -p : ``` Supported resource kinds: `Pod`, `Service`, `Deployment`, `StatefulSet`, `DaemonSet` ## Examples ```bash theme={null} # Forward to a Service mocli port-forward -n production -k Service -w postgres -p 5432:5432 # Forward to a Deployment mocli port-forward -n staging -k Deployment -w api-server -p 8080:8080 # Forward to a specific Pod mocli port-forward -n default -k Pod -w my-pod-abc123 -p 3000:3000 ``` ## Flags | Flag | Description | | - | - | | `-n, --namespace` | Kubernetes namespace (required) | | `-k, --kind` | Resource kind (required) | | `-w, --name` | Workload name (required) | | `-p, --port` | Port mapping `LOCAL:REMOTE` (required) | The tunnel remains active while the CLI process runs. Press `Ctrl+C` to terminate. On a mogenius platform connection, port-forwards are tunnelled through the platform with full RBAC enforcement and can be exposed as public tunnel URLs. On a direct kubeconfig connection, forwards are local only. See [Tunnels](/workspaces/tunnels). # Terminal UI Source: https://docs.mogenius.com/cli/terminal-ui Browse and manage your resources in a full-screen, k9s-style interface with mocli tui Launch the interactive Terminal UI to browse and manage your resources: ```bash theme={null} mocli tui ``` The TUI provides a visual interface for navigating your clusters and Kubernetes resources. It works against both a mogenius platform cluster and a local kubeconfig context — on a platform connection you additionally navigate through organizations and clusters. All keybindings are displayed at the bottom of each screen. ## Navigation The TUI follows a hierarchical navigation pattern. On a platform connection this starts at the organization; a direct kubeconfig connection has no org/cluster hierarchy above the cluster. **Organization → Cluster → Namespace → Resources** | Key | Action | | - | - | | Arrow keys | Move up/down | | `Enter` | Select / drill down | | `Esc` | Go back | | `q` | Quit | | `/` | Filter list | | `:` | Command mode (switch resource types, including CRDs) | ## Browsing resources Once you select a namespace, you'll see a list of Pods by default. Use command mode (`:`) to switch between resource types: * `:pods` or `:po` — Pods * `:deployments` or `:deploy` — Deployments * `:services` or `:svc` — Services * `:statefulsets` or `:sts` — StatefulSets * `:daemonsets` or `:ds` — DaemonSets * `:jobs` — Jobs * `:cronjobs` or `:cj` — CronJobs * `:configmaps` or `:cm` — ConfigMaps * `:secrets` — Secrets * `:ingresses` or `:ing` — Ingresses The TUI also supports custom resources (CRDs) — type the resource name in command mode to browse any resource type available in your cluster. ## Viewing logs Select a Pod and press `Enter` to view its logs in real-time. If the Pod has multiple containers, you'll be prompted to select one. | Key | Action | | - | - | | `PgUp` / `PgDn` | Scroll through logs | | `s` | Toggle autoscroll | | `w` | Toggle word wrap | | `Esc` | Return to resource list | ## Port forwarding From the logs view or resource list, press `t` to create a port-forward tunnel to the selected Pod. Enter the port mapping (e.g., `8080:80`) and the tunnel will be established. Active tunnels persist while the TUI is running. Press `Esc` from the port-forward view to return to browsing while keeping tunnels open. See [Port forwarding](/cli/port-forwarding) for the scriptable CLI equivalent. ## Shell access Select a Pod and press `x` to open an interactive shell session in the container. If the Pod has multiple containers, you'll be prompted to select one. On a platform connection the shell session is tunnelled through the mogenius platform — no local kubeconfig or direct cluster access required. # Active cluster sync Source: https://docs.mogenius.com/cluster-management/active-cluster-sync Use Active Cluster Sync to synchronize Kubernetes workloads with Git. This feature is currently in closed beta. [Contact us](mailto:support@mogenius.com) if you're interested in Active Cluster Sync. With Active Cluster Sync, you can use the mogenius operator to synchronize a Kubernetes cluster with a Git repository. Once activated, all Kubernetes workloads will be stored and updated in the repository as YAML files. The sync strategy setting allows you to synchronize workloads across multiple Kubernetes clusters. This feature is highly useful for several scenarios: * **Backup and Failover:** Create a hot backup of a Kubernetes cluster that always mirrors the exact state of your production cluster. If there is an incident with your primary cluster, you can fail over to the backup to minimize downtime. * **Kubernetes Migration:** When you need to migrate a Kubernetes cluster from one provider or data center to another, you can quickly create a clone of your current cluster. This allows you to test all workloads in the new environment before fully transitioning your workflows to the new infrastructure. * **Bridging Location Limitations:** If regulations or data privacy laws require your organization to serve customers from specific locations where your current cloud provider does not have a data center, managing multiple providers can be costly and prone to errors. Active Cluster Sync provides a solution by maintaining a streamlined workflow for deploying and updating applications on your main infrastructure, while serving edge locations with replicas of your main setup. ## Configuration In your organization, navigate to the settings of your cluster and scroll down to the "Active Cluster Sync" section. Fill in the form fields as follows: * **Git repository URL**: Enter the URL of the repository to be used for synchronization (e.g., [https://github.com/yourorganization/syncrepo.git](https://github.com/yourorganization/syncrepo.git)). * **Git branch**: Specify the branch that should be targeted for the sync. * **PAT**: Enter a Personal Access Token that has access to the defined repository. The token must have permissions to add and change the contents of the repository. * **Sync strategy**: More details below. * **Ignored namespaces**: List the namespaces that won’t be synchronized by the operator. ## Sync strategy The sync strategy setting determines the synchronization behavior of the operator on your Kubernetes cluster: * **None**: This is the default setting where no synchronization is enabled. Use this setting if you have previously applied a sync strategy and wish to stop the synchronization. * **Push**: This strategy pushes all workloads to the repository and updates them if changes on the cluster are detected. Manual changes to the YAML files stored in the repository will be overwritten. For the initial synchronization, an empty repository is required; otherwise, the initial sync will be canceled. * **Pull**: This strategy pulls workloads from the repository and applies them to your Kubernetes cluster. Any changes on the cluster that differ from the YAML files stored in Git will be overwritten. * **Push & Pull**: This setting combines both strategies, enabling bi-directional synchronization. Changes on Kubernetes will be pushed to the repository, and changes in Git will be pulled to the cluster. This excludes changes applied by the sync workflow itself to avoid infinite loops. The operator will monitor changes and apply the configured sync strategy every 10 seconds. All sync activities are logged by the operator's pod. To view the log, navigate to Workloads > Pods in your cluster and open the pod named mogenius-k8s-manager. # Audit log Source: https://docs.mogenius.com/cluster-management/audit-log The audit log provides a streamlined history of all changes made through the mogenius platform on your cluster. It serves as a crucial tool for identifying the root cause of failures and is an essential component for maintaining compliance in regulated environments through fully audited workflows. ## How Does It Work? The audit log captures all changes performed via the mogenius platform. Whenever a user creates, updates, or deletes a resource on your cluster using mogenius, a corresponding entry is generated in the audit log. ## Logged Information Each audit log entry includes the following details (when applicable): * Type: The type of operation and resource, e.g., create/workload * Age: Timestamp for when the action occurred * Kind, Namespace, and Workspace: Details of the modified resource * User: The mogenius user who triggered the action * Diff: Shows a visual difference between the resource state before and after the change * Status: Indicates the result of the operation (e.g., success or error) You can click on each log item to view the full API payload, along with the diff and any errors that occurred during the operation. The audit log only tracks actions performed through the mogenius platform. Changes made directly on the cluster (e.g., using kubectl) are not logged. To ensure a fully auditable workflow, we recommend limiting direct access to your cluster and enabling user interactions exclusively through mogenius. # Cluster settings Source: https://docs.mogenius.com/cluster-management/cluster-settings Prepare a cluster in mogenius to connect with your own Kubernetes cluster. On the "Settings" tab in a cluster, you can manage metadata, baseline components, default hostnames for ingresses, and more. ## General Cluster Information Modify metadata information of your cluster for displaying purposes in your cluster overview. ## Loadbalancer If you're using an ingress controller, you can use this setting to define a default hostname that will be used when you expose a port on a deployment. Fill in the form fields to set up a default domain for your cluster: * Loadbalancer IPs: If an IngressController is running on your cluster, the external loadbalancer IP address of your cluster will usually be filled out automatically. If the IP is not set automatically, you can enter it manually. * Loadbalancer Host: Enter a hostname for your cluster. Each service on the cluster will be created under a subdomain of this hostname by default. Later, you can set individual domains in the settings of each service. ### Connecting your domain In your DNS settings, create two records of type A: | Type | Name (example) | Target | | - | - | - | | A | yourdomain.com | LOADBALANCER\_IP | | A | \*.yourdomain.com | LOADBALANCER\_IP | ## Platform config Under **Settings → Platform config** you can view and edit your cluster's [Platform Config](/cluster-management/platform-config) — the declarative tool stack (GitOps, ingress, certificates, monitoring, secrets, and more) that the operator keeps in sync. Every change you save is written back to the connected Git repository, and the GitOps engine applies it to the cluster. ## Blueprints To create applications and services on your cluster from pre-configured Helm charts, use [Blueprints](/deploying-applications/blueprints). Blueprints provide sensible defaults that you can review and customize before deploying, and support optional GitOps integration. Platform Config and Blueprints cover two distinct roles: the **Platform Config** manages the cluster's shared platform tool stack (the admin's job), while **Blueprints** create applications on top of it (what the user does). If you previously installed services through Cluster Services, they continue to work as standard Helm releases. No migration is needed. For new installations, use Blueprints instead. ## Reset cluster MFA-ID Use this option to reset the connection with your Kubernetes cluster. This is necessary if you're re-installing the operator on a Kubernetes cluster, as each connection between the mogenius platform and an operator is kept unique. ## Deleting a cluster Deleting a cluster will remove it from your organization together with all workspaces that were created on that cluster. The resources on Kubernetes aren't affected by this. Since workspaces are a CRD, they will reappear in your organization after reconnecting your cluster. # GitOps with Argo CD Source: https://docs.mogenius.com/cluster-management/gitops/argocd This page covers mogenius' **Argo CD**–based GitOps workflow. For the GitOps concept and help choosing between the two engines, see the [GitOps overview](/cluster-management/gitops/overview). The Argo CD path in mogenius is **UI-first**: you deploy through the mogenius UI, mogenius generates the Kubernetes manifests and commits them to your Git repository, and Argo CD syncs them to your cluster. mogenius installs and manages Argo CD (and Sealed Secrets) for you. **Here's how you can use that in your teams:** * Deploy containers to Kubernetes using the mogenius UI, without requiring deep Kubernetes knowledge. Then, add them to GitOps for deploying them to production-grade deployments. * Configure your applications once and then deploy them to additional environments for a staged development workflow. See [Multi-Environment Deployments](/deploying-applications/multi-environment-deployments) for a practical guide. * Backup all your manifests to recover your cluster state in case of an incident. ## How the Argo CD workflow works The Argo CD workflow in mogenius follows a UI-first approach. You don't need to write Kubernetes manifests manually — mogenius generates them for you. Here's the end-to-end flow: 1. **Deploy via the UI**: Use the mogenius UI to deploy applications through [container images](/deploying-applications/container-images), [pipeline starters](/deploying-applications/pipeline-starters), [Helm charts](/deploying-applications/helm-charts), or [Kubernetes manifests](/deploying-applications/kubernetes-manifests). 2. **Enable GitOps** on your cluster (see setup below). 3. **Create a GitOps application** that includes your deployments. 4. **Manifests are auto-generated**: mogenius automatically creates the Kubernetes manifests (`application.yaml`) for all selected resources and commits them to your Git repository. You do not need to write these manifests yourself. 5. **Changes sync through Git**: When you modify configurations in the mogenius UI (environment variables, health checks, scaling, etc.), the changes are committed to Git. ArgoCD then syncs the updated manifests to your cluster. This means you get the speed and simplicity of UI-based deployments combined with the reliability and auditability of Git-based infrastructure management. ## GitOps setup You can configure GitOps for each cluster. Navigate to **Clusters** in your organization and open the tab **GitOps**. Click the button to enable GitOps and open the configuration page. mogenius comes with a pre-configured stack for enabling GitOps consisting of two main applications: 1. ArgoCD: mogenius relies on the open-source project [ArgoCD](https://github.com/argoproj/argo-cd) as the GitOps engine. 2. Sealed Secrets: To securely synchronize secrets with Git, mogenius uses [Sealed Secrets](https://github.com/bitnami-labs/sealed-secrets) to encrypt secrets when transferring them to Git. The setup form uses defaults that should work out of the box. You can overwrite them to customize the installation. Already have ArgoCD and/or Sealed Secrets installed on your cluster? If possible, mogenius detects existing installations and updates the settings in the setup form. Check the default values and adjust them if they don't match your installation. Your applications on a cluster will be synced with a Git repository. mogenius supports both GitHub and GitLab as providers. To set up a GitHub repository, go to github.com and perform the following steps: * Create a new repository and make sure it has a branch. * Create a Personal Access Token. It requires at least `read/write` permissions on `Contents`. This way mogenius can commit changes on applications to the repository. If you want to use pull requests instead, make sure that the access token has `read/write` permissions for `Pull Requests` as well. Make sure to copy the PAT to a safe location. **Branch protection and direct commits:** If you enable branch protection rules on your repository (e.g., requiring pull request reviews), direct commits from the mogenius UI will fail with an error. In this case, you must use the pull request workflow instead. The mogenius UI provides buttons to create pull requests when saving changes to GitOps-managed resources. To set up a GitLab repository, go to gitlab.com (or your self-hosted GitLab instance) and perform the following steps: * Create a new repository (project) and make sure it has a branch. * Create a Personal Access Token. Navigate to **User Settings** → **Access Tokens** and create a new token. GitLab's fine-grained personal access tokens are currently in Beta. For reliable integration, use a **Personal Access Token (classic)** instead. The token requires the following scopes: * `read_user` — Read access to your user profile * `read_repository` — Read access to the repository * `write_repository` — Write access to the repository * `read_api` — Read access to the API * `api` — Full API access (required for write operations) Make sure to copy the token to a safe location before leaving the page. **Branch protection and direct commits:** If you enable branch protection rules on your repository (e.g., requiring merge request approvals), direct commits from the mogenius UI will fail with an error. In this case, you must use the pull request workflow instead. The mogenius UI provides buttons to create merge requests when saving changes to GitOps-managed resources. You can use the same repository for multiple clusters. Your applications will be managed using the following structure for folders and files:\ `your-repository/mogenius/CLUSTER/APPLICATION/application.yaml` Now, in your GitOps settings in mogenius, click **Connect repository** and follow the steps: * Enter a name for the repository. * Enter the Personal Access Token. * Your username and a dropdown to select your repository will load. In the dropdown, search for your GitOps repository and select it. * Set the commit behavior: By default, mogenius will commit changes directly on the branch of your application. Activate the toggle to create pull requests instead. * Save your settings to connect the repository. You can proceed with creating applications. ## Applications Your workloads and resources in Kubernetes are tracked in GitOps as applications. Each application consists of one or more resources. Typical examples for how applications can be defined: * A deployment for your container, plus Ingress, Service, and Secrets that are used by the deployment. * A platform deployment consisting of several microservices. You can create applications in your cluster settings as an admin, or within Workspaces. In your cluster, scroll to the bottom of your **GitOps** page. In a Workspace, navigate to the page **GitOps applications**. Click the button **Create application** to configure a new application. Here's how it works: * Enter a name for your application. This is how it will be displayed in mogenius and it will be added as a folder to your Git repository. * From the list of namespaces on your cluster, select the resources that you want to include in your application. You can select one namespace per application. Inside a namespace you can select all resources, or a selected list of resources. * Confirm to create your application. Your application is now added to the list, and mogenius automatically generates the Kubernetes manifests for all selected resources and stores them as `application.yaml` in your Git repository. It can take a few minutes until ArgoCD has synchronized it, and you'll see a loading animation in the meantime. Once it is synced, you'll see the status of your application and all included resources. ## Working with GitOps in mogenius When workloads or resources in your Workspaces are part of an application (i.e. managed via GitOps), a status object `Application` will be shown. This indicates the sync status of the directory and the application. If an error occurs, you can hover over the status to view the error message. ### Updating workloads You can continue using the mogenius UI to change configurations such as environment variables, resource limits, health checks, or YAML manifests on any resource. When saving changes, mogenius detects that GitOps is enabled for the resource and will update the corresponding `application.yaml` in Git. This follows the commit behavior defined in your cluster settings (direct commit or pull request). Changes are not applied directly to the cluster but will be synced by ArgoCD within a few minutes. You can monitor this sync using the Application status. ### GitOps log You can track the history and changes of your `application.yaml` using the **GitOps log**. It is available on any resource managed by a GitOps application and shows commits and pull requests. ## ApplicationSets ApplicationSets allow you to deploy applications from an external Git repository directly to your cluster using ArgoCD. Unlike standard Applications (which track mogenius-managed resources), ApplicationSets sync manifests that already exist in a Git repository — ideal for teams with existing Kubernetes configurations, Helm charts, or Kustomize overlays. **When to use ApplicationSets:** * You have existing Kubernetes manifests, Helm charts, or Kustomize overlays in Git * You want to deploy the same application to multiple environments from a single source * You're integrating mogenius with an existing GitOps workflow ### Creating an ApplicationSet Navigate to **Clusters → \[Your Cluster] → GitOps** and click **Create ApplicationSet**. * **ApplicationSet name**: A unique name for this ApplicationSet * **Repository**: Select a connected Git repository containing your manifests * **Branch**: The branch to sync from * **Path**: The directory containing your manifests (e.g., `apps/my-service/overlays/prod`) Choose how ArgoCD should interpret the contents of the path: | Source Type | Use When | Path Must Contain | | - | - | - | | **Directory** | Plain Kubernetes YAML manifests | `.yaml` or `.json` files | | **Helm** | Helm chart | `Chart.yaml` | | **Kustomize** | Kustomize overlay | `kustomization.yaml` | Depending on your source type, additional options are available: **For Helm sources:** * **Values Files**: Paths to values files (one per line, relative to chart directory). Files are applied in order — later files override earlier ones. **For Kustomize sources:** See [Kustomize configuration](#kustomize-configuration) below. Specify where ArgoCD should deploy resources if the manifests don't include a namespace. Leave empty to use the ArgoCD default namespace. Once created, the ApplicationSet appears in your GitOps overview. ArgoCD will sync the manifests from Git and deploy them to your cluster. The sync status shows whether the cluster state matches the Git repository. ### Kustomize configuration When using Kustomize as the source type, you can configure additional transformations that ArgoCD applies during deployment: | Option | Description | Example | | - | - | - | | **Kustomize Namespace** | Override the namespace in all manifests | `production` | | **Name Prefix** | Prepend a string to all resource names | `prod-` | | **Name Suffix** | Append a string to all resource names | `-v2` | | **Image Overrides** | Replace container images (one per line) | `nginx=my-registry/nginx:1.21` | | **Common Labels** | Add labels to all resources (key=value per line) | `env=production` | | **Common Annotations** | Add annotations to all resources | `owner=platform-team` | If both **Target Namespace** and **Kustomize Namespace** are set but differ, Kustomize Namespace takes precedence and overrides the namespace in your manifests before deployment. **Example: Deploying to production with Kustomize** For a production deployment with environment-specific settings: * **Path**: `apps/my-service/overlays/prod` * **Kustomize Namespace**: `production` * **Name Prefix**: `prod-` * **Image Overrides**: `my-app=ghcr.io/myorg/my-app:v2.1.0` * **Common Labels**: `app.kubernetes.io/env=production` ### Managing ApplicationSets ApplicationSets are listed alongside standard Applications in the GitOps overview. You can: * View the sync status and included resources * Delete an ApplicationSet (this removes the ArgoCD ApplicationSet but does not delete deployed resources by default) To update an ApplicationSet's configuration, delete it and create a new one with the updated settings. ## Argo CD Projects Argo CD Projects provide a way to organize applications and control access to cluster resources. When connecting a Git repository, you can assign it to a specific Argo CD Project. By default, mogenius creates a `mogenius` project for your applications. If you have existing Argo CD Projects on your cluster, you can select them when configuring a repository: 1. Navigate to **Clusters → \[Your Cluster] → GitOps** 2. When adding or editing a repository connection, use the **ArgoCD Project** dropdown to select the target project Projects are useful for: * Separating applications by team or environment * Applying different sync policies or access controls * Integrating with existing Argo CD setups that use project-based organization ## CI/CD integration with GitHub Actions For teams that want to combine CI/CD builds with GitOps-based deployment, mogenius provides GitHub Actions workflow templates in the [mogenius build-workflows repository](https://github.com/mogenius/build-workflows). These templates automate the process of building your container image and triggering the mogenius operator to update the deployment, which is then tracked and synced by GitOps. You can use these templates in two ways: * **Through Pipeline Starters**: The easiest approach — mogenius sets up the GitHub Actions workflow for you directly from the UI. See [Pipeline Starters](/deploying-applications/pipeline-starters) for details. * **Custom integration**: Use the workflow templates directly in your own CI/CD pipelines for more control over the build and deployment process. ## Working with Sealed Secrets When GitOps is enabled, secrets cannot be stored in Git as plain text — they would be exposed to anyone with repository access. mogenius uses [Sealed Secrets](https://github.com/bitnami-labs/sealed-secrets) to solve this: secrets are encrypted before being committed to Git, and only the Sealed Secrets controller running on your cluster can decrypt them. ### How secrets flow through GitOps When you create a Secret through the mogenius UI with GitOps enabled: 1. **You create a Secret** using the [Secrets & Configs](/deploying-applications/deployment-configuration#secrets-and-configmaps) page in your workspace 2. **mogenius encrypts it** using the Sealed Secrets controller's public certificate 3. **A SealedSecret is committed** to your Git repository (encrypted, safe to store in Git) 4. **ArgoCD syncs** the SealedSecret to your cluster 5. **The controller decrypts it** and creates a regular Kubernetes Secret that your pods can use This happens automatically — you work with secrets normally in the UI, and mogenius handles the sealing and Git commits. ### Creating secrets To create a secret that will be managed through GitOps: 1. Navigate to your workspace and open the **Secrets & Configs** page 2. Click **Create Secret** and enter your key-value pairs 3. Save the secret — mogenius creates the Secret in your cluster 4. Add the secret to a GitOps application to include it in Git sync Once the secret is part of a GitOps application, mogenius automatically seals it and commits the SealedSecret to your repository. The encrypted secret in Git is safe to store — only the Sealed Secrets controller on your cluster can decrypt it. ### Viewing secrets **In the mogenius UI:** The Secrets & Configs page shows all secrets in your workspace. You can view the keys (but not values) and see which deployments reference each secret. **Using mocli:** Use the [mogenius CLI](/cli/overview) to view secrets from your terminal: ```bash theme={null} # List secrets in a namespace mocli get secrets -n # View a secret's data (base64 encoded) mocli get secret -n -o yaml ``` You can also browse secrets interactively in the mocli TUI — launch `mocli`, navigate to your namespace, and type `:secrets` to switch to the secrets view. **What's in Git:** The SealedSecret in your repository contains encrypted data that is not human-readable. This is expected — it ensures secrets are safe even if your repository is compromised. # GitOps with Flux Source: https://docs.mogenius.com/cluster-management/gitops/flux mogenius integrates with [Flux](https://fluxcd.io), the CNCF GitOps engine. When Flux is installed on a cluster, mogenius **detects it automatically** and gives you a single place to operate it: monitor all Flux resources and their sync health, reconcile, suspend and resume them, and **edit the source manifests directly in Git** — with AI assistance for diagnosing and fixing broken resources. Unlike the [Argo CD path](/cluster-management/gitops/argocd), the Flux integration is **Git-first**: your desired state already lives in Git and is reconciled by Flux. mogenius does not generate manifests for you — it manages and edits the manifests you already have. ## Prerequisites and detection Flux must already be running on the cluster. You can install it yourself (for example with the Flux CLI) or via the [flux-operator](/deploying-applications/blueprints) blueprint. Once Flux is present, mogenius detects it and shows the Flux integration on the cluster's **GitOps** page (**Clusters → \[Your Cluster] → GitOps**). Monitoring and reconcile actions work immediately, with no additional setup. Editing manifests in Git is opt-in and requires [Git write access](#editing-manifests-in-git). **Mogenius-managed Flux install (private beta).** A managed installation path — where mogenius installs and configures Flux and your Git repositories for you via the platform configuration (`PlatformConfig`) — is available in **private beta**. Contact mogenius to have it enabled for your account. Without it, use your own Flux installation as described above; all features on this page work the same either way. ## Managing Flux resources The GitOps page lists all your Flux resources — Kustomizations, HelmReleases, Sources (GitRepository, OCIRepository, HelmRepository, Bucket), and, when present, Image Automation, ResourceSets, and Receivers. You can search and filter by ready state, see each resource's sync health and current revision, and spot resources that are failing or **behind** their source. Opening a resource shows its status, source, dependencies, applied inventory, revision history, conditions, and events, so you can understand why a resource is out of sync without leaving mogenius. For each resource you can trigger the standard Flux operations: * **Reconcile** — request an immediate reconciliation. * **Reconcile with source** — refresh the source first, then reconcile the workload. * **Force** — force a reconciliation (HelmRelease only). * **Suspend** / **Resume** — pause or resume reconciliation. These actions require the appropriate permissions (see [Permissions](#permissions)). ## Editing manifests in Git Because Flux reconciles from Git, mogenius lets you edit the **source manifest** that backs a resource and commit the change back to your repository — directly from the resource's manifest view. mogenius locates the file in the repo, so you don't have to. Editing is opt-in and disabled until Git write access is configured for the repository. ### Enable Git write access On the cluster **GitOps** page, open **Git write access** and enable editing for a repository. Paste a **personal access token** with write permission (and a username if required). Supported providers are **GitHub**, **GitLab**, and **Gitea**. mogenius validates the token against the provider before storing it. The token is stored as a Secret in the cluster's `mogenius` namespace — mogenius never stores your token itself. Removing the credential turns editing off again. Enabling write access requires the **cluster change** permission. Set how changes reach the repository, per repository: * **Pull Request** (default) — mogenius opens a branch and a pull request. Nothing is reconciled until the PR is merged. Use this when the tracked branch is protected. * **Direct commit** — mogenius commits straight to the tracked branch. Commits to a protected branch are rejected. If the write mode is declared in your platform configuration (`PlatformConfig`), that value takes precedence over the UI choice. mogenius never edits your `PlatformConfig` for you — a snippet is shown that you can commit to your own GitOps repository to declare the settings in Git. ### Edit and commit Open a resource's manifest, switch to the **Git** view, edit the YAML (or use **Fix with AI**), add a commit message, and commit. In Pull Request mode a PR is opened and linked; in direct-commit mode you can optionally reconcile right after the commit. Concurrent edits are protected — a save that is based on a stale version is rejected rather than overwriting someone else's change. ### When editing is blocked If a file can't be edited, mogenius explains why. Common reasons: no write credential, write disabled, an unsupported Git host, the file couldn't be located or matched unambiguously, a SOPS-encrypted manifest, or a Kustomization that renders overlays rather than mapping to a single file. ## AI-assisted fixes Broken Flux resources can be fixed with AI. **Fix with AI** proposes a corrected manifest as a reviewable diff — nothing is committed without you. The **Flux Doctor** agent watches your Flux resources and explains failed reconciliations. Both require a chat-enabled AI model on the cluster; see [Agents](/ai/agents) for details and setup. ## Permissions * Enabling Git write access and performing runtime actions require the **cluster change** permission. * **Workspace-scoped users** can act on a Flux resource only if it is **assigned to their workspace** — otherwise it is read-only. This rule is enforced in the UI and on the server. # GitOps Source: https://docs.mogenius.com/cluster-management/gitops/overview GitOps (short for Git Operations) describes a declarative way of managing applications in cloud-native environments using the Git workflow. Application configurations are stored and updated via Git repositories, and a GitOps engine running on the cluster tracks those repositories and keeps the cluster in sync with them. mogenius comes with a native GitOps integration that lets you implement GitOps in your teams, or integrate the mogenius platform with your existing GitOps stack. You can deploy workloads and resources to Kubernetes through the UI with mogenius Workspaces (see [Deploying Applications](/deploying-applications/overview)) and add GitOps as a layer of stability and control. **Here's how you can use that in your teams:** * Deploy containers to Kubernetes using the mogenius UI, without requiring deep Kubernetes knowledge. Then, add them to GitOps for production-grade deployments. * Configure your applications once and then deploy them to additional environments for a staged development workflow. See [Multi-Environment Deployments](/deploying-applications/multi-environment-deployments) for a practical guide. * Back up all your manifests to recover your cluster state in case of an incident. ## Two GitOps engines mogenius supports two GitOps engines. A cluster runs **one** engine, and mogenius detects which one is installed and shows it on the cluster's **GitOps** page. UI-first. mogenius installs and manages Argo CD (plus Sealed Secrets), **generates** your Kubernetes manifests, and commits them to Git. You start in the mogenius UI. Git-first, bring-your-own. Flux already runs on the cluster; mogenius **detects**, observes, and manages it, and lets you **edit the existing source manifests** from the UI. You start in Git. The two engines follow different workflows: * **Argo CD path** — UI-first. You deploy through the mogenius UI; mogenius generates manifests and commits them for you (Applications and ApplicationSets), and Argo CD syncs them to the cluster. mogenius installs and manages Argo CD and Sealed Secrets. * **Flux path** — Git-first. Flux is already installed on the cluster (self-installed or via the flux-operator). mogenius detects it, shows the status and all Flux resources, lets you reconcile, suspend, and resume them, and lets you edit the source manifests in Git — with AI assistance. ## How to choose * Choose **Argo CD** if you want mogenius to drive deployments from the UI and generate the manifests for you — ideal for teams that want GitOps without writing Kubernetes YAML by hand. * Choose **Flux** if you already run Flux (or standardize on it) and want mogenius to observe, manage, and help you edit your existing Flux setup from a single UI. Both engines give you the auditability and reliability of Git-based infrastructure management. Pick the one that matches how your team already works, then follow the matching guide: * [GitOps with Argo CD](/cluster-management/gitops/argocd) * [GitOps with Flux](/cluster-management/gitops/flux) # Installing the mogenius operator Source: https://docs.mogenius.com/cluster-management/installing-the-mogenius-operator Connect your own Kubernetes cluster by installing the mogenius operator on the cluster. mogenius allows you to connect with Kubernetes clusters by installing the mogenius operator on a cluster. Once installed, you can start creating workspaces and manage Kubernetes workloads through the mogenius platform. To begin the installation process, you'll first need to add a cluster in mogenius. ## Prerequisites To successfully complete the next steps, you will need the following: * A Kubernetes cluster. We recommend a managed Kubernetes service, like EKS (Amazon AWS), AKS (Microsoft Azure) or GKE (Google Cloud Platform), but any cluster with Kubernetes version 1.24 or higher will work. To get started, a local Kubernetes like Docker Desktop, k3s, or minikube is also a great option. * A working installation of `Helm` and `kubectl` * OR optionally the [mogenius CLI](/cli/installation) * Kubernetes cluster admin permissions ## Resource requirements The mogenius operator is deployed to your Kubernetes cluster using Helm. It will require at least 0.5 vCPU and 128 MB RAM. ## Add a cluster in mogenius In your organization open "Clusters" and select "Add cluster." Enter a display name for your cluster and confirm. This will create a management pane for a Kubernetes cluster in mogenius. It will not create an actual Kubernetes cluster. ## Set up your platform tool stack (optional) During onboarding you can optionally set up a [Platform Config](/cluster-management/platform-config) — a declarative tool stack (GitOps, ingress, certificates, monitoring, secrets, and more) that the operator installs and keeps in sync for you: 1. Connect a Git repository for the Platform Config. 2. Configure the components you want. If the repository has no Platform Config yet, mogenius loads a default for you to adjust; if one already exists, it is loaded so you can edit it. 3. Save. mogenius commits the `platformconfig.yaml` to the repository (directly or as a pull request). Once the operator is installed (next step), it installs the GitOps engine, which syncs the Platform Config to the cluster; the operator then reconciles it and creates the configured components. This step is optional. You can also connect a cluster with just the operator and add a Platform Config later. See [Platform Config](/cluster-management/platform-config) for the full component catalog and how to manage it. ## Install the operator mogenius connects to your Kubernetes cluster via an operator that you'll need to deploy on Kubernetes. In the next step you will have two options to do this: using Helm, or the mogenius CLI. ### Helm install Retrieve the Helm install command from the user interface and run it on a terminal. Make sure that your kubecontext is set to the right Kubernetes cluster. The command will look something like this. ```jsx title="mogenius operator Helm install" theme={null} helm repo add mogenius https://helm.mogenius.com/public helm repo update mogenius helm upgrade --install mogenius-operator mogenius/mogenius-operator -n mogenius --create-namespace --wait \ --set global.cluster_name="NAME" \ --set global.api_key="API_KEY" ``` ### mogenius CLI Install the mogenius CLI, on your terminal perform a `mocli login` and then run the following command. ```jsx" title="Installation via mogenius CLI" theme={null} mocli cluster connect ``` You'll be asked to confirm the organization, the cluster that you want to connect, and your current kubecontext before the operator is being deployed. ## Metrics server Once the operator is installed, it will check if a [metrics server](https://github.com/kubernetes-sigs/metrics-server) is present on the cluster. If not, it will be automatically installed. **That's it - your cluster is connected and you can now create workspaces!** ## Troubleshooting If you're encountering issues with installing the operator, check out common problems in the section [Troubleshooting clusters](./troubleshooting-clusters.md). ## Helm chart values The Helm chart for the mogenius operator supports a range of values that you can optionally adjust during the installation. Add them to the [Helm install command](https://docs.mogenius.com/documentation/cluster-management/installing-mogenius#helm-install) with `--set` . View the latest values on [Artifact Hub](https://artifacthub.io/packages/helm/mogenius/mogenius-k8s-manager#values). # Kubernetes workloads Source: https://docs.mogenius.com/cluster-management/kubernetes-workloads Manage your Kubernetes cluster with workloads and logs. An alternative to k9s and Lens, right from your mogenius platform. Once the mogenius operator is [installed](./installing-the-mogenius-operator) on Kubernetes you'll be able to access a workload manager through the platform. This allows you to view each Kubernetes resource, use the `Describe` command, edit YAML, view logs, and open a shell for containers that support this feature. To access the workload manager, open a cluster in mogenius and navigate to the tab "Workloads". # Managed clusters Source: https://docs.mogenius.com/cluster-management/managed-clusters Besides the options of connecting mogenius with your own Kubernetes clusters, we offer managed cluster for maximum simplicity and less overhead. These clusters are available on a range of cloud providers and they are fully managed up to the point that you can create projects and deploy services right away from mogenius. Here's some use cases where a managed cluster might be a good idea: * You don't have a cloud account yet and want a simple but scalable cloud environment * For isolated projects, prototyping, or MVPs, where you need to move fast without deep infrastructure requirements * For testing mogenius in your team before rolling it out on your own infrastructure ## Cloud providers We currently offer shared or dedicated clusters on these cloud providers: * [Google Cloud Platform](https://cloud.google.com/) * [Microsoft Azure](https://azure.microsoft.com) * [StackIT](https://stackit.de/) * [Plusserver](http://plusserver.com/) * [Hetzner](https://hetzner.com) ## Pricing We're working with fixed resources that will be added to your monthly subscription. The price for CPU, RAM and storage depends on the cloud provider and individual requirements that you might have. Service level agreements, and support times will be offered according to your requirements. [Contact us](mailto:sales@mogenius.com) if you're interested in learning more about managed clusters. We're happy to create a proposal for you. # Platform Config Source: https://docs.mogenius.com/cluster-management/platform-config Define and manage a cluster's platform tool stack declaratively through GitOps. The Platform Config is a declarative definition of your cluster's platform tool stack — the baseline components that every workload on the cluster relies on, such as GitOps, ingress, certificates, monitoring, and secrets. It lives in a Git repository as a single `PlatformConfig` resource, and mogenius keeps the cluster in sync with it through GitOps. Instead of installing and wiring these components by hand, you describe the tool stack you want and the operator reconciles the cluster to match. ## Components The Platform Config bundles the platform components you can enable and configure: * **GitOps engine** — keeps the cluster in sync with Git. Choose **Argo CD** (`gitOps.argocd`) or **Flux** (`gitOps.fluxcd`) — a cluster runs one engine — and configure the `repositories` it watches. See [GitOps](/cluster-management/gitops/overview) for how the two engines differ. * **kube-prometheus-stack** — metrics and dashboards with Prometheus, Grafana, and Alertmanager. Adjust individual charts through patches. * **Alloy** — collects logs and metrics from the cluster. * **Loki** — persistent log storage. Optional, disabled by default; enable it when you want logs retained on the cluster. * **Renovate operator** — automated dependency updates for your platform components. * **Traefik** — the ingress controller. Set service annotations, for example load-balancer provider annotations. * **external-dns** — automated DNS record management. Choose the provider (for example Cloudflare), reference the API-token secret, and set the domains it manages via `domainFilters`. * **cert-manager** — TLS certificates via Let's Encrypt. Define your `clusterIssuers` and `issuers`. * **external-secrets** — pulls secrets from an external vault. Configure the `vaults` to connect (for example 1Password). ## Managing the Platform Config You edit the Platform Config in the mogenius UI under **Cluster → Settings → Platform config**. Every change you save is written back to the Git repository, and the GitOps engine applies it to the cluster — so Git always reflects the current state of your platform. ## Example A `PlatformConfig` is a Kubernetes resource. Here is a shortened example with a few components enabled: ```yaml theme={null} apiVersion: mogenius.com/v1alpha1 kind: PlatformConfig metadata: name: platform spec: platformVersion: main gitOps: argocd: # or: fluxcd (a cluster runs one engine) enabled: true repositories: [] kubePrometheusStack: enabled: true patches: - name: grafana traefik: enabled: true certManager: enabled: true clusterIssuers: - name: letsencrypt-prod email: ops@example.com solvers: - http01: ingress: class: traefik ``` ## Platform Config vs. Blueprints Platform Config and [Blueprints](/deploying-applications/blueprints) serve two distinct roles: * **Platform Config** manages the **platform** — the shared tool stack of a cluster. This is the admin's job. * **Blueprints** create **applications** on top of that platform. This is what the user does. # Self hosted Source: https://docs.mogenius.com/cluster-management/self-hosted The mogenius platform is available as a SaaS option on [app.mogenius.com](https://app.mogenius.com). If you prefer the self-hosted version of mogenius, you can install it with our Helm chart. This way you can run mogenius on your own clusters and even in air-gapped environments. ## Prerequisites * A Kubernetes cluster with at least 1 CPU and 1 GB of memory available. * Credentials for pulling the mogenius images from the container registry (see below). * The traefik ingress controller. * A working local installation of [Helm](https://helm.sh/). * A MySQL server (optional). Running the platform as a self-hosted version requires a subscription. Contact our sales team for more information. ## Quickstart For a quick installation of the mogenius platform with defaults where possible, follow these steps. ### Create a Namespace On the cluster where you're installing the mogenius platform, create a new namespace `mogenius-platform`. All following commands target this namespace. ```bash theme={null} kubectl create namespace mogenius-platform ``` ### Create Secrets The platform services require a few secrets containing critical credentials that aren't created by the Helm chart. The following secrets are required for the minimum configuration. Additional secrets can be used when working with more sophisticated Helm chart configurations. The commands below create each secret directly with `kubectl`. They generate secure random values on the fly using `openssl`, so you can run them as-is and only replace the placeholders that are marked with `<...>`. The encryption key `MO_CORE_NEST__SSH_SYM_ENC_KEY` must be **identical** in the `mo-platform-shared` and `mo-platform-user-secret` secrets. The commands below generate it once into a shell variable and reuse it, so run them in the same terminal session. **1. Container Registry** After obtaining a subscription for the self-hosted version, you will have received credentials for the container registry where the platform images are stored. Store them as a `mo-registry-credentials` secret of type `kubernetes.io/dockerconfigjson`. Replace the placeholders with the values from your subscription. ```bash theme={null} kubectl create secret docker-registry mo-registry-credentials \ --namespace mogenius-platform \ --docker-server= \ --docker-username= \ --docker-password= ``` **2. Valkey (Redis-compatible)** Holds the password shared by all Valkey instances. The command generates a secure random value. ```bash theme={null} kubectl create secret generic mo-redis-secret \ --namespace mogenius-platform \ --from-literal=REDIS_SECRET="$(openssl rand -base64 32)" ``` **3. Encryption Key** Generate the symmetric encryption key once and keep it in a shell variable so it can be reused for the admin user secret in step 5. ```bash theme={null} export MO_ENC_KEY="$(openssl rand -base64 32)" kubectl create secret generic mo-platform-shared \ --namespace mogenius-platform \ --from-literal=MO_CORE_NEST__SSH_SYM_ENC_KEY="$MO_ENC_KEY" ``` **4. MySQL** Holds the application and root passwords for the MySQL database. The command generates secure random values. Avoid single quotes (`'`) and backslashes (`\`) in MySQL passwords — they break the MySQL container's init and cause *Access denied*. Use **alphanumeric passwords** (`A–Z`, `a–z`, `0–9`). The command below already generates compliant values. ```bash theme={null} kubectl create secret generic mo-mysql-secret \ --namespace mogenius-platform \ --from-literal=MYSQL_PASSWORD="$(LC_ALL=C tr -dc 'A-Za-z0-9' " \ --from-literal=MO_USER_NEST__SYSTEM_ADMIN_PASSWORD="" \ --from-literal=MO_CORE_NEST__SSH_SYM_ENC_KEY="$MO_ENC_KEY" \ --from-literal=MO_USER_NEST__JWT_PRIVATE="$(openssl base64 -A -in ec512-key-pair.pem)" \ --from-literal=MO_USER_NEST__JWT_PUBLIC="$(openssl base64 -A -in public.pem)" \ --from-literal=MO_USER_NEST__SESSION_SECRET="$(openssl rand -base64 32)" ``` The keys stored in this secret are: `MO_USER_NEST__SYSTEM_ADMIN_EMAIL` — the email address to log in with your admin user. `MO_USER_NEST__SYSTEM_ADMIN_PASSWORD` — the password for your admin user. `MO_CORE_NEST__SSH_SYM_ENC_KEY` — the same encryption key set in the `mo-platform-shared` secret. `MO_USER_NEST__JWT_PRIVATE` — the base64-encoded private key for signing JWTs. `MO_USER_NEST__JWT_PUBLIC` — the base64-encoded public key for verifying JWTs. `MO_USER_NEST__SESSION_SECRET` — a secure random secret for session handling. ### Prepare your values.yaml The Helm chart supports wide range of values that you can use to configure your installation of the mogenius platform. Skip to [values](/cluster-management/self-hosted#values) for a full reference of the chart. Below is an example `values.yaml` for a minimal setup to install the mogenius platform in a development environment. Make sure to review the configuration and ensure that it matches your infrastructure. ```yaml values.yaml quickstart example theme={null} ingress: annotations: cert-manager.io/cluster-issuer: letsencrypt-cluster-issuer traefik.ingress.kubernetes.io/forward-headers: "true" traefik.ingress.kubernetes.io/router.middlewares: mogenius-platform-cors-middleware@kubernetescrd traefik.ingress.kubernetes.io/secure-headers: "true" api_service_url: platform-api.YOURDOMAIN.com hostname: mogenius.YOURDOMAIN.com k8s_cmd_stream_url: k8s-cmd-stream.YOURDOMAIN.com k8s_dispatcher_url: k8s-dispatcher.YOURDOMAIN.com k8s_logs_url: k8s-logs.YOURDOMAIN.com k8s_websocket_url: k8s-ws.YOURDOMAIN.com rootDomain: YOURDOMAIN.com socket_service_url: platform-ws.YOURDOMAIN.com tls: - hosts: - mogenius.YOURDOMAIN.com - platform-api.YOURDOMAIN.com - platform-user.YOURDOMAIN.com - platform-ws.YOURDOMAIN.com - k8s-ws.YOURDOMAIN.com - k8s-logs.YOURDOMAIN.com - k8s-cmd-stream.YOURDOMAIN.com - k8s-dispatcher.YOURDOMAIN.com secretName: mo-platform-tls traefik: apiVersion: traefik.io/v1alpha1 user_service_url: platform-user.YOURDOMAIN.com mo_platform: metrics: enabled: true resources: requests: cpu: 10m memory: 50Mi mo_platform_api: enableAutoRefreshToken: true refreshTokenTask: true mo_platform_user: openid: enabled: false mogenius: imagePullSecrets: - mo-registry-credentials mysql: enabled: true ssl: false storage: accessMode: ReadWriteOnce className: local-path ``` This chart configuration deploys the MySQL Docker image as part of the platform deployment. This setup is not recommended for running the mogenius platform in production scenarios. We recommend configuring the `mysql` values with connection to a high-availability MySQL for use in a production environment. ### Deploy the Helm chart Run the following command on your cluster to install the Helm chart with your values.yaml. ```bash theme={null} helm repo add mogenius https://helm.mogenius.com/private helm install mogenius-platform mogenius/mo-infrastructure -n mogenius-platform -f values.yaml ``` ### Access the mogenius web interface Check the status of the installation and make sure all Pods are starting properly. ```bash theme={null} kubectl get pods -n mogenius-platform ``` When all Pods are `Running`, access the mogenius platform with the hostname you specified in your Ingress (e.g. mogenius.yourdomain.com). You can log in with the credentials of your admin user. ### Next steps Now that mogenius is up and running you can prepare the platform for your team. Check out the following resources as next steps: * [Quickstart guide](../overview/quickstart) for connecting your first cluster and getting started with Workspaces. * [Enable Single Sign-On](./single-sign-on) to enable your team joining the mogenius platform. * [Configure GitOps](/cluster-management/gitops/argocd) for enabling Git-based workflows in mogenius using Argo CD. ### Support Need help setting up the mogenius platform? Contact us via [support@mogenius.com](mailto:support@mogenius.com). ## Values ### Global Settings | Key | Type | Default | Description | | - | - | - | - | | stage | string | `"production"` | Current environment, one of \[dev, production] | | revisionHistoryLimit | int | `1` | Global revisionHistoryLimit for all resources | | progressDeadlineSeconds | int | `600` | Deployment progress deadline | | secrets | object | `{}` | secrets.``.``.`` | | dockersecrets | object | `{}` | Docker registry secrets | | mogenius.imagePullSecrets | list | `[]` | List of image pull secrets for mogenius images | | global.imagePullSecrets | list | `[]` | List of image pull secrets for all images | | global.serviceMonitor.fallbackScrapeProtocol | string | `"PrometheusText0.0.4"` | Fallback scrape protocol for service monitors | | global.podLabels | object | `{}` | Global pod labels applied to all pods | ### Ingress | Key | Type | Default | Description | | - | - | - | - | | ingress.rootDomain | string | `nil` | Root domain that the platform will be hosted on, e.g. example.com | | ingress.ingressClassName | string | `"traefik"` | Ingress class name | | ingress.annotations | object | See below | Annotations to be placed on the ingress | | ingress.tls | list | `[]` | Secret reference for TLS | | ingress.hostname | string | `nil` | Platform hostname e.g. app.example.com | | ingress.api\_service\_url | string | `nil` | API hostname e.g. api-app.example.com | | ingress.user\_service\_url | string | `nil` | User service hostname e.g. user-app.example.com | | ingress.socket\_service\_url | string | `nil` | WebSocket hostname e.g. ws-app.example.com | | ingress.k8s\_websocket\_url | string | `nil` | Kubernetes WebSocket hostname e.g. k8s-ws.example.com | | ingress.k8s\_logs\_url | string | `nil` | Kubernetes log hostname e.g. k8s-logs.example.com | | ingress.k8s\_cmd\_stream\_url | string | `nil` | Kubernetes cmd stream hostname e.g. k8s-cmd-stream.example.com | | ingress.k8s\_dispatcher\_url | string | `nil` | Kubernetes dispatcher hostname e.g. k8s-dispatcher.example.com | | ingress.traefik.apiVersion | string | `"traefik.containo.us/v1alpha1"` | The apiVersion that shall be used for traefik resources | Default ingress annotations: ```yaml theme={null} traefik.ingress.kubernetes.io/router.middlewares: mogenius-cors-middleware@kubernetescrd traefik.ingress.kubernetes.io/forward-headers: "true" traefik.ingress.kubernetes.io/secure-headers: "true" ``` ### Feature Toggles | Key | Type | Default | Description | | - | - | - | - | | features.sso.enabled | bool | `true` | Enable SSO feature with ingress for SSO wildcard domain | | features.sso.ingress.tls | list | `[]` | TLS configuration for SSO ingress | | features.sso.ingress.annotations | object | `{}` | Annotations for SSO ingress | | features.portForwarding.enabled | bool | `true` | Enable port forwarding feature | | features.portForwarding.hostname | string | `"tunnel.mogenius.com"` | Hostname for port forwarding | | features.portForwarding.ingress.tls | list | `[]` | TLS configuration for port forwarding ingress | | features.portForwarding.ingress.annotations | object | `{}` | Annotations for port forwarding ingress | ### Platform Services #### mo\_platform (Frontend) | Key | Type | Default | Description | | - | - | - | - | | mo\_platform.enabled | bool | `true` | Enable frontend service | | mo\_platform.replicas | int | `1` | Number of replicas | | mo\_platform.image.registry | string | `"ghcr.io"` | Image registry | | mo\_platform.image.repository | string | `"mogenius/mo-frontend"` | Image repository | | mo\_platform.image.tag | string | `"v2.8.3"` | Image tag | | mo\_platform.imagePullPolicy | string | `"IfNotPresent"` | Image pull policy | | mo\_platform.port | int | `8080` | Service port | | mo\_platform.resources | object | `{}` | Resource requests/limits | | mo\_platform.tolerations | object | `{}` | Pod tolerations | | mo\_platform.metrics.enabled | bool | `false` | Enable Prometheus metrics exporter for nginx | | mo\_platform.metrics.port | int | `9113` | Metrics port | | mo\_platform.metrics.serviceMonitor.enabled | bool | `false` | Enable ServiceMonitor | #### mo\_platform\_api (API Service) | Key | Type | Default | Description | | - | - | - | - | | mo\_platform\_api.enabled | bool | `true` | Enable API service | | mo\_platform\_api.replicas | int | `1` | Number of replicas | | mo\_platform\_api.image.registry | string | `"ghcr.io"` | Image registry | | mo\_platform\_api.image.repository | string | `"mogenius/mo-platform-api-service"` | Image repository | | mo\_platform\_api.image.tag | string | `"v4.4.6"` | Image tag | | mo\_platform\_api.imagePullPolicy | string | `"IfNotPresent"` | Image pull policy | | mo\_platform\_api.port | int | `1337` | HTTP port | | mo\_platform\_api.port\_tcp | int | `7000` | TCP port | | mo\_platform\_api.ws\_port | int | `7001` | WebSocket port | | mo\_platform\_api.ws\_log\_port | int | `7002` | WebSocket log port | | mo\_platform\_api.ws\_cmd\_stream\_port | int | `7003` | WebSocket cmd stream port | | mo\_platform\_api.refreshTokenTask | bool | `false` | If set to true will refresh the tokens in the database | | mo\_platform\_api.enableAutoRefreshToken | bool | `false` | Enable automatic token refresh | | mo\_platform\_api.resources | object | `{}` | Resource requests/limits | | mo\_platform\_api.tolerations | object | `{}` | Pod tolerations | | mo\_platform\_api.probes.enabled | bool | `true` | Enable health probes | | mo\_platform\_api.probes.port | int | `1337` | Probe port | | mo\_platform\_api.probes.livenessProbe.path | string | `"/core/status"` | Liveness probe path | | mo\_platform\_api.probes.readinessProbe.path | string | `"/core/status"` | Readiness probe path | | mo\_platform\_api.probes.startupProbe.path | string | `"/core/status"` | Startup probe path | | mo\_platform\_api.sshSymEncKey.secretName | string | `"mo-platform-shared"` | Secret name for SSH symmetric encryption key | | mo\_platform\_api.sshSymEncKey.secretKey | string | `"MO_CORE_NEST__SSH_SYM_ENC_KEY"` | Secret key for SSH symmetric encryption key | | mo\_platform\_api.initContainer.image.registry | string | `"docker.io"` | Init container image registry | | mo\_platform\_api.initContainer.image.repository | string | `"alpine/curl"` | Init container image repository | | mo\_platform\_api.initContainer.image.tag | string | `"8.20.0"` | Init container image tag | #### mo\_platform\_user (User Service) | Key | Type | Default | Description | | - | - | - | - | | mo\_platform\_user.enabled | bool | `true` | Enable user service | | mo\_platform\_user.replicas | int | `1` | Number of replicas | | mo\_platform\_user.image.registry | string | `"ghcr.io"` | Image registry | | mo\_platform\_user.image.repository | string | `"mogenius/mo-platform-user"` | Image repository | | mo\_platform\_user.image.tag | string | `"v2.0.17"` | Image tag | | mo\_platform\_user.imagePullPolicy | string | `"IfNotPresent"` | Image pull policy | | mo\_platform\_user.port | int | `1337` | HTTP port | | mo\_platform\_user.port\_ws | int | `7000` | WebSocket port | | mo\_platform\_user.resources | object | `{}` | Resource requests/limits | | mo\_platform\_user.tolerations | object | `{}` | Pod tolerations | | mo\_platform\_user.probes.enabled | bool | `true` | Enable health probes | | mo\_platform\_user.sshSymEncKey.secretName | string | `"mo-platform-shared"` | Secret name for SSH symmetric encryption key | | mo\_platform\_user.sshSymEncKey.secretKey | string | `"MO_CORE_NEST__SSH_SYM_ENC_KEY"` | Secret key for SSH symmetric encryption key | **OpenID Configuration:** | Key | Type | Default | Description | | - | - | - | - | | mo\_platform\_user.openid.enabled | bool | `true` | Enable OpenID | | mo\_platform\_user.openid.issuer | string | `"https://login-dev.mogenius.com"` | OpenID issuer URL | | mo\_platform\_user.openid.accessTokenLifetime | string | `"600"` | Access token lifetime in seconds | | mo\_platform\_user.openid.refreshTokenLifetime | string | `"7776000"` | Refresh token lifetime in seconds | | mo\_platform\_user.openid.adminAccessTokenLifetime | string | `"28800"` | Admin access token lifetime in seconds | | mo\_platform\_user.openid.provider.github.enabled | bool | `false` | Enable GitHub OAuth | | mo\_platform\_user.openid.provider.gitlab.enabled | bool | `false` | Enable GitLab OAuth | | mo\_platform\_user.openid.provider.google.enabled | bool | `false` | Enable Google OAuth | | mo\_platform\_user.openid.provider.linkedin.enabled | bool | `false` | Enable LinkedIn OAuth | | mo\_platform\_user.openid.provider.microsoft.enabled | bool | `false` | Enable Microsoft OAuth | #### mo\_platform\_websocket (WebSocket Service) | Key | Type | Default | Description | | - | - | - | - | | mo\_platform\_websocket.enabled | bool | `true` | Enable WebSocket service | | mo\_platform\_websocket.replicas | int | `1` | Number of replicas | | mo\_platform\_websocket.image.registry | string | `"ghcr.io"` | Image registry | | mo\_platform\_websocket.image.repository | string | `"mogenius/mo-platform-websocket"` | Image repository | | mo\_platform\_websocket.image.tag | string | `"v2.0.7"` | Image tag | | mo\_platform\_websocket.imagePullPolicy | string | `"IfNotPresent"` | Image pull policy | | mo\_platform\_websocket.port | int | `1337` | HTTP port | | mo\_platform\_websocket.port\_ws | int | `7000` | WebSocket port | | mo\_platform\_websocket.resources | object | `{}` | Resource requests/limits | | mo\_platform\_websocket.tolerations | object | `{}` | Pod tolerations | | mo\_platform\_websocket.sshSymEncKey.secretName | string | `"mo-platform-shared"` | Secret name for SSH symmetric encryption key | | mo\_platform\_websocket.sshSymEncKey.secretKey | string | `"MO_CORE_NEST__SSH_SYM_ENC_KEY"` | Secret key for SSH symmetric encryption key | #### mo\_platform\_notification (Notification Service) | Key | Type | Default | Description | | - | - | - | - | | mo\_platform\_notification.enabled | bool | `true` | Enable notification service | | mo\_platform\_notification.replicas | int | `1` | Number of replicas | | mo\_platform\_notification.image.registry | string | `"ghcr.io"` | Image registry | | mo\_platform\_notification.image.repository | string | `"mogenius/mo-platform-notification"` | Image repository | | mo\_platform\_notification.image.tag | string | `"v2.0.7"` | Image tag | | mo\_platform\_notification.imagePullPolicy | string | `"IfNotPresent"` | Image pull policy | | mo\_platform\_notification.port | int | `7000` | Service port | | mo\_platform\_notification.email.fromName | string | `"Mogenius Team"` | Email sender name | | mo\_platform\_notification.email.fromAddress | string | `"no-reply@mogenius.com"` | Email sender address | | mo\_platform\_notification.resources | object | `{}` | Resource requests/limits | | mo\_platform\_notification.tolerations | object | `{}` | Pod tolerations | | mo\_platform\_notification.sshSymEncKey.secretName | string | `"mo-platform-shared"` | Secret name for SSH symmetric encryption key | | mo\_platform\_notification.sshSymEncKey.secretKey | string | `"MO_CORE_NEST__SSH_SYM_ENC_KEY"` | Secret key for SSH symmetric encryption key | #### mo\_platform\_queue (Queue Service) | Key | Type | Default | Description | | - | - | - | - | | mo\_platform\_queue.enabled | bool | `true` | Enable queue service | | mo\_platform\_queue.replicas | int | `1` | Number of replicas | | mo\_platform\_queue.image.registry | string | `"ghcr.io"` | Image registry | | mo\_platform\_queue.image.repository | string | `"mogenius/mo-platform-queue"` | Image repository | | mo\_platform\_queue.image.tag | string | `"v3.0.4"` | Image tag | | mo\_platform\_queue.imagePullPolicy | string | `"IfNotPresent"` | Image pull policy | | mo\_platform\_queue.resources | object | `{}` | Resource requests/limits | | mo\_platform\_queue.tolerations | object | `{}` | Pod tolerations | | mo\_platform\_queue.sshSymEncKey.secretName | string | `"mo-platform-shared"` | Secret name for SSH symmetric encryption key | | mo\_platform\_queue.sshSymEncKey.secretKey | string | `"MO_CORE_NEST__SSH_SYM_ENC_KEY"` | Secret key for SSH symmetric encryption key | #### mo\_platform\_message\_dispatcher (Message Dispatcher) | Key | Type | Default | Description | | - | - | - | - | | mo\_platform\_message\_dispatcher.enabled | bool | `true` | Enable message dispatcher | | mo\_platform\_message\_dispatcher.replicas | int | `1` | Number of replicas | | mo\_platform\_message\_dispatcher.image.registry | string | `"ghcr.io"` | Image registry | | mo\_platform\_message\_dispatcher.image.repository | string | `"mogenius/mo-platform-message-dispatcher"` | Image repository | | mo\_platform\_message\_dispatcher.image.tag | string | `"v1.1.4"` | Image tag | | mo\_platform\_message\_dispatcher.imagePullPolicy | string | `"IfNotPresent"` | Image pull policy | | mo\_platform\_message\_dispatcher.listen\_host | string | `"0.0.0.0"` | Listen host | | mo\_platform\_message\_dispatcher.port | int | `7060` | Service port | | mo\_platform\_message\_dispatcher.resources | object | `{}` | Resource requests/limits | | mo\_platform\_message\_dispatcher.tolerations | object | `{}` | Pod tolerations | ### Valkey (Redis-compatible Cache) The platform uses [Valkey](https://valkey.io/), an open-source Redis-compatible in-memory data store, for caching and message queuing. The chart deploys multiple Valkey instances for different purposes. #### mo\_platform\_api\_valkey | Key | Type | Default | Description | | - | - | - | - | | mo\_platform\_api\_valkey.enabled | bool | `true` | Enable Valkey for API service | | mo\_platform\_api\_valkey.image.registry | string | `"docker.io"` | Image registry | | mo\_platform\_api\_valkey.image.repository | string | `"valkey/valkey"` | Image repository | | mo\_platform\_api\_valkey.image.tag | string | `"9.1.0"` | Image tag | | mo\_platform\_api\_valkey.imagePullPolicy | string | `"IfNotPresent"` | Image pull policy | | mo\_platform\_api\_valkey.port | int | `6379` | Service port | | mo\_platform\_api\_valkey.host | string | `"mo-platform-api-valkey"` | Service hostname | | mo\_platform\_api\_valkey.password.secretName | string | `"mo-redis-secret"` | Secret name for password | | mo\_platform\_api\_valkey.password.secretKey | string | `"REDIS_SECRET"` | Secret key for password | | mo\_platform\_api\_valkey.resources | object | `{}` | Resource requests/limits | | mo\_platform\_api\_valkey.metrics.enabled | bool | `false` | Enable Prometheus metrics exporter | | mo\_platform\_api\_valkey.metrics.port | int | `9121` | Metrics port | | mo\_platform\_api\_valkey.metrics.serviceMonitor.enabled | bool | `false` | Enable ServiceMonitor | #### mo\_valkey\_shared Shared Valkey instance used for queue processing and cross-service communication. | Key | Type | Default | Description | | - | - | - | - | | mo\_valkey\_shared.enabled | bool | `true` | Enable shared Valkey | | mo\_valkey\_shared.tls | bool | `false` | Enable TLS | | mo\_valkey\_shared.queue\_db | int | `7` | Database number for queue | | mo\_valkey\_shared.image.registry | string | `"docker.io"` | Image registry | | mo\_valkey\_shared.image.repository | string | `"valkey/valkey"` | Image repository | | mo\_valkey\_shared.image.tag | string | `"9.1.0"` | Image tag | | mo\_valkey\_shared.imagePullPolicy | string | `"IfNotPresent"` | Image pull policy | | mo\_valkey\_shared.port | int | `6379` | Service port | | mo\_valkey\_shared.host | string | `"mo-valkey-shared"` | Service hostname | | mo\_valkey\_shared.password.secretName | string | `"mo-redis-secret"` | Secret name for password | | mo\_valkey\_shared.password.secretKey | string | `"REDIS_SECRET"` | Secret key for password | | mo\_valkey\_shared.resources | object | `{}` | Resource requests/limits | | mo\_valkey\_shared.strategy | string | `"RollingUpdate"` | Update strategy | | mo\_valkey\_shared.metrics.enabled | bool | `false` | Enable Prometheus metrics exporter | | mo\_valkey\_shared.metrics.serviceMonitor.enabled | bool | `false` | Enable ServiceMonitor | #### mo\_websocket\_valkey | Key | Type | Default | Description | | - | - | - | - | | mo\_websocket\_valkey.enabled | bool | `true` | Enable Valkey for WebSocket service | | mo\_websocket\_valkey.image.registry | string | `"docker.io"` | Image registry | | mo\_websocket\_valkey.image.repository | string | `"valkey/valkey"` | Image repository | | mo\_websocket\_valkey.image.tag | string | `"9.1.0"` | Image tag | | mo\_websocket\_valkey.port | int | `6379` | Service port | | mo\_websocket\_valkey.host | string | `"mo-websocket-valkey"` | Service hostname | | mo\_websocket\_valkey.password.secretName | string | `"mo-redis-secret"` | Secret name for password | | mo\_websocket\_valkey.password.secretKey | string | `"REDIS_SECRET"` | Secret key for password | | mo\_websocket\_valkey.resources | object | `{}` | Resource requests/limits | | mo\_websocket\_valkey.metrics.enabled | bool | `false` | Enable Prometheus metrics exporter | #### mo\_user\_valkey | Key | Type | Default | Description | | - | - | - | - | | mo\_user\_valkey.enabled | bool | `true` | Enable Valkey for user service | | mo\_user\_valkey.image.registry | string | `"docker.io"` | Image registry | | mo\_user\_valkey.image.repository | string | `"valkey/valkey"` | Image repository | | mo\_user\_valkey.image.tag | string | `"9.1.0"` | Image tag | | mo\_user\_valkey.port | int | `6379` | Service port | | mo\_user\_valkey.host | string | `"mo-user-valkey"` | Service hostname | | mo\_user\_valkey.password.secretName | string | `"mo-redis-secret"` | Secret name for password | | mo\_user\_valkey.password.secretKey | string | `"REDIS_SECRET"` | Secret key for password | | mo\_user\_valkey.resources | object | `{}` | Resource requests/limits | | mo\_user\_valkey.metrics.enabled | bool | `false` | Enable Prometheus metrics exporter | #### mo\_message\_dispatcher\_valkey | Key | Type | Default | Description | | - | - | - | - | | mo\_message\_dispatcher\_valkey.enabled | bool | `true` | Enable Valkey for message dispatcher | | mo\_message\_dispatcher\_valkey.image.registry | string | `"docker.io"` | Image registry | | mo\_message\_dispatcher\_valkey.image.repository | string | `"valkey/valkey"` | Image repository | | mo\_message\_dispatcher\_valkey.image.tag | string | `"9.1.0"` | Image tag | | mo\_message\_dispatcher\_valkey.port | int | `6379` | Service port | | mo\_message\_dispatcher\_valkey.host | string | `"mo-message-dispatcher-valkey"` | Service hostname | | mo\_message\_dispatcher\_valkey.tls | bool | `false` | Enable TLS | | mo\_message\_dispatcher\_valkey.password.secretName | string | `"mo-redis-secret"` | Secret name for password | | mo\_message\_dispatcher\_valkey.password.secretKey | string | `"REDIS_SECRET"` | Secret key for password | | mo\_message\_dispatcher\_valkey.resources | object | `{}` | Resource requests/limits | | mo\_message\_dispatcher\_valkey.metrics.enabled | bool | `false` | Enable Prometheus metrics exporter | ### MySQL | Key | Type | Default | Description | | - | - | - | - | | mysql.enabled | bool | `false` | Enable MySQL deployment (use external MySQL for production) | | mysql.replicas | int | `1` | Number of replicas | | mysql.image.registry | string | `"docker.io"` | Image registry | | mysql.image.repository | string | `"mysql"` | Image repository | | mysql.image.tag | string | `"8.4.10"` | Image tag | | mysql.imagePullPolicy | string | `"IfNotPresent"` | Image pull policy | | mysql.port | int | `3306` | Service port | | mysql.host | string | `"mysql"` | Service hostname | | mysql.database | string | `"platform"` | Database name | | mysql.user | string | `"platform_user"` | Database user | | mysql.password.secretName | string | `"mo-mysql-secret"` | Secret name for password | | mysql.password.secretKey | string | `"MYSQL_PASSWORD"` | Secret key for password | | mysql.root\_password.secretName | string | `"mo-mysql-secret"` | Secret name for root password | | mysql.root\_password.secretKey | string | `"MYSQL_ROOT_PASSWORD"` | Secret key for root password | | mysql.ssl | bool | `false` | Enable SSL | | mysql.sslRejectUnauthorized | bool | `true` | Reject unauthorized SSL connections | | mysql.allow\_empty\_root\_password | int | `0` | Allow empty root password (0 = no) | | mysql.subpath | string | `"{{ tpl .Release.Namespace }}-mysql-storage"` | Storage subpath | | mysql.mountpoint | string | `"/var/lib/mysql"` | Data mount point | | mysql.storage.capacity | string | `"50Gi"` | Storage capacity | | mysql.resources | object | `{}` | Resource requests/limits | | mysql.tolerations | object | `{}` | Pod tolerations | ### Storage | Key | Type | Default | Description | | - | - | - | - | | storage.className | string | `"default"` | Storage class name | | storage.accessMode | string | `"ReadWriteMany"` | Access mode | # Single Sign-On Source: https://docs.mogenius.com/cluster-management/single-sign-on Configure SSO for your mogenius organization using Microsoft Entra, GitHub, or any OpenID Connect provider — including group-based workspace access. # Single Sign-On mogenius supports Single Sign-On (SSO) through OpenID Connect (OIDC), allowing team members to authenticate using their existing identity provider accounts. Once configured, your organization receives a unique login page that you share with your team. ## Supported Providers * **Microsoft Entra ID** (formerly Azure Active Directory) * **GitHub** * **OpenID Connect** — any standards-compliant OIDC provider (GitLab, Okta, Keycloak, Auth0, and others) ## How the connection works You configure SSO under **Organization settings → Single sign-on**. When you select a provider, the form shows a **Redirect URI** for your organization — copy it and register it in your identity-provider app. The provider validates this value exactly, so it must match including the trailing slash: ``` https:///source/oauth/callback/org-/ ``` After you enter the provider credentials and click **Connect**, mogenius displays a **Login URL** for your organization. Share this URL with your team — users who sign in via this link are added to your organization automatically. ## Microsoft Entra ID All steps happen in the **Microsoft Entra admin center** of your own tenant. First decide how mogenius should learn about your users' groups — the steps differ: | Mode | What mogenius gets | Requires | | - | - | - | | **Microsoft Graph** (default) | Group **names** and Entra app roles → organization roles and workspace access | Delegated `GroupMember.Read.All` with **admin consent** | | **Token claims** | Group **object IDs** from the sign-in token → workspace access via GroupGrant rules | Only the groups claim on the app registration — **no Graph permission, no admin consent** | ### Step 1: Register the application (both modes) 1. **App registrations → New registration.** Any name; supported account types: *Accounts in this organizational directory only*. 2. **Authentication → Add a platform → Web.** Set the Redirect URI to the value shown in the mogenius SSO form. The trailing slash is required. 3. **Certificates & secrets → New client secret.** Copy the secret **Value** immediately — it is shown only once. 4. **Overview.** Note the *Application (client) ID* and the *Directory (tenant) ID*. ### Step 2a: Group memberships via Microsoft Graph 1. **API permissions → Add a permission → Microsoft Graph → Delegated →** `GroupMember.Read.All`. 2. **Grant admin consent for ``.** The row must show *Granted*. Adding the permission alone is not enough — users would see "Approval required" at sign-in. 3. **App roles → Create app role.** Allowed member types *Users/Groups*; values `admin`, `editor`, `viewer` (further values are passed on as workspace roles). 4. **Enterprise applications → `` → Users and groups → Add user/group.** Assign each group an app role. Only assigned groups are synced. 5. Organization roles: groups named `mogenius-admin`, `mogenius-editor`, or `mogenius-viewer` set the organization role; their app role is ignored. Assigning groups to enterprise applications requires Entra ID P1. The app reads its own role assignments by itself, so no application permission is needed. ### Step 2b: Group memberships via token claims 1. **Token configuration → Add groups claim.** Select **Security groups**; keep **Group ID** for the ID token. (Manifest equivalent: `"groupMembershipClaims": "SecurityGroup"`.) 2. **Token configuration → Add optional claim → ID:** `email`, `given_name`, `family_name` (recommended for complete profiles). 3. **API permissions:** the default `User.Read` is enough — no admin consent. 4. **Groups → `` → Overview → Object ID.** Note the object ID of every group that should grant workspace access. 5. In the cluster, create a GroupGrant per group (see [Group-based workspace access](#group-based-workspace-access)). Organization roles are not derived from Entra in this mode — reserved group names don't match object IDs. Manage them in mogenius. If a user belongs to more than \~200 groups, Entra omits the groups claim; choose *Groups assigned to the application* and assign the relevant groups under **Enterprise applications → Users and groups** (Entra ID P1). ### Step 3: Connect in mogenius 1. **Organization settings → Single sign-on → Microsoft Entra.** Choose *Group memberships* (**Microsoft Graph** or **Token claims**), enter the **Client ID**, **Client Secret**, and **Tenant ID**, then click **Connect**. 2. Members sign in through the organization's Login URL. Group changes take effect at the next sign-in. ### Both modes * Users must be **members** of a group — owners do not count. * The Redirect URI needs the trailing slash. ## GitHub 1. In GitHub, go to **Settings → Developer settings → OAuth Apps → New OAuth App** (in your personal account or an organization). 2. Fill in the details: * **Application name**: A recognizable name (e.g., "mogenius SSO") * **Authorization callback URL**: Paste the Redirect URI from the mogenius SSO form 3. Register the app, then generate a **client secret**. 4. Back in mogenius, select **GitHub**, enter the **Client ID** and **Client Secret**, and click **Connect**. ## OpenID Connect Use the generic OpenID Connect provider for any standards-compliant OIDC identity provider — for example GitLab (including self-hosted instances), Okta, Keycloak, or Auth0. 1. In your provider, create an OIDC/OAuth application: * **Redirect URI**: Paste the Redirect URI from the mogenius SSO form * **Scopes**: `openid`, `email`, `profile` * Where applicable, mark the application as **confidential**. 2. Note the **Client ID**, **Client Secret**, and the provider's **Issuer URL** — the base URL where its discovery document lives at `/.well-known/openid-configuration` (for example `https://gitlab.com` for GitLab.com, or your self-hosted base URL). 3. Back in mogenius, select **OpenID Connect**, enter the **Client ID**, **Client Secret**, and **Issuer URL**, then click **Connect**. For self-hosted providers, make sure the instance is reachable on a public HTTPS hostname. mogenius needs the discovery URL to be publicly accessible. ## Group-based workspace access With a GroupGrant, an identity-provider group maps to access on a workspace (or cluster) with a specific role. In the token-claims flow you reference the group by its object ID; with name-based groups you reference the group name. ```yaml theme={null} apiVersion: mogenius.com/v1alpha1 kind: GroupGrant metadata: name: namespace: mogenius spec: claimValue: targetType: workspace # or: cluster targetName: role: editor # optional: viewer (default) | editor | admin ``` `role` is optional. A GroupGrant saved without a role defaults to **viewer** (applied for kubectl/GitOps as well as the UI/CLI), so a forgotten role never grants more than read access. Members who receive access through a GroupGrant appear in the workspace member list marked as **SSO group**. Their role is managed in the identity provider / GroupGrant, not per user in mogenius. ## Troubleshooting **Redirect URI mismatch error** Ensure the Redirect URI in your identity provider exactly matches the one shown in mogenius, including the protocol (`https://`) and the trailing slash. **Discovery failures (self-hosted OpenID Connect)** Verify that your provider is reachable from the internet and that `/.well-known/openid-configuration` returns a valid JSON document. Instances behind a VPN or on a private IP cannot be used. **Missing email in user profile** Ensure the `email` scope (or, for Entra, the `email` optional claim) is included, and that users have a verified email address in their identity provider. # Troubleshooting clusters Source: https://docs.mogenius.com/cluster-management/troubleshooting-clusters Here's a list of common issues with clusters on mogenius and how to fix them. Here's a list of common issues that can occur when connecting clusters with mogenius. If your problem is not on the page, please contact [support](mailto:support@mogenius.com). ## Installation failed: clusterroles.rbac.authorization.k8s.io If installing the mogenius operator fails with an error message related to cluster roles and permissions, it is likely that your current user doesn't have sufficient permissions to perform the installation. Per default, the installation requires the clusterAdmin role. If you can't get access to this role by company policies please contact our [support](mailto:support@mogenius.com). Depending on your infrastructure setup the operator can be customized with less permissions required. ## No connection to mogenius The installation of the operator was completed, and the pod `mogenius-k8s-manager` is running on your cluster. However, the cluster status in mogenius is either disconnected or pending. To troubleshoot, please check the logs of the pod in Kubernetes. Here are some scenarios that might be occurring and suggestions on how to address them: * **Unauthorized Errors:** If the pod log is showing repeating unauthorized errors and no connection can be established, it could be due to the cluster having been connected to mogenius before, and the platform API is rightfully rejecting the unknown connection. In this case, try using the Reset MFA-ID option in your cluster settings. If this option isn’t available, consider deleting the cluster in mogenius, uninstalling the operator, and restarting the installation workflow. * **Operator Connection Issues:** If the operator cannot send traffic outside of the cluster, this could indicate a problem with the cluster’s internet connection. Check your network settings and ensure that there are no restrictions preventing outbound connections. # Custom Resource Forms Source: https://docs.mogenius.com/cluster-management/ui-configs Give any custom resource a form-based create and edit experience in mogenius instead of raw YAML, using UI Configs. By default, custom resources (CRDs) on your cluster are created and edited as raw YAML. A **UI Config** replaces that raw editor with a structured form: labelled inputs, grouped sections, dropdowns, toggles, and validation. You define the form once for a resource type, and from then on everyone who opens a resource of that type gets the same guided experience. If no UI Config exists for a resource type, mogenius falls back to the plain YAML editor — so adding a UI Config is always additive and never blocks the raw workflow. UI Configs currently apply to **custom resources (CRDs)** only. Built-in Kubernetes kinds keep their existing editors. ## How it works A UI Config is a cluster-scoped resource that binds a **form layout** to a **target resource type** (its API version and kind). Only one UI Config exists per resource type. When you create a new form, mogenius reads the target CRD's OpenAPI schema and auto-generates a starting layout with all available fields. You then curate that layout — keep the fields that matter, relabel them, group them into sections, and set defaults or validation. A live preview shows the resulting form as you edit. ## Creating a UI form UI Configs are managed by cluster administrators. 1. Open your **Cluster** and go to **Settings → UI Configs**. 2. Select **New UI Form**. 3. Pick the target resource type from the list of custom resources. Types that already have a UI Config are shown but cannot be selected again. 4. The form editor opens with a schema auto-generated from the resource's OpenAPI definition. ## Building the form The editor has two panels: the **builder** on the left and a **live preview** on the right that updates as you make changes. ### Sections Fields are grouped into ordered **sections** that render as blocks in the final form. By convention the first section holds the resource's metadata (name, namespace); the following sections map to the top-level spec. Nested objects in the spec are expressed as child sections rather than fields, keeping every field a simple input. ### Fields Each field maps to one property in the resource manifest. A field has: * **Key** — the dot-notation path into the resource YAML, e.g. `spec.replicas` or `spec.template.spec.containers[].image`. This is where the entered value is written. * **Label** — the name shown next to the input. * **Description** — hint text shown below the input to explain the expected value. * **Type** — the input widget (see below). * **Required** — blocks form submission when left empty. * **Default** — pre-filled into a blank create form. * **Enum** — restricts the input to a fixed set of allowed values, rendered as a dropdown. ### Field types * **string** — free-text input. * **integer** / **number** — numeric input. * **boolean** — a toggle switch. * **array** — a list of scalar values with add/remove. * **map** — a set of key/value pairs. Set an **Enum** on a field to turn it into a dropdown restricted to the allowed values. ### Curating the layout Starting from the auto-generated fields you can toggle fields on or off, rename them, reorder them, and move them between sections by drag and drop. Once you save your own edits, the UI Config is marked as **customized** to distinguish it from an untouched auto-generated schema. ## Saving Use **Save** in the editor header to store the UI Config. It takes effect immediately for every resource of the target type across the cluster. ## How users experience it Once a UI Config exists for a resource type, users opening a resource of that type see a **Details** tab that renders the form — on both the resource detail page and the resource drawer. They can fill in and edit values through the form controls instead of editing YAML, with required fields validated inline. If no UI Config exists, the **YAML** tab is shown instead. ## Managing UI forms From **Settings → UI Configs** you can, per resource type: * **Edit** — reopen the form editor to adjust the layout. * **View YAML** — inspect the underlying UI Config manifest. * **Delete** — remove the form. Resources of that type fall back to the plain YAML editor. # Update and uninstall Source: https://docs.mogenius.com/cluster-management/update-and-uninstall Manage the mogenius operator, run updates and delete it from your cluster. You can manage the installation of your mogenius operator directly from the management pane in mogenius. In the "Settings" and "Connect" sections, you will find several options to update your operator and to upgrade and uninstall the Helm repository. ## Updating the mogenius operator