Run Image Factory on-prem to generate Talos images locally
The Image Factory is a way for you to dynamically create Talos Linux images. There is a public, hosted version of the Image Factory at factory.talos.dev and it can also be run in your environment.The Image Factory is a critical component of Omni to generate installation media and update Talos nodes, but it is not required to use Omni to use the Image Factory. It is a web interface and API for the imager command which is used to customize Talos from the command line.
Running the Image Factory requires a container registry and an image cache signing key, which the sections below set up, and optionally an image cache storage location. It also requires the following tools on the host:
If you already have a container registry available you can export your registry to an environment variable. and skip to create an image cache signing key.
REGISTRY_ENDPOINT=registry.internal:5000
If you don’t have a container registry available to push images to you can temporarily run one with the registry container. We recommend using the official registry:2 registry from docker as some registries do not support all OCI images.
This example doesn’t have persistent storage.
Secure registry
Insecure registry
Air-gapped
We recommend using certificates for your temporary registry you will need to provide your own certificates and mount them into the container at run time. If you do not have certificates, follow the steps in the Omni air-gapped documentation.
Make sure the CA certificate is in your system pki path and docker has restarted to trust the certificate.
A registry can be run without certificates or encrypted communication. Running this way will require your to add a flag to crane and docker to allow insecure communication.
docker run -d -p 5000:5000 --name registry registry:2
Without internet access you will need to download the container image, transfer it internally, and load it on the target machine.Transfer the registry.tar and image-factory.tar files to an internal system.
There are a variety of image cache locations to store built images. Without an image cache, each asset will be built on demand which can consume a high amount of CPU on the image factory machine.Some supported cache storage options include:
There are two supported methods to run the Image Factory:
Connected to the upstream Sidero container registry
Using a custom container registry
A custom container registry is required for air-gapped environments or custom Talos builds.
Image factory connected
Image Factory air-gapped
Run with the official, upstream container registry if your machine is connected to the internet and you don’t need custom Talos images.
The official Sidero Labs registry has all of the required Talos installation containers, extensions, and tools.Export the URL for where you will be hosting the Image Factory.
export FACTORY_URL="http://factory.internal:8080"
You need to provide a registry where image schematics can be stored. Create a config file.
If you want to run image factory connected to the upstream container registry you can do it with:This will run the image factory on your machine on port 8080 and automatically pull container images from Sidero’s registry. It will also validate image signatures using cosign to validate pulled images.This will not allow you to create or publish custom system extensions.
To do that you will need to run your own container registry with the necessary images. See the disconnected instructions for Image Factory.
Run with an internal container registry if your machine is not connected to the internet, or you need custom Talos images and extensions.
Running the image factory in an air-gapped environment has more requirements than running in a connected mode. Make sure you have a registry running from the Internal container registry section. You will need to download container images and seed them into the internal registry and sign the container images.
This is just an example and should not be used in a production environment. If you want to test locally on your machine you can also see the developer documentation in the repository.
Starting with Talos 1.12 you can get a list of images needed to seed the image factory directly from talosctl.Get a list of Talos base images needed for the image factory with:This will give you a list of all images and extensions for Talos v1.14.5.
You will need to repeat this command for each version of Talos you want to download images for.
If you don’t need specific extensions you can delete them from the images.txt file.Push the images to your $REGISTRY_ENDPOINT
Internet available
Air-gapped
If your machine can reach the public internet and the internal registry at the same time you can copy the images internally with this command.
for SOURCE_IMAGE in $(cat images.txt) do IMAGE_WITHOUT_DIGEST=${SOURCE_IMAGE%%@*} IMAGE_WITH_NEW_REG="${REGISTRY_ENDPOINT}/${IMAGE_WITHOUT_DIGEST#*/}" crane copy \ $SOURCE_IMAGE \ $IMAGE_WITH_NEW_REGdone
If you don’t have direct access to an internal container registry (e.g. air gapped environment) you need to download the container images while connected to the internet.Download all images from images.txt. Create file names that don’t contain special characters.
Move to a network that has access to the $REGISTRY_ENDPOINT endpoint and push the local images to the registry.
This serves the container layers on your local admin machine port :5000 so you can push them with crane.
Run this command command from your admin machine so you do not have port conflicts with the $REGISTRY_ENDPOINT.
This method of copying containers is important because Talos releases pin to a container digest which needs to match in your internal registry
Sign each image and tag in your internal registry. This will allow the registry to validate images without reaching out to any external services for key validation.
KEY_FILE="cosign.key"export COSIGN_PASSWORD="" # Leave empty for empty password
Sign all of the images using the images.txt file as a list.
If your registry is running with a self-signed CA certificate (i.e. from the Installing Airgapped Omni guide) you need to mount the CA certificate into the cosign container for it to be trusted.
for IMAGE in $(cat images.txt) do NEW_IMAGE="${REGISTRY_ENDPOINT}/${IMAGE#*/}" if [[ "$NEW_IMAGE" != *"@sha256:"* ]]; then NEW_IMAGE="${NEW_IMAGE}@$(crane digest $NEW_IMAGE)" fi docker run --rm -it --net=host \ -v $PWD:/keys -w /keys \ -v "$PWD/ca.pem:/etc/ssl/certs/ca-certificates.crt:ro,Z" \ -e COSIGN_PASSWORD="" \ -e COSIGN_YES=true \ --user $(id -u):$(id -g) \ ghcr.io/sigstore/cosign/cosign:v2.6.1 \ sign --key /keys/$KEY_FILE \ --tlog-upload=false \ $NEW_IMAGEdone
This guide assumes the container registry and image factory are running on the same machine. Because of this we will run the Image Factory with --net=host which is not recommended for a production, multi-host deployment.
Self-signed CA
Insecure
Set a internal factory endpoint.
FACTORY_URL=https://factory.internal:8080
Create a configuration file for the Image Factory.
To run the image factory with a self-signed CA certificate you need to mount them into the container image at run time.You should now be able to browse to https://registry.internal:8080 and view the Image Factory web interface. If your server or network has any firewall rules you may need to allow TCP traffic to the host.
If your image factory and container registry do not have certificates run the following command:You should now be able to browse to http://registry.internal:8080 and view the Image Factory web interface. If your server or network has any firewall rules you may need to allow TCP traffic to the host.
{"docsConfig":{"theme":"aspen","$schema":"https://leaves.mintlify.com/schema/docs.json","name":"Sidero Documentation","colors":{"primary":"#D41A3B","light":"#E48E96","dark":"#E12D46"},"logo":{"light":"https://mintcdn.com/siderolabs-fe86397c/G9H15xhTYrTLoHZE/images/sidero-light.svg?fit=max\u0026auto=format\u0026n=G9H15xhTYrTLoHZE\u0026q=85\u0026s=111c3a81dfd33536a250355ab70d5b5f","dark":"https://mintcdn.com/siderolabs-fe86397c/G9H15xhTYrTLoHZE/images/sidero-dark.svg?fit=max\u0026auto=format\u0026n=G9H15xhTYrTLoHZE\u0026q=85\u0026s=4dc8f324935c0a940a3b4640b7b999ec"},"favicon":"https://mintcdn.com/siderolabs-fe86397c/G9H15xhTYrTLoHZE/images/favicon.svg?fit=max\u0026auto=format\u0026n=G9H15xhTYrTLoHZE\u0026q=85\u0026s=b1780d5f545130db050cb89f1b2ac8a1","navbar":{"links":[{"href":"https://www.siderolabs.com/support/","label":"Enterprise Support"}],"primary":{"type":"button","label":"Try Talos Omni","href":"https://www.siderolabs.com/omni-signup"}},"footer":{"socials":{"bluesky":"https://bsky.app/profile/siderolabs.com","github":"https://github.com/siderolabs","linkedin":"https://linkedin.com/company/sidero-labs","reddit":"https://reddit.com/r/taloslinux","x":"https://x.com/siderolabs"}},"seo":{"metatags":{"canonical":"https://docs.siderolabs.com"}},"integrations":{"ga4":{"measurementId":"G-PT2W5NT93B"},"posthog":{"apiKey":"phc_D44Y76lThvZBf8s7lpVpPjJm9fNLvCRMluHXtF7bQXT"},"cookies":{"key":"sidero-analytics-consent","value":"granted"}},"banner":{"content":"Join us at [TalosCon](https://www.taloscon.com/) in Santa Barbara, Jan 26-27, 2027. Share the announcement and your ticket is free!","dismissible":true},"errors":{"404":{"redirect":false,"title":"Page not found","description":"The page you're looking for doesn't exist. [Go home](/)."}},"contextual":{"options":["copy","view","chatgpt","claude"],"display":"header"},"thumbnails":{"background":"https://mintcdn.com/siderolabs-fe86397c/OiJI5OX0Yyg1HXae/images/og-background.png?fit=max\u0026auto=format\u0026n=OiJI5OX0Yyg1HXae\u0026q=85\u0026s=a9873e2ecf3f86f33e8406f597a69095"},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"siderolabs-fe86397c","hasAudioNarration":false,"actualSubdomain":"siderolabs-fe86397c","customDomains":["docs.siderolabs.com"],"gitSource":{"type":"github","owner":"siderolabs","repo":"docs","deployBranch":"main","contentDirectory":"public","isPrivate":false,"mountPath":"","label":""},"feedback":{"thumbs":true,"edits":true,"issues":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6af304a42f20aabdfd474118","clientVersion":"0.0.4102","searchFilterCounts":[{"language":"default","tag":"Talos Linux","count":1318},{"language":"default","tag":"Platform specific installation","count":358},{"language":"default","tag":"Reference","count":267},{"language":"default","tag":"Configure your Talos cluster","count":197},{"language":"default","tag":"Configuration","count":133},{"language":"default","tag":"Networking","count":129},{"language":"default","tag":"Cloud Platforms","count":107},{"language":"default","tag":"Single Board Computers","count":103},{"language":"default","tag":"Talos Omni","count":100},{"language":"default","tag":"Learn more","count":97}],"searchSettings":{"maxResults":10,"isFiltersEnabled":true}},"assistantConfig":{"enableAskAiButton":true,"enableStarterQuestions":true,"enableAskAiSearchBar":false,"deflection":{"enabled":false,"email":"support@siderolabs.com"}},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[],"starterQuestions":[{"_id":"6933179bb8c4c689533e99c1","deploymentId":"688d3353fc3ba50464ce8ee7","questionText":"What is the architecture of Talos disk layout?","status":"active","generatedBy":"manual","createdAt":"2025-12-05T17:34:19.159Z","updatedAt":"2025-12-05T17:34:19.159Z","__v":0},{"_id":"6933178db8c4c689533e97ca","deploymentId":"688d3353fc3ba50464ce8ee7","questionText":"Generate a machine config for a UserVolume","status":"active","generatedBy":"manual","createdAt":"2025-12-05T17:34:05.515Z","updatedAt":"2025-12-05T17:34:05.515Z","__v":0},{"_id":"69331771b8c4c689533e9371","deploymentId":"688d3353fc3ba50464ce8ee7","questionText":"How do I upgrade Talos?","status":"active","generatedBy":"manual","createdAt":"2025-12-05T17:33:37.847Z","updatedAt":"2025-12-05T17:33:37.847Z","__v":0}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":".nav-logo{height:auto!important;max-height:40px!important;width:auto!important}.nav-tabs-item img,.nav-tabs-item .nav-logo{background:transparent!important;background-color:transparent!important}html[data-sidero-search-filter] [data-component-part=\"search-filter-content\"]{opacity:0!important;pointer-events:none!important}table{border-color:var(--talos-border-default);table-layout:auto;border-collapse:collapse;width:100%;margin:var(--talos-space-compact) 0;th,\n td {\n text-align: left;\n }\n\n td {\n border: var(--talos-border-hairline) solid var(--talos-border-default);\n }\n\n tbody {\n border: var(--talos-border-hairline) solid var(--talos-border-default);\n\n tr {\n \u0026:nth-child(even) {\n background-color: var(--talos-surface-subtle);\n }\n\n \u0026:hover {\n background-color: var(--talos-surface-hover);\n }\n }\n }}.prose table th,.prose table td{padding:var(--talos-space-tight) var(--talos-space-compact) var(--talos-space-tight) var(--talos-space-base)}table:not([class]) td:nth-child(1) code{white-space:nowrap}@media (min-width: 1024px){table:not([class]){display:table;width:100%}}#body-content,#content-container{max-width:none}.prose{max-width:none}"},{"filePath":"talos-tokens.css","content":"@font-face{font-family:'Manrope';font-style:normal;font-weight:400 700;font-display:swap;src:url('/fonts/manrope-latin.woff2') format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}@font-face{font-family:'Manrope';font-style:normal;font-weight:400 700;font-display:swap;src:url('/fonts/manrope-latin-ext.woff2') format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}@font-face{font-family:'JetBrains Mono';font-style:normal;font-weight:400 700;font-display:swap;src:url('/fonts/jetbrains-mono-latin.woff2') format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}@font-face{font-family:'JetBrains Mono';font-style:normal;font-weight:400 700;font-display:swap;src:url('/fonts/jetbrains-mono-latin-ext.woff2') format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}:root{--talos-ink-0: #060606;--talos-ink-1: #0B0B0B;--talos-ink-2: #1A1A1E;--talos-ink-3: #1E1E22;--talos-ink-4: #26262B;--talos-ink-5: #2E2E33;--talos-ink-6: #5A5A58;--talos-ink-7: #8A8A88;--talos-ink-8: #A8A8A6;--talos-ink-9: #C8C8C6;--talos-ink-10: #F5F5F4;--talos-cream-0: #F2EDE8;--talos-cream-1: #F5F0EB;--talos-cream-2: #FFFFFF;--talos-cream-3: #F0EBE5;--talos-cream-4: #E6E1DC;--talos-cream-5: #D8D2CB;--talos-cream-6: #8A8A88;--talos-cream-7: #686866;--talos-cream-8: #4F4F4D;--talos-cream-9: #3A3A38;--talos-cream-10: #1A1A18;--talos-red-1: #E48E96;--talos-red-2: #DB6973;--talos-red-3: #E12D46;--talos-red-4: #D41A3B;--talos-red-5: #B93B46;--talos-red-6: #A83640;--talos-red-7: #8F2D36;--talos-gradient-display-1: #E8312C;--talos-gradient-display-2: #E2335A;--talos-gradient-display-3: #F77216;--talos-green-1: #E6F0E7;--talos-green-2: #C0DAC4;--talos-green-3: #A0C8A7;--talos-green-4: #6FD087;--talos-green-5: #1B8641;--talos-green-6: #046E31;--talos-green-7: #23432E;--talos-green-8: #213428;--talos-amber-1: #FEEED9;--talos-amber-2: #FDE8CB;--talos-amber-3: #FCDCB0;--talos-amber-4: #F5AE39;--talos-amber-5: #E6AC3D;--talos-amber-6: #7E5905;--talos-amber-7: #695132;--talos-amber-8: #403529;--talos-scarlet-1: #FFECEA;--talos-scarlet-2: #FDC7C0;--talos-scarlet-3: #FAABA1;--talos-scarlet-4: #FF5B5B;--talos-scarlet-5: #DE2F2E;--talos-scarlet-6: #BB081F;--talos-scarlet-7: #642A29;--talos-scarlet-8: #3E2324;--talos-stone-1: #BAB7B3;--talos-stone-2: #75726F;--talos-stone-3: #5D5B58;--talos-paper: #E2D2A8;--talos-white: #FFFFFF;--talos-black: #000000;--talos-space-micro: 4px;--talos-space-tight: 8px;--talos-space-snug: 12px;--talos-space-compact: 16px;--talos-space-base: 24px;--talos-space-section: 32px;--talos-space-major: 64px;--talos-radius-sm: 4px;--talos-radius-base: 6px;--talos-radius-lg: 8px;--talos-radius-xl: 12px;--talos-radius-pill: 9999px;--talos-border-hairline: 1px;--talos-border-edge: 3px;--talos-font-sans: Manrope, system-ui, -apple-system, 'Segoe UI', sans-serif;--talos-font-mono: 'JetBrains Mono', 'SF Mono', Consolas, 'Liberation Mono', monospace;--talos-text-2xs: 10px;--talos-text-xs: 11px;--talos-text-sm: 12px;--talos-text-base: 14px;--talos-text-md: 16px;--talos-text-lg: 20px;--talos-text-xl: 24px;--talos-text-2xl: 30px;--talos-weight-regular: 400;--talos-weight-medium: 500;--talos-weight-semibold: 600;--talos-weight-bold: 700;--talos-leading-tight: 1.25;--talos-leading-base: 1.5;--talos-leading-relaxed: 1.65;--talos-tracking-normal: 0;--talos-tracking-eyebrow: 0.10em;--talos-tracking-machine: 0.16em;--talos-surface-page: var(--talos-cream-0);--talos-surface-chrome: var(--talos-cream-1);--talos-surface-card: var(--talos-cream-2);--talos-surface-inset: var(--talos-cream-3);--talos-surface-raised: var(--talos-cream-2);--talos-surface-hover: var(--talos-cream-4);--talos-surface-inert: var(--talos-cream-5);--talos-surface-subtle: rgba(0, 0, 0, 0.04);--talos-surface-inverse: var(--talos-cream-10);--talos-surface-paper: var(--talos-paper);--talos-content-emphasis: var(--talos-cream-10);--talos-content-default: var(--talos-cream-9);--talos-content-secondary: var(--talos-cream-8);--talos-content-muted: var(--talos-cream-7);--talos-content-disabled: var(--talos-cream-6);--talos-content-inverse: var(--talos-cream-2);--talos-content-on-accent: var(--talos-white);--talos-border-subtle: rgba(0, 0, 0, 0.06);--talos-border-default: rgba(0, 0, 0, 0.08);--talos-border-strong: rgba(0, 0, 0, 0.16);--talos-border-accent: var(--talos-red-3);--talos-accent-default: var(--talos-red-3);--talos-accent-hover: var(--talos-red-5);--talos-accent-text: var(--talos-red-4);--talos-accent-fill: var(--talos-red-3);--talos-accent-fill-hover: rgba(225, 45, 70, 0.9);--talos-accent-fill-active: var(--talos-red-7);--talos-accent-subtle: rgba(212, 26, 59, 0.08);--talos-accent-gradient: linear-gradient(90deg, var(--talos-gradient-display-1) 0%, var(--talos-gradient-display-2) 51%, var(--talos-gradient-display-3) 100%);--talos-accent-gradient-fill: linear-gradient(270deg, var(--talos-gradient-display-3) 0%, var(--talos-red-3) 30%, var(--talos-red-3) 70%, var(--talos-gradient-display-1) 100%);--talos-status-success-default: var(--talos-green-6);--talos-status-success-text: var(--talos-green-6);--talos-status-success-fill: var(--talos-green-5);--talos-status-success-on-fill: var(--talos-white);--talos-status-success-subtle: var(--talos-green-1);--talos-status-success-subtle-border: var(--talos-green-2);--talos-status-success-surface: var(--talos-green-1);--talos-status-success-border: var(--talos-green-3);--talos-status-warning-default: var(--talos-amber-6);--talos-status-warning-text: var(--talos-amber-6);--talos-status-warning-fill: var(--talos-amber-4);--talos-status-warning-on-fill: var(--talos-cream-10);--talos-status-warning-subtle: var(--talos-amber-1);--talos-status-warning-subtle-border: var(--talos-amber-2);--talos-status-warning-surface: var(--talos-amber-1);--talos-status-warning-border: var(--talos-amber-3);--talos-status-danger-default: var(--talos-scarlet-6);--talos-status-danger-text: var(--talos-scarlet-6);--talos-status-danger-fill: var(--talos-scarlet-5);--talos-status-danger-on-fill: var(--talos-white);--talos-status-danger-subtle: var(--talos-scarlet-1);--talos-status-danger-subtle-border: var(--talos-scarlet-2);--talos-status-danger-surface: var(--talos-scarlet-1);--talos-status-danger-border: var(--talos-scarlet-3);--talos-status-info-default: var(--talos-stone-3);--talos-status-info-text: var(--talos-stone-3);--talos-status-info-fill: var(--talos-stone-2);--talos-status-info-on-fill: var(--talos-white);--talos-status-info-subtle: var(--talos-surface-hover);--talos-status-info-subtle-border: rgba(0, 0, 0, 0);--talos-status-info-surface: var(--talos-surface-card);--talos-status-info-border: var(--talos-surface-inert);--talos-shadow-card: 0 1px 3px rgba(26, 26, 24, 0.06), 0 0 0 1px rgba(0, 0, 0, 0.02);--talos-shadow-dropdown: 0 4px 16px rgba(26, 26, 24, 0.12);--talos-shadow-modal: 0 8px 32px rgba(26, 26, 24, 0.16);--talos-shadow-focus: 0 0 0 3px rgba(224, 75, 69, 0.30)}.dark{--talos-surface-page: var(--talos-ink-0);--talos-surface-chrome: var(--talos-ink-1);--talos-surface-card: var(--talos-ink-2);--talos-surface-inset: var(--talos-ink-3);--talos-surface-raised: var(--talos-ink-3);--talos-surface-hover: var(--talos-ink-4);--talos-surface-inert: var(--talos-ink-5);--talos-surface-subtle: rgba(255, 255, 255, 0.05);--talos-surface-inverse: var(--talos-ink-10);--talos-surface-paper: var(--talos-paper);--talos-content-emphasis: var(--talos-ink-10);--talos-content-default: var(--talos-ink-9);--talos-content-secondary: var(--talos-ink-8);--talos-content-muted: var(--talos-ink-7);--talos-content-disabled: var(--talos-ink-6);--talos-content-inverse: var(--talos-ink-1);--talos-content-on-accent: var(--talos-white);--talos-border-subtle: rgba(255, 255, 255, 0.06);--talos-border-default: rgba(255, 255, 255, 0.08);--talos-border-strong: rgba(255, 255, 255, 0.14);--talos-border-accent: var(--talos-red-3);--talos-accent-default: var(--talos-red-3);--talos-accent-hover: var(--talos-red-2);--talos-accent-text: var(--talos-red-1);--talos-accent-fill: var(--talos-red-3);--talos-accent-fill-hover: rgba(225, 45, 70, 0.9);--talos-accent-fill-active: var(--talos-red-7);--talos-accent-subtle: rgba(228, 142, 150, 0.20);--talos-accent-gradient: linear-gradient(90deg, var(--talos-gradient-display-1) 0%, var(--talos-gradient-display-2) 51%, var(--talos-gradient-display-3) 100%);--talos-accent-gradient-fill: linear-gradient(270deg, var(--talos-gradient-display-3) 0%, var(--talos-red-3) 30%, var(--talos-red-3) 70%, var(--talos-gradient-display-1) 100%);--talos-status-success-default: var(--talos-green-4);--talos-status-success-text: var(--talos-green-4);--talos-status-success-fill: var(--talos-green-5);--talos-status-success-on-fill: var(--talos-white);--talos-status-success-subtle: var(--talos-green-8);--talos-status-success-subtle-border: var(--talos-green-7);--talos-status-success-surface: var(--talos-surface-card);--talos-status-success-border: var(--talos-surface-inert);--talos-status-warning-default: var(--talos-amber-5);--talos-status-warning-text: var(--talos-amber-5);--talos-status-warning-fill: var(--talos-amber-4);--talos-status-warning-on-fill: var(--talos-cream-10);--talos-status-warning-subtle: var(--talos-amber-8);--talos-status-warning-subtle-border: var(--talos-amber-7);--talos-status-warning-surface: var(--talos-surface-card);--talos-status-warning-border: var(--talos-surface-inert);--talos-status-danger-default: var(--talos-scarlet-4);--talos-status-danger-text: var(--talos-scarlet-4);--talos-status-danger-fill: var(--talos-scarlet-5);--talos-status-danger-on-fill: var(--talos-white);--talos-status-danger-subtle: var(--talos-scarlet-8);--talos-status-danger-subtle-border: var(--talos-scarlet-7);--talos-status-danger-surface: var(--talos-surface-card);--talos-status-danger-border: var(--talos-surface-inert);--talos-status-info-default: var(--talos-stone-1);--talos-status-info-text: var(--talos-stone-1);--talos-status-info-fill: var(--talos-stone-2);--talos-status-info-on-fill: var(--talos-white);--talos-status-info-subtle: var(--talos-surface-hover);--talos-status-info-subtle-border: rgba(0, 0, 0, 0);--talos-status-info-surface: var(--talos-surface-card);--talos-status-info-border: var(--talos-surface-inert);--talos-shadow-card: 0 1px 3px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(255, 255, 255, 0.04);--talos-shadow-dropdown: 0 4px 16px rgba(0, 0, 0, 0.5);--talos-shadow-modal: 0 8px 32px rgba(0, 0, 0, 0.6);--talos-shadow-focus: 0 0 0 3px rgba(224, 75, 69, 0.35)}:root{--primary: 212 26 59;--primary-light: 228 142 150;--primary-dark: 225 45 70;--background-light: 245 240 235;--background-dark: 11 11 11;--gray-50: 245 240 235;--gray-100: 240 235 229;--gray-200: 230 225 220;--gray-300: 216 210 203;--gray-400: 138 138 136;--gray-500: 104 104 102;--gray-600: 79 79 77;--gray-700: 58 58 56;--gray-800: 46 46 51;--gray-900: 26 26 30;--gray-950: 11 11 11;--font-inter: var(--talos-font-sans);--font-paper-mono: var(--talos-font-mono)}html #banner{background:var(--talos-accent-gradient-fill)}html #banner,html #banner *{color:var(--talos-content-on-accent)!important}html #banner a{text-decoration-color:var(--talos-red-1)!important}html #topbar-cta-button a>span:first-child{background:var(--talos-accent-fill)}html #topbar-cta-button a:hover>span:first-child{opacity:0.9}html #topbar-cta-button a,html #topbar-cta-button a *{color:var(--talos-content-on-accent)!important}html:not(.dark) a[aria-current=\"page\"].bg-primary\\/10{background-color:var(--talos-accent-subtle)!important;color:var(--talos-content-emphasis)!important;position:relative}html:not(.dark) a[aria-current=\"page\"].bg-primary\\/10::before{content:\"\";position:absolute;left:6px;top:25%;bottom:25%;width:var(--talos-border-edge);border-radius:2px;background:var(--talos-accent-text)}html.dark a[aria-current=\"page\"].dark\\:bg-primary-light\\/10{background-color:var(--talos-accent-subtle)!important;color:var(--talos-content-emphasis)!important;position:relative}html.dark a[aria-current=\"page\"].dark\\:bg-primary-light\\/10::before{content:\"\";position:absolute;left:6px;top:25%;bottom:25%;width:var(--talos-border-edge);border-radius:2px;background:var(--talos-accent-text)}html:root [data-callout-type=\"danger\"]{background-color:var(--talos-status-danger-surface);border-color:var(--talos-status-danger-border)}html:root [data-callout-type=\"danger\"] svg{color:var(--talos-status-danger-text)!important}html:root [data-callout-type=\"danger\"] [class*=\"prose\"]{color:var(--talos-content-default)!important}html:root [data-callout-type=\"danger\"] [class*=\"prose\"] strong{color:var(--talos-status-danger-text)!important}html.dark [data-callout-type=\"danger\"]{border-left:var(--talos-border-edge) solid var(--talos-status-danger-fill)}html:root [data-callout-type=\"warning\"]{background-color:var(--talos-status-warning-surface);border-color:var(--talos-status-warning-border)}html:root [data-callout-type=\"warning\"] svg{color:var(--talos-status-warning-text)!important}html:root [data-callout-type=\"warning\"] [class*=\"prose\"]{color:var(--talos-content-default)!important}html:root [data-callout-type=\"warning\"] [class*=\"prose\"] strong{color:var(--talos-status-warning-text)!important}html.dark [data-callout-type=\"warning\"]{border-left:var(--talos-border-edge) solid var(--talos-status-warning-fill)}html:root [data-callout-type=\"tip\"]{background-color:var(--talos-status-success-surface);border-color:var(--talos-status-success-border)}html:root [data-callout-type=\"tip\"] svg{color:var(--talos-status-success-text)!important}html:root [data-callout-type=\"tip\"] [class*=\"prose\"]{color:var(--talos-content-default)!important}html:root [data-callout-type=\"tip\"] [class*=\"prose\"] strong{color:var(--talos-status-success-text)!important}html.dark [data-callout-type=\"tip\"]{border-left:var(--talos-border-edge) solid var(--talos-status-success-fill)}html:root [data-callout-type=\"check\"]{background-color:var(--talos-status-success-surface);border-color:var(--talos-status-success-border)}html:root [data-callout-type=\"check\"] svg{color:var(--talos-status-success-text)!important}html:root [data-callout-type=\"check\"] [class*=\"prose\"]{color:var(--talos-content-default)!important}html:root [data-callout-type=\"check\"] [class*=\"prose\"] strong{color:var(--talos-status-success-text)!important}html.dark [data-callout-type=\"check\"]{border-left:var(--talos-border-edge) solid var(--talos-status-success-fill)}html:root [data-callout-type=\"info\"]{background-color:var(--talos-status-info-surface);border-color:var(--talos-status-info-border)}html:root [data-callout-type=\"info\"] svg{color:var(--talos-status-info-text)!important}html:root [data-callout-type=\"info\"] [class*=\"prose\"]{color:var(--talos-content-default)!important}html:root [data-callout-type=\"info\"] [class*=\"prose\"] strong{color:var(--talos-content-emphasis)!important}html:root [data-callout-type=\"note\"]{background-color:var(--talos-status-info-surface);border-color:var(--talos-status-info-border)}html:root [data-callout-type=\"note\"] svg{color:var(--talos-content-secondary)!important}html:root [data-callout-type=\"note\"] [class*=\"prose\"]{color:var(--talos-content-default)!important}html:root [data-callout-type=\"note\"] [class*=\"prose\"] strong{color:var(--talos-content-emphasis)!important}html #footer a[href*=\"mintlify.com\"]:not(:hover){color:var(--talos-content-muted)!important}"},{"filePath":"home.css","content":"#docs-home{max-width:1040px;margin:0 auto;padding:0 var(--talos-space-base) var(--talos-space-major);font-family:var(--talos-font-sans);font-size:16px;line-height:var(--talos-leading-base);color:var(--talos-content-default)}#docs-home .home-hero{padding:var(--talos-space-major) 0 var(--talos-space-section);text-align:center}#docs-home .home-hero h1{margin:0 0 var(--talos-space-snug);font-size:var(--talos-text-2xl);line-height:var(--talos-leading-tight);font-weight:var(--talos-weight-bold);color:var(--talos-content-emphasis);letter-spacing:-0.01em}#docs-home .home-promise{margin:0 auto var(--talos-space-section);max-width:34em;color:var(--talos-content-secondary)}#docs-home .home-search{display:flex;align-items:center;width:100%;max-width:540px;margin:0 auto;background:var(--talos-surface-card);border:1px solid var(--talos-border-default);border-radius:var(--talos-radius-base);box-shadow:var(--talos-shadow-card);padding:0;font:inherit;cursor:pointer;text-align:left}#docs-home .home-search:hover,#docs-home .home-search:focus-visible{box-shadow:var(--talos-shadow-focus);border-color:var(--talos-border-accent);outline:none}#docs-home .home-search-icon{display:flex;align-items:center;padding-left:var(--talos-space-compact);color:var(--talos-content-muted)}#docs-home .home-search-label{flex:1;padding:var(--talos-space-snug);font-size:var(--talos-text-base);color:var(--talos-content-muted)}#docs-home .home-kbd{display:flex;align-items:center;padding-right:var(--talos-space-snug);font-family:var(--talos-font-mono);font-size:var(--talos-text-xs);color:var(--talos-content-muted)}#docs-home .home-domain{margin-bottom:var(--talos-space-major)}#docs-home .home-domain-head{margin-bottom:var(--talos-space-base)}#docs-home .home-domain-head h2{margin:0 0 var(--talos-space-tight);font-size:var(--talos-text-lg);line-height:var(--talos-leading-tight);font-weight:var(--talos-weight-semibold);color:var(--talos-content-emphasis);display:flex;align-items:center;gap:var(--talos-space-snug)}#docs-home .home-domain-head h2::after{content:'';flex:1;height:1px;background:var(--talos-border-subtle)}#docs-home .home-domain-head p{margin:0;color:var(--talos-content-secondary);font-size:var(--talos-text-base)}#docs-home .home-grid{display:grid;gap:var(--talos-space-base);grid-template-columns:repeat(auto-fill, minmax(248px, 1fr))}#docs-home .home-card{display:flex;flex-direction:column;background:var(--talos-surface-card);border:1px solid var(--talos-border-default);border-radius:var(--talos-radius-lg);padding:var(--talos-space-base);text-decoration:none;transition:border-color 0.12s, box-shadow 0.12s, transform 0.12s}#docs-home .home-card--live:hover{border-color:var(--talos-border-strong);box-shadow:var(--talos-shadow-card);transform:translateY(-1px)}#docs-home .home-card--soon{background:var(--talos-surface-subtle);border-style:dashed;cursor:default}#docs-home .home-eyebrow{font-size:var(--talos-text-2xs);letter-spacing:var(--talos-tracking-eyebrow);text-transform:uppercase;font-weight:var(--talos-weight-semibold);color:var(--talos-content-muted);margin-bottom:var(--talos-space-snug);display:flex;align-items:center;gap:var(--talos-space-tight)}#docs-home .home-card h3{margin:0 0 var(--talos-space-tight);font-size:var(--talos-text-md);line-height:var(--talos-leading-tight);font-weight:var(--talos-weight-semibold);color:var(--talos-content-emphasis)}#docs-home .home-card--soon h3{color:var(--talos-content-secondary)}#docs-home .home-card h3{display:flex;flex-wrap:wrap;align-items:center;column-gap:var(--talos-space-tight);row-gap:var(--talos-space-micro)}#docs-home .home-card p{margin:0 0 var(--talos-space-base);font-size:var(--talos-text-base);color:var(--talos-content-secondary)}#docs-home .home-card--soon p{color:var(--talos-content-muted)}#docs-home .home-card>:last-child{margin-bottom:0}#docs-home .home-sep{color:var(--talos-content-muted)}#docs-home .home-meta{margin-top:auto;display:flex;align-items:center;gap:var(--talos-space-snug);font-family:var(--talos-font-mono);font-size:var(--talos-text-xs);letter-spacing:var(--talos-tracking-machine);color:var(--talos-content-muted)}#docs-home .home-pill{border-radius:var(--talos-radius-pill);padding:2px var(--talos-space-tight);font-size:var(--talos-text-2xs);font-family:var(--talos-font-sans);letter-spacing:var(--talos-tracking-normal);font-weight:var(--talos-weight-medium);text-transform:uppercase;background:var(--talos-status-info-subtle);color:var(--talos-status-info-text)}#docs-home .home-covers{display:flex;flex-wrap:wrap;gap:var(--talos-space-tight);margin-bottom:var(--talos-space-base)}#docs-home .home-cover{display:inline-flex;align-items:baseline;gap:var(--talos-space-tight);border:1px solid var(--talos-border-default);border-radius:var(--talos-radius-pill);padding:2px var(--talos-space-snug);font-size:var(--talos-text-xs);font-weight:var(--talos-weight-medium);color:var(--talos-content-default)}#docs-home .home-cover--soon{border-style:dashed;color:var(--talos-content-muted)}#docs-home .home-cover em{font-style:normal;font-family:var(--talos-font-mono);font-size:var(--talos-text-xs);font-weight:var(--talos-weight-regular, 400);letter-spacing:var(--talos-tracking-machine)}#docs-home .home-columns{display:grid;gap:var(--talos-space-base);grid-template-columns:repeat(4, minmax(0, 1fr));row-gap:var(--talos-space-snug)}@media (max-width: 960px){#docs-home .home-columns{grid-template-columns:repeat(2, minmax(0, 1fr))}}@media (max-width: 560px){#docs-home .home-columns{grid-template-columns:1fr}}#docs-home .home-column{display:grid;grid-template-rows:subgrid;gap:var(--talos-space-snug)}#docs-home .home-columns--rows-1 .home-column{grid-row:span 2}#docs-home .home-columns--rows-2 .home-column{grid-row:span 3}#docs-home .home-columns--rows-3 .home-column{grid-row:span 4}#docs-home .home-columns--rows-4 .home-column{grid-row:span 5}#docs-home .home-column-head{border-top:2px solid var(--talos-border-strong);padding-top:var(--talos-space-snug);margin-bottom:var(--talos-space-tight)}#docs-home .home-column-head h3{margin:0 0 var(--talos-space-tight);font-size:var(--talos-text-base);font-weight:var(--talos-weight-semibold);color:var(--talos-content-emphasis)}#docs-home .home-column-head p{margin:0;font-size:var(--talos-text-sm);color:var(--talos-content-secondary)}#docs-home .home-grid--tools{grid-template-columns:repeat(auto-fill, minmax(220px, 1fr))}#docs-home .home-card--tool{padding:var(--talos-space-compact) var(--talos-space-base)}#docs-home .home-card--tool p{margin-bottom:0}#docs-home .home-aside{border-top:1px solid var(--talos-border-subtle);padding-top:var(--talos-space-base);display:flex;flex-wrap:wrap;gap:var(--talos-space-base);align-items:baseline}#docs-home .home-lbl{font-size:var(--talos-text-2xs);text-transform:uppercase;letter-spacing:var(--talos-tracking-eyebrow);font-weight:var(--talos-weight-semibold);color:var(--talos-content-muted)}#docs-home .home-aside a{color:var(--talos-content-default);font-size:var(--talos-text-base);text-decoration:none}#docs-home .home-aside a:hover{color:var(--talos-accent-text);text-decoration:underline}"},{"filePath":"product-chrome.css","content":"html[data-current-path=\"/changelog\"] #sidebar-content{display:none}html[data-current-path=\"/changelog\"] #content-area{width:100%;max-width:60rem}"}],"page":{"pagePath":"omni/self-hosted/run-image-factory-on-prem","slug":"/omni/self-hosted/run-image-factory-on-prem","pageMetadata":{"title":"Run Image Factory On-Prem","description":"Run Image Factory on-prem to generate Talos images locally","href":"/omni/self-hosted/run-image-factory-on-prem"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Run Image Factory on-prem to generate Talos images locally\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];const image_factory_release=`v1.8.0`;const version=`v1.14`;const release=`v1.14.5`;function _createMdxContent(props){const _components={a:`a`,blockquote:`blockquote`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Info,Note,Tab,Tabs}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Tab)_missingMdxReference(`Tab`,true);if(!Tabs)_missingMdxReference(`Tabs`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`The `,_jsx(_components.a,{href:`https://github.com/siderolabs/image-factory`,children:`Image Factory`}),` is a way for you to dynamically create Talos Linux images. There is a public, hosted version of the Image Factory at `,_jsx(_components.a,{href:`https://factory.talos.dev`,children:`factory.talos.dev`}),` and it can also be run in your environment.`]}),`\n`,_jsxs(_components.p,{children:[`The Image Factory is a critical component of Omni to generate installation media and update Talos nodes, but it is not required to use Omni to use the Image Factory. It is a web interface and API for the `,_jsx(_components.a,{href:`../../../talos/${version}/platform-specific-installations/boot-assets#imager`,children:_jsx(_components.code,{children:`imager`})}),` command which is used to customize Talos from the command line.`]}),`\n`,_jsx(Heading,{level:`2`,id:`prerequisites`,children:`Prerequisites`}),`\n`,_jsx(_components.p,{children:`Running the Image Factory requires a container registry and an image cache signing key, which the sections below set up, and optionally an image cache storage location. It also requires the following tools on the host:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/talos/latest/getting-started/talosctl`,children:_jsx(_components.code,{children:`talosctl`})})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`https://github.com/google/go-containerregistry/blob/main/cmd/crane/README.md`,children:_jsx(_components.code,{children:`crane`})})}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`docker`}),` or `,_jsx(_components.code,{children:`podman`})]}),`\n`]}),`\n`,_jsxs(_components.blockquote,{children:[`\n`,_jsx(_components.p,{children:`Podman is known to work but has some flags that are different than docker and you may have to translate them for your version of podman.`}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`container-registry`,children:`Container registry`}),`\n`,_jsxs(_components.p,{children:[`If you already have a container registry available you can export your registry to an environment variable. and skip to create an `,_jsx(_components.a,{href:`#image-cache-signing-key`,children:`image cache signing key`}),`.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`REGISTRY_ENDPOINT=registry.internal:5000`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`If you don’t have a container registry available to push images to you can temporarily run one with the `,_jsx(_components.code,{children:`registry`}),` container. We recommend using the official `,_jsx(_components.code,{children:`registry:2`}),` registry from docker as some registries do not support all OCI images.`]}),`\n`,_jsx(Note,{children:`This example doesn’t have persistent storage.`}),`\n`,_jsxs(Tabs,{children:[_jsxs(Tab,{title:`Secure registry`,id:`secure-registry`,children:[_jsxs(_components.p,{children:[`We recommend using certificates for your temporary registry you will need to provide your own certificates and mount them into the container at run time. If you do not have certificates, follow the steps in the `,_jsx(_components.a,{href:`/omni/self-hosted/run-omni-airgapped`,children:`Omni air-gapped documentation`}),`.`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`9`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`9`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`docker`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` run -d \\\\`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` --name registry \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` -p 5000:5000 \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:\" -v ${PWD}/server-key.pem:/certs/server-key.pem:ro,Z \\\\\"})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:\" -v ${PWD}/server-chain.pem:/certs/server-chain.pem:ro,Z \\\\\"})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` -e REGISTRY_HTTP_ADDR=0.0.0.0:5000 \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` -e REGISTRY_HTTP_TLS_KEY=/certs/server-key.pem \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/server-chain.pem \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` registry:2`})}),`\n`]})})}),_jsxs(_components.p,{children:[`Make sure the CA certificate is in your system pki path and `,_jsx(_components.code,{children:`docker`}),` has restarted to trust the certificate.`]})]}),_jsxs(Tab,{title:`Insecure registry`,id:`insecure-registry`,children:[_jsxs(_components.p,{children:[`A registry can be run without certificates or encrypted communication. Running this way will require your to add a flag to `,_jsx(_components.code,{children:`crane`}),` and `,_jsx(_components.code,{children:`docker`}),` to allow insecure communication.`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`docker`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` run -d -p 5000:5000 --name registry registry:2`})]}),`\n`]})})})]}),_jsxs(Tab,{title:`Air-gapped`,id:`air-gapped`,children:[_jsx(_components.p,{children:`Without internet access you will need to download the container image, transfer it internally, and load it on the target machine.`}),_jsx(CodeBlock,{language:`bash`,children:`docker save -o registry.tar registry:2 \\ndocker save -o image-factory.tar ghcr.io/siderolabs/image-factory:${image_factory_release}`}),_jsxs(_components.p,{children:[`Transfer the `,_jsx(_components.code,{children:`registry.tar`}),` and `,_jsx(_components.code,{children:`image-factory.tar`}),` files to an internal system.`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`docker`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` load -i registry.tar`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`docker`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` load -i image-factory.tar`})]}),`\n`]})})}),_jsx(_components.p,{children:`Run the registry with certificates.`}),_jsx(CodeBlock,{filename:``,numberOfLines:`9`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`9`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`docker`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` run -d \\\\`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` --name registry \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` -p 5000:5000 \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:\" -v ${PWD}/server-key.pem:/certs/server-key.pem:ro,Z \\\\\"})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:\" -v ${PWD}/server-chain.pem:/certs/server-chain.pem:ro,Z \\\\\"})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` -e REGISTRY_HTTP_ADDR=0.0.0.0:5000 \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` -e REGISTRY_HTTP_TLS_KEY=/certs/server-key.pem \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/server-chain.pem \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` registry:2`})}),`\n`]})})})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`image-cache-signing-key`,children:`Image cache signing key`}),`\n`,_jsx(_components.p,{children:`You need to create a Cache Signing Key to sign cached Talos image artifacts, ensuring they haven’t been tampered with before being served.`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`openssl`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ecparam -name prime256v1 -genkey -noout -out signing-key.key`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`image-cache-storage-optional`,children:`Image cache storage (optional)`}),`\n`,_jsx(_components.p,{children:`There are a variety of image cache locations to store built images. Without an image cache, each asset will be built on demand which can consume a high amount of CPU on the image factory machine.`}),`\n`,_jsx(_components.p,{children:`Some supported cache storage options include:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`CDN`}),`\n`,_jsx(_components.li,{children:`s3 bucket (or compatible API)`}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Please view the `,_jsx(_components.code,{children:`--help`}),` output for cache options.`]}),`\n`,_jsx(Heading,{level:`2`,id:`run-image-factory`,children:`Run Image Factory`}),`\n`,_jsx(_components.p,{children:`There are two supported methods to run the Image Factory:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Connected to the upstream Sidero container registry`}),`\n`,_jsx(_components.li,{children:`Using a custom container registry`}),`\n`]}),`\n`,_jsx(_components.p,{children:`A custom container registry is required for air-gapped environments or custom Talos builds.`}),`\n`,_jsxs(Tabs,{children:[_jsxs(Tab,{title:`Image factory connected`,id:`image-factory-connected`,children:[_jsx(Note,{children:`Run with the official, upstream container registry if your machine is connected to the internet and you don’t need custom Talos images.`}),_jsx(_components.p,{children:`The official Sidero Labs registry has all of the required Talos installation containers, extensions, and tools.`}),_jsx(_components.p,{children:`Export the URL for where you will be hosting the Image Factory.`}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`export`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` FACTORY_URL=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"http://factory.internal:8080\"`})]}),`\n`]})})}),_jsx(_components.p,{children:`You need to provide a registry where image schematics can be stored. Create a config file.`}),_jsx(CodeBlock,{filename:``,numberOfLines:`9`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`9`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`cat`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` \u003c\u003cEOF > image-factory.yaml`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`artifacts:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` schematic:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` registry: $REGISTRY_ENDPOINT`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`cache:`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` signingKeyPath: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"/signing-key.key\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`http:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` externalURL: $FACTORY_URL`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`EOF`})}),`\n`]})})}),_jsx(_components.p,{children:`If you want to run image factory connected to the upstream container registry you can do it with:`}),_jsx(CodeBlock,{language:`bash`,children:`\n docker run -p 8080:8080 -d \\\\\\n --name image-factory \\\\\\n -v $PWD/image-factory.yaml:/image-factory.yaml:ro,Z \\\\\\n -v $PWD/signing-key.key:/signing-key.key:ro,Z \\\\\\n ghcr.io/siderolabs/image-factory:${image_factory_release} \\\\\\n --config image-factory.yaml\n `}),_jsxs(_components.p,{children:[`This will run the image factory on your machine on port 8080 and automatically pull container images from Sidero’s registry. It will also validate image signatures using `,_jsx(_components.a,{href:`https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/`,children:_jsx(_components.code,{children:`cosign`})}),` to validate pulled images.`]}),_jsxs(_components.p,{children:[`This will not allow you to create or publish custom system extensions.\nTo do that you will need to run your own container registry with the necessary images. See the `,_jsx(_components.strong,{children:`disconnected`}),` instructions for Image Factory.`]})]}),_jsxs(Tab,{title:`Image Factory air-gapped`,id:`image-factory-air-gapped`,\"data-child-tab-ids\":`[\"internet-available\",\"air-gapped-2\",\"self-signed-ca\",\"insecure\"]`,\"data-child-heading-ids\":`[\"download-container-images\",\"sign-container-images\"]`,children:[_jsx(Note,{children:`Run with an internal container registry if your machine is not connected to the internet, or you need custom Talos images and extensions.`}),_jsxs(_components.p,{children:[`Running the image factory in an air-gapped environment has more requirements than running in a connected mode. Make sure you have a registry running from the `,_jsx(_components.a,{href:`#container-registry`,children:`Internal container registry`}),` section. You will need to download container images and seed them into the internal registry and sign the container images.`]}),_jsxs(_components.blockquote,{children:[`\n`,_jsxs(_components.p,{children:[`This is just an example and should not be used in a production environment. If you want to test locally on your machine you can also see the `,_jsx(_components.a,{href:`https://github.com/siderolabs/image-factory#air-gapped-mode`,children:`developer documentation`}),` in the repository.`]}),`\n`]}),_jsx(Heading,{level:`3`,id:`download-container-images`,children:`Download container images`}),_jsxs(_components.p,{children:[`Starting with Talos 1.12 you can get a list of images needed to seed the image factory directly from `,_jsx(_components.code,{children:`talosctl`}),`.`]}),_jsx(_components.p,{children:`Get a list of Talos base images needed for the image factory with:`}),_jsx(CodeBlock,{lang:`sh`,children:`talosctl image talos-bundle ${release} > images.txt`}),_jsxs(_components.p,{children:[`This will give you a list of all images and extensions for Talos `,release,`.\nYou will need to repeat this command for each version of Talos you want to download images for.\nIf you don’t need specific extensions you can delete them from the `,_jsx(_components.code,{children:`images.txt`}),` file.`]}),_jsxs(_components.p,{children:[`Push the images to your `,_jsx(_components.code,{children:`$REGISTRY_ENDPOINT`})]}),_jsxs(Tabs,{children:[_jsxs(Tab,{title:`Internet available`,id:`internet-available`,children:[_jsx(_components.p,{children:`If your machine can reach the public internet and the internal registry at the same time you can copy the images internally with this command.`}),_jsx(CodeBlock,{filename:``,numberOfLines:`8`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`8`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`for`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` SOURCE_IMAGE `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`in`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` $(`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`cat`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` images.txt)`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` do`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:\" IMAGE_WITHOUT_DIGEST=${SOURCE_IMAGE%%@*}\"})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` IMAGE_WITH_NEW_REG=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:'\"${REGISTRY_ENDPOINT}/${IMAGE_WITHOUT_DIGEST#*/}\"'})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` crane copy \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` $SOURCE_IMAGE \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` $IMAGE_WITH_NEW_REG`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`done`})}),`\n`]})})})]}),_jsxs(Tab,{title:`Air-gapped`,id:`air-gapped-2`,children:[_jsx(_components.p,{children:`If you don’t have direct access to an internal container registry (e.g. air gapped environment) you need to download the container images while connected to the internet.`}),_jsxs(_components.p,{children:[`Download all images from `,_jsx(_components.code,{children:`images.txt`}),`. Create file names that don’t contain special characters.`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`5`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`5`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`cat`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` images.txt \\\\`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` | talosctl images cache-create \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` --layout flat \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` --image-cache-path ./image-cache \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` --images=-`})}),`\n`]})})}),_jsxs(_components.p,{children:[`Move to a network that has access to the `,_jsx(_components.code,{children:`$REGISTRY_ENDPOINT`}),` endpoint and push the local images to the registry.\nThis serves the container layers on your local admin machine port `,_jsx(_components.code,{children:`:5000`}),` so you can push them with crane.\nRun this command command from your admin machine so you do not have port conflicts with the `,_jsx(_components.code,{children:`$REGISTRY_ENDPOINT`}),`.`]}),_jsx(Info,{children:`This method of copying containers is important because Talos releases pin to a container digest which needs to match in your internal registry`}),_jsx(CodeBlock,{filename:``,numberOfLines:`10`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`10`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`export`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` IP=$(hostname -I | awk `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'{print $1}'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`talosctl image cache-cert-gen \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` --advertised-address $IP`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`talosctl image cache-serve \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` --address $IP:5000 \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` --image-cache-path ./image-cache \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` --tls-cert-file tls.crt \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` --tls-key-file tls.key \u0026`})}),`\n`]})})}),_jsxs(_components.p,{children:[`Push the container images with `,_jsx(_components.code,{children:`crane`}),`.`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`9`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`9`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`for`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` SOURCE_IMAGE `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`in`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` $(`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`cat`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` images.txt)`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` do`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:\" IMAGE_WITHOUT_DIGEST=${SOURCE_IMAGE%%@*}\"})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` IMAGE_WITH_NEW_REG=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:'\"${REGISTRY_ENDPOINT}/${IMAGE_WITHOUT_DIGEST#*/}\"'})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` LOCALHOST_IMAGE=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:'\"${IP}:5000/${IMAGE_WITHOUT_DIGEST#*/}\"'})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` crane copy --insecure \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` $LOCALHOST_IMAGE \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` $IMAGE_WITH_NEW_REG`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`done`})}),`\n`]})})})]})]}),_jsx(Heading,{level:`3`,id:`sign-container-images`,children:`Sign container images`}),_jsx(_components.p,{children:`The Image Factory verifies container image signatures when being used. Generate a cosign singing key and sign each container pushed to the registry.`}),_jsxs(Note,{children:[`Image factory currently only supports `,_jsx(_components.code,{children:`cosign`}),` v2 signatures.`]}),_jsx(_components.p,{children:`Generate a cosign key.`}),_jsx(CodeBlock,{filename:``,numberOfLines:`6`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`6`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`docker`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` run --rm -it \\\\`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` -v $PWD:/keys:Z -w /keys \\\\`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` -e COSIGN_PASSWORD=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` \\\\`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` --user $(id -u):$(id -g) \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ghcr.io/sigstore/cosign/cosign:v2.6.1 \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` generate-key-pair`})}),`\n`]})})}),_jsx(_components.p,{children:`Sign each image and tag in your internal registry. This will allow the registry to validate images without reaching out to any external services for key validation.`}),_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`KEY_FILE=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"cosign.key\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`export`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` COSIGN_PASSWORD=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"\"`}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # Leave empty for empty password`})]}),`\n`]})})}),_jsxs(_components.p,{children:[`Sign all of the images using the `,_jsx(_components.code,{children:`images.txt`}),` file as a list.`]}),_jsxs(_components.blockquote,{children:[`\n`,_jsxs(_components.p,{children:[`If your registry is running with a self-signed CA certificate (i.e. from the `,_jsx(_components.a,{href:`/omni/self-hosted/run-omni-airgapped`,children:`Installing Airgapped Omni`}),` guide) you need to mount the CA certificate into the cosign container for it to be trusted.`]}),`\n`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`17`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`17`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`for`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` IMAGE `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`in`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` $(`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`cat`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` images.txt)`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` do`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` NEW_IMAGE=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:'\"${REGISTRY_ENDPOINT}/${IMAGE#*/}\"'})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [[ `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"$NEW_IMAGE\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` != *`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"@sha256:\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`* ]]; `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`then`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` NEW_IMAGE=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:'\"${NEW_IMAGE}@$(crane digest $NEW_IMAGE)\"'})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` fi`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` docker`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` run --rm -it --net=host \\\\`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` -v $PWD:/keys -w /keys \\\\`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` -v `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"$PWD/ca.pem:/etc/ssl/certs/ca-certificates.crt:ro,Z\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` -e COSIGN_PASSWORD=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` \\\\`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` -e COSIGN_YES=true \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` --user $(id -u):$(id -g) \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ghcr.io/sigstore/cosign/cosign:v2.6.1 \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` sign --key /keys/$KEY_FILE \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` --tlog-upload=false \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` $NEW_IMAGE`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`done`})}),`\n`]})})}),_jsxs(Info,{children:[`This guide assumes the container registry and image factory are running on the same machine. Because of this we will run the Image Factory with `,_jsx(_components.code,{children:`--net=host`}),` which is not recommended for a production, multi-host deployment.`]}),_jsxs(Tabs,{children:[_jsxs(Tab,{title:`Self-signed CA`,id:`self-signed-ca`,children:[_jsx(_components.p,{children:`Set a internal factory endpoint.`}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`FACTORY_URL=https://factory.internal:8080`})}),`\n`]})})}),_jsx(_components.p,{children:`Create a configuration file for the Image Factory.`}),_jsx(CodeBlock,{filename:``,numberOfLines:`24`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`24`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`cat`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` \u003c\u003cEOF > image-factory.yaml`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`artifacts:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` core:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` registry: $REGISTRY_ENDPOINT`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` schematic:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` registry: $REGISTRY_ENDPOINT`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` installer:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` internal:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` registry: $REGISTRY_ENDPOINT`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` external:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` registry: $REGISTRY_ENDPOINT`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` namespace: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"siderolabs\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`containerSignature:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` publicKeyFile: /cosign.pub`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` subjectRegExp: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`cache:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` oci:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` registry: $REGISTRY_ENDPOINT`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` signingKeyPath: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"/signing-key.key\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`http:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` externalURL: $FACTORY_URL`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` certFile: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"/certs/server-chain.pem\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` keyFile: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"/certs/server-key.pem\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`EOF`})}),`\n`]})})}),_jsx(_components.p,{children:`To run the image factory with a self-signed CA certificate you need to mount them into the container image at run time.`}),_jsx(CodeBlock,{language:`bash`,children:`\n docker run -p 8080:8080 -d \\\\\\n --name image-factory \\\\\\n --net=host \\\\\\n -v $PWD/image-factory.yaml:/image-factory.yaml:ro,Z \\\\\\n -v $PWD/signing-key.key:/signing-key.key:ro,Z \\\\\\n -v $PWD/cosign.pub:/cosign.pub:ro,Z \\\\\\n -v $PWD/server-chain.pem:/certs/server-chain.pem:ro,Z \\\\\\n -v $PWD/server-key.pem:/certs/server-key.pem:ro,Z \\\\\\n -v $PWD/ca.pem:/etc/ssl/certs/ca.pem:ro,Z \\\\\\n ghcr.io/siderolabs/image-factory:${image_factory_release} \\\\\\n --config /image-factory.yaml\n `}),_jsxs(_components.p,{children:[`You should now be able to browse to `,_jsx(_components.a,{href:`https://registry.internal:8080`,children:`https://registry.internal:8080`}),` and view the Image Factory web interface. If your server or network has any firewall rules you may need to allow TCP traffic to the host.`]})]}),_jsxs(Tab,{title:`Insecure`,id:`insecure`,children:[_jsx(_components.p,{children:`Set a internal factory endpoint.`}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`FACTORY_URL=http://factory.internal:8080`})}),`\n`]})})}),_jsx(_components.p,{children:`Create a configuration for the Image Factory`}),_jsx(CodeBlock,{filename:``,numberOfLines:`26`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`26`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`cat`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` \u003c\u003cEOF > image-factory.yaml`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`artifacts:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` core:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` registry: $REGISTRY_ENDPOINT`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` insecure: true`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` schematic:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` registry: $REGISTRY_ENDPOINT`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` insecure: true`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` installer:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` internal:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` registry: $REGISTRY_ENDPOINT`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` insecure: true`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` external:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` registry: $REGISTRY_ENDPOINT`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` insecure: true`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`containerSignature:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` publicKeyFile: /cosign.pub`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` subjectRegExp: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`cache:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` oci:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` registry: $REGISTRY_ENDPOINT`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` insecure: true`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` signingKeyPath: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"/signing-key.key\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`http:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` externalURL: $FACTORY_URL`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`EOF`})}),`\n`]})})}),_jsx(_components.p,{children:`If your image factory and container registry do not have certificates run the following command:`}),_jsx(CodeBlock,{language:`bash`,children:`\n docker run -p 8080:8080 -d \\\\\\n --name image-factory \\\\\\n --net=host \\\\\\n -v $PWD/image-factory.yaml:/image-factory.yaml:ro,Z \\\\\\n -v $PWD/signing-key.key:/signing-key.key:ro,Z \\\\\\n -v $PWD/cosign.pub:/cosign.pub:ro,Z \\\\\\n ghcr.io/siderolabs/image-factory:${image_factory_release} \\\\\\n --config /image-factory.yaml\n `}),_jsxs(_components.p,{children:[`You should now be able to browse to `,_jsx(_components.a,{href:`http://registry.internal:8080`,children:`http://registry.internal:8080`}),` and view the Image Factory web interface. If your server or network has any firewall rules you may need to allow TCP traffic to the host.`]})]})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`run-omni`,children:`Run Omni`}),`\n`,_jsxs(_components.p,{children:[`After the image factory is running you can continue to the `,_jsx(_components.a,{href:`/omni/self-hosted/run-omni-airgapped`,children:`Omni Airgapped documentation`}),`.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{image_factory_release,version,release,default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Run Image Factory On-Prem","description":"Run Image Factory on-prem to generate Talos images locally","href":"/omni/self-hosted/run-image-factory-on-prem"}}},"mdxSourceWithNoJs":null,"noJsSplices":[[1427,1503,""],[8007,8184,""],[17081,17404,""],[19678,19769,""],[19864,19882,"`v1.14.5`,`.\nYou wil"],[44755,45310,""],[51333,51723,""]]},"mdxExtracts":{"tableOfContents":[{"title":"Prerequisites","slug":"prerequisites","depth":2,"children":[{"title":"Container registry","slug":"container-registry","depth":3,"children":[]},{"title":"Image cache signing key","slug":"image-cache-signing-key","depth":3,"children":[]},{"title":"Image cache storage (optional)","slug":"image-cache-storage-optional","depth":3,"children":[]}]},{"title":"Run Image Factory","slug":"run-image-factory","depth":2,"children":[{"title":"Download container images","slug":"download-container-images","depth":3,"children":[],"tabId":"image-factory-air-gapped"},{"title":"Sign container images","slug":"sign-container-images","depth":3,"children":[],"tabId":"image-factory-air-gapped"}]},{"title":"Run Omni","slug":"run-omni","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/siderolabs-fe86397c/35f5b79d0f96f08e/script/cookie.js","/_mintlify/custom/siderolabs-fe86397c/3cbe4d3646b78d4f/home.js","/_mintlify/custom/siderolabs-fe86397c/d57b1e900c03bdac/script/contextual-chrome.js","/_mintlify/custom/siderolabs-fe86397c/8e8b7fbcff2dadcd/script/product-nav.js"],"subdomain":"siderolabs-fe86397c","siteName":"Sidero Documentation","title":"Run Image Factory On-Prem - Sidero Documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-09T15:45:37.507Z","originalFileLocation":"omni/self-hosted/run-image-factory-on-prem.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Run Image Factory on-prem to generate Talos images locally\">\u003cmeta data-mint-head name=\"application-name\" content=\"Sidero Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/siderolabs-fe86397c/3so3sf5kkBQmhola/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/siderolabs-fe86397c/3so3sf5kkBQmhola/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/siderolabs-fe86397c/3so3sf5kkBQmhola/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/siderolabs-fe86397c/3so3sf5kkBQmhola/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/siderolabs-fe86397c/3so3sf5kkBQmhola/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/siderolabs-fe86397c/3so3sf5kkBQmhola/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/siderolabs-fe86397c/3so3sf5kkBQmhola/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/siderolabs-fe86397c/3so3sf5kkBQmhola/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/siderolabs-fe86397c/3so3sf5kkBQmhola/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Run Image Factory On-Prem - Sidero Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Run Image Factory on-prem to generate Talos images locally\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Sidero Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.siderolabs.com/omni/self-hosted/run-image-factory-on-prem\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://siderolabs-fe86397c.mintlify.site/_mintlify/api/og/v2?division=Self+Hosted\u0026amp;title=Run+Image+Factory+On-Prem\u0026amp;description=Run+Image+Factory+on-prem+to+generate+Talos+images+locally\u0026amp;theme=adbfd9499291058dc821c512\u0026amp;signature=f7a709915c946e40537b91e3d54372fa8f7b7cee39522b439d6e21d08b8183bf\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Run Image Factory On-Prem - Sidero Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Run Image Factory on-prem to generate Talos images locally\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://siderolabs-fe86397c.mintlify.site/_mintlify/api/og/v2?division=Self+Hosted\u0026amp;title=Run+Image+Factory+On-Prem\u0026amp;description=Run+Image+Factory+on-prem+to+generate+Talos+images+locally\u0026amp;theme=adbfd9499291058dc821c512\u0026amp;signature=f7a709915c946e40537b91e3d54372fa8f7b7cee39522b439d6e21d08b8183bf\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/siderolabs-fe86397c/3so3sf5kkBQmhola/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Sidero Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#D41A3B\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.siderolabs.com/omni/self-hosted/run-image-factory-on-prem\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/omni/self-hosted/run-image-factory-on-prem.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.siderolabs.com/#organization\",\"name\":\"Sidero Documentation\",\"url\":\"https://docs.siderolabs.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/siderolabs-fe86397c/G9H15xhTYrTLoHZE/images/sidero-light.svg?fit=max\u0026auto=format\u0026n=G9H15xhTYrTLoHZE\u0026q=85\u0026s=111c3a81dfd33536a250355ab70d5b5f\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.siderolabs.com#website\",\"name\":\"Sidero Documentation\",\"url\":\"https://docs.siderolabs.com\",\"publisher\":{\"@id\":\"https://docs.siderolabs.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.siderolabs.com/omni/self-hosted/run-image-factory-on-prem#webpage\",\"url\":\"https://docs.siderolabs.com/omni/self-hosted/run-image-factory-on-prem\",\"name\":\"Run Image Factory On-Prem\",\"description\":\"Run Image Factory on-prem to generate Talos images locally\",\"dateModified\":\"2026-11-09T15:45:37.507Z\",\"isPartOf\":{\"@id\":\"https://docs.siderolabs.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.siderolabs.com/omni/self-hosted/run-image-factory-on-prem#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.siderolabs.com/omni/self-hosted/run-image-factory-on-prem#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Self Hosted\",\"item\":\"https://docs.siderolabs.com/omni/self-hosted/options-for-running-omni\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Run Image Factory On-Prem\",\"item\":\"https://docs.siderolabs.com/omni/self-hosted/run-image-factory-on-prem\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.siderolabs.com/omni/self-hosted/run-image-factory-on-prem#article\",\"headline\":\"Run Image Factory On-Prem\",\"name\":\"Run Image Factory On-Prem\",\"description\":\"Run Image Factory on-prem to generate Talos images locally\",\"url\":\"https://docs.siderolabs.com/omni/self-hosted/run-image-factory-on-prem\",\"mainEntityOfPage\":{\"@id\":\"https://docs.siderolabs.com/omni/self-hosted/run-image-factory-on-prem#webpage\"},\"dateModified\":\"2026-11-09T15:45:37.507Z\",\"publisher\":{\"@id\":\"https://docs.siderolabs.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.siderolabs.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Sidero Documentation\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Sidero Documentation\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/omni/self-hosted/run-image-factory-on-prem.md","siteName":"Sidero Documentation","nav":{"global":null,"products":[{"product":"Talos Linux","icon":"https://mintlify.s3.us-west-1.amazonaws.com/siderolabs-fe86397c/images/talos.svg","description":"Bring up a Kubernetes cluster on Talos Linux and operate it day to day.","versions":[{"version":"v1.14"},{"version":"v1.13"},{"version":"v1.12"},{"version":"v1.11"},{"version":"v1.10"},{"version":"v1.9"},{"version":"v1.8"}],"pages":[{"title":"Talos Linux","href":"/talos/v1.14/overview/what-is-talos"}]},{"product":"Talos Enterprise Linux","icon":"https://mintlify.s3.us-west-1.amazonaws.com/siderolabs-fe86397c/images/talos.svg","description":"FIPS-enabled builds, SBOMs, VEX, and signed images from the Enterprise Image Factory.","pages":[{"title":"Talos Enterprise Linux","href":"/talos-enterprise-linux/overview/introducing-talos-enterprise-linux"}]},{"product":"Talos Omni","icon":"https://mintlify.s3.us-west-1.amazonaws.com/siderolabs-fe86397c/images/omni.svg","description":"Provision, upgrade, and manage Talos machines across sites from one place.","groups":[{"group":"Overview","pages":[{"title":"Omni Documentation","href":"/omni/overview/what-is-omni"}]},{"group":"Getting Started","pages":[{"title":"Install talosctl","href":"/omni/getting-started/how-to-install-talosctl"},{"title":"Install and Configure Omnictl","href":"/omni/getting-started/install-and-configure-omnictl"},{"title":"Getting Started with Omni","href":"/omni/getting-started/getting-started"},{"title":"Use Kubectl With Omni","href":"/omni/getting-started/use-kubectl-with-omni"},{"title":"Create a Cluster","href":"/omni/getting-started/create-a-cluster"},{"title":"Omni Support Matrix","href":"/omni/getting-started/support-matrix"},{"title":"Talos Version Support Policy","href":"/omni/getting-started/talos-version-support-policy"}]},{"group":"Self Hosted","pages":[{"title":"Options for Running Omni","href":"/omni/self-hosted/options-for-running-omni"},{"title":"Omni On-Prem Hardware Requirements","href":"/omni/self-hosted/omni-on-prem-hardware-requirements"},{"title":"Run Omni On-Prem","href":"/omni/self-hosted/run-omni-on-prem"},{"title":"Production vs. Non-Production Use Under the Business Source License","href":"/omni/self-hosted/production-vs-non-production"},{"title":"Omni Configuration Examples","href":"/omni/self-hosted/omni-configuration-example"},{"title":"Enable Workload Proxy","href":"/omni/self-hosted/enable-workload-proxy"},{"title":"Run An etcd Cluster On-Prem","href":"/omni/self-hosted/run-an-etcd-cluster"},{"title":"Run Omni on Kubernetes","href":"/omni/self-hosted/run-omni-on-k8s"},{"title":"Run Omni Air-Gapped","description":"Set up the full Sidero stack in a fully offline environment","href":"/omni/self-hosted/run-omni-airgapped"},{"title":"Run Image Factory On-Prem","href":"/omni/self-hosted/run-image-factory-on-prem"},{"title":"Configure Keycloak for Omni","description":"Steps to integrate Keycloak with Omni using SAML authentication.","href":"/omni/self-hosted/configure-keycloak-for-omni"},{"title":"Expose Omni with Nginx (HTTPS)","href":"/omni/self-hosted/expose-omni-with-nginx-https"},{"title":"Back Up Omni Database","href":"/omni/self-hosted/back-up-omni-db"},{"title":"Omni On-Prem etcd Data Recovery","href":"/omni/self-hosted/restore-omni-database"},{"title":"Upgrade Omni","href":"/omni/self-hosted/upgrading-omni"}]},{"group":"Infrastructure and Extensions","pages":[{"title":"Infrastructure Providers","href":"/omni/infrastructure-and-extensions/infrastructure-providers"},{"title":"Write an Infrastructure Provider","href":"/omni/infrastructure-and-extensions/writing-infrastructure-providers"},{"title":"Machine Registration","href":"/omni/infrastructure-and-extensions/machine-registration"},{"title":"Install Talos Linux Extensions","href":"/omni/infrastructure-and-extensions/install-talos-linux-extensions"},{"title":"Modify Kernel Arguments","href":"/omni/infrastructure-and-extensions/modify-kernel-arguments"}]},{"group":"Omni Cluster Setup","pages":[{"group":"Register machines with Omni","pages":[{"title":"Overview","href":"/omni/omni-cluster-setup/registering-machines/register-machines-with-omni"},{"title":"Register a Bare Metal Machine (ISO)","href":"/omni/omni-cluster-setup/registering-machines/register-a-bare-metal-machine-iso"},{"title":"Register a Bare Metal Machine (PXE/iPXE)","href":"/omni/omni-cluster-setup/registering-machines/register-a-bare-metal-machine-pxe-ipxe"},{"title":"Register an AWS EC2 Instance","href":"/omni/omni-cluster-setup/registering-machines/how-to-register-an-aws-ec2-instance"},{"title":"Register an Azure Instance","href":"/omni/omni-cluster-setup/registering-machines/register-an-azure-instance"},{"title":"Register a GCP Instance","href":"/omni/omni-cluster-setup/registering-machines/register-a-gcp-instance"},{"title":"Register a Hetzner Server","href":"/omni/omni-cluster-setup/registering-machines/register-a-hetzner-server"},{"title":"Join machines to Omni","href":"/omni/omni-cluster-setup/registering-machines/join-machines-to-omni"}]},{"title":"Create a Kubeconfig for a Kubernetes Service Account","href":"/omni/omni-cluster-setup/create-a-kubeconfig-for-a-service-account"},{"title":"Create a Machine Class","href":"/omni/omni-cluster-setup/create-a-machine-class"},{"title":"How configuration works in Omni","href":"/omni/omni-cluster-setup/how-configuration-works-in-omni"},{"title":"Introduction to Cluster Templates","href":"/omni/omni-cluster-setup/cluster-template"},{"title":"Create a Patch for Cluster Machines","href":"/omni/omni-cluster-setup/create-a-patch-for-cluster-machines"},{"title":"Select the Install Disk","href":"/omni/omni-cluster-setup/select-the-install-disk"},{"title":"Create an Omni Service Account","href":"/omni/omni-cluster-setup/create-an-omni-service-account"},{"title":"Set Initial Machine Labels","href":"/omni/omni-cluster-setup/how-to-set-initial-machine-labels"},{"title":"Setting Up the Bare-Metal Infrastructure Provider","href":"/omni/omni-cluster-setup/setting-up-the-bare-metal-infrastructure-provider"},{"title":"Omni Firewall and Egress Requirements","href":"/omni/omni-cluster-setup/omni-firewall-egress-requirement"},{"title":"Connect Machines to Omni Through a Corporate Proxy","href":"/omni/omni-cluster-setup/connect-machines-to-omni-through-a-proxy"}]},{"group":"Cluster Management","pages":[{"group":"Scale your cluster","pages":[{"title":"Scale a Cluster Up or Down","href":"/omni/cluster-management/scale-your-cluster/scale-a-cluster-up-or-down"},{"title":"Autoscale Your Cluster with Cluster AutoScaler","href":"/omni/cluster-management/scale-your-cluster/cluster-autoscaler"},{"title":"Autoscale Your Cluster with Cluster AutoScaler in AWS","href":"/omni/cluster-management/scale-your-cluster/cluster-autoscaler-aws"},{"title":"Autoscale Your Talos Cluster on AWS with Karpenter","href":"/omni/cluster-management/scale-your-cluster/karpenter"}]},{"title":"Create a Hybrid Cluster","href":"/omni/cluster-management/create-a-hybrid-cluster"},{"title":"Sync Kubernetes Manifests","href":"/omni/cluster-management/sync-kubernetes-manifests"},{"title":"Upgrade Omni Clusters","href":"/omni/cluster-management/upgrading-clusters"},{"title":"Gate Talos Upgrades with Healthchecks","href":"/omni/cluster-management/gate-talos-upgrades-with-healthchecks"},{"title":"Expose a Workload via Service Proxy","href":"/omni/cluster-management/expose-a-workload-via-service-proxy"},{"title":"Export a Cluster template","href":"/omni/cluster-management/export-a-cluster-template-from-a-cluster-created-in-the-ui"},{"title":"Create Etcd Backups","href":"/omni/cluster-management/etcd-backups"},{"title":"Restore Etcd of a Cluster","href":"/omni/cluster-management/restore-etcd-of-a-cluster-managed-by-cluster-templates"},{"title":"Audit Logs","href":"/omni/cluster-management/using-audit-log"},{"title":"Export Audit Logs","href":"/omni/cluster-management/export-audit-logs"},{"title":"Monitor Omni With Prometheus","href":"/omni/cluster-management/monitor-omni-with-prometheus"},{"title":"Import Talos Clusters","href":"/omni/cluster-management/importing-talos-clusters"},{"title":"Manage Omni Clusters with Nautik","href":"/omni/cluster-management/manage-omni-cluster-with-nautik"},{"title":"Wipe a Machine","href":"/omni/cluster-management/wipe-a-machine"},{"title":"Talos Config Overrides","href":"/omni/cluster-management/talos-config-overrides"},{"title":"Override NTP Servers","href":"/omni/cluster-management/override-ntp-servers"},{"title":"Support Bundle","href":"/omni/cluster-management/support-bundle"},{"title":"CA Rotation","href":"/omni/cluster-management/ca-rotation"},{"title":"Terraform and Omni","href":"/omni/cluster-management/terraform-and-omni"}]},{"group":"Security and Authentication","pages":[{"group":"Using SAML With Omni","pages":[{"title":"Overview","href":"/omni/security-and-authentication/using-saml-with-omni/overview"},{"title":"Using SAML and ACLs for fine-grained access control","href":"/omni/security-and-authentication/using-saml-with-omni/configure-saml-and-acls"},{"title":"Configure Okta for Omni","href":"/omni/security-and-authentication/using-saml-with-omni/configure-okta-for-omni"},{"title":"Auto-Assign Roles to SAML and OIDC Users","href":"/omni/security-and-authentication/using-saml-with-omni/auto-assign-roles-to-saml-users"},{"title":"Sign SAML Requests","href":"/omni/security-and-authentication/using-saml-with-omni/sign-saml-requests"},{"title":"Configure Unifi Identity Enterprise for Omni","href":"/omni/security-and-authentication/using-saml-with-omni/configure-unifi-identity-enterprise-for-omni"},{"title":"Configure Workspace ONE Access for Omni","href":"/omni/security-and-authentication/using-saml-with-omni/configure-workspace-one-access-for-omni"},{"title":"Configure Entra ID for Omni","href":"/omni/security-and-authentication/using-saml-with-omni/how-to-configure-entraid-for-omni"},{"title":"Configure Oracle Cloud for Omni","href":"/omni/security-and-authentication/using-saml-with-omni/configure-oracle-cloud-for-omni"},{"title":"Use SAML groups information in Kubernetes","href":"/omni/security-and-authentication/using-saml-with-omni/use-saml-groups-in-kubernetes"}]},{"title":"Authentication and Authorization","href":"/omni/security-and-authentication/authentication-and-authorization"},{"title":"OIDC login with Tailscale","href":"/omni/security-and-authentication/oidc-login-with-tailscale"},{"title":"Manage Users in Omni","href":"/omni/security-and-authentication/manage-user-in-omni"},{"title":"Manage Access Policies (ACLs)","href":"/omni/security-and-authentication/how-to-manage-acls"},{"title":"Omni KMS Disk Encryption","href":"/omni/security-and-authentication/omni-kms-disk-encryption"},{"title":"Break Glass Emergency Access","href":"/omni/security-and-authentication/break-glass-emergency-access"},{"title":"Rotate SideroLink Join Token","href":"/omni/security-and-authentication/rotate-siderolink-join-token"},{"title":"Revoke Kubernetes Access Tokens","href":"/omni/security-and-authentication/revoke-kubernetes-access-tokens"},{"title":"Omni, Talos, and Kubernetes Security","href":"/omni/security-and-authentication/security-model"},{"title":"Subscribe to Security Advisories","href":"/omni/security-and-authentication/subscribe-to-security-advisories"}]},{"group":"Reference","pages":[{"title":"Build with the Omni API","href":"/omni/reference/build-with-the-omni-api"},{"title":"Access Policies (ACLs)","href":"/omni/reference/acls"},{"title":"omnictl CLI","href":"/omni/reference/cli"},{"title":"Cluster Templates","href":"/omni/reference/cluster-templates"},{"title":"Omni Configuration","href":"/omni/reference/omni-configuration"},{"title":"Manage Omni Resources with omnictl","href":"/omni/reference/manage-omni-resources-with-omnictl"},{"title":"Image Factory Configuration","href":"/omni/reference/image-factory-configuration"},{"title":"Omni Helm Chart","href":"/omni/reference/helm-chart"}]},{"group":"Troubleshooting and Support","pages":[{"title":"Troubleshooting","href":"/omni/troubleshooting/troubleshooting"},{"title":"FAQs","href":"/omni/troubleshooting/faqs"}]}]},{"product":"Talos Director","icon":"gauge","description":"Manage virtual machines, Kubernetes clusters, storage, and networking across the data center.","pages":[{"title":"Talos Director","href":"/director/overview/what-is-talos-director"}]},{"product":"Talos Hypervisor","icon":"server","description":"Run virtual machines on a Talos host through native Talos APIs and talosctl.","pages":[{"title":"Talos Hypervisor","href":"/hypervisor/overview/what-is-talos-hypervisor"}]},{"product":"Kubernetes Guides","icon":"https://mintlify.s3.us-west-1.amazonaws.com/siderolabs-fe86397c/images/kubernetes.svg","pages":[{"title":"Kubernetes Guides","href":"/kubernetes-guides/overview/kubernetes-guides-overview"}]},{"product":"Changelog","hidden":true,"pages":[{"title":"Changelog","href":"/changelog"}]}]},"basePath":"","title":"Run Image Factory On-Prem - Sidero Documentation","buildId":"dpl_596ePT575z4qnAFksq1biRW97aLY","deploymentId":"dpl_596ePT575z4qnAFksq1biRW97aLY","dynamics":["10e4515597"],"chunks":["BannerMarkdown-6DXXLlfN.js","dist-CmKHfscc.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","clsx-C3kuh_dz.js","html-void-elements-mCSPHezU.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js"]}