diff --git a/content/docs/en/cli.mdx b/content/docs/en/cli.mdx index 712c01763f..39267351ac 100644 --- a/content/docs/en/cli.mdx +++ b/content/docs/en/cli.mdx @@ -80,7 +80,7 @@ Here **project** and **environment** are the required arguments. User might add ### Injecting values on deploy -You can inject Helm values into a single deployment, on top of everything configured in the platform (see [Values](/docs/project/values) for the override levels): +You can inject Helm values into a single deployment, on top of everything configured in the platform (see [Values](/docs/project/workload/values) for the override levels): ```plain sleakops deploy -p myapp -e prod -f values.prod.yaml diff --git a/content/docs/en/cluster/addons/essential-addons.mdx b/content/docs/en/cluster/addons/essential-addons.mdx new file mode 100644 index 0000000000..9402fec31d --- /dev/null +++ b/content/docs/en/cluster/addons/essential-addons.mdx @@ -0,0 +1,55 @@ +--- +title: Essential addons +sidebar_label: Essential addons +sidebar_position: 9 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +:::info +This page covers importing an existing resource. If you haven't connected your AWS infrastructure to SleakOps yet, start with [Install SleakOps on your infra](/docs/install-on-your-infra). +::: + +Essential addons are the infrastructure glue every cluster needs to function under SleakOps: networking, autoscaling, and access control. Unlike the optional addons you pick from the Addons list, these five are always present — SleakOps installs them automatically on every managed cluster instead of waiting for you to add them. + + + Addons list showing the five essential addons (all Installed) alongside a mix of installed, deprecated, and not-yet-installed optional addons + + +They show in the Addons list like any other addon card, with no special badge or visual marker — you recognize them by name and description, not by a distinct treatment. + +## The five essential addons + +| Name | What it does | +|---|---| +| Metrics Server | Collects resource metrics from kubelets and exposes them through the Kubernetes Metrics API, enabling Horizontal Pod Autoscaling and `kubectl top`. | +| ExternalDNS | Synchronizes exposed Kubernetes Services and Ingresses with DNS providers (Route53), keeping cluster DNS records up to date automatically. | +| Karpenter | A Kubernetes node autoscaler that provisions right-sized compute capacity in response to unschedulable pods, improving efficiency and reducing cost. | +| AWS Auth | Wires SleakOps IAM roles into the cluster's `aws-auth` ConfigMap and the SleakOps RBAC ClusterRoles, enabling SleakOps integration and role-based access. | +| Load Balancer | The AWS Load Balancer Controller manages Application Load Balancers for Kubernetes Ingresses, plus the public and private IngressClasses used to route external traffic. | + +## Behavior on imported clusters + +On a managed cluster, SleakOps provisions and owns all five essential addons from day one. On an imported cluster, there's nothing to provision — the client's infrastructure already runs its own version of each piece — so instead of installing them, SleakOps adopts them from what's already there, one at a time, as you bring resources under management. + +The Load Balancer addon is one concrete example: when a cluster is imported, its Addon row is created directly from the public and private IngressClass names discovered in the import payload, without running any Pulumi provisioning — the client already runs their own ALB controller, so SleakOps only needs to record what exists. + +AWS Auth has the most involved import-time behavior. On a managed cluster, SleakOps owns the entire `aws-auth` ConfigMap's `mapRoles`. On an imported cluster, the module instead runs in merge mode: it reads the client's live `aws-auth` ConfigMap and merges in only the SleakOps-required role entries, deduplicated by role ARN with the SleakOps entries winning on conflict — every pre-existing client entry is preserved. This merge is idempotent: reading back an already-merged ConfigMap and running it again doesn't duplicate entries. + +## Restrictions + +**Configuration** — an essential addon's configuration form is read-only on a managed cluster, since SleakOps owns that configuration; it becomes editable on an imported cluster, since there the configuration reflects what the client already had running, which is theirs to change. Note that most essential addons (Metrics Server, ExternalDNS, Karpenter, AWS Auth) have no configurable fields at all — Load Balancer is the one with an actual schema (its public and private IngressClass names), so it's also the one where the read-only lock is visible: + + + Load Balancer addon detail view on a managed cluster, with its IngressClass name fields locked + + +**Deletion** — essential addons cannot be deleted at all on a managed cluster: they're permanent for the cluster's lifetime and are only torn down automatically when the cluster itself is destroyed. On an imported cluster, they can be deleted individually like any other adopted resource, subject to the same dependency guard as any addon (you can't delete one that another addon depends on). This restriction is gated by the cluster's type, not by the requesting user's role. diff --git a/content/docs/en/cluster/addons/essential-addons/essential-addon-lb-detail.png b/content/docs/en/cluster/addons/essential-addons/essential-addon-lb-detail.png new file mode 100644 index 0000000000..a464dc494d Binary files /dev/null and b/content/docs/en/cluster/addons/essential-addons/essential-addon-lb-detail.png differ diff --git a/content/docs/en/cluster/addons/essential-addons/essential-addons-list.png b/content/docs/en/cluster/addons/essential-addons/essential-addons-list.png new file mode 100644 index 0000000000..861e05394d Binary files /dev/null and b/content/docs/en/cluster/addons/essential-addons/essential-addons-list.png differ diff --git a/content/docs/en/cluster/addons/import-addons.mdx b/content/docs/en/cluster/addons/import-addons.mdx new file mode 100644 index 0000000000..53758f2833 --- /dev/null +++ b/content/docs/en/cluster/addons/import-addons.mdx @@ -0,0 +1,69 @@ +--- +title: Import and export addons +sidebar_label: Import and export addons +sidebar_position: 8 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +:::info +This page covers importing an existing resource. If you haven't connected your AWS infrastructure to SleakOps yet, start with [Install SleakOps on your infra](/docs/install-on-your-infra). +::: + +Addons can move in and out of SleakOps in two ways: importing a JSON definition exported from another cluster, or discovering and adopting a Helm release already running in the cluster. Both buttons sit on the Addons list next to **Add custom addon**, and both only appear when your company has the generic (custom Helm chart) addon type registered. From there the two flows differ in scope: **Import from JSON** and **Export JSON** work with any addon type registered in the cluster — SleakOps Managed (Grafana, KEDA, …) or custom — while **Import from cluster** always adopts the release as a custom addon, since discovery has no way to know which managed type (if any) a live Helm release corresponds to. + +Both flows require your company to have the import feature enabled (`infra_import.addon`) and require an **admin** user — creating, updating, or exporting an addon is admin-only on the backend. + + + Addons list showing Import from cluster and Import from JSON next to Add custom addon + + +## Import from JSON + +Click **Import from JSON** to paste a definition exported from another cluster: + + + Import addon from JSON dialog with a textarea for pasting the exported definition + + +Paste the JSON and click **Import**. SleakOps validates it before opening the form: + +- Invalid JSON: **"Invalid JSON. Paste a valid addon export."** +- Missing shape: **'The JSON must include a string "addon_type" and an object "values".'** +- A type the cluster doesn't have registered: **`Addon type "" is not available in this cluster.`** + +Once it validates, the matching addon's create form opens pre-filled from the pasted `values` (and `name`, if present) — nothing is locked, so you can change anything before installing. The submit button reads **Import** instead of **Install** as a reminder that these are starting values, not a fresh default configuration. + +This pairs with **Export JSON**, available on any installed addon's detail view — SleakOps Managed or custom — once it's in `created` state (same access requirement). It copies the addon's portable JSON to the clipboard and downloads it as `.addon.json` — that file is what you paste into **Import from JSON** on the destination cluster. + +## Import from cluster + +Click **Import from cluster** to discover the Helm releases already running in this cluster: + + + Import from cluster dialog listing discovered Helm releases with a Use button each + + +Each release shows its name, namespace, chart, and version. While discovery runs: **"Loading releases…"**; if it can't reach the cluster: **"Could not load Helm releases from the cluster."**; if none are found: **"No Helm releases found in this cluster."** + +Click **Use** on a release to pre-fill the generic addon form with its release name, namespace, chart, version, and current Helm values. Unlike the JSON flow — which can target any addon type — this always creates a custom (generic) addon, and it adopts a live resource rather than just starting from a set of values: the release name, namespace, chart, and version are locked (read-only) because they feed the underlying Pulumi import and must match what's actually running. **Repository URL** is the one field left blank and editable — the chart's repository URL can't be recovered from a live release, so you type it in yourself. + + + Generic addon form pre-filled from a discovered release, with release name, chart, version and namespace locked and Repository URL left blank + + +Click **Import** to adopt the release under SleakOps management. diff --git a/content/docs/en/cluster/addons/import-addons/import-addon-from-cluster-form.png b/content/docs/en/cluster/addons/import-addons/import-addon-from-cluster-form.png new file mode 100644 index 0000000000..f74b6ab6e3 Binary files /dev/null and b/content/docs/en/cluster/addons/import-addons/import-addon-from-cluster-form.png differ diff --git a/content/docs/en/cluster/addons/import-addons/import-addon-from-cluster.png b/content/docs/en/cluster/addons/import-addons/import-addon-from-cluster.png new file mode 100644 index 0000000000..73bc009365 Binary files /dev/null and b/content/docs/en/cluster/addons/import-addons/import-addon-from-cluster.png differ diff --git a/content/docs/en/cluster/addons/import-addons/import-addon-json.png b/content/docs/en/cluster/addons/import-addons/import-addon-json.png new file mode 100644 index 0000000000..db644db798 Binary files /dev/null and b/content/docs/en/cluster/addons/import-addons/import-addon-json.png differ diff --git a/content/docs/en/cluster/addons/import-addons/import-addons-buttons.png b/content/docs/en/cluster/addons/import-addons/import-addons-buttons.png new file mode 100644 index 0000000000..3be62f9215 Binary files /dev/null and b/content/docs/en/cluster/addons/import-addons/import-addons-buttons.png differ diff --git a/content/docs/en/cluster/index.mdx b/content/docs/en/cluster/index.mdx index 33b86e2969..21802eb1c5 100644 --- a/content/docs/en/cluster/index.mdx +++ b/content/docs/en/cluster/index.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 5 +sidebar_position: 6 title: Cluster pagination_next: environment/index --- diff --git a/content/docs/en/cluster/nodepools/importing-a-nodepool.mdx b/content/docs/en/cluster/nodepools/importing-a-nodepool.mdx new file mode 100644 index 0000000000..e26104190b --- /dev/null +++ b/content/docs/en/cluster/nodepools/importing-a-nodepool.mdx @@ -0,0 +1,59 @@ +--- +title: Importing a Node Pool +sidebar_label: Importing a Node Pool +sidebar_position: 4 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +:::info +This page covers importing an existing resource. If you haven't connected your AWS infrastructure to SleakOps yet, start with [Install SleakOps on your infra](/docs/install-on-your-infra). +::: + +SleakOps can bring an existing Karpenter node pool under management instead of creating one from scratch. Import discovers the live node pools running in your cluster and lets you adopt one as-is. + +## Prerequisites + +- An admin user in SleakOps. +- The import feature enabled for your company (`infra_import.nodepool`). +- The cluster must **not** be in import mode. **Import Node Pool** is only available on clusters SleakOps provisioned itself — it doesn't appear on imported clusters. + +## Discover and import + +From the Cluster Listing, select a cluster and access its Settings, then click on Node Pools. If the prerequisites above are met, an **Import Node Pool** button sits next to **Create**. + + + Node Pools section of a cluster, with the Import Node Pool button next to Create + + +### Discover + +Clicking it opens a dialog that lists the live Karpenter node pools running in the cluster that SleakOps doesn't manage yet: + +- While the search runs: **"Discovering Karpenter node pools…"** +- No unmanaged node pools found: **"No unmanaged Karpenter node pools were found in this cluster."** +- The cluster isn't reachable: an error asking you to check connectivity and try again. + +A node pool whose name doesn't match SleakOps' naming rules (lowercase alphanumerics with single hyphens, up to 50 characters) can't be adopted and appears disabled — the pool's name becomes the NodePool's name in SleakOps and can't be edited afterward, so names outside that pattern are filtered out of selection. + + + Import Node Pool dialog showing the discovered, unmanaged Karpenter node pools of the cluster + + +### Review + +Select a node pool and move to the next step: "Review the configuration mapped from the live pool. It is adopted exactly as it runs today, even where its values fall outside the SleakOps ranges." + +SleakOps pre-fills the same form used to create or edit a node pool with the values discovered on the live pool — architecture, node types, instance types, CPU and memory limits, node storage, and its dedicated taint if the pool has one. + +## After importing + +Once you confirm the import: "`` is being adopted by SleakOps. SleakOps is taking the live node pool under management. Its EC2NodeClass is cloned under the pool's name and existing nodes rotate gradually, respecting PodDisruptionBudgets and disruption budgets. You can follow the progress in the node pools list." diff --git a/content/docs/en/cluster/nodepools/importing-a-nodepool/import-nodepool-button.png b/content/docs/en/cluster/nodepools/importing-a-nodepool/import-nodepool-button.png new file mode 100644 index 0000000000..797fcbb437 Binary files /dev/null and b/content/docs/en/cluster/nodepools/importing-a-nodepool/import-nodepool-button.png differ diff --git a/content/docs/en/cluster/nodepools/importing-a-nodepool/import-nodepool-dialog.png b/content/docs/en/cluster/nodepools/importing-a-nodepool/import-nodepool-dialog.png new file mode 100644 index 0000000000..5bf31c2438 Binary files /dev/null and b/content/docs/en/cluster/nodepools/importing-a-nodepool/import-nodepool-dialog.png differ diff --git a/content/docs/en/domain/import-domain.mdx b/content/docs/en/domain/import-domain.mdx new file mode 100644 index 0000000000..09df92dae8 --- /dev/null +++ b/content/docs/en/domain/import-domain.mdx @@ -0,0 +1,53 @@ +--- +title: Import a domain +sidebar_label: Import a domain +sidebar_position: 3 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +:::info +This page covers importing an existing resource. If you haven't connected your AWS infrastructure to SleakOps yet, start with [Install SleakOps on your infra](/docs/install-on-your-infra). +::: + +Domain import isn't a separate flow — it's a section inside the Environment creation form. Creating an Environment normally provisions a brand-new Route53 hosted zone; the import option lets you reuse one that already exists in the target AWS account instead. + +## Reuse an existing hosted zone + +On the Environment creation form, an admin-only **Use Existing Hosted Zone** toggle sits below the base fields (Name, Cluster, Domain): + +> Adopt a Route53 hosted zone that already exists in the target AWS account instead of creating a new one. The ACM certificate for the domain is adopted automatically when the account has one issued. + +Before you can search, three fields need to be filled in first — the Cluster determines which AWS account SleakOps searches: + +- No Cluster selected: **"Select a Cluster to search its account for existing hosted zones."** +- Cluster selected but Name or Domain still missing/invalid: **"Enter a Name and a valid Domain to search for existing hosted zones."** + +Once all three are filled in, turning the toggle on searches Route53 in that account: + +- A zone whose name matches the Domain field exactly is marked **Exact Match** (plus **Private** if it's a private zone) and listed first. +- Any other zones found in the account are listed below it, each with a **Private** badge if applicable. +- No zones at all: **"No hosted zones found in the account."** +- Zones exist but none match exactly: **"No hosted zone matches `` exactly. Pick one manually or create a new one."** + +Pick one with the radio cards — **Create a New Hosted Zone** (the default, SleakOps provisions a new zone) or one of the discovered zones. Changing the Cluster switches the target AWS account, so it discards any zone you'd already picked — a hosted zone ID only makes sense within the account it belongs to. + + + Environment creation form with the Use Existing Hosted Zone toggle on, showing an exact-match zone and another discovered zone + + +Once the Environment is created, the usual domain setup applies — see [Setup your Domains](/docs/domain/setup) and the [Domain Delegation Guide](/docs/domain/delegation) for what comes next. + +## FAQs + +
+ + ### What happens to the ACM certificate? + + It's adopted automatically, along with the hosted zone, when the target AWS account already has one issued for the domain. +
diff --git a/content/docs/en/domain/import-domain/domain-import-section.png b/content/docs/en/domain/import-domain/domain-import-section.png new file mode 100644 index 0000000000..56ecf5a7d4 Binary files /dev/null and b/content/docs/en/domain/import-domain/domain-import-section.png differ diff --git a/content/docs/en/domain/index.mdx b/content/docs/en/domain/index.mdx index 327eede72b..05fe6a8984 100644 --- a/content/docs/en/domain/index.mdx +++ b/content/docs/en/domain/index.mdx @@ -1,6 +1,6 @@ --- sidebar_label: Domain -sidebar_position: 8 +sidebar_position: 9 --- # Domain Levels & Strategies @@ -134,6 +134,8 @@ If `anything.com` is completely external: - You need multiple domains for the same service - Connecting external domains to your Sleakops services +Each domain or alias you add gets its own manifest — see [Manifests](/docs/project/workload/manifests#ingress-per-domain). + --- ## Delegation Strategies diff --git a/content/docs/en/environment/index.mdx b/content/docs/en/environment/index.mdx index f23a83000d..9942c1b7fb 100644 --- a/content/docs/en/environment/index.mdx +++ b/content/docs/en/environment/index.mdx @@ -1,6 +1,6 @@ --- sidebar_label: Environment -sidebar_position: 6 +sidebar_position: 7 pagination_next: project/index --- diff --git a/content/docs/en/install-on-your-infra/import-accounts.mdx b/content/docs/en/install-on-your-infra/import-accounts.mdx new file mode 100644 index 0000000000..7b7559dd72 --- /dev/null +++ b/content/docs/en/install-on-your-infra/import-accounts.mdx @@ -0,0 +1,48 @@ +--- +title: Import an account +sidebar_label: Import an account +sidebar_position: 3 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +# Import an account + +Once a provider is running in import mode, connect each existing AWS account you want SleakOps to manage from its **Accounts & Networking** section. + +## Declare an existing AWS account + +1. In **Accounts & Networking**, click the **Install SleakOps in account** card. +2. Fill in the three fields: + + - **Account color** — pick one of the 8 preset swatches, or use the custom color picker to choose any other color. + - **Account name** — up to 20 characters (e.g. `payments-prod`). + - **AWS account ID** — the account's 12-digit numeric ID. + + + Import account form with color, name, and AWS account ID filled in + + +3. Click **Create account**. The account appears in the list on the left. + +## Run the CloudFormation stack + +1. Select the new account in the list. Its detail panel shows **CloudFormation not applied yet**. + + + Account detail panel showing the CloudFormation not applied yet state with the Open CloudFormation link + + +2. Click **Open CloudFormation** to launch the SleakOps CloudFormation stack. It opens in a new tab — run it signed in to this AWS account. + +## What happens next + +Once SleakOps receives the stack's callback, the account is ready for network configuration. diff --git a/content/docs/en/install-on-your-infra/import-accounts/account-awaiting-cfn.png b/content/docs/en/install-on-your-infra/import-accounts/account-awaiting-cfn.png new file mode 100644 index 0000000000..f017b0fd42 Binary files /dev/null and b/content/docs/en/install-on-your-infra/import-accounts/account-awaiting-cfn.png differ diff --git a/content/docs/en/install-on-your-infra/import-accounts/import-account-form.png b/content/docs/en/install-on-your-infra/import-accounts/import-account-form.png new file mode 100644 index 0000000000..bc7401a184 Binary files /dev/null and b/content/docs/en/install-on-your-infra/import-accounts/import-account-form.png differ diff --git a/content/docs/en/install-on-your-infra/import-cluster.mdx b/content/docs/en/install-on-your-infra/import-cluster.mdx new file mode 100644 index 0000000000..696135ce0f --- /dev/null +++ b/content/docs/en/install-on-your-infra/import-cluster.mdx @@ -0,0 +1,83 @@ +--- +title: Import the cluster +sidebar_label: Import the cluster +sidebar_position: 5 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +# Import the cluster + +With an account's network configured, SleakOps can register an existing EKS cluster of that account without recreating it — the last step of the import journey. + +## Prerequisites + +- An account already in **created** state, with its network configured ([Configure the network](/docs/install-on-your-infra/network-configuration)). + +## Install SleakOps in the cluster + +On the Clusters list, admins see an **Install SleakOps in Cluster** button next to **Create**. It only appears once at least one account is in created state. + + + Clusters list with the Install SleakOps in Cluster button next to Create + + +The button opens a 4-step dialog. + +### 1. Select account + +Choose the account of the EKS cluster. Only accounts in created state are listed. + +### 2. Select cluster + +SleakOps lists the EKS clusters it discovered in that account — name, Kubernetes version and status (ACTIVE, etc.). Pick the cluster to import. + + + Select cluster step listing the EKS clusters SleakOps discovered in the account, with one selected + + +### 3. Cluster endpoint access + +SleakOps operates inside the cluster through its Kubernetes API, so it needs to reach the cluster endpoint. If the endpoint is already public with an allowlist, SleakOps adds its own outbound addresses to it, keeping every entry already there. If the endpoint isn't publicly reachable, SleakOps enables it and restricts it to its own outbound addresses. + +Check **I allow SleakOps to access the endpoint of this cluster** to continue — it's required. + +### 4. Ingress classes + +Enter the **Private IngressClass name** (e.g. `alb-internal`) and **Public IngressClass name** (e.g. `alb-internet-facing`) of the cluster. SleakOps uses them to route private and public traffic — it can't autodetect them, since only the cluster's ALB controller configuration defines which one is which. + + + Ingress classes step with the Private and Public IngressClass name fields filled in + + +Click **Install** to start the import. + +## Installation progress + +While the import runs, SleakOps reads the cluster metadata (OIDC issuer), sets up the account VPN if it doesn't exist yet, creates the dedicated `sleakops` namespace, and saves the Load Balancer addon with the IngressClass names from step 4. + +You can close the dialog and follow the progress from the clusters list — it keeps refreshing while the import is in progress. + +Once it finishes, SleakOps can reach the cluster endpoint and is ready to operate inside it. From here, the cluster is ready to have its essential addons and nodepools managed. + +## The Imported badge + +An imported cluster shows an **Imported** badge on its card in the clusters list, distinguishing it from clusters SleakOps created from scratch. Hovering over the badge shows: "Pre-existing EKS cluster imported into SleakOps". + + + Clusters list showing an imported cluster with the Imported badge and its tooltip + diff --git a/content/docs/en/install-on-your-infra/import-cluster/cluster-imported-badge.png b/content/docs/en/install-on-your-infra/import-cluster/cluster-imported-badge.png new file mode 100644 index 0000000000..fb4b234137 Binary files /dev/null and b/content/docs/en/install-on-your-infra/import-cluster/cluster-imported-badge.png differ diff --git a/content/docs/en/install-on-your-infra/import-cluster/import-cluster-button.png b/content/docs/en/install-on-your-infra/import-cluster/import-cluster-button.png new file mode 100644 index 0000000000..25d42233f7 Binary files /dev/null and b/content/docs/en/install-on-your-infra/import-cluster/import-cluster-button.png differ diff --git a/content/docs/en/install-on-your-infra/import-cluster/import-cluster-ingress-classes.png b/content/docs/en/install-on-your-infra/import-cluster/import-cluster-ingress-classes.png new file mode 100644 index 0000000000..b03a01e380 Binary files /dev/null and b/content/docs/en/install-on-your-infra/import-cluster/import-cluster-ingress-classes.png differ diff --git a/content/docs/en/install-on-your-infra/import-cluster/import-cluster-select-eks.png b/content/docs/en/install-on-your-infra/import-cluster/import-cluster-select-eks.png new file mode 100644 index 0000000000..e1caeaae17 Binary files /dev/null and b/content/docs/en/install-on-your-infra/import-cluster/import-cluster-select-eks.png differ diff --git a/content/docs/en/install-on-your-infra/import-provider.mdx b/content/docs/en/install-on-your-infra/import-provider.mdx new file mode 100644 index 0000000000..311d5ae48f --- /dev/null +++ b/content/docs/en/install-on-your-infra/import-provider.mdx @@ -0,0 +1,44 @@ +--- +title: Import a provider +sidebar_label: Import a provider +sidebar_position: 2 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +# Import a provider + +A Provider in import mode connects SleakOps to an AWS Organization you already run, instead of creating a new one. This page covers how to create a provider in import mode and where it leads next. + +## When to use import mode + +Use the default flow ([Providers](/docs/provider)) when you want SleakOps to provision a new AWS Organization and accounts for you. Use import mode when you already operate AWS infrastructure and want SleakOps to manage it as-is — the accounts, network, and EKS cluster are connected rather than recreated. + +## Create the provider in import mode + +1. Go to **Settings > Providers** and click **Create**. The provider wizard opens on the **Basic Information** tab. +2. Turn on the **Install SleakOps in existing AWS infra** toggle. + + + Basic Information tab with the Install SleakOps in existing AWS infra toggle turned on + + + With the toggle on, the **Email** field is hidden — SleakOps reads the account email from your existing AWS setup instead. **Name**, **Region**, and **Domain** work the same as in the default flow. +3. Fill in **Name**, **Region**, and **Domain**, then click **Submit** to move to **Connect to AWS**. This tab and the CloudFormation role setup match the default flow — see [Providers](/docs/provider) — with one addition: an optional box lets you run a CloudFormation stack once on your AWS organization root account to activate organization-level Cost Allocation Tags. Skipping it only disables organization-level cost tagging. +4. Once the provider finishes creating, SleakOps redirects you automatically to **Accounts & Networking** instead of the dashboard. + + + Accounts and Networking section for a provider created in import mode + + +## Next step + +From **Accounts & Networking**, [connect your existing AWS accounts](/docs/install-on-your-infra/import-accounts) to the provider. diff --git a/content/docs/en/install-on-your-infra/import-provider/accounts-networking-landing.png b/content/docs/en/install-on-your-infra/import-provider/accounts-networking-landing.png new file mode 100644 index 0000000000..da8a28bc6d Binary files /dev/null and b/content/docs/en/install-on-your-infra/import-provider/accounts-networking-landing.png differ diff --git a/content/docs/en/install-on-your-infra/import-provider/provider-wizard-import-toggle.png b/content/docs/en/install-on-your-infra/import-provider/provider-wizard-import-toggle.png new file mode 100644 index 0000000000..8e765d3193 Binary files /dev/null and b/content/docs/en/install-on-your-infra/import-provider/provider-wizard-import-toggle.png differ diff --git a/content/docs/en/install-on-your-infra/index.mdx b/content/docs/en/install-on-your-infra/index.mdx new file mode 100644 index 0000000000..fec955a304 --- /dev/null +++ b/content/docs/en/install-on-your-infra/index.mdx @@ -0,0 +1,45 @@ +--- +title: Install SleakOps on your infra +sidebar_label: Install SleakOps on your infra +sidebar_position: 4 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +# Install SleakOps on your infra + +SleakOps can bring an existing AWS setup under management instead of provisioning everything from scratch. Import mode connects SleakOps to infrastructure you already run — an AWS account, its network, and an EKS cluster — without recreating any of it. + +Import features are enabled per company — contact SleakOps to enable them for yours. + +## Prerequisites + +- An AWS account with existing infrastructure to import. +- Permissions to run CloudFormation stacks in that account. +- An admin user in SleakOps. + +## The import journey + +Importing existing infrastructure follows a fixed sequence: + +1. [Import the provider](/docs/install-on-your-infra/import-provider). +2. [Import the accounts](/docs/install-on-your-infra/import-accounts). +3. [Configure the network](/docs/install-on-your-infra/network-configuration). +4. [Import the cluster](/docs/install-on-your-infra/import-cluster). + +## What you can import + +| Resource | What it does | +|---|---| +| [Provider](/docs/install-on-your-infra/import-provider) | Connect SleakOps to an AWS Organization you already run. | +| [Account](/docs/install-on-your-infra/import-accounts) | Declare an existing AWS account and connect it via CloudFormation. | +| [Network configuration](/docs/install-on-your-infra/network-configuration) | Complete the network inputs SleakOps needs for an imported account. | +| [Cluster](/docs/install-on-your-infra/import-cluster) | Register an existing EKS cluster in SleakOps. | +| [Dependency](/docs/project/dependency/import-dependency) | Register an existing managed resource (RDS, S3, SQS, Redis…) as a SleakOps Dependency. | +| [Project](/docs/project/import-project) | Adopt an existing deployment as a SleakOps Project. | +| [Domain](/docs/domain/import-domain) | Reuse an existing Route53 hosted zone for an Environment. | +| [NodePool](/docs/cluster/nodepools/importing-a-nodepool) | Register an existing EKS node pool. | +| [Addons](/docs/cluster/addons/import-addons) | Import an addon's manifests, or adopt one already running in the cluster. | +| [Essential addons](/docs/cluster/addons/essential-addons) | Adopt the cluster's existing core addons (AWS Auth, external-dns, etc.) into SleakOps. | diff --git a/content/docs/en/install-on-your-infra/network-configuration.mdx b/content/docs/en/install-on-your-infra/network-configuration.mdx new file mode 100644 index 0000000000..6c0a55f15d --- /dev/null +++ b/content/docs/en/install-on-your-infra/network-configuration.mdx @@ -0,0 +1,76 @@ +--- +title: Configure the network +sidebar_label: Configure the network +sidebar_position: 4 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +# Configure the network + +Once an account's CloudFormation stack has run, SleakOps needs to know which VPC, subnets and gateways to use before it can deploy a cluster into it. This step maps that existing AWS network to the inputs SleakOps requires. + +## Find accounts waiting on network configuration + +If you have accounts still waiting on network configuration, you'll see an alert for it on the Providers list. The banner reads **Network configuration pending** and names the provider with pending accounts. Its **Configure networking** button takes you straight to that account's network configuration form in **Accounts & Networking**. Only admins see this alert. + + + Providers list showing the Network configuration pending banner with the Configure networking button + + +## Select the VPC + +The account's detail panel opens on a single required field: **VPC**. The dropdown lists every VPC SleakOps discovered in the account, as ` · `. + + + Network configuration form with the VPC dropdown not yet selected + + +Selecting a VPC loads its subnets, NAT Gateways and Internet Gateway — the form shows **Loading subnets, NAT and gateways…** while that happens. + +## Assign subnets to slots + +| **Setting** | **Description** | +| -------------------- | ------------------------------------------------------------- | +| **Public subnets** | Subnets with a route to the Internet Gateway. | +| **Private subnets** | Subnets that reach the internet through a NAT Gateway. | +| **Persistent subnets** | Subnets for stateful resources (databases, storage). | + +All three slots are required — each needs at least one subnet, or the form shows **Select at least one subnet**. The same subnet can be assigned to more than one slot. + +## Gateways + +- **NAT Gateway(s)** — select at least one. If none are selected, the form shows **Select at least one NAT Gateway**. If the VPC has no NAT Gateway at all, SleakOps shows a warning asking you to create one or pick another VPC. +- **Internet Gateway** — a single required dropdown, with the same warning if the VPC has none attached. + +Each NAT Gateway's Elastic IP is taken automatically from AWS — there's no field to pick it separately. + + + Network configuration form with a VPC, all three subnet slots, a NAT Gateway and the Internet Gateway selected + + +## Submit and import + +**Save and apply** stays disabled until all three subnet slots, at least one NAT Gateway, and the Internet Gateway are set. Once you submit, the account moves to **Creating…** while SleakOps applies the configuration — the panel switches to the **network explorer** automatically when it finishes. + +The network explorer is a read-only view of the imported network: the VPC, its route tables, the Internet Edge (Internet Gateway, NAT Gateway and its Elastic IP), and the subnets grouped by Public, Private and Persistent. + + + Network explorer showing the VPC, route tables, Internet Edge and subnet groups for a configured account + + +From here, the account is ready to import its cluster. diff --git a/content/docs/en/install-on-your-infra/network-configuration/network-config-slots.png b/content/docs/en/install-on-your-infra/network-configuration/network-config-slots.png new file mode 100644 index 0000000000..5613cab220 Binary files /dev/null and b/content/docs/en/install-on-your-infra/network-configuration/network-config-slots.png differ diff --git a/content/docs/en/install-on-your-infra/network-configuration/network-config-vpc.png b/content/docs/en/install-on-your-infra/network-configuration/network-config-vpc.png new file mode 100644 index 0000000000..3fda8cad58 Binary files /dev/null and b/content/docs/en/install-on-your-infra/network-configuration/network-config-vpc.png differ diff --git a/content/docs/en/install-on-your-infra/network-configuration/network-explorer.png b/content/docs/en/install-on-your-infra/network-configuration/network-explorer.png new file mode 100644 index 0000000000..0f8423fcb5 Binary files /dev/null and b/content/docs/en/install-on-your-infra/network-configuration/network-explorer.png differ diff --git a/content/docs/en/install-on-your-infra/network-configuration/pending-network-alert.png b/content/docs/en/install-on-your-infra/network-configuration/pending-network-alert.png new file mode 100644 index 0000000000..5b1415da85 Binary files /dev/null and b/content/docs/en/install-on-your-infra/network-configuration/pending-network-alert.png differ diff --git a/content/docs/en/install-on-your-infra/whats-next.mdx b/content/docs/en/install-on-your-infra/whats-next.mdx new file mode 100644 index 0000000000..40ed23823e --- /dev/null +++ b/content/docs/en/install-on-your-infra/whats-next.mdx @@ -0,0 +1,84 @@ +--- +title: What's next +sidebar_label: What's next +sidebar_position: 6 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; +import { FiDatabase, FiBox, FiGlobe, FiServer, FiPackage, FiShield } from "react-icons/fi"; + +# What's next + +The base import journey — provider, accounts, network, and cluster — is done; here's what else you can bring into SleakOps from your existing infrastructure. + +
+ +{" "} + +
+
+ +

Dependencies

+
+

Register an existing RDS, S3 bucket, SQS queue or Redis cluster that already runs in your AWS account.

+ Learn more +
+ +{" "} + +
+
+ +

Projects

+
+

Adopt an existing deployment as a SleakOps Project.

+ Learn more +
+ +{" "} + +
+
+ +

Domains

+
+

Reuse an existing Route53 hosted zone for an Environment.

+ Learn more +
+ +{" "} + +
+
+ +

NodePools

+
+

Register an existing EKS node pool.

+ Learn more +
+ +{" "} + +
+
+ +

Addons

+
+

Import an addon's manifests, or adopt one already running in the cluster.

+ Learn more +
+ +{" "} + +
+
+ +

Essential addons

+
+

Adopt the cluster's existing core addons into SleakOps.

+ Learn more +
+ +
diff --git a/content/docs/en/network/index.mdx b/content/docs/en/network/index.mdx index e60d9ab764..18c094cf35 100644 --- a/content/docs/en/network/index.mdx +++ b/content/docs/en/network/index.mdx @@ -2,7 +2,7 @@ id: network-resources title: Network Resources sidebar_label: Network Resources -sidebar_position: 6 +sidebar_position: 7 --- import Zoom from "react-medium-image-zoom"; diff --git a/content/docs/en/powered-ai/mcp.mdx b/content/docs/en/powered-ai/mcp.mdx index 0b1f417c1f..cfc1beb66d 100644 --- a/content/docs/en/powered-ai/mcp.mdx +++ b/content/docs/en/powered-ai/mcp.mdx @@ -39,7 +39,11 @@ Add the server to your MCP client configuration: } ``` -The first time your client connects, it opens your browser on the SleakOps sign-in page. Enter your account email and password — and your two-factor code if you have it enabled — and the client receives its access automatically. From then on it renews the session on its own. +The first time your client connects, it opens your browser on the SleakOps sign-in page. Enter your account email and password — and your two-factor code if you have it enabled — and then authorize that client: the screen names the application asking for access and the address that will receive it. Approve it and the client is connected; from then on it renews the session on its own. + +:::warning +Only approve an authorization you started yourself from your MCP client. If that screen appears without you connecting anything, or it names an application you don't recognize, cancel it — someone else may have started the flow with your account. +::: :::tip The URL is the only thing your client needs. Your SleakOps password is never stored in the configuration file, and neither the client nor the server keeps a copy of it. @@ -87,6 +91,16 @@ The import tools register resources that already exist in your AWS accounts — Onboarding a new AWS account (provider, account, network configuration) and importing an EKS cluster are done with the console's import wizard, not through the MCP. +### Deploying a static site end-to-end + +With the `static` feature in your subscription, the agent can take a frontend repository to a published site in a single conversation. The target environment must already exist and have a domain configured (see [Static Site](/docs/project/workload/static)) — environments are created in the console. + +1. **Create the project** — "Create a static project for repo X on the dev environment, building with Node 20, `npm run build`, output in `dist`". The agent calls `create_project` with `method="static"` and the three build fields (`node_version`, `build_command`, `output_path`). +2. **Attach the site's domain** — "Serve it at landing.dev.example.com". The agent calls `create_static`; the URL must be a direct subdomain of the environment's domain. Do this **before** the first deployment: a static project's deployable workloads are its Statics, so a deployment without one is rejected. +3. **First publish is automatic** — once the site's domain is active, SleakOps triggers the first build and its deploy on its own. +4. **Ship updates** — "Build main and deploy it when it finishes". The agent chains `trigger_build`, `create_release`, `create_deployment`, `approve_deployment` and `wait_for_deployment`. Each deploy syncs the build output to the project's bucket and invalidates the CloudFront cache of every Static with invalidate on deploy enabled (the default). +5. **Refresh the cache on demand** — "Invalidate the cache of the landing site". The agent calls `invalidate_static`, useful when invalidate on deploy is disabled or you need to force a refresh. + ## What the MCP does not do Two things stay a deliberate decision in the console: diff --git a/content/docs/en/project/chart/extra_templates.mdx b/content/docs/en/project/chart/extra_templates.mdx index acfe64739a..dffb3ee008 100644 --- a/content/docs/en/project/chart/extra_templates.mdx +++ b/content/docs/en/project/chart/extra_templates.mdx @@ -8,7 +8,7 @@ import { FiExternalLink } from "react-icons/fi"; # Extra Templates :::warning Deprecated in favor of Manifests -Extending templates & values is deprecated. To add or edit custom resources, use the Project's **Manifests** section instead — each resource becomes its own manifest, with validation, preview and per-Workload scoping. See the [Manifests documentation](/docs/project/manifests). Existing Extra Templates keep deploying as before until you migrate them. +Extending templates & values is deprecated. To add or edit custom resources, use the Project's **Manifests** section instead — each resource becomes its own manifest, with validation, preview and per-Workload scoping. See the [Manifests documentation](/docs/project/workload/manifests). Existing Extra Templates keep deploying as before until you migrate them. ::: Extra Templates enable you to deploy custom Kubernetes resources beyond SleakOps' built-in components. This powerful feature allows you to extend your project with specialized resources such as custom Ingresses, testing pods, or other Kubernetes objects tailored to your specific requirements. diff --git a/content/docs/en/project/chart/index.mdx b/content/docs/en/project/chart/index.mdx index 3dcd58202b..7082bae6d8 100644 --- a/content/docs/en/project/chart/index.mdx +++ b/content/docs/en/project/chart/index.mdx @@ -83,8 +83,8 @@ Values that apply across the entire Project: Yes. You can: - - Customize or add [**Manifests**](/docs/project/manifests) per Workload or shared across the Project - - Override [**Values**](/docs/project/values) at the project or workload level + - Customize or add [**Manifests**](/docs/project/workload/manifests) per Workload or shared across the Project + - Override [**Values**](/docs/project/workload/values) at the project or workload level - Add chart dependencies using [**Chart Dependencies**](/docs/project/chart/chart_dependencies), similar to [Helm Chart Dependencies ](https://helm.sh/docs/helm/helm_dependency/) @@ -93,7 +93,7 @@ Values that apply across the entire Project: ### Can I add a custom Ingress to my Project? Yes — add it as a manifest from the Workload's Advanced view or the project - bucket. See the [Manifests documentation](/docs/project/manifests). The legacy + bucket. See the [Manifests documentation](/docs/project/workload/manifests). The legacy [Extra Templates](/docs/project/chart/extra_templates) path still works but is deprecated. @@ -104,5 +104,5 @@ Values that apply across the entire Project: Yes. Open the Workload's **Advanced** view, click the manifest and edit its YAML — your copy is preserved and never overwritten by SleakOps. See - [Manifests](/docs/project/manifests). + [Manifests](/docs/project/workload/manifests). diff --git a/content/docs/en/project/dependency/import-dependency.mdx b/content/docs/en/project/dependency/import-dependency.mdx new file mode 100644 index 0000000000..7567354088 --- /dev/null +++ b/content/docs/en/project/dependency/import-dependency.mdx @@ -0,0 +1,94 @@ +--- +title: Import a dependency +sidebar_label: Import a dependency +sidebar_position: 14 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +:::info +This page covers importing an existing resource. If you haven't connected your AWS infrastructure to SleakOps yet, start with [Install SleakOps on your infra](/docs/install-on-your-infra). +::: + +SleakOps can register a Dependency you already run in AWS — a database, a queue, a bucket — instead of creating one from scratch. Import discovers the real resources in an account and adopts the one you pick without modifying it. + +## Supported types + +All 14 types below are supported for import. This table only indicates whether SleakOps needs credentials to connect — it isn't a support/not-supported column. + +| **Type** | **Credentials required** | +| --------------------- | ------------------------- | +| **PostgreSQL** | Yes | +| **MySQL** | Yes | +| **MariaDB** | Yes | +| **Oracle** | Yes | +| **Aurora MySQL** | Yes | +| **Aurora PostgreSQL** | Yes | +| **DocumentDB** | Yes | +| **RabbitMQ** | Yes | +| **MSK** | Only for SASL/SCRAM | +| **S3 bucket** | No | +| **SQS** | No | +| **Redis** | No | +| **Memcached** | No | +| **OpenSearch** | No | + +## Discover and import + +On the Dependencies list, click **Import Dependency** next to **Create**. + + + Dependencies list with the Import Dependency button next to Create + + +The button opens a 4-step dialog. + +### 1. Choose the type of resource + +Search and pick one of the supported types above. + +### 2. Choose the account + +Select the account where the resource lives. Only accounts in created state are listed. + +### 3. Discover + +SleakOps lists the real resources of that type it found in the account — name, engine version (or the relevant attributes for non-database types), and status. A resource already registered in SleakOps shows dimmed and disabled, with a tooltip explaining it's already managed. + + + Discover step listing the resources SleakOps found in the account, with one selected + + +### 4. Name, project and credentials + +Enter a **Name** and pick the **Project** to attach the dependency to. For types that require credentials, enter the **Username** and **Password** SleakOps should use to connect — AWS never exposes the master password of an existing instance, so these values aren't discovered automatically. + + + Name, project and credentials step filled in for a PostgreSQL resource + + +Click **Import** to start the registration. SleakOps adopts the resource into its infrastructure state without modifying it, and you can follow the progress from the dependencies list. + +## Configuration sync + +Once imported, a dependency's config can also be synced from the real AWS resource in the background — this isn't triggered from the console yet. + +## FAQs + +
+ +### Does importing modify the resource? + +No. SleakOps adopts the resource into its infrastructure state without modifying it — it only registers what's already there. +
diff --git a/content/docs/en/project/dependency/import-dependency/import-dependency-button.png b/content/docs/en/project/dependency/import-dependency/import-dependency-button.png new file mode 100644 index 0000000000..c67d94bac5 Binary files /dev/null and b/content/docs/en/project/dependency/import-dependency/import-dependency-button.png differ diff --git a/content/docs/en/project/dependency/import-dependency/import-dependency-config.png b/content/docs/en/project/dependency/import-dependency/import-dependency-config.png new file mode 100644 index 0000000000..fdea05ede1 Binary files /dev/null and b/content/docs/en/project/dependency/import-dependency/import-dependency-config.png differ diff --git a/content/docs/en/project/dependency/import-dependency/import-dependency-discovery.png b/content/docs/en/project/dependency/import-dependency/import-dependency-discovery.png new file mode 100644 index 0000000000..2f9c237cf0 Binary files /dev/null and b/content/docs/en/project/dependency/import-dependency/import-dependency-discovery.png differ diff --git a/content/docs/en/project/deployment/pending_changes.mdx b/content/docs/en/project/deployment/pending_changes.mdx index 1d804f8cd1..71e7c7114a 100644 --- a/content/docs/en/project/deployment/pending_changes.mdx +++ b/content/docs/en/project/deployment/pending_changes.mdx @@ -6,7 +6,7 @@ import "react-medium-image-zoom/dist/styles.css"; # Pending Changes & Publishing -Not every change has to hit the cluster immediately. Whenever you save an edit with the **Deploy?** switch off — a Workload edit, a [manifest](/docs/project/manifests) customization, a [values](/docs/project/values) override, a Var Group update — SleakOps records it as a **pending change** instead of deploying it. Pending changes accumulate per environment until you review and publish them with one click. +Not every change has to hit the cluster immediately. Whenever you save an edit with the **Deploy?** switch off — a Workload edit, a [manifest](/docs/project/workload/manifests) customization, a [values](/docs/project/workload/values) override, a Var Group update — SleakOps records it as a **pending change** instead of deploying it. Pending changes accumulate per environment until you review and publish them with one click. ## How changes accumulate diff --git a/content/docs/en/project/import-project.mdx b/content/docs/en/project/import-project.mdx new file mode 100644 index 0000000000..0f15132dd7 --- /dev/null +++ b/content/docs/en/project/import-project.mdx @@ -0,0 +1,77 @@ +--- +title: Import a project +sidebar_label: Import a project +sidebar_position: 15 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +:::info +This page covers importing an existing resource. If you haven't connected your AWS infrastructure to SleakOps yet, start with [Install SleakOps on your infra](/docs/install-on-your-infra). +::: + +SleakOps can adopt a deployment already running in a cluster as a managed Project instead of building it from scratch. Import discovers the Helm releases the cluster runs outside SleakOps and maps one of them into workloads and manifests. + +## Discover a release to import + +On the Projects screen, click **Import Project** next to **Create**. This opens the same discovery dialog used to import addons: pick the cluster to inspect, and SleakOps lists the Helm releases running there that aren't already managed by SleakOps. Pick one to continue. + + + Import project from cluster dialog listing unmanaged Helm releases + + +## Preview: what SleakOps detects + +SleakOps maps the release's documents deterministically into workloads — web service, worker, cron job, or hook — plus any manifests shared across the whole project. Anything it couldn't map lands in a **Not included** list, each with a reason. An optional **Improve mapping with AI** button re-runs the mapping with an LLM as an alternative if the deterministic result needs adjusting. + + + Preview step showing the release mapped into a workload with its manifests + + +The original release keeps running untouched. This creates a SleakOps-managed project in its own namespace, in parallel — its pods use the SleakOps service account, so grant any AWS access the app needs via Dependencies. Switching traffic over to the managed project is a manual step. + +## Complete the project details + +Click **Continue** to fill in the new project: + +| **Field** | **Description** | +| ------------------ | ----------------------------------------------------------------------------- | +| **Project name** | Prefilled from the release name, slugified. Editable. | +| **Environment** | The Environment of the chosen cluster to deploy into. | +| **Nodepool** | The node pool of the chosen cluster to run the workloads on. | +| **Branch** | The Git branch to build from. | +| **Repository** | The Git repository to build from — requires a Git integration configured. | +| **Build method** | Docker or Buildpack. | +| **Dockerfile path**| Only for the Docker method. | + +Environment and Nodepool list the real resources of the cluster you picked in the discovery step. + + + Details step with project name, environment, nodepool, branch and build method filled in + + +Click **Import** to create the project. + +## What stays manual + +The new project builds from the repository you pick and deploys with the manifests mapped from the release. The original release is not modified — it keeps serving traffic on its own until you decide to switch over. Routing real traffic to the managed project is a manual step, outside SleakOps. + +## FAQs + +
+ +### What happens to the original release? + +Nothing. The original release keeps running untouched in its own namespace. SleakOps creates a new, separate project alongside it — switching traffic over to the managed project is a manual step you take when you're ready. +
diff --git a/content/docs/en/project/import-project/import-project-details.png b/content/docs/en/project/import-project/import-project-details.png new file mode 100644 index 0000000000..c8edcf9e74 Binary files /dev/null and b/content/docs/en/project/import-project/import-project-details.png differ diff --git a/content/docs/en/project/import-project/import-project-entry.png b/content/docs/en/project/import-project/import-project-entry.png new file mode 100644 index 0000000000..715adf8834 Binary files /dev/null and b/content/docs/en/project/import-project/import-project-entry.png differ diff --git a/content/docs/en/project/import-project/import-project-preview.png b/content/docs/en/project/import-project/import-project-preview.png new file mode 100644 index 0000000000..b3c661d069 Binary files /dev/null and b/content/docs/en/project/import-project/import-project-preview.png differ diff --git a/content/docs/en/project/index.mdx b/content/docs/en/project/index.mdx index 89aa45e640..6dd01f4e6c 100644 --- a/content/docs/en/project/index.mdx +++ b/content/docs/en/project/index.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 7 +sidebar_position: 8 sidebar_label: Project pagination_next: project/dependency/index --- diff --git a/content/docs/en/project/manifests.mdx b/content/docs/en/project/workload/manifests.mdx similarity index 63% rename from content/docs/en/project/manifests.mdx rename to content/docs/en/project/workload/manifests.mdx index 2ad9ab57ed..a2754217ca 100644 --- a/content/docs/en/project/manifests.mdx +++ b/content/docs/en/project/workload/manifests.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 12 +sidebar_position: 6 --- import Zoom from "react-medium-image-zoom"; import "react-medium-image-zoom/dist/styles.css"; @@ -10,14 +10,16 @@ import { FiExternalLink } from "react-icons/fi"; Every Workload you create in SleakOps is deployed to Kubernetes through a set of **manifests** — the Deployment, Service, Ingress, PodDisruptionBudget and HorizontalPodAutoscaler resources that SleakOps generates for it. The Manifests feature makes those resources first-class citizens: you can inspect each one, customize its YAML, disable it, or add your own extra manifests — per Workload or shared across the whole Project. :::info Availability -Manifests are being rolled out progressively. If you don't see the **Advanced** toggle on your Workload forms or the **Manifests** section in your Project's Chart Configuration, the feature is not enabled for your company yet. +Manifests ships in **SleakOps 3.0.0** behind the `service_manifests` company feature flag, off by default while the rollout completes. If you don't see the **Advanced** toggle on your Workload forms or the **Manifests** section in your Project's Chart Configuration, ask your SleakOps contact to enable it for your company. The flag can also be scoped to a subset of users through a configuration group, so it may be on for your company and still off for your user — if the Manifests surfaces are missing, ask your SleakOps contact whether your user is in the rollout. ::: +Enabling `service_manifests` is also a prerequisite for importing a Project from an existing Helm release. + ## Where to find them Manifests live in two places: -- **Per Workload** — open any Workload (WebService, Worker, CronJob or Hook) and switch the view toggle from **Form** to **Advanced**. The Advanced view has two tabs: **Manifests** (the graph of resources) and **Values** (see [Values](/docs/project/values)). +- **Per Workload** — open any Workload (WebService, Worker, CronJob or Hook) and switch the view toggle from **Form** to **Advanced**. The Advanced view has two tabs: **Manifests** (the graph of resources) and **Values** (see [Values](/docs/project/workload/values)). - **Per Project** — go to **Project → Settings → Chart Configuration**. The **Manifests** section lists every Workload and manifest in the Project, and manages the shared **project bucket**. The **Form** view is still the source of truth for your Workload's configuration: one submit updates every generated manifest. The **Advanced** view is where you inspect and customize what gets deployed. @@ -41,15 +43,25 @@ Each node shows the manifest's name, its Kind (or resolved host, for Ingress man | **Customized** | `Customized` | You edited its YAML. SleakOps never overwrites your copy — see [template updates](#base-template-updates). | | **Custom** | `Custom` | A manifest you added yourself. It has no SleakOps base template. | -Disabled manifests show a `Disabled` badge and their edges render dashed. +The **Custom** origin is also labeled "user added" in the editor header and workload toolbar — same thing, worded differently depending on where you're looking. + +Disabled manifests show a `Disabled` badge and their edges render dashed. A summary line above the graph counts manifests by origin (`N manifests · X customized · Y user-added · Z disabled`), matched to a color-dot legend. -You can drag nodes to arrange the graph — positions are saved per Workload, and **Reset layout** restores the automatic arrangement. +You can drag nodes to arrange the graph — positions are saved per Workload, and **Reset layout** restores the automatic arrangement. Dragging nodes and re-linking dependencies are layout actions — they update instantly but never register a pending change or trigger a deployment, regardless of the **Deploy?** switch. Below the graph, the **Project-shared manifests** strip shows the manifests in the [project bucket](#the-project-bucket) that deploy alongside every Workload, with a **Manage →** shortcut to the Project's Chart Configuration. +### Ingress per domain + +Every domain or alias you add to a WebService gets its own `ingress-` node in the graph, separate from the node for the Workload's default URL — you'll see one Ingress manifest per host, not a single shared one. + +Deleting a per-domain ingress manifest only removes routing for that host: SleakOps does not re-create it automatically. Add a new manifest (or re-add the domain) if you need that host back. + +Adding a domain whose host maps to the same Kubernetes Ingress name as an existing host of the Workload is rejected when you save the domain — `api.acme.com` and `api-acme.com` collapse to one name; pick one that differs in more than dots or dashes. Manifest node names never clash: a repeated slug simply gets the domain's id appended. + ## Editing a manifest -Click any node to open the manifest editor. The header shows the manifest's kind, origin, base template version, an **Enabled** switch, a copy button and **Delete**. +Click any node to open the manifest editor. The header shows the manifest's kind, origin, base template version, an **Enabled** switch, a copy button and **Delete** (Admin role required — see [Who can edit manifests?](#who-can-edit-manifests)). >` variables resolve **before Helm**, from the values of your Workload form (name, namespace, command, healthcheck, etc.). -- `{{ .Values }}` expressions are left for **Helm at deploy time** (replicas, resources, image tag — everything that comes from [Values](/docs/project/values)). +- `{{ .Values }}` expressions are left for **Helm at deploy time** (replicas, resources, image tag — everything that comes from [Values](/docs/project/workload/values)). -The **Variables** panel on the right lists everything available: click an entry to insert it at the cursor, or drag it into the editor. +The **Variables** panel on the right lists everything available: click an entry to insert it at the cursor, or drag it into the editor. Dragging a variable onto the editor shows a live cursor preview of where it'll land before you drop it. The editor validates as you type. Errors block saving, and include: @@ -85,11 +97,13 @@ The **Preview** tab renders the template with the current form variables and sho /> -The badges above the output confirm how many `<< form >>` variables were resolved, whether `{{ .Values }}` expressions remain for deploy time, and that the protected invariants are present. If the template fails to render, the errors are listed with their line numbers and a **Fix in YAML** shortcut — a manifest that doesn't render will not deploy. +The badges above the output confirm how many `<< form >>` variables were resolved, whether `{{ .Values }}` expressions remain for deploy time, and that the protected invariants are present. + +If the template fails to render, the Preview tab replaces its output with a "Template failed to render — nothing will deploy" card, listing the errors with their line numbers and a **Fix in YAML** shortcut — this is different from the badges that just flag unresolved `{{ .Values }}` expressions, which still render fine. ## Adding a manifest -Use **Add manifest** (on the Workload graph toolbar, or in the project bucket) to deploy resources beyond the generated ones: +Use **Add manifest** (on the Workload graph toolbar, or in the project bucket) to deploy resources beyond the generated ones (Admin role required — see [Who can edit manifests?](#who-can-edit-manifests)): -The **Explorer** at the top of the section lists every Workload of the Project with its manifests, and the project bucket at the end. Use the filter to search by name or kind; clicking a Workload opens its Advanced view, and clicking a manifest opens the editor in place. +The **Explorer** at the top of the section lists every Workload of the Project with its manifests, and the project bucket at the end. Clicking a Workload opens its Advanced view, and clicking a manifest opens the editor in place. + +The filter searches both name and kind. A Workload with no matches collapses out of the list instead of showing an empty lane; if nothing matches anywhere (including the bucket), you'll see a "No manifests match" message. Workload types without a dedicated Advanced view yet show as disabled rows. ### Can I deploy resources from a CRD? -Yes — choose **Custom…** as the Kind when adding a manifest and set the CRD's apiVersion/kind. The CRD must be installed in the cluster (for example, Keda's ScaledObject requires the Keda Addon), otherwise the deploy fails with the corresponding Helm error. +Yes — choose **Custom…** as the Kind when adding a manifest and set the CRD's apiVersion/kind. The manifest saves regardless; the CRD must be installed in the cluster (for example, Keda's ScaledObject requires the Keda Addon), otherwise the deploy fails with the corresponding Helm error.
@@ -199,5 +229,5 @@ Disabling keeps the manifest and its configuration but skips it at deploy time ### Who can edit manifests? -Editing follows your platform role: viewers see the graph, the YAML and the previews in read-only mode; editors and admins can customize, add, disable and delete manifests. +Viewers see the graph and the YAML in read-only mode; rendering a Preview needs at least the Editor role. Editors can also drag nodes to rearrange the graph, but cannot create, edit, disable, delete or reset a manifest — those actions require the Admin role.
diff --git a/content/docs/en/project/manifests/add-manifest-modal.png b/content/docs/en/project/workload/manifests/add-manifest-modal.png similarity index 100% rename from content/docs/en/project/manifests/add-manifest-modal.png rename to content/docs/en/project/workload/manifests/add-manifest-modal.png diff --git a/content/docs/en/project/manifests/manifest-editor-preview.png b/content/docs/en/project/workload/manifests/manifest-editor-preview.png similarity index 100% rename from content/docs/en/project/manifests/manifest-editor-preview.png rename to content/docs/en/project/workload/manifests/manifest-editor-preview.png diff --git a/content/docs/en/project/manifests/manifest-editor-yaml.png b/content/docs/en/project/workload/manifests/manifest-editor-yaml.png similarity index 100% rename from content/docs/en/project/manifests/manifest-editor-yaml.png rename to content/docs/en/project/workload/manifests/manifest-editor-yaml.png diff --git a/content/docs/en/project/manifests/project-manifests-explorer.png b/content/docs/en/project/workload/manifests/project-manifests-explorer.png similarity index 100% rename from content/docs/en/project/manifests/project-manifests-explorer.png rename to content/docs/en/project/workload/manifests/project-manifests-explorer.png diff --git a/content/docs/en/project/manifests/project-shared-bucket.png b/content/docs/en/project/workload/manifests/project-shared-bucket.png similarity index 100% rename from content/docs/en/project/manifests/project-shared-bucket.png rename to content/docs/en/project/workload/manifests/project-shared-bucket.png diff --git a/content/docs/en/project/manifests/workload-advanced-manifests.png b/content/docs/en/project/workload/manifests/workload-advanced-manifests.png similarity index 100% rename from content/docs/en/project/manifests/workload-advanced-manifests.png rename to content/docs/en/project/workload/manifests/workload-advanced-manifests.png diff --git a/content/docs/en/project/workload/static.mdx b/content/docs/en/project/workload/static.mdx new file mode 100644 index 0000000000..82e0530f9d --- /dev/null +++ b/content/docs/en/project/workload/static.mdx @@ -0,0 +1,88 @@ +--- +sidebar_position: 6 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +# Static Site + +**Static sites** build your frontend from its Git repository and serve the output from a private S3 bucket through Amazon CloudFront, on your own domain. There are no containers running and no web server to maintain: SleakOps builds the site, uploads it to S3 and keeps the CloudFront cache fresh. + +:::info +Static sites require the `static` feature in your subscription. Without it, the **Static site** build method and the **Static** tab under Workloads are not shown. +::: + +## How it works + +- You create a Project with the **Static site** build method. SleakOps generates the project's Dockerfile automatically — a multistage build that compiles your frontend with Node and packages the output — so there is no Dockerfile to write or maintain. +- The Project gets a private S3 bucket. Each **Static** attached to the Project is a custom domain served from that bucket through its own CloudFront distribution, with its TLS certificate and DNS record managed for you. +- Each deploy syncs the new build output to the bucket, so the site always reflects the last deployed build. + +## Creating a static site + +Navigate to **Projects**, click **Create**, and select your repository and branch as with any Project. Choose **Static site** as the build method and complete the build configuration: + +| **Attribute** | **Description** | +| ----------------- | ------------------------------------------------------------------------------------------------------------ | +| **Node version** | Node.js version used to build the site: 18, 20 or 22. Default: `20`. | +| **Build command** | The command that produces the production build, e.g. `npm run build`. | +| **Output path** | The repo-relative folder the build writes to, e.g. `dist`. Absolute paths and `..` segments are not accepted. | +| **Subdomain** | The site's URL: you type a single label and the environment's domain is appended (e.g. `landing` becomes `landing.dev.example.com`). | + +{/* TODO: screenshot - Project create form with the Static site build method selected, showing Node version, Build command, Output path and Subdomain */} + +The site's URL must be a **direct subdomain of the environment's domain** — the only shape covered by the domain's wildcard certificate. The target environment therefore needs a domain configured (see [Domain](/docs/domain)). + +After you submit, SleakOps provisions the project's bucket and the site's CloudFront distribution, certificate and DNS record. Once the domain is active, the first build and deploy run automatically — the site is published without further steps. + +:::info +If the domain's certificate is still being issued, the distribution starts on a default CloudFront certificate without the custom domain attached — the site doesn't answer on its URL yet. SleakOps attaches the domain automatically as soon as the certificate is ready. +::: + +## How deploys work + +A static Project follows the same Build → Release → Deployment flow as any other Project. The build compiles your frontend into an image containing the static output; the deploy runs a short-lived job that syncs that output to the project's bucket (removing files that no longer exist in the build) and then invalidates the CloudFront cache of every Static with **Invalidate on deploy** enabled. + +Builds and deployments appear in the Builds and Deployments sections as usual. To roll back, redeploy a previous Release — its image contains that version's static output. + +## Managing your static sites + +Open **Workloads** in the left pane and select the **Static** tab to see every static site with its state, URL and environment. + +{/* TODO: screenshot - Statics list under Workloads with a created static site */} + +The detail view shows the S3 bucket, the CloudFront distribution and links to the AWS console, and offers two cache controls: + +- **Invalidate on deploy** — invalidates the CloudFront cache on every deploy, so visitors get the new version immediately. Enabled by default. +- **Invalidate cache** — triggers a manual invalidation, available once the distribution is created. + +{/* TODO: screenshot - Static detail with the Invalidate on deploy toggle and the Invalidate cache action */} + +A Project can serve several Statics: they share the same content — the project's bucket — on different domains, each with its own CloudFront distribution. Changing a Static's URL re-provisions its distribution, certificate and DNS record for the new domain. + +The build configuration (Node version, build command, output path) is editable in the project's settings; SleakOps regenerates the Dockerfile on save. The build method itself cannot be switched to or from Static site after creation. + +## FAQs + +
+ + ### Does it work with single-page applications? + + Yes. The CloudFront distribution serves `index.html` as the root object and maps not-found responses back to `index.html`, so client-side routes (React Router, Vue Router, etc.) resolve correctly on direct navigation and refresh. +
+ +
+ + ### Why doesn't my static site have replicas or CPU settings? + + A static site runs no Pods: the content is served by S3 and CloudFront, so there is nothing to scale or allocate resources for. Scaling, health checks and resource settings only apply to containerized workloads such as [Web Services](/docs/project/workload/webservice). +
+ +
+ + ### When do visitors see the new content after a deploy? + + Immediately, when the Static has **Invalidate on deploy** enabled (the default): the deploy invalidates the CloudFront cache after syncing the bucket. If you disabled it, cached content is served until it expires — use **Invalidate cache** in the Static's detail to refresh it on demand. +
diff --git a/content/docs/en/project/values.mdx b/content/docs/en/project/workload/values.mdx similarity index 86% rename from content/docs/en/project/values.mdx rename to content/docs/en/project/workload/values.mdx index a2f0ae0ca3..70c3b0a243 100644 --- a/content/docs/en/project/values.mdx +++ b/content/docs/en/project/workload/values.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 13 +sidebar_position: 7 --- import Zoom from "react-medium-image-zoom"; import "react-medium-image-zoom/dist/styles.css"; @@ -7,7 +7,7 @@ import { FiExternalLink } from "react-icons/fi"; # Values -Every deployment renders your Project's Helm chart with a **values tree**: replicas, resources, image tags, hosts, probes and everything else that parameterizes the [manifests](/docs/project/manifests). SleakOps generates those values for you, and lets you override them at three persistent levels — plus a fourth, ephemeral level at deploy time. +Every deployment renders your Project's Helm chart with a **values tree**: replicas, resources, image tags, hosts, probes and everything else that parameterizes the [manifests](/docs/project/workload/manifests). SleakOps generates those values for you, and lets you override them at three persistent levels — plus a fourth, ephemeral level at deploy time. ## The override levels @@ -57,7 +57,7 @@ In the example above, `resources.limits.memory` is generated as `1331Mi`, raised ## Project global values -Project-wide overrides live in **Project → Settings → Chart Configuration**, in the **Values** editor of the Extends Template & Values section. The deprecation notice shown on that section is about migrating free-form **templates** to [Manifests](/docs/project/manifests) — the Values editor remains the home of project globals. Nest the keys under the Workload's name (or under `global:` for chart-wide values): +Project-wide overrides live in **Project → Settings → Chart Configuration**, in the **Values** editor of the Extends Template & Values section. The deprecation notice shown on that section is about migrating free-form **templates** to [Manifests](/docs/project/workload/manifests) — the Values editor remains the home of project globals. Nest the keys under the Workload's name (or under `global:` for chart-wide values): diff --git a/content/docs/en/project/values/project-global-values.png b/content/docs/en/project/workload/values/project-global-values.png similarity index 100% rename from content/docs/en/project/values/project-global-values.png rename to content/docs/en/project/workload/values/project-global-values.png diff --git a/content/docs/en/project/values/workload-effective-values.png b/content/docs/en/project/workload/values/workload-effective-values.png similarity index 100% rename from content/docs/en/project/values/workload-effective-values.png rename to content/docs/en/project/workload/values/workload-effective-values.png diff --git a/content/docs/en/project/values/workload-values-tab.png b/content/docs/en/project/workload/values/workload-values-tab.png similarity index 100% rename from content/docs/en/project/values/workload-values-tab.png rename to content/docs/en/project/workload/values/workload-values-tab.png diff --git a/content/docs/en/project/workload/webservice.mdx b/content/docs/en/project/workload/webservice.mdx index b057c21263..e884e0d1e6 100644 --- a/content/docs/en/project/workload/webservice.mdx +++ b/content/docs/en/project/workload/webservice.mdx @@ -117,7 +117,9 @@ This gives your application enough time to handle graceful shutdown procedures, ### How can I deploy my static web service? -At the moment, Sleakops doesn't natively support static sites, but you can still deploy them using the same flow as other sites, by containerizing them with a web server like Nginx. Below is a simple example of a Dockerfile and the corresponding nginx.conf to serve your static content. +SleakOps supports static sites natively: create a Project with the **Static site** build method and the platform builds your frontend and serves it from S3 through CloudFront on your own domain — see [Static Site](/docs/project/workload/static). It requires the `static` feature in your subscription. + +Without that feature, you can still deploy a static site as a regular Web Service by containerizing it with a web server like Nginx. Below is a simple example of a Dockerfile and the corresponding nginx.conf to serve your static content. ``` FROM node:20.11.0-alpine AS base diff --git a/content/docs/en/provider/index.mdx b/content/docs/en/provider/index.mdx index 20c266c41f..a76dc32642 100644 --- a/content/docs/en/provider/index.mdx +++ b/content/docs/en/provider/index.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 4 +sidebar_position: 5 pagination_next: provider/schemas --- diff --git a/content/docs/es/cli.mdx b/content/docs/es/cli.mdx index d230f2d68c..829edfe7d9 100644 --- a/content/docs/es/cli.mdx +++ b/content/docs/es/cli.mdx @@ -90,7 +90,7 @@ Aquí, **project** y **environment** son los argumentos obligatorios. El usuario ### Inyectar values en el deploy -Puedes inyectar values de Helm en un deployment puntual, por encima de todo lo configurado en la plataforma (ver [Values](/docs/project/values) para los niveles de override): +Puedes inyectar values de Helm en un deployment puntual, por encima de todo lo configurado en la plataforma (ver [Values](/docs/project/workload/values) para los niveles de override): ```plain sleakops deploy -p myapp -e prod -f values.prod.yaml diff --git a/content/docs/es/cluster/addons/essential-addons.mdx b/content/docs/es/cluster/addons/essential-addons.mdx new file mode 100644 index 0000000000..de957d6f59 --- /dev/null +++ b/content/docs/es/cluster/addons/essential-addons.mdx @@ -0,0 +1,55 @@ +--- +title: Addons esenciales +sidebar_label: Addons esenciales +sidebar_position: 9 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +:::info +Esta página cubre la importación de un recurso existente. Si todavía no conectaste tu infraestructura de AWS a SleakOps, empezá por [Instala SleakOps en tu infraestructura](/docs/install-on-your-infra). +::: + +Los addons esenciales son el pegamento de infraestructura que todo clúster necesita para funcionar bajo SleakOps: networking, autoscaling y control de acceso. A diferencia de los addons opcionales que elegís del listado de Addons, estos cinco siempre están presentes — SleakOps los instala automáticamente en todo clúster gestionado en lugar de esperar a que vos los agregues. + + + Listado de Addons mostrando los cinco addons esenciales (todos Installed) junto a una mezcla de addons opcionales instalados, deprecados y sin instalar + + +Aparecen en el listado de Addons como cualquier otra tarjeta de addon, sin ninguna insignia o marca visual especial — se reconocen por nombre y descripción, no por un tratamiento distinto. + +## Los cinco addons esenciales + +| Nombre | Qué hace | +|---|---| +| Metrics Server | Recolecta métricas de recursos desde los kubelets y las expone a través de la Kubernetes Metrics API, habilitando Horizontal Pod Autoscaling y `kubectl top`. | +| ExternalDNS | Sincroniza los Services e Ingresses expuestos de Kubernetes con los proveedores de DNS (Route53), manteniendo los registros DNS del clúster actualizados automáticamente. | +| Karpenter | Un autoscaler de nodos de Kubernetes que aprovisiona capacidad de cómputo del tamaño justo en respuesta a pods sin programar, mejorando la eficiencia y reduciendo el costo. | +| AWS Auth | Conecta los roles IAM de SleakOps al ConfigMap `aws-auth` del clúster y a los ClusterRoles de RBAC de SleakOps, habilitando la integración de SleakOps y el acceso basado en roles. | +| Load Balancer | El AWS Load Balancer Controller gestiona los Application Load Balancers para los Ingresses de Kubernetes, además de las IngressClasses públicas y privadas usadas para rutear el tráfico externo. | + +## Comportamiento en clústeres importados + +En un clúster gestionado, SleakOps aprovisiona y es dueño de los cinco addons esenciales desde el primer día. En un clúster importado no hay nada que aprovisionar — la infraestructura del cliente ya corre su propia versión de cada pieza — así que en lugar de instalarlos, SleakOps los adopta a partir de lo que ya está corriendo, uno a la vez, a medida que traés recursos bajo gestión. + +El addon Load Balancer es un ejemplo concreto: cuando se importa un clúster, su fila de Addon se crea directamente a partir de los nombres de las IngressClass públicas y privadas descubiertas en el payload de importación, sin correr ningún aprovisionamiento de Pulumi — el cliente ya corre su propio controlador ALB, así que SleakOps solo necesita registrar lo que existe. + +AWS Auth tiene el comportamiento de importación más elaborado. En un clúster gestionado, SleakOps es dueño de todo el `mapRoles` del ConfigMap `aws-auth`. En un clúster importado, el módulo corre en modo merge: lee el ConfigMap `aws-auth` real del cliente y mezcla solo las entradas de rol que requiere SleakOps, deduplicadas por ARN de rol y con las entradas de SleakOps ganando en caso de conflicto — se preserva cada entrada previa del cliente. Este merge es idempotente: leer un ConfigMap ya mezclado y volver a correrlo no duplica entradas. + +## Restricciones + +**Configuración** — el formulario de configuración de un addon esencial es de solo lectura en un clúster gestionado, ya que SleakOps es dueño de esa configuración; se vuelve editable en un clúster importado, ya que ahí la configuración refleja lo que el cliente ya tenía corriendo, y eso es suyo para cambiar. La mayoría de los addons esenciales (Metrics Server, ExternalDNS, Karpenter, AWS Auth) no tienen campos configurables — Load Balancer es el único con un esquema real (los nombres de sus IngressClass públicas y privadas), así que también es el único donde se ve el bloqueo de solo lectura: + + + Vista de detalle del addon Load Balancer en un clúster gestionado, con sus campos de nombre de IngressClass bloqueados + + +**Eliminación** — los addons esenciales no se pueden eliminar en absoluto en un clúster gestionado: son permanentes durante toda la vida del clúster y solo se destruyen automáticamente cuando se destruye el clúster mismo. En un clúster importado se pueden eliminar de forma individual como cualquier otro recurso adoptado, sujeto a la misma protección de dependencias que cualquier addon (no se puede eliminar uno del que otro addon depende). Esta restricción está condicionada por el tipo de clúster, no por el rol del usuario que hace la solicitud. diff --git a/content/docs/es/cluster/addons/essential-addons/essential-addon-lb-detail.png b/content/docs/es/cluster/addons/essential-addons/essential-addon-lb-detail.png new file mode 100644 index 0000000000..a464dc494d Binary files /dev/null and b/content/docs/es/cluster/addons/essential-addons/essential-addon-lb-detail.png differ diff --git a/content/docs/es/cluster/addons/essential-addons/essential-addons-list.png b/content/docs/es/cluster/addons/essential-addons/essential-addons-list.png new file mode 100644 index 0000000000..861e05394d Binary files /dev/null and b/content/docs/es/cluster/addons/essential-addons/essential-addons-list.png differ diff --git a/content/docs/es/cluster/addons/import-addons.mdx b/content/docs/es/cluster/addons/import-addons.mdx new file mode 100644 index 0000000000..dca1b36605 --- /dev/null +++ b/content/docs/es/cluster/addons/import-addons.mdx @@ -0,0 +1,69 @@ +--- +title: Importar y exportar addons +sidebar_label: Importar y exportar addons +sidebar_position: 8 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +:::info +Esta página cubre la importación de un recurso existente. Si todavía no conectaste tu infraestructura de AWS a SleakOps, empezá por [Instala SleakOps en tu infraestructura](/docs/install-on-your-infra). +::: + +Los addons pueden entrar y salir de SleakOps de dos formas: importando una definición JSON exportada desde otro clúster, o descubriendo y adoptando un release de Helm que ya corre en el clúster. Ambos botones están en el listado de Addons, junto a **Add custom addon**, y solo aparecen cuando tu empresa tiene registrado el tipo de addon genérico (custom Helm chart). A partir de ahí los dos flujos difieren en alcance: **Import from JSON** y **Export JSON** funcionan con cualquier tipo de addon registrado en el clúster — gestionado por SleakOps (Grafana, KEDA, …) o personalizado — mientras que **Import from cluster** siempre adopta el release como un addon personalizado, ya que el descubrimiento no tiene forma de saber a qué tipo gestionado (si es que corresponde a alguno) equivale un release de Helm en vivo. + +Ambos flujos requieren que tu empresa tenga habilitada la funcionalidad de importación (`infra_import.addon`) y que seas un usuario **admin** — crear, actualizar o exportar un addon está restringido a admin en el backend. + + + Listado de Addons mostrando Import from cluster e Import from JSON junto a Add custom addon + + +## Importar desde JSON + +Hacé clic en **Import from JSON** para pegar una definición exportada desde otro clúster: + + + Diálogo Import addon from JSON con un textarea para pegar la definición exportada + + +Pegá el JSON y hacé clic en **Import**. SleakOps lo valida antes de abrir el formulario: + +- JSON inválido: **"Invalid JSON. Paste a valid addon export."** +- Forma incorrecta: **'The JSON must include a string "addon_type" and an object "values".'** +- Un tipo que el clúster no tiene registrado: **`Addon type "" is not available in this cluster.`** + +Una vez que valida, se abre el formulario de creación del addon correspondiente precargado con los `values` pegados (y el `name`, si viene incluido) — nada queda bloqueado, así que podés cambiar lo que quieras antes de instalar. El botón de envío dice **Import** en lugar de **Install**, como recordatorio de que estos son valores de partida, no una configuración por defecto recién creada. + +Esto se combina con **Export JSON**, disponible en la vista de detalle de cualquier addon instalado — gestionado por SleakOps o personalizado — una vez que está en estado `created` (mismo requisito de acceso). Copia el JSON portable del addon al portapapeles y lo descarga como `.addon.json` — ese archivo es el que pegás en **Import from JSON** en el clúster de destino. + +## Importar desde el clúster + +Hacé clic en **Import from cluster** para descubrir los releases de Helm que ya corren en este clúster: + + + Diálogo Import from cluster listando los releases de Helm descubiertos, cada uno con un botón Use + + +Cada release muestra su nombre, namespace, chart y versión. Mientras corre el descubrimiento: **"Loading releases…"**; si no puede alcanzar el clúster: **"Could not load Helm releases from the cluster."**; si no encuentra ninguno: **"No Helm releases found in this cluster."** + +Hacé clic en **Use** sobre un release para precargar el formulario del addon genérico con su nombre de release, namespace, chart, versión y los valores de Helm actuales. A diferencia del flujo por JSON — que puede apuntar a cualquier tipo de addon —, este siempre crea un addon personalizado (genérico), y además adopta un recurso que ya corre en vivo, no simplemente parte de un conjunto de valores: el nombre del release, el namespace, el chart y la versión quedan bloqueados (solo lectura) porque alimentan la importación de Pulumi subyacente y deben coincidir con lo que realmente está corriendo. **Repository URL** es el único campo que queda vacío y editable — la URL del repositorio del chart no se puede recuperar de un release en vivo, así que la escribís vos. + + + Formulario de addon genérico precargado desde un release descubierto, con release name, chart, version y namespace bloqueados y Repository URL vacío + + +Hacé clic en **Import** para adoptar el release bajo la gestión de SleakOps. diff --git a/content/docs/es/cluster/addons/import-addons/import-addon-from-cluster-form.png b/content/docs/es/cluster/addons/import-addons/import-addon-from-cluster-form.png new file mode 100644 index 0000000000..f74b6ab6e3 Binary files /dev/null and b/content/docs/es/cluster/addons/import-addons/import-addon-from-cluster-form.png differ diff --git a/content/docs/es/cluster/addons/import-addons/import-addon-from-cluster.png b/content/docs/es/cluster/addons/import-addons/import-addon-from-cluster.png new file mode 100644 index 0000000000..73bc009365 Binary files /dev/null and b/content/docs/es/cluster/addons/import-addons/import-addon-from-cluster.png differ diff --git a/content/docs/es/cluster/addons/import-addons/import-addon-json.png b/content/docs/es/cluster/addons/import-addons/import-addon-json.png new file mode 100644 index 0000000000..db644db798 Binary files /dev/null and b/content/docs/es/cluster/addons/import-addons/import-addon-json.png differ diff --git a/content/docs/es/cluster/addons/import-addons/import-addons-buttons.png b/content/docs/es/cluster/addons/import-addons/import-addons-buttons.png new file mode 100644 index 0000000000..3be62f9215 Binary files /dev/null and b/content/docs/es/cluster/addons/import-addons/import-addons-buttons.png differ diff --git a/content/docs/es/cluster/index.mdx b/content/docs/es/cluster/index.mdx index 00f1d88766..88ab94b340 100644 --- a/content/docs/es/cluster/index.mdx +++ b/content/docs/es/cluster/index.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 5 +sidebar_position: 6 title: Cluster pagination_next: environment/index --- diff --git a/content/docs/es/cluster/nodepools/importing-a-nodepool.mdx b/content/docs/es/cluster/nodepools/importing-a-nodepool.mdx new file mode 100644 index 0000000000..85907d5e5d --- /dev/null +++ b/content/docs/es/cluster/nodepools/importing-a-nodepool.mdx @@ -0,0 +1,59 @@ +--- +title: Importar un Node Pool +sidebar_label: Importar un Node Pool +sidebar_position: 4 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +:::info +Esta página cubre la importación de un recurso existente. Si todavía no conectaste tu infraestructura de AWS a SleakOps, empezá por [Instala SleakOps en tu infraestructura](/docs/install-on-your-infra). +::: + +SleakOps puede tomar bajo gestión un node pool de Karpenter existente en lugar de crear uno desde cero. La importación descubre los node pools que corren de verdad en tu clúster y te permite adoptar uno tal cual está. + +## Requisitos previos + +- Un usuario con permisos de administrador en SleakOps. +- La funcionalidad de importación habilitada para tu empresa (`infra_import.nodepool`). +- El clúster **no** debe estar en modo importación. **Import Node Pool** solo está disponible en clústeres que SleakOps aprovisionó él mismo — no aparece en clústeres importados. + +## Descubrí e importá + +Desde el listado de Clústeres, seleccioná uno y entrá a su Settings, después hacé clic en Node Pools. Si se cumplen los requisitos anteriores, vas a encontrar un botón **Import Node Pool** junto a **Create**. + + + Sección Node Pools de un clúster, con el botón Import Node Pool junto a Create + + +### Descubrimiento + +Al hacer clic se abre un diálogo que lista los node pools de Karpenter que corren de verdad en el clúster y que SleakOps todavía no gestiona: + +- Mientras se busca: **"Discovering Karpenter node pools…"** +- No se encontraron node pools sin gestionar: **"No unmanaged Karpenter node pools were found in this cluster."** +- El clúster no es alcanzable: un error que pide verificar la conectividad y reintentar. + +Un node pool cuyo nombre no cumple las reglas de nombres de SleakOps (minúsculas alfanuméricas con guiones simples, hasta 50 caracteres) no se puede adoptar y aparece deshabilitado — el nombre del pool pasa a ser el nombre del NodePool en SleakOps y no se puede editar después, así que los nombres fuera de ese patrón quedan afuera de la selección. + + + Diálogo Import Node Pool mostrando los node pools de Karpenter descubiertos y sin gestionar del clúster + + +### Revisión + +Elegí un node pool y pasá al siguiente paso: "Review the configuration mapped from the live pool. It is adopted exactly as it runs today, even where its values fall outside the SleakOps ranges." + +SleakOps precarga el mismo formulario que se usa para crear o editar un node pool con los valores descubiertos en el pool real — arquitectura, tipos de nodo, tipos de instancia, límites de CPU y memoria, almacenamiento del nodo, y su taint dedicado si el pool tiene uno. + +## Después de importar + +Una vez que confirmás la importación: "`` is being adopted by SleakOps. SleakOps is taking the live node pool under management. Its EC2NodeClass is cloned under the pool's name and existing nodes rotate gradually, respecting PodDisruptionBudgets and disruption budgets. You can follow the progress in the node pools list." diff --git a/content/docs/es/cluster/nodepools/importing-a-nodepool/import-nodepool-button.png b/content/docs/es/cluster/nodepools/importing-a-nodepool/import-nodepool-button.png new file mode 100644 index 0000000000..797fcbb437 Binary files /dev/null and b/content/docs/es/cluster/nodepools/importing-a-nodepool/import-nodepool-button.png differ diff --git a/content/docs/es/cluster/nodepools/importing-a-nodepool/import-nodepool-dialog.png b/content/docs/es/cluster/nodepools/importing-a-nodepool/import-nodepool-dialog.png new file mode 100644 index 0000000000..5bf31c2438 Binary files /dev/null and b/content/docs/es/cluster/nodepools/importing-a-nodepool/import-nodepool-dialog.png differ diff --git a/content/docs/es/domain/import-domain.mdx b/content/docs/es/domain/import-domain.mdx new file mode 100644 index 0000000000..159f1cca19 --- /dev/null +++ b/content/docs/es/domain/import-domain.mdx @@ -0,0 +1,53 @@ +--- +title: Importa un dominio +sidebar_label: Importa un dominio +sidebar_position: 3 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +:::info +Esta página cubre la importación de un recurso existente. Si todavía no conectaste tu infraestructura de AWS a SleakOps, empezá por [Instala SleakOps en tu infraestructura](/docs/install-on-your-infra). +::: + +La importación de dominio no es un flujo separado — es una sección dentro del formulario de creación de un Entorno. Crear un Entorno normalmente aprovisiona una hosted zone de Route53 nueva; la opción de importación te permite reutilizar una que ya existe en la cuenta de AWS de destino en lugar de eso. + +## Reutilizá una hosted zone existente + +En el formulario de creación de Entorno, un toggle **Use Existing Hosted Zone**, visible solo para administradores, aparece debajo de los campos base (Name, Cluster, Domain): + +> Adopt a Route53 hosted zone that already exists in the target AWS account instead of creating a new one. The ACM certificate for the domain is adopted automatically when the account has one issued. + +Antes de poder buscar, hace falta completar tres campos primero — el Cluster determina en qué cuenta de AWS busca SleakOps: + +- Sin Cluster elegido: **"Select a Cluster to search its account for existing hosted zones."** +- Cluster elegido pero falta Name o Domain (o el Domain no es válido): **"Enter a Name and a valid Domain to search for existing hosted zones."** + +Una vez que los tres campos están completos, activar el toggle busca en Route53 de esa cuenta: + +- Una zona cuyo nombre coincide exacto con el campo Domain se marca con el badge **Exact Match** (más **Private** si es una zona privada) y se muestra primero. +- Las demás zonas encontradas en la cuenta se listan debajo, cada una con el badge **Private** si corresponde. +- Si no hay ninguna zona: **"No hosted zones found in the account."** +- Si hay zonas pero ninguna coincide exacto: **"No hosted zone matches `` exactly. Pick one manually or create a new one."** + +Elegí una opción con las tarjetas de radio — **Create a New Hosted Zone** (la opción por defecto, SleakOps aprovisiona una zona nueva) o una de las zonas encontradas. Cambiar el Cluster cambia la cuenta de AWS de destino, así que descarta cualquier zona que ya hubieras elegido — el id de una hosted zone solo tiene sentido dentro de la cuenta a la que pertenece. + + + Formulario de creación de Entorno con el toggle Use Existing Hosted Zone activado, mostrando una zona con exact match y otra zona encontrada + + +Una vez creado el Entorno, aplica la configuración de dominio habitual — mirá [Setup your Domains](/docs/domain/setup) y la [Domain Delegation Guide](/docs/domain/delegation) para lo que sigue. + +## FAQs + +
+ + ### ¿Qué pasa con el certificado ACM? + + Se adopta automáticamente, junto con la hosted zone, cuando la cuenta de AWS de destino ya tiene uno emitido para el dominio. +
diff --git a/content/docs/es/domain/import-domain/domain-import-section.png b/content/docs/es/domain/import-domain/domain-import-section.png new file mode 100644 index 0000000000..56ecf5a7d4 Binary files /dev/null and b/content/docs/es/domain/import-domain/domain-import-section.png differ diff --git a/content/docs/es/domain/index.mdx b/content/docs/es/domain/index.mdx index d1e1e9a05c..f078b352c2 100644 --- a/content/docs/es/domain/index.mdx +++ b/content/docs/es/domain/index.mdx @@ -1,6 +1,6 @@ --- sidebar_label: Dominio -sidebar_position: 8 +sidebar_position: 9 --- # Niveles de Dominio y Estrategias @@ -133,6 +133,8 @@ Si `cualquiera.com` es completamente externo: - Necesitas múltiples dominios para el mismo servicio - Conectar dominios externos a tus servicios de Sleakops +Cada dominio o alias que agregas obtiene su propio manifiesto — ver [Manifests](/docs/project/workload/manifests#ingress-por-dominio). + --- ## Estrategias de Delegación diff --git a/content/docs/es/environment/index.mdx b/content/docs/es/environment/index.mdx index aedbb6c36b..3f9d6c6f32 100644 --- a/content/docs/es/environment/index.mdx +++ b/content/docs/es/environment/index.mdx @@ -1,6 +1,6 @@ --- sidebar_label: Entorno -sidebar_position: 6 +sidebar_position: 7 pagination_next: project/index --- diff --git a/content/docs/es/install-on-your-infra/import-accounts.mdx b/content/docs/es/install-on-your-infra/import-accounts.mdx new file mode 100644 index 0000000000..4b9f037e48 --- /dev/null +++ b/content/docs/es/install-on-your-infra/import-accounts.mdx @@ -0,0 +1,48 @@ +--- +title: Importa una cuenta +sidebar_label: Importa una cuenta +sidebar_position: 3 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +# Importa una cuenta + +Una vez que un provider está corriendo en modo de importación, conectá cada cuenta de AWS existente que quieras que SleakOps gestione desde su sección **Accounts & Networking**. + +## Declará una cuenta de AWS existente + +1. En **Accounts & Networking**, hacé clic en la card **Install SleakOps in account**. +2. Completá los tres campos: + + - **Account color** — elegí uno de los 8 colores predefinidos, o usá el color picker personalizado para elegir cualquier otro color. + - **Account name** — hasta 20 caracteres (por ejemplo, `payments-prod`). + - **AWS account ID** — el ID numérico de 12 dígitos de la cuenta. + + + Formulario de importación de cuenta con color, nombre y AWS account ID completos + + +3. Hacé clic en **Create account**. La cuenta aparece en la lista de la izquierda. + +## Corré el stack de CloudFormation + +1. Seleccioná la cuenta recién creada en la lista. Su panel de detalle muestra **CloudFormation not applied yet**. + + + Panel de detalle de la cuenta mostrando el estado CloudFormation not applied yet con el link Open CloudFormation + + +2. Hacé clic en **Open CloudFormation** para lanzar el stack de CloudFormation de SleakOps. Se abre en una pestaña nueva — corrélo estando conectado a esa cuenta de AWS. + +## Qué pasa después + +Cuando SleakOps recibe el callback del stack, la cuenta queda lista para la configuración de red. diff --git a/content/docs/es/install-on-your-infra/import-accounts/account-awaiting-cfn.png b/content/docs/es/install-on-your-infra/import-accounts/account-awaiting-cfn.png new file mode 100644 index 0000000000..f017b0fd42 Binary files /dev/null and b/content/docs/es/install-on-your-infra/import-accounts/account-awaiting-cfn.png differ diff --git a/content/docs/es/install-on-your-infra/import-accounts/import-account-form.png b/content/docs/es/install-on-your-infra/import-accounts/import-account-form.png new file mode 100644 index 0000000000..bc7401a184 Binary files /dev/null and b/content/docs/es/install-on-your-infra/import-accounts/import-account-form.png differ diff --git a/content/docs/es/install-on-your-infra/import-cluster.mdx b/content/docs/es/install-on-your-infra/import-cluster.mdx new file mode 100644 index 0000000000..8780d142e2 --- /dev/null +++ b/content/docs/es/install-on-your-infra/import-cluster.mdx @@ -0,0 +1,83 @@ +--- +title: Importa el clúster +sidebar_label: Importa el clúster +sidebar_position: 5 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +# Importa el clúster + +Con la red de una cuenta ya configurada, SleakOps puede registrar un clúster EKS existente de esa cuenta sin recrearlo — el último paso del recorrido de importación. + +## Requisitos previos + +- Una cuenta ya en estado **created**, con su red configurada ([Configura la red](/docs/install-on-your-infra/network-configuration)). + +## Instala SleakOps en el clúster + +En la lista de Clusters, los admins ven un botón **Install SleakOps in Cluster** junto a **Create**. Solo aparece cuando al menos una cuenta está en estado created. + + + Lista de Clusters con el botón Install SleakOps in Cluster junto a Create + + +El botón abre un diálogo de 4 pasos. + +### 1. Elegí la cuenta + +Elegí la cuenta del clúster EKS. Solo se listan las cuentas en estado created. + +### 2. Elegí el clúster + +SleakOps lista los clústeres EKS que descubrió en esa cuenta — nombre, versión de Kubernetes y estado (ACTIVE, etc.). Elegí el clúster a importar. + + + Paso Select cluster listando los clústeres EKS que SleakOps descubrió en la cuenta, con uno seleccionado + + +### 3. Acceso al endpoint del clúster + +SleakOps opera dentro del clúster a través de su API de Kubernetes, así que necesita llegar al endpoint del clúster. Si el endpoint ya es público con una allowlist, SleakOps agrega sus propias direcciones salientes a ella, manteniendo cada entrada que ya está. Si el endpoint no es públicamente alcanzable, SleakOps lo habilita y lo restringe a sus propias direcciones salientes. + +Marcá **I allow SleakOps to access the endpoint of this cluster** para continuar — es obligatorio. + +### 4. Ingress classes + +Ingresá el **Private IngressClass name** (por ejemplo `alb-internal`) y el **Public IngressClass name** (por ejemplo `alb-internet-facing`) del clúster. SleakOps los usa para rutear tráfico privado y público — no puede autodetectarlos, ya que solo la configuración del ALB controller del clúster define cuál es cuál. + + + Paso Ingress classes con los campos Private y Public IngressClass name completos + + +Hacé clic en **Install** para iniciar la importación. + +## Progreso de la instalación + +Mientras corre la importación, SleakOps lee la metadata del clúster (OIDC issuer), configura la VPN de la cuenta si todavía no existe, crea el namespace dedicado `sleakops`, y guarda el addon de Load Balancer con los nombres de IngressClass del paso 4. + +Podés cerrar el diálogo y seguir el progreso desde la lista de clusters — se sigue actualizando mientras la importación está en curso. + +Al terminar, SleakOps puede alcanzar el endpoint del clúster y está listo para operar dentro de él. Desde acá, el clúster está listo para que se gestionen sus addons esenciales y nodepools. + +## La etiqueta Imported + +Un clúster importado muestra una etiqueta **Imported** en su tarjeta en la lista de clusters, distinguiéndolo de los clústeres que SleakOps creó desde cero. Al pasar el mouse sobre la etiqueta se muestra: "Pre-existing EKS cluster imported into SleakOps". + + + Lista de clusters mostrando un clúster importado con la etiqueta Imported y su tooltip + diff --git a/content/docs/es/install-on-your-infra/import-cluster/cluster-imported-badge.png b/content/docs/es/install-on-your-infra/import-cluster/cluster-imported-badge.png new file mode 100644 index 0000000000..fb4b234137 Binary files /dev/null and b/content/docs/es/install-on-your-infra/import-cluster/cluster-imported-badge.png differ diff --git a/content/docs/es/install-on-your-infra/import-cluster/import-cluster-button.png b/content/docs/es/install-on-your-infra/import-cluster/import-cluster-button.png new file mode 100644 index 0000000000..25d42233f7 Binary files /dev/null and b/content/docs/es/install-on-your-infra/import-cluster/import-cluster-button.png differ diff --git a/content/docs/es/install-on-your-infra/import-cluster/import-cluster-ingress-classes.png b/content/docs/es/install-on-your-infra/import-cluster/import-cluster-ingress-classes.png new file mode 100644 index 0000000000..b03a01e380 Binary files /dev/null and b/content/docs/es/install-on-your-infra/import-cluster/import-cluster-ingress-classes.png differ diff --git a/content/docs/es/install-on-your-infra/import-cluster/import-cluster-select-eks.png b/content/docs/es/install-on-your-infra/import-cluster/import-cluster-select-eks.png new file mode 100644 index 0000000000..e1caeaae17 Binary files /dev/null and b/content/docs/es/install-on-your-infra/import-cluster/import-cluster-select-eks.png differ diff --git a/content/docs/es/install-on-your-infra/import-provider.mdx b/content/docs/es/install-on-your-infra/import-provider.mdx new file mode 100644 index 0000000000..043d25c30e --- /dev/null +++ b/content/docs/es/install-on-your-infra/import-provider.mdx @@ -0,0 +1,44 @@ +--- +title: Importar un provider +sidebar_label: Importar un provider +sidebar_position: 2 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +# Importar un provider + +Un provider en modo de importación conecta SleakOps con una Organización de AWS que ya operás, en lugar de crear una nueva. Esta página cubre cómo crear un provider en modo de importación y a dónde te lleva a continuación. + +## Cuándo usar el modo de importación + +Usá el flujo por defecto ([Providers](/docs/provider)) cuando quieras que SleakOps aprovisione una nueva Organización de AWS y sus cuentas por vos. Usá el modo de importación cuando ya operás infraestructura en AWS y querés que SleakOps la gestione tal como está — las cuentas, la red y el clúster EKS se conectan en lugar de recrearse. + +## Crea el provider en modo de importación + +1. Ve a **Configuración > Providers** y hacé clic en **Crear**. El wizard del provider se abre en la pestaña **Basic Information**. +2. Activá el toggle **Install SleakOps in existing AWS infra**. + + + Pestaña Basic Information con el toggle Install SleakOps in existing AWS infra activado + + + Con el toggle activado, el campo **Email** se oculta — SleakOps lee el email de la cuenta desde tu configuración de AWS existente. **Name**, **Region** y **Domain** funcionan igual que en el flujo por defecto. +3. Completá **Name**, **Region** y **Domain**, y hacé clic en **Submit** para pasar a **Connect to AWS**. Esta pestaña y la configuración del rol de CloudFormation coinciden con el flujo por defecto — mirá [Providers](/docs/provider) — con un agregado: un cuadro opcional te permite ejecutar un stack de CloudFormation una vez en la cuenta raíz de tu Organización de AWS para activar las Cost Allocation Tags a nivel organización. Si lo omitís, solo se desactiva el etiquetado de costos a nivel organización. +4. Cuando el provider termina de crearse, SleakOps te redirige automáticamente a **Accounts & Networking** en lugar del dashboard. + + + Sección Accounts and Networking de un provider creado en modo de importación + + +## Próximo paso + +Desde **Accounts & Networking**, [conectá tus cuentas de AWS existentes](/docs/install-on-your-infra/import-accounts) al provider. diff --git a/content/docs/es/install-on-your-infra/import-provider/accounts-networking-landing.png b/content/docs/es/install-on-your-infra/import-provider/accounts-networking-landing.png new file mode 100644 index 0000000000..da8a28bc6d Binary files /dev/null and b/content/docs/es/install-on-your-infra/import-provider/accounts-networking-landing.png differ diff --git a/content/docs/es/install-on-your-infra/import-provider/provider-wizard-import-toggle.png b/content/docs/es/install-on-your-infra/import-provider/provider-wizard-import-toggle.png new file mode 100644 index 0000000000..8e765d3193 Binary files /dev/null and b/content/docs/es/install-on-your-infra/import-provider/provider-wizard-import-toggle.png differ diff --git a/content/docs/es/install-on-your-infra/index.mdx b/content/docs/es/install-on-your-infra/index.mdx new file mode 100644 index 0000000000..1a52ff7e00 --- /dev/null +++ b/content/docs/es/install-on-your-infra/index.mdx @@ -0,0 +1,45 @@ +--- +title: Instala SleakOps en tu infraestructura +sidebar_label: Instala SleakOps en tu infraestructura +sidebar_position: 4 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +# Instala SleakOps en tu infraestructura + +SleakOps puede gestionar una infraestructura de AWS existente en lugar de aprovisionar todo desde cero. El modo de importación conecta SleakOps con infraestructura que ya tienes en funcionamiento — una cuenta de AWS, su red y un clúster EKS — sin recrear nada de eso. + +Las funcionalidades de importación se habilitan por empresa — contacta a SleakOps para habilitarlas en la tuya. + +## Requisitos previos + +- Una cuenta de AWS con infraestructura existente para importar. +- Permisos para ejecutar stacks de CloudFormation en esa cuenta. +- Un usuario con permisos de administrador en SleakOps. + +## El recorrido de importación + +Importar infraestructura existente sigue una secuencia fija: + +1. [Importa el provider](/docs/install-on-your-infra/import-provider). +2. [Importa las cuentas](/docs/install-on-your-infra/import-accounts). +3. [Configura la red](/docs/install-on-your-infra/network-configuration). +4. [Importa el clúster](/docs/install-on-your-infra/import-cluster). + +## Qué podés importar + +| Recurso | Qué hace | +|---|---| +| [Provider](/docs/install-on-your-infra/import-provider) | Conecta SleakOps a una AWS Organization que ya tenés en funcionamiento. | +| [Cuenta](/docs/install-on-your-infra/import-accounts) | Declara una cuenta de AWS existente y la conecta vía CloudFormation. | +| [Configuración de red](/docs/install-on-your-infra/network-configuration) | Completa los datos de red que SleakOps necesita para una cuenta importada. | +| [Clúster](/docs/install-on-your-infra/import-cluster) | Registra un clúster EKS existente en SleakOps. | +| [Dependencia](/docs/project/dependency/import-dependency) | Registra un recurso administrado existente (RDS, S3, SQS, Redis…) como una Dependencia de SleakOps. | +| [Proyecto](/docs/project/import-project) | Adopta un deployment existente como un Proyecto de SleakOps. | +| [Dominio](/docs/domain/import-domain) | Reutiliza una hosted zone de Route53 existente para un Entorno. | +| [NodePool](/docs/cluster/nodepools/importing-a-nodepool) | Registra un node pool de EKS existente. | +| [Addons](/docs/cluster/addons/import-addons) | Importa los manifiestos de un addon, o adopta uno que ya esté corriendo en el clúster. | +| [Addons esenciales](/docs/cluster/addons/essential-addons) | Adopta los addons esenciales existentes del clúster (AWS Auth, external-dns, etc.) en SleakOps. | diff --git a/content/docs/es/install-on-your-infra/network-configuration.mdx b/content/docs/es/install-on-your-infra/network-configuration.mdx new file mode 100644 index 0000000000..eaf9e653a2 --- /dev/null +++ b/content/docs/es/install-on-your-infra/network-configuration.mdx @@ -0,0 +1,76 @@ +--- +title: Configura la red +sidebar_label: Configura la red +sidebar_position: 4 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +# Configura la red + +Una vez que el stack de CloudFormation de una cuenta corrió, SleakOps necesita saber qué VPC, subnets y gateways usar antes de poder desplegar un clúster en ella. Este paso mapea esa red de AWS existente a los inputs que SleakOps requiere. + +## Encontrá cuentas pendientes de configuración de red + +Si tenés cuentas todavía esperando su configuración de red, vas a ver una alerta para eso en la lista de Providers. El banner dice **Network configuration pending** y nombra al provider con cuentas pendientes. Su botón **Configure networking** te lleva directo al formulario de configuración de red de esa cuenta en **Accounts & Networking**. Solo los admins ven esta alerta. + + + Lista de Providers mostrando el banner Network configuration pending con el botón Configure networking + + +## Seleccioná la VPC + +El panel de detalle de la cuenta abre con un único campo obligatorio: **VPC**. El dropdown lista cada VPC que SleakOps descubrió en la cuenta, como ` · `. + + + Formulario de configuración de red con el dropdown de VPC sin seleccionar todavía + + +Al seleccionar una VPC se cargan sus subnets, NAT Gateways e Internet Gateway — el formulario muestra **Loading subnets, NAT and gateways…** mientras eso sucede. + +## Asigná subnets a los slots + +| **Setting** | **Description** | +| ------------------------ | --------------------------------------------------------------- | +| **Public subnets** | Subnets con ruta hacia el Internet Gateway. | +| **Private subnets** | Subnets que llegan a internet a través de un NAT Gateway. | +| **Persistent subnets** | Subnets para recursos con estado (bases de datos, storage). | + +Los tres slots son obligatorios — cada uno necesita al menos una subnet, o el formulario muestra **Select at least one subnet**. La misma subnet se puede asignar a más de un slot. + +## Gateways + +- **NAT Gateway(s)** — seleccioná al menos uno. Si no hay ninguno seleccionado, el formulario muestra **Select at least one NAT Gateway**. Si la VPC no tiene ningún NAT Gateway, SleakOps muestra una advertencia pidiéndote crear uno o elegir otra VPC. +- **Internet Gateway** — un único dropdown obligatorio, con la misma advertencia si la VPC no tiene ninguno asociado. + +La Elastic IP de cada NAT Gateway se toma automáticamente de AWS — no hay un campo para elegirla por separado. + + + Formulario de configuración de red con una VPC, los tres slots de subnets, un NAT Gateway y el Internet Gateway seleccionados + + +## Enviá e importá + +**Save and apply** queda deshabilitado hasta completar los tres slots de subnets, al menos un NAT Gateway y el Internet Gateway. Al enviarlo, la cuenta pasa a **Creating…** mientras SleakOps aplica la configuración — el panel cambia automáticamente al **network explorer** cuando termina. + +El network explorer es una vista de solo lectura de la red importada: la VPC, sus route tables, el Internet Edge (Internet Gateway, NAT Gateway y su Elastic IP), y las subnets agrupadas en Public, Private y Persistent. + + + Network explorer mostrando la VPC, las route tables, el Internet Edge y los grupos de subnets de una cuenta configurada + + +Desde acá, la cuenta está lista para importar su clúster. diff --git a/content/docs/es/install-on-your-infra/network-configuration/network-config-slots.png b/content/docs/es/install-on-your-infra/network-configuration/network-config-slots.png new file mode 100644 index 0000000000..5613cab220 Binary files /dev/null and b/content/docs/es/install-on-your-infra/network-configuration/network-config-slots.png differ diff --git a/content/docs/es/install-on-your-infra/network-configuration/network-config-vpc.png b/content/docs/es/install-on-your-infra/network-configuration/network-config-vpc.png new file mode 100644 index 0000000000..3fda8cad58 Binary files /dev/null and b/content/docs/es/install-on-your-infra/network-configuration/network-config-vpc.png differ diff --git a/content/docs/es/install-on-your-infra/network-configuration/network-explorer.png b/content/docs/es/install-on-your-infra/network-configuration/network-explorer.png new file mode 100644 index 0000000000..0f8423fcb5 Binary files /dev/null and b/content/docs/es/install-on-your-infra/network-configuration/network-explorer.png differ diff --git a/content/docs/es/install-on-your-infra/network-configuration/pending-network-alert.png b/content/docs/es/install-on-your-infra/network-configuration/pending-network-alert.png new file mode 100644 index 0000000000..5b1415da85 Binary files /dev/null and b/content/docs/es/install-on-your-infra/network-configuration/pending-network-alert.png differ diff --git a/content/docs/es/install-on-your-infra/whats-next.mdx b/content/docs/es/install-on-your-infra/whats-next.mdx new file mode 100644 index 0000000000..03ae6325b0 --- /dev/null +++ b/content/docs/es/install-on-your-infra/whats-next.mdx @@ -0,0 +1,84 @@ +--- +title: Próximos pasos +sidebar_label: Próximos pasos +sidebar_position: 6 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; +import { FiDatabase, FiBox, FiGlobe, FiServer, FiPackage, FiShield } from "react-icons/fi"; + +# Próximos pasos + +El recorrido base de importación — provider, cuentas, red y clúster — ya está completo; esto es lo que además podés traer a SleakOps desde tu infraestructura existente. + +
+ +{" "} + +
+
+ +

Dependencias

+
+

Registrá una RDS, un bucket de S3, una cola de SQS o un clúster de Redis existente que ya corre en tu cuenta de AWS.

+ Más información +
+ +{" "} + +
+
+ +

Proyectos

+
+

Adoptá un deployment existente como un Proyecto de SleakOps.

+ Más información +
+ +{" "} + +
+
+ +

Dominios

+
+

Reutilizá una hosted zone de Route53 existente para un Entorno.

+ Más información +
+ +{" "} + +
+
+ +

NodePools

+
+

Registrá un node pool de EKS existente.

+ Más información +
+ +{" "} + +
+
+ +

Addons

+
+

Importá los manifiestos de un addon, o adoptá uno que ya esté corriendo en el clúster.

+ Más información +
+ +{" "} + +
+
+ +

Addons esenciales

+
+

Adoptá en SleakOps los addons esenciales que ya existen en el clúster.

+ Más información +
+ +
diff --git a/content/docs/es/network/index.mdx b/content/docs/es/network/index.mdx index 53b0836d57..b7b85dfd97 100644 --- a/content/docs/es/network/index.mdx +++ b/content/docs/es/network/index.mdx @@ -2,7 +2,7 @@ id: networking-y-recursos-de-red title: Networking y Recursos de Red sidebar_label: Networking y Recursos de Red -sidebar_position: 6 +sidebar_position: 7 --- import Zoom from "react-medium-image-zoom"; diff --git a/content/docs/es/powered-ai/mcp.mdx b/content/docs/es/powered-ai/mcp.mdx index 46e677f285..f1425be6bb 100644 --- a/content/docs/es/powered-ai/mcp.mdx +++ b/content/docs/es/powered-ai/mcp.mdx @@ -39,7 +39,11 @@ Agregá el server a la configuración de tu cliente MCP: } ``` -La primera vez que tu cliente se conecta, abre el navegador en la pantalla de inicio de sesión de SleakOps. Ingresás el email y la password de tu cuenta — y el código de doble factor si lo tenés activo — y el cliente recibe su acceso automáticamente. A partir de ahí renueva la sesión por su cuenta. +La primera vez que tu cliente se conecta, abre el navegador en la pantalla de inicio de sesión de SleakOps. Ingresás el email y la password de tu cuenta — y el código de doble factor si lo tenés activo — y después autorizás ese cliente: la pantalla nombra la aplicación que pide el acceso y la dirección que lo va a recibir. Al aprobarla el cliente queda conectado y, a partir de ahí, renueva la sesión por su cuenta. + +:::warning +Aprobá solo una autorización que iniciaste vos desde tu cliente MCP. Si esa pantalla aparece sin que hayas conectado nada, o nombra una aplicación que no reconocés, cancelá — puede ser que alguien más haya iniciado el flujo con tu cuenta. +::: :::tip La URL es lo único que necesita tu cliente. Tu password de SleakOps nunca queda en el archivo de configuración, y ni el cliente ni el server guardan una copia. @@ -87,6 +91,16 @@ Los tools de import registran recursos que ya existen en tus cuentas de AWS — El onboarding de una cuenta AWS nueva (provider, account, configuración de red) y el import de un cluster EKS se hacen con el wizard de import de la console, no por el MCP. +### Deployar un sitio estático de punta a punta + +Con la feature `static` en tu suscripción, el agente puede llevar un repositorio de frontend a un sitio publicado en una sola conversación. El environment de destino ya debe existir y tener un dominio configurado (ver [Sitio Estático](/docs/project/workload/static)) — los environments se crean en la console. + +1. **Creá el proyecto** — "Creá un proyecto static para el repo X en el environment dev, compilando con Node 20, `npm run build`, salida en `dist`". El agente llama a `create_project` con `method="static"` y los tres campos de build (`node_version`, `build_command`, `output_path`). +2. **Asociá el dominio del sitio** — "Servilo en landing.dev.example.com". El agente llama a `create_static`; la URL debe ser un subdominio directo del dominio del environment. Hacelo **antes** del primer deployment: los workloads deployables de un proyecto static son sus Statics, así que un deployment sin uno se rechaza. +3. **La primera publicación es automática** — cuando el dominio del sitio queda activo, SleakOps dispara el primer build y su deploy por su cuenta. +4. **Publicá actualizaciones** — "Buildeá main y deployalo cuando termine". El agente encadena `trigger_build`, `create_release`, `create_deployment`, `approve_deployment` y `wait_for_deployment`. Cada deploy sincroniza el resultado del build al bucket del proyecto e invalida la caché de CloudFront de cada Static con invalidate on deploy habilitado (el default). +5. **Refrescá la caché a demanda** — "Invalidá la caché del sitio landing". El agente llama a `invalidate_static`, útil cuando invalidate on deploy está deshabilitado o necesitás forzar un refresh. + ## Qué no hace el MCP Hay dos cosas que siguen siendo una decisión deliberada en la console: diff --git a/content/docs/es/project/chart/extra_templates.mdx b/content/docs/es/project/chart/extra_templates.mdx index 439ed29066..5d66244271 100644 --- a/content/docs/es/project/chart/extra_templates.mdx +++ b/content/docs/es/project/chart/extra_templates.mdx @@ -8,7 +8,7 @@ import { FiExternalLink } from "react-icons/fi"; # Extra Templates :::warning Deprecado en favor de Manifests -Extender templates y values está deprecado. Para agregar o editar recursos personalizados, usa la sección **Manifests** del Project — cada recurso se vuelve su propio manifiesto, con validación, preview y scoping por Workload. Ver la [documentación de Manifests](/docs/project/manifests). Los Extra Templates existentes se siguen desplegando como siempre hasta que los migres. +Extender templates y values está deprecado. Para agregar o editar recursos personalizados, usa la sección **Manifests** del Project — cada recurso se vuelve su propio manifiesto, con validación, preview y scoping por Workload. Ver la [documentación de Manifests](/docs/project/workload/manifests). Los Extra Templates existentes se siguen desplegando como siempre hasta que los migres. ::: Los Extra Templates te permiten desplegar recursos personalizados de Kubernetes más allá de los componentes integrados de SleakOps. Esta poderosa funcionalidad te permite extender tu proyecto con recursos especializados como Ingresses personalizados, pods de prueba, u otros objetos de Kubernetes adaptados a tus requisitos específicos. diff --git a/content/docs/es/project/chart/index.mdx b/content/docs/es/project/chart/index.mdx index f201bce044..fd8e3d060a 100644 --- a/content/docs/es/project/chart/index.mdx +++ b/content/docs/es/project/chart/index.mdx @@ -83,8 +83,8 @@ Valores que se aplican a todo el Proyecto: Sí. Puedes: - - Personalizar o agregar [**Manifests**](/docs/project/manifests) por Workload o compartidos en el Project - - Sobreescribir [**Values**](/docs/project/values) a nivel Project o Workload + - Personalizar o agregar [**Manifests**](/docs/project/workload/manifests) por Workload o compartidos en el Project + - Sobreescribir [**Values**](/docs/project/workload/values) a nivel Project o Workload - Agregar dependencias de chart usando [**Chart Dependencies**](/docs/project/chart/chart_dependencies), similar a [Helm Chart Dependencies ](https://helm.sh/docs/helm/helm_dependency/) @@ -93,7 +93,7 @@ Valores que se aplican a todo el Proyecto: ### ¿Puedo agregar un Ingress personalizado a mi Proyecto? Sí — agrégalo como manifiesto desde la vista Advanced del Workload o desde el - project bucket. Ver la [documentación de Manifests](/docs/project/manifests). + project bucket. Ver la [documentación de Manifests](/docs/project/workload/manifests). El camino legacy de [Extra Templates](/docs/project/chart/extra_templates) sigue funcionando pero está deprecado. @@ -104,5 +104,5 @@ Valores que se aplican a todo el Proyecto: Sí. Abre la vista **Advanced** del Workload, haz clic en el manifiesto y edita su YAML — tu copia se conserva y SleakOps nunca la sobreescribe. Ver - [Manifests](/docs/project/manifests). + [Manifests](/docs/project/workload/manifests). diff --git a/content/docs/es/project/dependency/import-dependency.mdx b/content/docs/es/project/dependency/import-dependency.mdx new file mode 100644 index 0000000000..a99df72bf7 --- /dev/null +++ b/content/docs/es/project/dependency/import-dependency.mdx @@ -0,0 +1,94 @@ +--- +title: Importa una dependencia +sidebar_label: Importa una dependencia +sidebar_position: 14 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +:::info +Esta página cubre la importación de un recurso existente. Si todavía no conectaste tu infraestructura de AWS a SleakOps, empezá por [Instala SleakOps en tu infraestructura](/docs/install-on-your-infra). +::: + +SleakOps puede registrar una Dependencia que ya tenés en AWS — una base de datos, una cola, un bucket — en lugar de crear una desde cero. La importación descubre los recursos reales de una cuenta y adopta el que elijas sin modificarlo. + +## Tipos soportados + +Los 14 tipos de abajo están soportados para importar. Esta tabla solo indica si SleakOps necesita credenciales para conectarse — no es una columna de soportado/no soportado. + +| **Tipo** | **Requiere credenciales** | +| ---------------------- | -------------------------- | +| **PostgreSQL** | Sí | +| **MySQL** | Sí | +| **MariaDB** | Sí | +| **Oracle** | Sí | +| **Aurora MySQL** | Sí | +| **Aurora PostgreSQL** | Sí | +| **DocumentDB** | Sí | +| **RabbitMQ** | Sí | +| **MSK** | Solo para SASL/SCRAM | +| **S3 bucket** | No | +| **SQS** | No | +| **Redis** | No | +| **Memcached** | No | +| **OpenSearch** | No | + +## Descubrí e importá + +En la lista de Dependencies, hacé clic en **Import Dependency** al lado de **Create**. + + + Lista de Dependencies con el botón Import Dependency al lado de Create + + +El botón abre un diálogo de 4 pasos. + +### 1. Elegí el tipo de recurso + +Buscá y elegí uno de los tipos soportados de la tabla anterior. + +### 2. Elegí la cuenta + +Seleccioná la cuenta donde vive el recurso. Solo se listan cuentas en estado created. + +### 3. Descubrí + +SleakOps lista los recursos reales de ese tipo que encontró en la cuenta — nombre, versión del engine (o los atributos correspondientes para los tipos que no son bases de datos) y estado. Un recurso ya registrado en SleakOps aparece atenuado y deshabilitado, con un tooltip que aclara que ya está gestionado. + + + Paso de descubrimiento listando los recursos que SleakOps encontró en la cuenta, con uno seleccionado + + +### 4. Nombre, proyecto y credenciales + +Ingresá un **Name** y elegí el **Project** al que se va a asociar la dependencia. Para los tipos que requieren credenciales, ingresá el **Username** y **Password** que SleakOps va a usar para conectarse — AWS nunca expone la contraseña maestra de una instancia existente, así que estos valores no se descubren automáticamente. + + + Paso de nombre, proyecto y credenciales completo para un recurso PostgreSQL + + +Hacé clic en **Import** para iniciar el registro. SleakOps adopta el recurso en su estado de infraestructura sin modificarlo, y podés seguir el progreso desde la lista de dependencias. + +## Sincronización de configuración + +Una vez importada, la configuración de una dependencia también puede sincronizarse desde el recurso real de AWS en segundo plano — esto todavía no se dispara desde el console. + +## Preguntas frecuentes + +
+ +### ¿Importar modifica el recurso? + +No. SleakOps adopta el recurso en su estado de infraestructura sin modificarlo — solo registra lo que ya existe. +
diff --git a/content/docs/es/project/dependency/import-dependency/import-dependency-button.png b/content/docs/es/project/dependency/import-dependency/import-dependency-button.png new file mode 100644 index 0000000000..c67d94bac5 Binary files /dev/null and b/content/docs/es/project/dependency/import-dependency/import-dependency-button.png differ diff --git a/content/docs/es/project/dependency/import-dependency/import-dependency-config.png b/content/docs/es/project/dependency/import-dependency/import-dependency-config.png new file mode 100644 index 0000000000..fdea05ede1 Binary files /dev/null and b/content/docs/es/project/dependency/import-dependency/import-dependency-config.png differ diff --git a/content/docs/es/project/dependency/import-dependency/import-dependency-discovery.png b/content/docs/es/project/dependency/import-dependency/import-dependency-discovery.png new file mode 100644 index 0000000000..2f9c237cf0 Binary files /dev/null and b/content/docs/es/project/dependency/import-dependency/import-dependency-discovery.png differ diff --git a/content/docs/es/project/deployment/pending_changes.mdx b/content/docs/es/project/deployment/pending_changes.mdx index 187ca22276..53c20e2740 100644 --- a/content/docs/es/project/deployment/pending_changes.mdx +++ b/content/docs/es/project/deployment/pending_changes.mdx @@ -6,7 +6,7 @@ import "react-medium-image-zoom/dist/styles.css"; # Cambios Pendientes y Publicación -No todos los cambios tienen que llegar al cluster inmediatamente. Cada vez que guardas una edición con el switch **Deploy?** apagado — una edición de Workload, una personalización de [manifiestos](/docs/project/manifests), un override de [values](/docs/project/values), una actualización de Var Group — SleakOps la registra como un **cambio pendiente** en lugar de desplegarla. Los cambios pendientes se acumulan por entorno hasta que los revisas y publicas con un clic. +No todos los cambios tienen que llegar al cluster inmediatamente. Cada vez que guardas una edición con el switch **Deploy?** apagado — una edición de Workload, una personalización de [manifiestos](/docs/project/workload/manifests), un override de [values](/docs/project/workload/values), una actualización de Var Group — SleakOps la registra como un **cambio pendiente** en lugar de desplegarla. Los cambios pendientes se acumulan por entorno hasta que los revisas y publicas con un clic. ## Cómo se acumulan los cambios diff --git a/content/docs/es/project/import-project.mdx b/content/docs/es/project/import-project.mdx new file mode 100644 index 0000000000..3055e4ddf2 --- /dev/null +++ b/content/docs/es/project/import-project.mdx @@ -0,0 +1,77 @@ +--- +title: Importa un proyecto +sidebar_label: Importa un proyecto +sidebar_position: 15 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +:::info +Esta página cubre la importación de un recurso existente. Si todavía no conectaste tu infraestructura de AWS a SleakOps, empezá por [Instala SleakOps en tu infraestructura](/docs/install-on-your-infra). +::: + +SleakOps puede adoptar un deployment que ya corre en un clúster como un Proyecto administrado, en vez de crearlo desde cero. La importación descubre los Helm releases que el clúster corre fuera de SleakOps y mapea uno de ellos en workloads y manifiestos. + +## Descubrí un release para importar + +En la pantalla de Proyectos, hacé clic en **Import Project** junto a **Create**. Esto abre el mismo diálogo de descubrimiento que se usa para importar addons: elegí el clúster a inspeccionar, y SleakOps lista los Helm releases que corren ahí y que todavía no están administrados por SleakOps. Elegí uno para continuar. + + + Diálogo de importación de proyecto desde clúster listando Helm releases no administrados + + +## Preview: qué detecta SleakOps + +SleakOps mapea determinísticamente los documentos del release en workloads — web service, worker, cron job o hook — más cualquier manifiesto compartido por todo el proyecto. Lo que no pudo mapear queda en una lista de **Not included**, cada uno con su motivo. Un botón opcional **Improve mapping with AI** vuelve a correr el mapeo con un LLM como alternativa, si el resultado determinístico necesita ajustarse. + + + Paso de preview mostrando el release mapeado en un workload con sus manifiestos + + +El release original sigue corriendo intacto. Esto crea un proyecto administrado por SleakOps en su propio namespace, en paralelo — sus pods usan la service account de SleakOps, así que hay que otorgar cualquier acceso a AWS que la app necesite a través de Dependencias. Pasar el tráfico al proyecto administrado es un paso manual. + +## Completá los datos del proyecto + +Hacé clic en **Continue** para completar el nuevo proyecto: + +| **Campo** | **Descripción** | +| ---------------------- | -------------------------------------------------------------------------------- | +| **Project name** | Prellenado a partir del nombre del release, slugificado. Editable. | +| **Environment** | El Entorno del clúster elegido en el que se va a desplegar. | +| **Nodepool** | El node pool del clúster elegido en el que van a correr los workloads. | +| **Branch** | La rama de Git desde la que se construye. | +| **Repository** | El repositorio de Git desde el que se construye — requiere una integración de Git configurada. | +| **Build method** | Docker o Buildpack. | +| **Dockerfile path** | Solo para el método Docker. | + +Environment y Nodepool listan los recursos reales del clúster que elegiste en el paso de descubrimiento. + + + Paso de detalles con nombre de proyecto, entorno, nodepool, rama y método de build completos + + +Hacé clic en **Import** para crear el proyecto. + +## Qué queda manual + +El nuevo proyecto se construye desde el repositorio que elijas y se despliega con los manifiestos mapeados desde el release. El release original no se modifica — sigue sirviendo tráfico por su cuenta hasta que decidas pasarte al proyecto administrado. Enrutar tráfico real hacia el proyecto administrado es un paso manual, fuera de SleakOps. + +## FAQs + +
+ +### ¿Qué pasa con el release original? + +Nada. El release original sigue corriendo intacto en su propio namespace. SleakOps crea un proyecto nuevo y separado en paralelo — pasar el tráfico al proyecto administrado es un paso manual que tomás cuando estés listo. +
diff --git a/content/docs/es/project/import-project/import-project-details.png b/content/docs/es/project/import-project/import-project-details.png new file mode 100644 index 0000000000..c8edcf9e74 Binary files /dev/null and b/content/docs/es/project/import-project/import-project-details.png differ diff --git a/content/docs/es/project/import-project/import-project-entry.png b/content/docs/es/project/import-project/import-project-entry.png new file mode 100644 index 0000000000..715adf8834 Binary files /dev/null and b/content/docs/es/project/import-project/import-project-entry.png differ diff --git a/content/docs/es/project/import-project/import-project-preview.png b/content/docs/es/project/import-project/import-project-preview.png new file mode 100644 index 0000000000..b3c661d069 Binary files /dev/null and b/content/docs/es/project/import-project/import-project-preview.png differ diff --git a/content/docs/es/project/index.mdx b/content/docs/es/project/index.mdx index daee081895..1dc12424c0 100644 --- a/content/docs/es/project/index.mdx +++ b/content/docs/es/project/index.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 7 +sidebar_position: 8 sidebar_label: Projecto pagination_next: project/dependency/index --- diff --git a/content/docs/es/project/manifests.mdx b/content/docs/es/project/workload/manifests.mdx similarity index 62% rename from content/docs/es/project/manifests.mdx rename to content/docs/es/project/workload/manifests.mdx index 5537505172..d4560e13d6 100644 --- a/content/docs/es/project/manifests.mdx +++ b/content/docs/es/project/workload/manifests.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 12 +sidebar_position: 6 --- import Zoom from "react-medium-image-zoom"; import "react-medium-image-zoom/dist/styles.css"; @@ -10,14 +10,16 @@ import { FiExternalLink } from "react-icons/fi"; Cada Workload que creas en SleakOps se despliega en Kubernetes a través de un conjunto de **manifiestos** — los recursos Deployment, Service, Ingress, PodDisruptionBudget y HorizontalPodAutoscaler que SleakOps genera para él. La funcionalidad de Manifests convierte esos recursos en ciudadanos de primera clase: puedes inspeccionar cada uno, personalizar su YAML, deshabilitarlo o agregar tus propios manifiestos extra — por Workload o compartidos a nivel del Project. :::info Disponibilidad -Manifests se está habilitando progresivamente. Si no ves el toggle **Advanced** en los formularios de tus Workloads ni la sección **Manifests** en la Chart Configuration de tu Project, la funcionalidad todavía no está habilitada para tu compañía. +Manifests se lanza en **SleakOps 3.0.0** detrás del feature flag de compañía `service_manifests`, apagado por defecto mientras se completa el rollout. Si no ves el toggle **Advanced** en los formularios de tus Workloads ni la sección **Manifests** en la Chart Configuration de tu Project, pide a tu contacto de SleakOps que lo habilite para tu compañía. El flag también puede estar acotado a un subconjunto de usuarios mediante un grupo de configuración, así que puede estar habilitado para tu compañía y seguir apagado para tu usuario — si las superficies de Manifests no aparecen, consulta con tu contacto de SleakOps si tu usuario está incluido en el rollout. ::: +Habilitar `service_manifests` también es un prerrequisito para importar un Project desde un release de Helm existente. + ## Dónde encontrarlos Los manifiestos viven en dos lugares: -- **Por Workload** — abre cualquier Workload (WebService, Worker, CronJob o Hook) y cambia el toggle de vista de **Form** a **Advanced**. La vista Advanced tiene dos tabs: **Manifests** (el grafo de recursos) y **Values** (ver [Values](/docs/project/values)). +- **Por Workload** — abre cualquier Workload (WebService, Worker, CronJob o Hook) y cambia el toggle de vista de **Form** a **Advanced**. La vista Advanced tiene dos tabs: **Manifests** (el grafo de recursos) y **Values** (ver [Values](/docs/project/workload/values)). - **Por Project** — ve a **Project → Settings → Chart Configuration**. La sección **Manifests** lista todos los Workloads y manifiestos del Project, y administra el **project bucket** compartido. La vista **Form** sigue siendo la fuente de verdad de la configuración de tu Workload: un submit actualiza todos los manifiestos generados. La vista **Advanced** es donde inspeccionas y personalizas lo que se despliega. @@ -41,15 +43,25 @@ Cada nodo muestra el nombre del manifiesto, su Kind (o el host resuelto, en los | **Customized** | `Customized` | Editaste su YAML. SleakOps nunca sobreescribe tu copia — ver [actualizaciones del template base](#actualizaciones-del-template-base). | | **Custom** | `Custom` | Un manifiesto que agregaste tú. No tiene template base de SleakOps. | -Los manifiestos deshabilitados muestran un badge `Disabled` y sus aristas se dibujan punteadas. +El origen **Custom** también se muestra como "user added" en el header del editor y en la toolbar del Workload — es lo mismo, con distinta etiqueta según dónde lo mires. + +Los manifiestos deshabilitados muestran un badge `Disabled` y sus aristas se dibujan punteadas. Una línea de resumen arriba del grafo cuenta los manifiestos por origen (`N manifests · X customized · Y user-added · Z disabled`), junto con una leyenda de puntos de color. -Puedes arrastrar los nodos para acomodar el grafo — las posiciones se guardan por Workload, y **Reset layout** restaura el orden automático. +Puedes arrastrar los nodos para acomodar el grafo — las posiciones se guardan por Workload, y **Reset layout** restaura el orden automático. Arrastrar nodos y re-vincular dependencias son acciones de layout — se actualizan al instante pero nunca registran un cambio pendiente ni disparan un deployment, sin importar el switch **Deploy?**. Debajo del grafo, la franja **Project-shared manifests** muestra los manifiestos del [project bucket](#el-project-bucket) que se despliegan junto a todos los Workloads, con un acceso **Manage →** a la Chart Configuration del Project. +### Ingress por dominio + +Cada dominio o alias que agregas a un WebService obtiene su propio nodo `ingress-` en el grafo, separado del nodo de la URL predeterminada del Workload — vas a ver un manifiesto Ingress por host, no uno solo compartido. + +Borrar un manifiesto de ingress de un dominio puntual solo quita el ruteo de ese host: SleakOps no lo vuelve a crear automáticamente. Agrega un manifiesto nuevo (o vuelve a agregar el dominio) si necesitas ese host de nuevo. + +Agregar un dominio cuyo host mapea al mismo nombre de Ingress de Kubernetes que otro host existente del Workload se rechaza al guardar el dominio — `api.acme.com` y `api-acme.com` colapsan al mismo nombre; elige uno que difiera en algo más que puntos o guiones. Los nombres de los nodos de manifiesto nunca chocan: un slug repetido simplemente recibe el id del dominio como sufijo. + ## Editar un manifiesto -Haz clic en cualquier nodo para abrir el editor. El header muestra el kind del manifiesto, su origen, la versión del template base, un switch **Enabled**, un botón de copiado y **Delete**. +Haz clic en cualquier nodo para abrir el editor. El header muestra el kind del manifiesto, su origen, la versión del template base, un switch **Enabled**, un botón de copiado y **Delete** (requiere rol Admin — ver [¿Quién puede editar manifiestos?](#quién-puede-editar-manifiestos)). >` se resuelven **antes de Helm**, con los valores del formulario de tu Workload (nombre, namespace, command, healthcheck, etc.). -- Las expresiones `{{ .Values }}` quedan para **Helm en el momento del deploy** (replicas, resources, tag de imagen — todo lo que viene de [Values](/docs/project/values)). +- Las expresiones `{{ .Values }}` quedan para **Helm en el momento del deploy** (replicas, resources, tag de imagen — todo lo que viene de [Values](/docs/project/workload/values)). -El panel **Variables** de la derecha lista todo lo disponible: haz clic en una entrada para insertarla en el cursor, o arrástrala al editor. +El panel **Variables** de la derecha lista todo lo disponible: haz clic en una entrada para insertarla en el cursor, o arrástrala al editor. Arrastrar una variable sobre el editor muestra una vista previa del cursor en vivo, indicando dónde va a caer antes de soltarla. El editor valida mientras escribes. Los errores bloquean el guardado, e incluyen: @@ -85,11 +97,13 @@ El tab **Preview** renderiza el template con las variables actuales del formular /> -Los badges sobre la salida confirman cuántas variables `<< form >>` se resolvieron, si quedan expresiones `{{ .Values }}` para el deploy, y que los invariantes protegidos están presentes. Si el template no renderiza, los errores se listan con su número de línea y un acceso **Fix in YAML** — un manifiesto que no renderiza no se despliega. +Los badges sobre la salida confirman cuántas variables `<< form >>` se resolvieron, si quedan expresiones `{{ .Values }}` para el deploy, y que los invariantes protegidos están presentes. + +Si el template no renderiza, el tab Preview reemplaza su salida con una card "Template failed to render — nothing will deploy", listando los errores con su número de línea y un acceso **Fix in YAML** — esto es distinto de los badges que solo marcan expresiones `{{ .Values }}` sin resolver, que sí renderizan bien. ## Agregar un manifiesto -Usa **Add manifest** (en la toolbar del grafo del Workload, o en el project bucket) para desplegar recursos más allá de los generados: +Usa **Add manifest** (en la toolbar del grafo del Workload, o en el project bucket) para desplegar recursos más allá de los generados (requiere rol Admin — ver [¿Quién puede editar manifiestos?](#quién-puede-editar-manifiestos)): -El **Explorer** al inicio de la sección lista cada Workload del Project con sus manifiestos, y el project bucket al final. Usa el filtro para buscar por nombre o kind; hacer clic en un Workload abre su vista Advanced, y hacer clic en un manifiesto abre el editor ahí mismo. +El **Explorer** al inicio de la sección lista cada Workload del Project con sus manifiestos, y el project bucket al final. Hacer clic en un Workload abre su vista Advanced, y hacer clic en un manifiesto abre el editor ahí mismo. + +El filtro busca tanto por nombre como por kind. Un Workload sin coincidencias se colapsa de la lista en vez de mostrar una lane vacía; si no hay coincidencias en ningún lado (incluido el bucket), vas a ver un mensaje "No manifests match". Los tipos de Workload que todavía no tienen una vista Advanced dedicada se muestran como filas deshabilitadas. ### ¿Puedo desplegar recursos de un CRD? -Sí — elige **Custom…** como Kind al agregar un manifiesto y define el apiVersion/kind del CRD. El CRD debe estar instalado en el cluster (por ejemplo, el ScaledObject de Keda requiere el Addon de Keda); si no, el deploy falla con el error correspondiente de Helm. +Sí — elige **Custom…** como Kind al agregar un manifiesto y define el apiVersion/kind del CRD. El manifiesto se guarda igual; el CRD debe estar instalado en el cluster (por ejemplo, el ScaledObject de Keda requiere el Addon de Keda); si no, el deploy falla con el error correspondiente de Helm.
@@ -199,5 +229,5 @@ Deshabilitar conserva el manifiesto y su configuración pero lo saltea al desple ### ¿Quién puede editar manifiestos? -La edición sigue tu rol en la plataforma: los viewers ven el grafo, el YAML y los previews en modo solo lectura; los editors y admins pueden personalizar, agregar, deshabilitar y borrar manifiestos. +Los viewers ven el grafo y el YAML en modo solo lectura; renderizar un Preview requiere al menos el rol Editor. Los editors además pueden arrastrar nodos para reorganizar el grafo, pero no pueden crear, editar, deshabilitar, borrar ni resetear un manifiesto — esas acciones requieren el rol Admin.
diff --git a/content/docs/es/project/manifests/add-manifest-modal.png b/content/docs/es/project/workload/manifests/add-manifest-modal.png similarity index 100% rename from content/docs/es/project/manifests/add-manifest-modal.png rename to content/docs/es/project/workload/manifests/add-manifest-modal.png diff --git a/content/docs/es/project/manifests/manifest-editor-preview.png b/content/docs/es/project/workload/manifests/manifest-editor-preview.png similarity index 100% rename from content/docs/es/project/manifests/manifest-editor-preview.png rename to content/docs/es/project/workload/manifests/manifest-editor-preview.png diff --git a/content/docs/es/project/manifests/manifest-editor-yaml.png b/content/docs/es/project/workload/manifests/manifest-editor-yaml.png similarity index 100% rename from content/docs/es/project/manifests/manifest-editor-yaml.png rename to content/docs/es/project/workload/manifests/manifest-editor-yaml.png diff --git a/content/docs/es/project/manifests/project-manifests-explorer.png b/content/docs/es/project/workload/manifests/project-manifests-explorer.png similarity index 100% rename from content/docs/es/project/manifests/project-manifests-explorer.png rename to content/docs/es/project/workload/manifests/project-manifests-explorer.png diff --git a/content/docs/es/project/manifests/project-shared-bucket.png b/content/docs/es/project/workload/manifests/project-shared-bucket.png similarity index 100% rename from content/docs/es/project/manifests/project-shared-bucket.png rename to content/docs/es/project/workload/manifests/project-shared-bucket.png diff --git a/content/docs/es/project/manifests/workload-advanced-manifests.png b/content/docs/es/project/workload/manifests/workload-advanced-manifests.png similarity index 100% rename from content/docs/es/project/manifests/workload-advanced-manifests.png rename to content/docs/es/project/workload/manifests/workload-advanced-manifests.png diff --git a/content/docs/es/project/workload/static.mdx b/content/docs/es/project/workload/static.mdx new file mode 100644 index 0000000000..dc3310e76d --- /dev/null +++ b/content/docs/es/project/workload/static.mdx @@ -0,0 +1,88 @@ +--- +sidebar_position: 6 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +# Sitio Estático + +Los **sitios estáticos** compilan tu frontend desde su repositorio Git y sirven el resultado desde un bucket S3 privado a través de Amazon CloudFront, en tu propio dominio. No hay contenedores corriendo ni servidor web que mantener: SleakOps compila el sitio, lo sube a S3 y mantiene fresca la caché de CloudFront. + +:::info +Los sitios estáticos requieren la feature `static` en tu suscripción. Sin ella, el build method **Static site** y la pestaña **Static** dentro de Workloads no se muestran. +::: + +## Cómo funciona + +- Creás un Project con el build method **Static site**. SleakOps genera el Dockerfile del proyecto automáticamente — un build multistage que compila tu frontend con Node y empaqueta el resultado — así que no hay Dockerfile que escribir ni mantener. +- El Project obtiene un bucket S3 privado. Cada **Static** asociado al Project es un dominio custom servido desde ese bucket a través de su propia distribución de CloudFront, con su certificado TLS y su registro DNS administrados por la plataforma. +- Cada deploy sincroniza el nuevo build al bucket, así que el sitio siempre refleja el último build deployado. + +## Crear un sitio estático + +Navegá a **Projects**, hacé clic en **Create** y seleccioná tu repositorio y branch como en cualquier Project. Elegí **Static site** como build method y completá la configuración de build: + +| **Atributo** | **Descripción** | +| ----------------- | --------------------------------------------------------------------------------------------------------------- | +| **Node version** | Versión de Node.js usada para compilar el sitio: 18, 20 o 22. Default: `20`. | +| **Build command** | El comando que produce el build de producción, p. ej. `npm run build`. | +| **Output path** | La carpeta relativa al repo donde el build escribe el resultado, p. ej. `dist`. No se aceptan rutas absolutas ni segmentos `..`. | +| **Subdomain** | La URL del sitio: escribís una sola etiqueta y el dominio del environment se agrega como sufijo (p. ej. `landing` se convierte en `landing.dev.example.com`). | + +{/* TODO: screenshot - Formulario de creación de Project con el build method Static site seleccionado, mostrando Node version, Build command, Output path y Subdomain */} + +La URL del sitio debe ser un **subdominio directo del dominio del environment** — la única forma que cubre el certificado wildcard del dominio. El environment de destino necesita, por lo tanto, un dominio configurado (ver [Domain](/docs/domain)). + +Al enviar el formulario, SleakOps aprovisiona el bucket del proyecto y la distribución de CloudFront, el certificado y el registro DNS del sitio. Una vez que el dominio está activo, el primer build y su deploy corren automáticamente — el sitio queda publicado sin pasos adicionales. + +:::info +Si el certificado del dominio todavía se está emitiendo, la distribución arranca con un certificado default de CloudFront sin el dominio custom adjunto — el sitio todavía no responde en su URL. SleakOps adjunta el dominio automáticamente apenas el certificado queda emitido. +::: + +## Cómo funcionan los deploys + +Un Project estático sigue el mismo flujo Build → Release → Deployment que cualquier otro Project. El build compila tu frontend en una imagen que contiene el resultado estático; el deploy corre un job de corta duración que sincroniza ese resultado al bucket del proyecto (eliminando los archivos que ya no existen en el build) y luego invalida la caché de CloudFront de cada Static con **Invalidate on deploy** habilitado. + +Los builds y deployments aparecen en las secciones de Builds y Deployments como siempre. Para hacer rollback, re-deployá un Release anterior — su imagen contiene el resultado estático de esa versión. + +## Administrar tus sitios estáticos + +Abrí **Workloads** en el panel izquierdo y seleccioná la pestaña **Static** para ver cada sitio estático con su estado, URL y environment. + +{/* TODO: screenshot - Listado de Statics dentro de Workloads con un sitio estático creado */} + +La vista de detalle muestra el bucket S3, la distribución de CloudFront y links a la consola de AWS, y ofrece dos controles de caché: + +- **Invalidate on deploy** — invalida la caché de CloudFront en cada deploy, para que los visitantes reciban la nueva versión de inmediato. Habilitado por default. +- **Invalidate cache** — dispara una invalidación manual, disponible una vez creada la distribución. + +{/* TODO: screenshot - Detalle del Static con el toggle Invalidate on deploy y la acción Invalidate cache */} + +Un Project puede servir varios Statics: comparten el mismo contenido — el bucket del proyecto — en dominios distintos, cada uno con su propia distribución de CloudFront. Cambiar la URL de un Static re-aprovisiona su distribución, certificado y registro DNS para el nuevo dominio. + +La configuración de build (Node version, build command, output path) es editable en los settings del proyecto; SleakOps regenera el Dockerfile al guardar. El build method en sí no puede cambiarse hacia o desde Static site después de la creación. + +## FAQs + +
+ + ### ¿Funciona con single-page applications? + + Sí. La distribución de CloudFront sirve `index.html` como objeto raíz y mapea las respuestas not-found de vuelta a `index.html`, así que las rutas del lado del cliente (React Router, Vue Router, etc.) resuelven correctamente en navegación directa y al refrescar. +
+ +
+ + ### ¿Por qué mi sitio estático no tiene réplicas ni configuración de CPU? + + Un sitio estático no corre Pods: el contenido lo sirven S3 y CloudFront, así que no hay nada que escalar ni recursos que asignar. El escalado, los health checks y la configuración de recursos solo aplican a workloads containerizados como los [Web Services](/docs/project/workload/webservice). +
+ +
+ + ### ¿Cuándo ven los visitantes el contenido nuevo después de un deploy? + + De inmediato, cuando el Static tiene **Invalidate on deploy** habilitado (el default): el deploy invalida la caché de CloudFront después de sincronizar el bucket. Si lo deshabilitaste, el contenido cacheado se sirve hasta que expira — usá **Invalidate cache** en el detalle del Static para refrescarlo a demanda. +
diff --git a/content/docs/es/project/values.mdx b/content/docs/es/project/workload/values.mdx similarity index 86% rename from content/docs/es/project/values.mdx rename to content/docs/es/project/workload/values.mdx index 0bfd4822fb..3f250d542e 100644 --- a/content/docs/es/project/values.mdx +++ b/content/docs/es/project/workload/values.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 13 +sidebar_position: 7 --- import Zoom from "react-medium-image-zoom"; import "react-medium-image-zoom/dist/styles.css"; @@ -7,7 +7,7 @@ import { FiExternalLink } from "react-icons/fi"; # Values -Cada deployment renderiza el chart de Helm de tu Project con un **árbol de values**: replicas, resources, tags de imagen, hosts, probes y todo lo demás que parametriza los [manifiestos](/docs/project/manifests). SleakOps genera esos values por ti, y te deja sobreescribirlos en tres niveles persistentes — más un cuarto nivel, efímero, en el momento del deploy. +Cada deployment renderiza el chart de Helm de tu Project con un **árbol de values**: replicas, resources, tags de imagen, hosts, probes y todo lo demás que parametriza los [manifiestos](/docs/project/workload/manifests). SleakOps genera esos values por ti, y te deja sobreescribirlos en tres niveles persistentes — más un cuarto nivel, efímero, en el momento del deploy. ## Los niveles de override @@ -57,7 +57,7 @@ En el ejemplo de arriba, `resources.limits.memory` se genera como `1331Mi`, sube ## Values globales del Project -Los overrides a nivel Project viven en **Project → Settings → Chart Configuration**, en el editor de **Values** de la sección Extends Template & Values. El aviso de deprecación de esa sección apunta a migrar los **templates** libres a [Manifests](/docs/project/manifests) — el editor de Values sigue siendo el hogar de los globales del Project. Anida las claves bajo el nombre del Workload (o bajo `global:` para values de todo el chart): +Los overrides a nivel Project viven en **Project → Settings → Chart Configuration**, en el editor de **Values** de la sección Extends Template & Values. El aviso de deprecación de esa sección apunta a migrar los **templates** libres a [Manifests](/docs/project/workload/manifests) — el editor de Values sigue siendo el hogar de los globales del Project. Anida las claves bajo el nombre del Workload (o bajo `global:` para values de todo el chart): diff --git a/content/docs/es/project/values/project-global-values.png b/content/docs/es/project/workload/values/project-global-values.png similarity index 100% rename from content/docs/es/project/values/project-global-values.png rename to content/docs/es/project/workload/values/project-global-values.png diff --git a/content/docs/es/project/values/workload-effective-values.png b/content/docs/es/project/workload/values/workload-effective-values.png similarity index 100% rename from content/docs/es/project/values/workload-effective-values.png rename to content/docs/es/project/workload/values/workload-effective-values.png diff --git a/content/docs/es/project/values/workload-values-tab.png b/content/docs/es/project/workload/values/workload-values-tab.png similarity index 100% rename from content/docs/es/project/values/workload-values-tab.png rename to content/docs/es/project/workload/values/workload-values-tab.png diff --git a/content/docs/es/project/workload/webservice.mdx b/content/docs/es/project/workload/webservice.mdx index 6100f9b22b..f5f52e3aff 100644 --- a/content/docs/es/project/workload/webservice.mdx +++ b/content/docs/es/project/workload/webservice.mdx @@ -116,7 +116,9 @@ Esto le da a tu aplicación tiempo suficiente para manejar procedimientos de apa ### Como puedo desplegar mi sitio web estatico? -Por el momento, Sleakops no ofrece soporte nativo para sitios estáticos. Sin embargo, puedes desplegarlos utilizando el mismo flujo que para otros sitios, contenedorizándolos con un servidor web como Nginx. A continuación, se muestra un ejemplo sencillo de un Dockerfile y su correspondiente nginx.conf para servir tu contenido estático. +SleakOps soporta sitios estáticos de forma nativa: crea un Project con el build method **Static site** y la plataforma compila tu frontend y lo sirve desde S3 a través de CloudFront en tu propio dominio — ver [Sitio Estático](/docs/project/workload/static). Requiere la feature `static` en tu suscripción. + +Sin esa feature, todavía puedes desplegar un sitio estático como un Web Service normal, contenedorizándolo con un servidor web como Nginx. A continuación, se muestra un ejemplo sencillo de un Dockerfile y su correspondiente nginx.conf para servir tu contenido estático. ``` FROM node:20.11.0-alpine AS base diff --git a/content/docs/es/provider/index.mdx b/content/docs/es/provider/index.mdx index 4c9127c9b6..c52221f416 100644 --- a/content/docs/es/provider/index.mdx +++ b/content/docs/es/provider/index.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 4 +sidebar_position: 5 pagination_next: provider/schemas --- diff --git a/content/tutorials/en/sticky-sessions.mdx b/content/tutorials/en/sticky-sessions.mdx index b626d9d4fe..61aa08db02 100644 --- a/content/tutorials/en/sticky-sessions.mdx +++ b/content/tutorials/en/sticky-sessions.mdx @@ -142,5 +142,5 @@ If your application exposes its hostname anywhere — the `HOSTNAME` environment ## Next Steps - [Web Service configuration](/docs/project/workload/webservice) — the rest of the Workload settings, including replicas and autoscaling -- [Manifests](/docs/project/manifests) — edit the generated Ingress YAML directly when an annotation is not enough -- [Values](/docs/project/values) — override any generated Helm value, including per-host ingress settings +- [Manifests](/docs/project/workload/manifests) — edit the generated Ingress YAML directly when an annotation is not enough +- [Values](/docs/project/workload/values) — override any generated Helm value, including per-host ingress settings diff --git a/content/tutorials/es/sticky-sessions.mdx b/content/tutorials/es/sticky-sessions.mdx index 8eff1ae376..074a07b347 100644 --- a/content/tutorials/es/sticky-sessions.mdx +++ b/content/tutorials/es/sticky-sessions.mdx @@ -142,5 +142,5 @@ Si tu aplicación expone su hostname en algún lado —la variable de entorno `H ## Próximos pasos - [Configuración de Web Service](/docs/project/workload/webservice) — el resto de las opciones del Workload, incluidas réplicas y autoscaling -- [Manifests](/docs/project/manifests) — editá directamente el YAML del Ingress generado cuando una anotación no alcanza -- [Values](/docs/project/values) — sobrescribí cualquier value generado de Helm, incluidas las opciones de ingress por host +- [Manifests](/docs/project/workload/manifests) — editá directamente el YAML del Ingress generado cuando una anotación no alcanza +- [Values](/docs/project/workload/values) — sobrescribí cualquier value generado de Helm, incluidas las opciones de ingress por host diff --git a/docusaurus.config.js b/docusaurus.config.js index 97a1b2428c..4666701d4f 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -176,6 +176,17 @@ const config = { : undefined, }, ], + [ + "@docusaurus/plugin-client-redirects", + { + // Manifests + Values moved from project/ to project/workload/. + // console/src/utils/helplinks.js hardcodes the old URL, so it must keep resolving. + redirects: [ + { to: "/docs/project/workload/manifests", from: "/docs/project/manifests" }, + { to: "/docs/project/workload/values", from: "/docs/project/values" }, + ], + }, + ], ], themeConfig: { diff --git a/package.json b/package.json index b1acddf862..e3b6e47a30 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "dependencies": { "@algolia/client-search": "^4.9.1", "@docusaurus/core": "^3.9.2", + "@docusaurus/plugin-client-redirects": "3.9.2", "@docusaurus/plugin-google-analytics": "^3.9.2", "@docusaurus/plugin-sitemap": "^3.9.2", "@docusaurus/preset-classic": "^3.9.2", diff --git a/static/admin/config.yml b/static/admin/config.yml index a24db78b5e..89beb92adf 100644 --- a/static/admin/config.yml +++ b/static/admin/config.yml @@ -50,6 +50,35 @@ collections: } - { name: body, label: Body, widget: markdown, i18n: true } + # Install on your infra + - name: docs-install-on-your-infra + label: "Install on your infra" + icon: download + folder: content/docs + path: "install-on-your-infra/{{slug}}" + create: true + extension: mdx + format: frontmatter + i18n: true + identifier_field: title + fields: + - { name: title, label: Title, widget: string, i18n: true } + - { + name: sidebar_label, + label: Sidebar Label, + widget: string, + required: false, + i18n: true, + } + - { + name: sidebar_position, + label: Sidebar Position, + widget: number, + required: false, + i18n: duplicate, + } + - { name: body, label: Body, widget: markdown, i18n: true } + # Cluster - name: docs-cluster label: "Cluster" diff --git a/yarn.lock b/yarn.lock index b76157dde1..81436dce48 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1930,6 +1930,21 @@ react-helmet-async "npm:@slorber/react-helmet-async@1.3.0" react-loadable "npm:@docusaurus/react-loadable@6.0.0" +"@docusaurus/plugin-client-redirects@3.9.2": + version "3.9.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-3.9.2.tgz#9c27025c72aeeedeb783a94720163911567da0e8" + integrity sha512-lUgMArI9vyOYMzLRBUILcg9vcPTCyyI2aiuXq/4npcMVqOr6GfmwtmBYWSbNMlIUM0147smm4WhpXD0KFboffw== + dependencies: + "@docusaurus/core" "3.9.2" + "@docusaurus/logger" "3.9.2" + "@docusaurus/utils" "3.9.2" + "@docusaurus/utils-common" "3.9.2" + "@docusaurus/utils-validation" "3.9.2" + eta "^2.2.0" + fs-extra "^11.1.1" + lodash "^4.17.21" + tslib "^2.6.0" + "@docusaurus/plugin-content-blog@3.9.2": version "3.9.2" resolved "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.9.2.tgz"