You need to create Container Registry for storing Docker images. The deployment script will upload images to Container Registry during the build step, and Kubernetes will automatically pull these images from Container Registry to run a new version of service during the deployment step.Name container registry as the name of organization, which usually is equals to the name of the project: my-ship-app.After some time, you will get registry endpoint.registry.digitalocean.com/my-ship-app is registry endpoint, where my-ship-app is registry name.Docker images for each service are stored in separate repository.
In Digital Ocean repositories are created automatically when something is uploaded by specific paths.
During deployment process script will automatically create paths to repositories in next format:
We recommend you to create a cluster in the region where your end-users are located, it will reduce response time to incoming requests to all services.
Also, if your cluster will be located in one region with a Container Registry deployment process will be faster. You can find more information about regions here.
2
Set Node pool name
Set Node pool name (e.g. pool-app) and configure Nodes.
Digital Ocean recommends creating at least 2 nodes for the production environment. These settings will have an impact on the price of the cluster.
3
Set cluster name
Set cluster name (e.g. my-ship-app). A common practice is to use the project name for it.
4
Review and Create
Click on Create Kubernetes Cluster button to create a cluster and wait for cluster to be ready.
5
Integrate with created Container Registry
After cluster is created, go to the Container Registry’s settings and find DigitalOcean Kubernetes integration section.
You need to select your newly created my-ship-app cluster.
To upload docker images in Container Registry and pull them after from cluster we need Digital Ocean Personal Access Token.
When you created cluster - one with Read Only scope was automatically created.But we need to generate a new one with:
Name (e.g. my-ship-app-admin-deploy)
Full Access scope
No expiration
You cannot change scope of already generated token.
We will need this token soon, so don’t close this page yet.
Be very careful with Personal Access Token, if someone steals it he will get access
to all resources from your Digital Ocean account.
Kubeconfig files contain information about several clusters, you have your own on the local machine, it should have been created after kubectl installation.
You need to add information about the new cluster to your kubeconfig.
Find .kube/config file on your machine, and add cluster, context and user values from my-ship-app-kubeconfig.yaml.
~/.kube/config
apiVersion: v1clusters:- cluster: certificate-authority-data: ... server: https://... name: some-cluster# your new cluster from my-ship-app-kubeconfig.yaml goes here- cluster: certificate-authority-data: ... server: https://... name: do-nyc3-my-ship-appcontexts:- context: cluster: some-cluster user: some-user name: some-cluster# your new context from my-ship-app-kubeconfig.yaml goes here- context: cluster: do-nyc3-my-ship-app user: do-nyc3-my-ship-app-admin name: do-nyc3-my-ship-appcurrent-context: some-clusterkind: Configpreferences: {}users:- name: some-user user: token: dop_v1_...# your new user from my-ship-app-kubeconfig.yaml goes here- name: do-nyc3-my-ship-app-admin user: token: dop_v1_...
3
Switch to cluster context
Execute kubectx in your terminal and select your cluster from the list.
kubectx
You will see the list of available clusters.
some-clusterdo-nyc3-my-ship-app
Select your cluster from the list:
kubectx do-nyc3-my-ship-app
4
Verify cluster access
Check the installed pods by running:
kubectl get pods -A
You should see a list of system pods in your cluster:
Change to the deploy/dependencies directory in your terminal.
2
Configure Helm Values (Optional)
This step is required only if you specified a custom node pool name in your Digital Ocean Kubernetes cluster.If you did, update the doks.digitalocean.com/node-pool value in values.yaml.gotmpl:
Both should point to your Load Balancer’s external hostname.Enable the Proxied option to:
Route traffic through Cloudflare
Generate SSL certificates automatically
Cloudflare’s free Universal SSL certificates only cover the apex domain and one subdomain level. For multiple subdomain levels, you’ll need an Advanced Certificate.
4
Update Configuration Files
Update your domain settings in the appropriate environment configuration files:For API service:
A managed PostgreSQL service provides automated backups, scaling, and security so you don’t have to operate a database yourself. The API connects through a single DATABASE_URL connection string, and the Migrator applies Drizzle migrations against it before the API and Scheduler roll out.
Use a currently supported PostgreSQL major version (16 or newer). Ship’s Drizzle migrations target standard PostgreSQL and have no version-specific requirements.
2
Name your databases
Use environment-specific database names so staging and production never share data, for example api-staging and api-production.
Create a dedicated user for the API with read and write access to its database. Use environment-specific names (e.g. api-production, api-staging) and generate a strong password.
Give each environment its own user and database. Never reuse production credentials in staging or in documentation.
From your database dashboard, copy the host, port, user, password, and database name, or the ready-made connection string if the provider gives you one.
2
Build the DATABASE_URL
The API reads a single DATABASE_URL connection string. Compose it in the standard PostgreSQL format:
Managed providers require TLS. Keep sslmode=require (or stricter) in the connection string for staging and production.
3
Save the connection string
Store DATABASE_URL securely — you’ll add it to the API secret during environment configuration. The Migrator and API both read it from the same secret.
Before deploying to production, confirm automated backups are enabled in your provider’s console so you can recover data if needed.
Kubernetes applications require proper environment variable configuration for both API and Web components. This section covers how to set up and manage environment variables securely using Kubernetes secrets and configuration files.
For the API deployment, you need to set up environment variables using Kubernetes secrets to securely manage sensitive configuration data.
Secrets in Kubernetes are used to store sensitive information, such as passwords, API tokens, and keys.
They are encoded in Base64 format to provide a level of security.
These can be mounted into containers as data volumes or used as environment variables.
Before deploying the app, make sure all necessary variables from the API config are exist. Here are the minimal set of required variables:
Specifies the application environment (development, staging, production). This controls logging levels, debugging features, error reporting, and other environment-specific behaviors. The API uses this to determine which configuration settings to load.
DATABASE_URL
PostgreSQL connection string including authentication credentials, host, port, and database name. This is the primary database connection for the API and the Migrator. Format: postgresql://username:password@host:5432/database?sslmode=require. Each environment should use a separate database or at minimum separate credentials. Managed providers require TLS, so keep sslmode=require in staging and production.
API_URL
The fully qualified domain name where the API will be accessible. This must be a valid HTTPS URL and should match your Kubernetes ingress configuration. Used for CORS settings and internal service communication.
WEB_URL
The fully qualified domain name where the web application will be accessible. Used for CORS configuration, redirect URLs, email templates, and social sharing metadata. Must be a valid HTTPS URL.
After updating environment variables, you must initiate a new deployment for changes to take effect.
Kubernetes pods cache variable values during startup, requiring a pod restart or rolling update to apply changes.
The web application is a TanStack Start app built with Vite. Its environment variables are embedded at build time and made available in the browser through import.meta.env. Only variables prefixed with VITE_ are exposed to the client. Unlike API secrets, these variables are stored directly in the GitHub repository.
Why Web Environment Variables Are Safe in Git: Web environment variables (prefixed with VITE_) contain only public configuration like URLs and API endpoints. They don’t include sensitive data like passwords or API keys, making them safe to store in version control. These values are already exposed to users in the browser, so repository storage doesn’t create additional security risks.
Security Notice: Never store sensitive information (passwords, API keys, secrets) in web environment files as they will be accessible on the client side. Only use public configuration values that are safe to expose to end users.
Best Practice: Keep web environment files in your repository and ensure all values are non-sensitive. If you need to reference sensitive data from the frontend, create a secure API endpoint that returns the necessary information after proper authentication.
Before starting, make sure you have created a GitHub repository for your project.
GitHub Secrets and variables allow you to manage reusable configuration data.Secrets are encrypted and are used for sensitive data. Learn more about encrypted secrets.Variables are shown as plain text and are used for non-sensitive data. Learn more about variables.
The deployment will be triggered on each commit:
Commits to main branch → deploy to staging environment
Commits to production branch → deploy to production environment
Configure the following secrets and variables in your GitHub repository:
Name
Type
Description
DO_PERSONAL_ACCESS_TOKEN
secret
The secret access user created for CI/CD. This allows GitHub Actions to authenticate with DO services
CLUSTER_NAME_STAGING
variable
Name of the staging cluster. (our case: my-ship-app)
CLUSTER_NAME_PRODUCTION
variable
Name of the production cluster. (our case: my-ship-app, same as staging cluster since we have only one cluster)
CLUSTER_NODE_POOL
variable
Name of the node pool. (our case: pool-app)
REGISTRY_NAME
variable
Name of the Digital Ocean Container Registry. (our case: my-ship-app)
Never commit sensitive credentials directly to your repository.
Always use GitHub Secrets for sensitive information like DO keys.
Variables (unlike secrets) are visible in logs and can be used for non-sensitive configuration values that may need to be referenced or modified.
We set up DO_PERSONAL_ACCESS_TOKEN to be universal for both production and staging environments with Full access scope.
Your KUBE_CONFIG_PRODUCTION and KUBE_CONFIG_STAGING will be the same if you have only one cluster for both environments.
Now commit all changes to GitHub that will trigger deployment, or you can run a workflow manually
Done! Application deployed and can be accessed by the provided domain.
Upstash Redis is a highly available, infinitely scalable Redis-compatible database that provides enterprise-grade features without the operational complexity.
Redis as a Message Broker: When scaling to multiple server instances, Redis acts as a message broker between Socket.io servers, ensuring real-time messages reach all connected clients regardless of which server they’re connected to.
Log in to your Upstash account and navigate to the Redis section.
2
Create New Database
Click Create Database in the upper right corner to open the configuration dialog.
3
Configure Database Settings
Database Name: Choose a descriptive name for your database (e.g., my-ship-app-production)Primary Region: Select the region closest to your main application deployment for optimal write performance.Read Regions: Choose additional regions where you expect high read traffic for better global performance.
4
Select Plan & Deploy
Choose your pricing plan based on expected usage and click Create to deploy your database.
Once your database is created, you’ll need the connection string for your application:
1
Navigate to Connection Info
Go to your database dashboard and find the Connect to your database section.
2
Copy Connection String
Select the Node tab for the appropriate connection string format
Click Reveal to show the hidden password
Copy the complete Redis URI (format: rediss://username:password@host:port)
3
Add to Environment Variables through k8sec
Using k8sec, add the Redis connection string to your environment configuration:
k8sec set api-production-secret -n production REDIS_URI=$REDIS_URI
k8sec set api-staging-secret -n staging REDIS_URI=$REDIS_URI
After updating environment variables, restart your API pod using:
kubectl delete pod <pod-name> -n <namespace>
This will trigger Kubernetes to create a new pod with the updated environment variables.
Redis Insight is a powerful GUI tool for managing and debugging Redis databases.
1
Install Redis Insight
Download and install Redis Insight on your local machine.
2
Add Database Connection
Open Redis Insight
Click Add Database
Paste your Upstash Redis connection string in the Connection URL field
Click Add Database
3
Explore Your Database
Once connected, you can use Upstash Redis Console to:
Browse keys and data structures
Execute Redis commands directly
Monitor real-time performance metrics
Debug application data storage
Real-time Monitoring: Upstash Redis updates database metrics automatically every 10 seconds, giving you near real-time visibility into your Redis performance and usage.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Ship","colors":{"primary":"#9166A9","light":"#ECCBFF","dark":"#9166A9"},"logo":"https://mintcdn.com/ship/NJ8GmOFvTnU_w738/logo.png?fit=max\u0026auto=format\u0026n=NJ8GmOFvTnU_w738\u0026q=85\u0026s=ba34fe49f53df6beecde5ee601862f8c","favicon":"https://mintcdn.com/ship/x4usuONuzojy0ONL/favicon.svg?fit=max\u0026auto=format\u0026n=x4usuONuzojy0ONL\u0026q=85\u0026s=a1223940d632d7374608f2f0bcc1fdbf","appearance":{"default":"dark","strict":true},"navbar":{"links":[{"href":"https://www.paralect.com/ship","label":"What's Ship?"},{"href":"https://ship.paralect.com/#showcase","label":"Showcase"},{"href":"https://ship.paralect.com/#contributors","label":"Contributors"}],"primary":{"type":"github","href":"https://github.com/paralect/ship"}},"footer":{"socials":{"twitter":"https://twitter.com/paralect_ship","github":"https://github.com/paralect/ship"}},"styling":{"latex":false},"navigation":{"global":{"anchors":[{"anchor":"Twitter","icon":"twitter","href":"https://twitter.com/paralect_ship"},{"anchor":"Discord","icon":"discord","href":"https://discord.gg/zNWEatRWqx"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"ship","hasAudioNarration":false,"actualSubdomain":"ship","customDomains":["ship.paralect.com"],"gitSource":{"type":"github","owner":"paralect","repo":"ship","deployBranch":"main","contentDirectory":"docs","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6a22adfe416657b1467fc37a","collectionId":"8d2721fe-5844-46c2-8d7e-ee5579347675","schemaVersion":"v2"},"feedback":{"thumbs":true,"edits":true,"issues":true},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6a22adfe416657b1467fc37a:success","clientVersion":"0.0.4044","searchFilterCounts":[{"language":"default","tag":"Documentation","count":46},{"language":"default","tag":"Ship Components","count":37},{"language":"default","tag":"API","count":13},{"language":"default","tag":"Web","count":9},{"language":"default","tag":"Deployment","count":6},{"language":"default","tag":"Getting Started","count":5},{"language":"default","tag":"Plugins","count":4},{"language":"default","tag":"Kubernetes","count":3},{"language":"default","tag":"Routing","count":2},{"language":"default","tag":"Package sharing","count":2}]},"assistantConfig":{},"basePath":"/docs","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"deployment/kubernetes/digital-ocean","slug":"/deployment/kubernetes/digital-ocean","pageMetadata":{"title":"Digital Ocean","description":null,"href":"/deployment/kubernetes/digital-ocean"},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];const provider_1=`do`;const provider_0=`do`;function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Accordion,CodeBlock,CodeGroup,Frame,Heading,Info,Note,OptimizedImage,Step,Steps,Table,Tip,Warning}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!CodeGroup)_missingMdxReference(`CodeGroup`,true);if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!Note)_missingMdxReference(`Note`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`It’s a step-by-step Ship deployment guide. We will use Digital Ocean Managed `,_jsx(_components.a,{href:`https://www.digitalocean.com/products/kubernetes`,children:`Kubernetes`}),`, `,_jsx(_components.a,{href:`https://www.digitalocean.com/products/container-registry`,children:`Container Registry`}),`, `,_jsx(_components.a,{href:`https://www.digitalocean.com/products/managed-databases-postgresql`,children:`Managed PostgreSQL`}),`, `,_jsx(_components.a,{href:`https://github.com/features/actions`,children:`GitHub Actions`}),` for automated deployment, and `,_jsx(_components.a,{href:`https://www.cloudflare.com/`,children:`CloudFlare`}),` for DNS and SSL configuration.`]}),`\n`,_jsxs(_components.p,{children:[`You need to create `,_jsx(_components.a,{href:`https://github.com/`,children:`GitHub`}),`, `,_jsx(_components.a,{href:`https://www.cloudflare.com/`,children:`CloudFlare`}),` and `,_jsx(_components.a,{href:`https://www.digitalocean.com/`,children:`Digital Ocean`}),` accounts and install the next tools on your machine before starting:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`https://kubernetes.io/docs/tasks/tools/#kubectl`,children:`kubectl`}),` - CLI tool for accessing Kubernetes cluster;`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`https://github.com/ahmetb/kubectx`,children:`kubectx`}),` - CLI tool for easier switching between Kubernetes contexts;`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`https://helm.sh/docs/intro/install`,children:`helm`}),` - CLI tool for managing Kubernetes deployments;`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`https://github.com/dtan4/k8sec`,children:`k8sec`}),` - CLI tool for managing Kubernetes Secrets easily;`]}),`\n`]}),`\n`,_jsxs(Accordion,{title:`How to install k8sec on Linux?`,id:`how-to-install-k8sec-on-linux`,children:[_jsx(_components.p,{children:`Download k8sec tar.gz, then do:`}),_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`chmod +x k8sec`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`sudo cp k8sec /usr/local/bin/`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`k8sec --help`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})})]}),`\n`,_jsx(_components.p,{children:`Try the next commands to ensure that everything is installed correctly:`}),`\n`,_jsx(CodeBlock,{numberOfLines:`8`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`8`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`kubectl`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`kubectx`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`helm`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`k8sec`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`Also, you need `,_jsx(_components.a,{href:`https://git-scm.com/`,children:`git`}),` and `,_jsx(_components.a,{href:`https://nodejs.org/en/`,children:`Node.js`}),` if you already haven’t.`]}),`\n`,_jsx(Heading,{level:`2`,id:`setup-project`,children:`Setup project`}),`\n`,_jsxs(_components.p,{children:[`First, initialize your project. Type `,_jsx(_components.code,{children:`npx create-ship-app@latest`}),` in the terminal then choose `,_jsx(_components.strong,{children:`Digital Ocean Managed Kubernetes`}),` deployment type.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`npx`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` @paralect/ship`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` init`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`You will have next project structure.`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`7`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`7`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`/my-ship-app`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:` /.github`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:` /apps`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:` /api`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:` /web`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:` /deploy`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` ...`})}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`container-registry`,children:`Container registry`}),`\n`,_jsxs(_components.p,{children:[`You need to create `,_jsx(_components.a,{href:`https://www.digitalocean.com/products/container-registry`,children:`Container Registry`}),` for storing Docker images. The deployment script will upload images to Container Registry during the build step, and Kubernetes will automatically pull these images from Container Registry to run a new version of service during the deployment step.`]}),`\n`,_jsxs(_components.p,{children:[`Name container registry as the name of organization, which usually is equals to the name of the project: `,_jsx(_components.code,{children:`my-ship-app`}),`.`]}),`\n`,_jsx(OptimizedImage,{src:`https://mintcdn.com/ship/x4usuONuzojy0ONL/images/container-registry-creation.png?fit=max\u0026auto=format\u0026n=x4usuONuzojy0ONL\u0026q=85\u0026s=13af0e4c08793a40c54578701dbecebd`,alt:`Container Registry creation`,\"data-og-width\":`7680`,width:`7680`,\"data-og-height\":`4320`,height:`4320`,\"data-path\":`images/container-registry-creation.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/ship/x4usuONuzojy0ONL/images/container-registry-creation.png?w=280\u0026fit=max\u0026auto=format\u0026n=x4usuONuzojy0ONL\u0026q=85\u0026s=295f6108eb5d9e9590e3213ad51ae290 280w, https://mintcdn.com/ship/x4usuONuzojy0ONL/images/container-registry-creation.png?w=560\u0026fit=max\u0026auto=format\u0026n=x4usuONuzojy0ONL\u0026q=85\u0026s=19b9c083d4db95bc9163fd133a91ca77 560w, https://mintcdn.com/ship/x4usuONuzojy0ONL/images/container-registry-creation.png?w=840\u0026fit=max\u0026auto=format\u0026n=x4usuONuzojy0ONL\u0026q=85\u0026s=eb89dfc864f592260ccbfe99d8c5667a 840w, https://mintcdn.com/ship/x4usuONuzojy0ONL/images/container-registry-creation.png?w=1100\u0026fit=max\u0026auto=format\u0026n=x4usuONuzojy0ONL\u0026q=85\u0026s=5b3f457add3847cd1827b8af6008c906 1100w, https://mintcdn.com/ship/x4usuONuzojy0ONL/images/container-registry-creation.png?w=1650\u0026fit=max\u0026auto=format\u0026n=x4usuONuzojy0ONL\u0026q=85\u0026s=d995e43678aea538870515bad6ef32c9 1650w, https://mintcdn.com/ship/x4usuONuzojy0ONL/images/container-registry-creation.png?w=2500\u0026fit=max\u0026auto=format\u0026n=x4usuONuzojy0ONL\u0026q=85\u0026s=9a176959538b866d94901e65fe641873 2500w`}),`\n`,_jsx(_components.p,{children:`After some time, you will get registry endpoint.`}),`\n`,_jsx(OptimizedImage,{src:`https://mintcdn.com/ship/x4usuONuzojy0ONL/images/container-registry-created.png?fit=max\u0026auto=format\u0026n=x4usuONuzojy0ONL\u0026q=85\u0026s=fa418298b77bfbbb2cbe59315c92f55d`,alt:`Container Registry creation`,\"data-og-width\":`7680`,width:`7680`,\"data-og-height\":`4320`,height:`4320`,\"data-path\":`images/container-registry-created.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/ship/x4usuONuzojy0ONL/images/container-registry-created.png?w=280\u0026fit=max\u0026auto=format\u0026n=x4usuONuzojy0ONL\u0026q=85\u0026s=9a38819988a25ace5860d1341f7e8a76 280w, https://mintcdn.com/ship/x4usuONuzojy0ONL/images/container-registry-created.png?w=560\u0026fit=max\u0026auto=format\u0026n=x4usuONuzojy0ONL\u0026q=85\u0026s=301d1a57f238a6d1309e71b95c24acbd 560w, https://mintcdn.com/ship/x4usuONuzojy0ONL/images/container-registry-created.png?w=840\u0026fit=max\u0026auto=format\u0026n=x4usuONuzojy0ONL\u0026q=85\u0026s=38f5af3cb19a2130c7de038d208baf97 840w, https://mintcdn.com/ship/x4usuONuzojy0ONL/images/container-registry-created.png?w=1100\u0026fit=max\u0026auto=format\u0026n=x4usuONuzojy0ONL\u0026q=85\u0026s=1f8ed7c17931b6cbfddf3e7ce186414d 1100w, https://mintcdn.com/ship/x4usuONuzojy0ONL/images/container-registry-created.png?w=1650\u0026fit=max\u0026auto=format\u0026n=x4usuONuzojy0ONL\u0026q=85\u0026s=2c98fd1e32fb639663ce23369603e604 1650w, https://mintcdn.com/ship/x4usuONuzojy0ONL/images/container-registry-created.png?w=2500\u0026fit=max\u0026auto=format\u0026n=x4usuONuzojy0ONL\u0026q=85\u0026s=0bd33035b908ef08aecb969b7cc9e5a3 2500w`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`registry.digitalocean.com/my-ship-app`}),` is registry endpoint, where `,_jsx(_components.code,{children:`my-ship-app`}),` is registry name.`]}),`\n`,_jsx(_components.p,{children:`Docker images for each service are stored in separate repository.\nIn Digital Ocean repositories are created automatically when something is uploaded by specific paths.\nDuring deployment process script will automatically create paths to repositories in next format:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/api-reference/overview`,children:_jsx(_components.strong,{children:`API`})}),` - registry.digitalocean.com/my-ship-app/api;`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/scheduler`,children:_jsx(_components.strong,{children:`Scheduler`})}),` - registry.digitalocean.com/my-ship-app/scheduler;`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/migrator`,children:_jsx(_components.strong,{children:`Migrator`})}),` - registry.digitalocean.com/my-ship-app/migrator;`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/web/overview`,children:_jsx(_components.strong,{children:`Web`})}),` - registry.digitalocean.com/my-ship-app/web;`]}),`\n`]}),`\n`,_jsx(Tip,{children:_jsx(_components.p,{children:`Images for all environments will be uploaded to the same repository for each\nservice.`})}),`\n`,_jsx(Heading,{level:`2`,id:`kubernetes-cluster`,children:`Kubernetes cluster`}),`\n`,_jsxs(_components.p,{children:[`Now let’s create `,_jsx(_components.a,{href:`https://www.digitalocean.com/products/kubernetes`,children:`Managed Kubernetes`}),` cluster.`]}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Select a region`,children:[_jsxs(_components.p,{children:[`Navigate to the cluster creation page `,_jsx(_components.a,{href:`https://cloud.digitalocean.com/kubernetes/clusters/new`,children:`here`}),_jsx(`br`,{})]}),_jsx(Tip,{children:_jsx(_components.p,{children:`We recommend you to create a cluster in the region where your end-users are located, it will reduce response time to incoming requests to all services.`})}),_jsx(Tip,{children:_jsxs(_components.p,{children:[`Also, if your cluster will be located in one region with a Container Registry deployment process will be faster. You can find more information about regions `,_jsx(_components.a,{href:`https://docs.digitalocean.com/products/platform/availability-matrix/`,children:`here`}),`.`]})}),_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://mintcdn.com/ship/x4usuONuzojy0ONL/images/cluster-region.png?fit=max\u0026auto=format\u0026n=x4usuONuzojy0ONL\u0026q=85\u0026s=b399232783f9d66b1390fc2f2d3d74e1`,alt:`Cluster Region`,\"data-og-width\":`1092`,width:`1092`,\"data-og-height\":`854`,height:`854`,\"data-path\":`images/cluster-region.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/ship/x4usuONuzojy0ONL/images/cluster-region.png?w=280\u0026fit=max\u0026auto=format\u0026n=x4usuONuzojy0ONL\u0026q=85\u0026s=bf1e46eea1365d2469e65b5c5cd9ecd2 280w, https://mintcdn.com/ship/x4usuONuzojy0ONL/images/cluster-region.png?w=560\u0026fit=max\u0026auto=format\u0026n=x4usuONuzojy0ONL\u0026q=85\u0026s=de540f5dfbb0d14e90684aa61a9462a0 560w, https://mintcdn.com/ship/x4usuONuzojy0ONL/images/cluster-region.png?w=840\u0026fit=max\u0026auto=format\u0026n=x4usuONuzojy0ONL\u0026q=85\u0026s=438fa4853ab82ef1f30c31608194d910 840w, https://mintcdn.com/ship/x4usuONuzojy0ONL/images/cluster-region.png?w=1100\u0026fit=max\u0026auto=format\u0026n=x4usuONuzojy0ONL\u0026q=85\u0026s=a1f603a5d6e973b12405d3c1ede287d3 1100w, https://mintcdn.com/ship/x4usuONuzojy0ONL/images/cluster-region.png?w=1650\u0026fit=max\u0026auto=format\u0026n=x4usuONuzojy0ONL\u0026q=85\u0026s=aac70475a927a2bad90896a6a9aa3257 1650w, https://mintcdn.com/ship/x4usuONuzojy0ONL/images/cluster-region.png?w=2500\u0026fit=max\u0026auto=format\u0026n=x4usuONuzojy0ONL\u0026q=85\u0026s=775d52fbb23f3727ef16fbc9042f1b79 2500w`})})]}),_jsxs(Step,{title:`Set Node pool name`,children:[_jsxs(_components.p,{children:[`Set Node pool name (e.g. `,_jsx(_components.code,{children:`pool-app`}),`) and configure Nodes.\nDigital Ocean recommends creating at least 2 nodes for the production environment. These settings will have an impact on the price of the cluster.`]}),_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://mintcdn.com/ship/x4usuONuzojy0ONL/images/cluster-capacity.png?fit=max\u0026auto=format\u0026n=x4usuONuzojy0ONL\u0026q=85\u0026s=aed2e1f69fd9e2b0ebd0166a7d7979ad`,alt:`Cluster Capacity`,\"data-og-width\":`1103`,width:`1103`,\"data-og-height\":`819`,height:`819`,\"data-path\":`images/cluster-capacity.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/ship/x4usuONuzojy0ONL/images/cluster-capacity.png?w=280\u0026fit=max\u0026auto=format\u0026n=x4usuONuzojy0ONL\u0026q=85\u0026s=918cad3c30313ef662e99df2f67f63d0 280w, https://mintcdn.com/ship/x4usuONuzojy0ONL/images/cluster-capacity.png?w=560\u0026fit=max\u0026auto=format\u0026n=x4usuONuzojy0ONL\u0026q=85\u0026s=b222621aaf745fa3c82885fad6e897ce 560w, https://mintcdn.com/ship/x4usuONuzojy0ONL/images/cluster-capacity.png?w=840\u0026fit=max\u0026auto=format\u0026n=x4usuONuzojy0ONL\u0026q=85\u0026s=a82e08c7906ea4ac80b5786bd66846d1 840w, https://mintcdn.com/ship/x4usuONuzojy0ONL/images/cluster-capacity.png?w=1100\u0026fit=max\u0026auto=format\u0026n=x4usuONuzojy0ONL\u0026q=85\u0026s=7bde219cf3c852b492fb49be2caee9e4 1100w, https://mintcdn.com/ship/x4usuONuzojy0ONL/images/cluster-capacity.png?w=1650\u0026fit=max\u0026auto=format\u0026n=x4usuONuzojy0ONL\u0026q=85\u0026s=557a78ea2accf60847134f94dba3ac45 1650w, https://mintcdn.com/ship/x4usuONuzojy0ONL/images/cluster-capacity.png?w=2500\u0026fit=max\u0026auto=format\u0026n=x4usuONuzojy0ONL\u0026q=85\u0026s=f9207e934f5b10accd19a72725c3c4c7 2500w`})})]}),_jsxs(Step,{title:`Set cluster name`,children:[_jsxs(_components.p,{children:[`Set cluster name (e.g. `,_jsx(_components.code,{children:`my-ship-app`}),`). A common practice is to use the project name for it.`]}),_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://mintcdn.com/ship/x4usuONuzojy0ONL/images/cluster-name.png?fit=max\u0026auto=format\u0026n=x4usuONuzojy0ONL\u0026q=85\u0026s=48c3bde8ed49a5454a13b27ad633e0c2`,alt:`Cluster Name`,\"data-og-width\":`1086`,width:`1086`,\"data-og-height\":`763`,height:`763`,\"data-path\":`images/cluster-name.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/ship/x4usuONuzojy0ONL/images/cluster-name.png?w=280\u0026fit=max\u0026auto=format\u0026n=x4usuONuzojy0ONL\u0026q=85\u0026s=50431156898f58e2c56c0b677712eefe 280w, https://mintcdn.com/ship/x4usuONuzojy0ONL/images/cluster-name.png?w=560\u0026fit=max\u0026auto=format\u0026n=x4usuONuzojy0ONL\u0026q=85\u0026s=072124dc681d94a4c1f97788d930fef3 560w, https://mintcdn.com/ship/x4usuONuzojy0ONL/images/cluster-name.png?w=840\u0026fit=max\u0026auto=format\u0026n=x4usuONuzojy0ONL\u0026q=85\u0026s=1337206757304bc79b4c6ee2977e0d59 840w, https://mintcdn.com/ship/x4usuONuzojy0ONL/images/cluster-name.png?w=1100\u0026fit=max\u0026auto=format\u0026n=x4usuONuzojy0ONL\u0026q=85\u0026s=3ee4e82bfe5ca47a44b88e8fb389c5cd 1100w, https://mintcdn.com/ship/x4usuONuzojy0ONL/images/cluster-name.png?w=1650\u0026fit=max\u0026auto=format\u0026n=x4usuONuzojy0ONL\u0026q=85\u0026s=035601996f1b35ef0e2b4b5e2ee16a2a 1650w, https://mintcdn.com/ship/x4usuONuzojy0ONL/images/cluster-name.png?w=2500\u0026fit=max\u0026auto=format\u0026n=x4usuONuzojy0ONL\u0026q=85\u0026s=3e16caf7bd89553623980402b13d154d 2500w`})})]}),_jsx(Step,{title:`Review and Create`,children:_jsxs(_components.p,{children:[`Click on `,_jsx(_components.code,{children:`Create Kubernetes Cluster`}),` button to create a cluster and wait for cluster to be ready.`]})}),_jsxs(Step,{title:`Integrate with created Container Registry`,children:[_jsxs(_components.p,{children:[`After cluster is created, go to the Container Registry’s settings and find `,_jsx(_components.code,{children:`DigitalOcean Kubernetes integration`}),` section.`]}),_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/registry-settings.png?fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=ad9514438f83f225bd57ab1a12ac0281`,alt:`Registry Settings`,\"data-og-width\":`7680`,width:`7680`,\"data-og-height\":`4320`,height:`4320`,\"data-path\":`images/do/registry-settings.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/registry-settings.png?w=280\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=7e29f15de5f837a48eaeb029c3278d88 280w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/registry-settings.png?w=560\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=81974a55fe73b8986e4b34bd12508b26 560w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/registry-settings.png?w=840\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=9d629df41e9faefb4bf514be2367c37a 840w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/registry-settings.png?w=1100\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=978954187380ee7cdbabb30b79f5e369 1100w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/registry-settings.png?w=1650\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=41e6bfe2bd3581b2c38bc69216637421 1650w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/registry-settings.png?w=2500\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=9157e3dfaeb7d78bdb594048be6b696f 2500w`})}),_jsxs(_components.p,{children:[`You need to select your newly created `,_jsx(_components.code,{children:`my-ship-app`}),` cluster.`]}),_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/registry-check-cluster.png?fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=184db4c77fe2d3a40cdbf06fc3f1f3dc`,alt:`Registry Check Cluster`,\"data-og-width\":`599`,width:`599`,\"data-og-height\":`298`,height:`298`,\"data-path\":`images/do/registry-check-cluster.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/registry-check-cluster.png?w=280\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=0bdff5cb6f45ebe8fb02076de3a060b1 280w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/registry-check-cluster.png?w=560\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=3bec79285f09066ed93f4dd1a49aeb41 560w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/registry-check-cluster.png?w=840\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=356a6dd76e1c832445b3fc9d6a2d1f32 840w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/registry-check-cluster.png?w=1100\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=c09aa512c8269e5ef192371fe605347b 1100w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/registry-check-cluster.png?w=1650\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=313bc68f21b27cdad17642d98deeefe8 1650w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/registry-check-cluster.png?w=2500\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=dddd49d5f2768efafe9c8ff7d7148d9e 2500w`})})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`personal-access-token`,children:`Personal access token`}),`\n`,_jsxs(_components.p,{children:[`To upload docker images in Container Registry and pull them after from cluster we need Digital Ocean `,_jsx(_components.a,{href:`https://cloud.digitalocean.com/account/api/tokens`,children:`Personal Access Token`}),`.\nWhen you created cluster - one with `,_jsx(_components.strong,{children:`Read Only`}),` scope was automatically created.`]}),`\n`,_jsxs(_components.p,{children:[`But we need to `,_jsx(_components.a,{href:`https://cloud.digitalocean.com/account/api/tokens/new`,children:`generate`}),` a new one with:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Name (e.g. `,_jsx(_components.code,{children:`my-ship-app-admin-deploy`}),`)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Full Access`}),` scope`]}),`\n`,_jsx(_components.li,{children:`No expiration`}),`\n`]}),`\n`,_jsx(Tip,{children:_jsx(_components.p,{children:`You cannot change scope of already generated token.`})}),`\n`,_jsx(OptimizedImage,{src:`https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do-token.png?fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=7784d0982ccdfa63d2804a42fbefe508`,alt:`Digital Ocean Token`,\"data-og-width\":`7680`,width:`7680`,\"data-og-height\":`4320`,height:`4320`,\"data-path\":`images/do-token.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do-token.png?w=280\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=bbe632bcca1f48f9d46a191eb5c8cec7 280w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do-token.png?w=560\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=957a7cc3689cc2ad6bfc9944cd257891 560w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do-token.png?w=840\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=3b710092464ae192b90650748c1d581d 840w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do-token.png?w=1100\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=1464f80fc4d40ba261cad0024d071a74 1100w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do-token.png?w=1650\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=fe0156ffbbbf84ad73d15240e6c7a097 1650w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do-token.png?w=2500\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=d10a31264537008f9c63e42a325ba8be 2500w`}),`\n`,_jsx(_components.p,{children:`We will need this token soon, so don’t close this page yet.`}),`\n`,_jsx(OptimizedImage,{src:`https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/full-access-token.png?fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=c4da1154ca9149466b8abf1ed8e5cbdc`,alt:`Digital Ocean Token`,\"data-og-width\":`1214`,width:`1214`,\"data-og-height\":`679`,height:`679`,\"data-path\":`images/do/full-access-token.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/full-access-token.png?w=280\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=708f9ed4dd14786da2bcb73e0a0b93db 280w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/full-access-token.png?w=560\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=d2c9e1824aeb0142f31918e9fd75101f 560w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/full-access-token.png?w=840\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=13b38c5ac40125f37d19d33af18baac3 840w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/full-access-token.png?w=1100\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=26e0710f7d84b106ec0cdebb698714f8 1100w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/full-access-token.png?w=1650\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=cfce5f7b5ace06409886f95bd583547f 1650w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/full-access-token.png?w=2500\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=e893ecc49f91adc8104b9bc76dd4dfa3 2500w`}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`Be very careful with Personal Access Token, if someone steals it he will get access\nto all resources from your Digital Ocean account.`})}),`\n`,_jsx(Heading,{level:`2`,id:`accessing-cluster-from-a-local-machine`,children:`Accessing cluster from a local machine`}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Download cluster's kubeconfig`,children:[_jsxs(_components.p,{children:[`Download cluster’s kubeconfig, this file includes information for accessing cluster through `,_jsx(_components.code,{children:`kubectl`}),`.`]}),_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/kubeconfig-download.png?fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=37bde52b3ccb34f20567040baa217ee0`,alt:`Kubeconfig Download`,\"data-og-width\":`1274`,width:`1274`,\"data-og-height\":`637`,height:`637`,\"data-path\":`images/kubeconfig-download.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/kubeconfig-download.png?w=280\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=a7f1c7262dfeab128539232773e6ed7c 280w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/kubeconfig-download.png?w=560\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=19af7c66e59d0d19d8ca14567b1c4c5d 560w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/kubeconfig-download.png?w=840\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=89ea267097c6e13b335c47bf7b824085 840w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/kubeconfig-download.png?w=1100\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=753953c539e6527432197383b1e6524d 1100w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/kubeconfig-download.png?w=1650\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=68764bb56a60d5e8b57d39fa71ec0d9e 1650w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/kubeconfig-download.png?w=2500\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=0e76fb406f3cb93374ff820ddd2aaf3c 2500w`})}),_jsx(Accordion,{title:`Expected structure of downloaded kubeconfig`,id:`expected-structure-of-downloaded-kubeconfig`,children:_jsx(CodeBlock,{filename:`my-ship-app-kubeconfig.yaml`,numberOfLines:`18`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`18`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`apiVersion`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`v1`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`clusters`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`- `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`cluster`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` certificate-authority-data`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`...`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` server`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`https://...`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`do-nyc3-my-ship-app`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`contexts`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`- `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`context`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` cluster`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`do-nyc3-my-ship-app`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` user`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`do-nyc3-my-ship-app-admin`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`do-nyc3-my-ship-app`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`current-context`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`do-nyc3-my-ship-app`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`kind`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`Config`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`preferences`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {}`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`users`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`- `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`do-nyc3-my-ship-app-admin`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` user`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` token`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`dop_v1_...`})]}),`\n`]})})})}),_jsxs(_components.p,{children:[`And replace initial `,_jsx(_components.strong,{children:`Read only`}),` token with new `,_jsx(_components.strong,{children:`Full access`}),` token from `,_jsx(_components.a,{href:`#personal-access-token`,children:`Personal access token`}),` section.`]}),_jsx(CodeBlock,{filename:`my-ship-app-kubeconfig.yaml`,highlight:`[18,19]`,numberOfLines:`19`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`19`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`apiVersion`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`v1`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`clusters`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`- `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`cluster`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` certificate-authority-data`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`...`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` server`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`https://...`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`do-nyc3-my-ship-app`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`contexts`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`- `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`context`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` cluster`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`do-nyc3-my-ship-app`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` user`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`do-nyc3-my-ship-app-admin`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`do-nyc3-my-ship-app`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`current-context`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`do-nyc3-my-ship-app`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`kind`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`Config`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`preferences`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {}`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`users`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`- `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`do-nyc3-my-ship-app-admin`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` user`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsx(_components.span,{className:`line line-highlight`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # replace this token for full access token`})}),`\n`,_jsxs(_components.span,{className:`line line-highlight`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` token`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`dop_v1_...`})]}),`\n`]})})})]}),_jsxs(Step,{title:`Add cluster, context and user to kubeconfig`,children:[_jsx(Tip,{children:_jsxs(_components.p,{children:[_jsx(_components.a,{href:`https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/`,children:`Kubeconfig`}),` files contain information about several clusters, you have your own on the local machine, it should have been created after `,_jsx(_components.code,{children:`kubectl`}),` installation.`]})}),_jsxs(_components.p,{children:[`You need to add information about the new cluster to your kubeconfig.\nFind `,_jsx(_components.code,{children:`.kube/config`}),` file on your machine, and add `,_jsx(_components.code,{children:`cluster`}),`, `,_jsx(_components.code,{children:`context`}),` and `,_jsx(_components.code,{children:`user`}),` values from `,_jsx(_components.code,{children:`my-ship-app-kubeconfig.yaml`}),`.`]}),_jsx(CodeBlock,{filename:`~/.kube/config`,highlight:`[7,8,9,10,11,17,18,19,20,21,29,30,31,32,33]`,numberOfLines:`32`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`32`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`apiVersion`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`v1`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`clusters`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`- `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`cluster`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` certificate-authority-data`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`...`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` server`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`https://...`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`some-cluster`})]}),`\n`,_jsx(_components.span,{className:`line line-highlight`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# your new cluster from my-ship-app-kubeconfig.yaml goes here`})}),`\n`,_jsxs(_components.span,{className:`line line-highlight`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`- `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`cluster`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line line-highlight`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` certificate-authority-data`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`...`})]}),`\n`,_jsxs(_components.span,{className:`line line-highlight`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` server`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`https://...`})]}),`\n`,_jsxs(_components.span,{className:`line line-highlight`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`do-nyc3-my-ship-app`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`contexts`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`- `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`context`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` cluster`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`some-cluster`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` user`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`some-user`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`some-cluster`})]}),`\n`,_jsx(_components.span,{className:`line line-highlight`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# your new context from my-ship-app-kubeconfig.yaml goes here`})}),`\n`,_jsxs(_components.span,{className:`line line-highlight`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`- `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`context`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line line-highlight`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` cluster`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`do-nyc3-my-ship-app`})]}),`\n`,_jsxs(_components.span,{className:`line line-highlight`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` user`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`do-nyc3-my-ship-app-admin`})]}),`\n`,_jsxs(_components.span,{className:`line line-highlight`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`do-nyc3-my-ship-app`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`current-context`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`some-cluster`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`kind`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`Config`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`preferences`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {}`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`users`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`- `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`some-user`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` user`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` token`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`dop_v1_...`})]}),`\n`,_jsx(_components.span,{className:`line line-highlight`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# your new user from my-ship-app-kubeconfig.yaml goes here`})}),`\n`,_jsxs(_components.span,{className:`line line-highlight`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`- `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`do-nyc3-my-ship-app-admin`})]}),`\n`,_jsxs(_components.span,{className:`line line-highlight`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` user`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line line-highlight`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` token`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`dop_v1_...`})]}),`\n`]})})})]}),_jsxs(Step,{title:`Switch to cluster context`,children:[_jsx(_components.p,{children:`Execute kubectx in your terminal and select your cluster from the list.`}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kubectx`})}),`\n`]})})}),_jsx(_components.p,{children:`You will see the list of available clusters.`}),_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`some-cluster`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`do-nyc3-my-ship-app`})}),`\n`]})})}),_jsx(_components.p,{children:`Select your cluster from the list:`}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kubectx`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` do-nyc3-my-ship-app`})]}),`\n`]})})})]}),_jsxs(Step,{title:`Verify cluster access`,children:[_jsx(_components.p,{children:`Check the installed pods by running:`}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kubectl`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` get`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` pods`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -A`})]}),`\n`]})})}),_jsx(_components.p,{children:`You should see a list of system pods in your cluster:`}),_jsx(CodeBlock,{filename:``,numberOfLines:`15`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`15`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`NAMESPACE`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` NAME`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` READY`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` STATUS`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` RESTARTS`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` AGE`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kube-system`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` cilium-tb8td`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 1/1`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Running`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 18m`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kube-system`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` cilium-x5w8n`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 1/1`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Running`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 19m`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kube-system`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` coredns-5679ffb5c8-b7dzj`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 1/1`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Running`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 17m`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kube-system`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` coredns-5679ffb5c8-d465r`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 1/1`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Running`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 17m`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kube-system`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` cpc-bridge-proxy-ebpf-2gzfr`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 1/1`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Running`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 17m`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kube-system`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` cpc-bridge-proxy-ebpf-jknzh`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 1/1`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Running`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 17m`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kube-system`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` csi-do-node-jcqd2`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 2/2`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Running`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 17m`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kube-system`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` csi-do-node-rpx6q`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 2/2`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Running`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 17m`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kube-system`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` do-node-agent-ldhxq`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 1/1`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Running`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 17m`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kube-system`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` do-node-agent-pdksz`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 1/1`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Running`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 17m`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kube-system`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` hubble-relay-66f54dcd57-l7xjb`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 1/1`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Running`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 21m`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kube-system`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` hubble-ui-785bdbc45b-6xd57`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 2/2`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Running`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 18m`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kube-system`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` konnectivity-agent-h79mt`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 1/1`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Running`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 17m`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kube-system`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` konnectivity-agent-hvv67`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 1/1`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Running`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 17m`})]}),`\n`]})})})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`ingress-nginx-controller`,children:`Ingress NGINX Controller`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.a,{href:`https://github.com/kubernetes/ingress-nginx`,children:`ingress-nginx`}),` is an Ingress controller for Kubernetes using `,_jsx(_components.a,{href:`https://nginx.org`,children:`NGINX`}),` as a reverse proxy and load balancer.`]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`Learn more about ingress-nginx functionality in the `,_jsx(_components.strong,{children:_jsx(_components.a,{href:`https://docs.nginx.com/nginx-ingress-controller/intro/how-nginx-ingress-controller-works/`,children:`official documentation`})}),`.`]})}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Navigate to dependencies directory`,children:_jsxs(_components.p,{children:[`Change to the `,_jsx(_components.code,{children:`deploy/dependencies`}),` directory in your terminal.`]})}),_jsxs(Step,{title:`Configure Helm Values (Optional)`,children:[_jsxs(_components.p,{children:[`This step is required `,_jsx(_components.strong,{children:`only if`}),` you specified a custom node pool name in your Digital Ocean Kubernetes cluster.`]}),_jsxs(_components.p,{children:[`If you did, update the `,_jsx(_components.code,{children:`doks.digitalocean.com/node-pool`}),` value in `,_jsx(_components.code,{children:`values.yaml.gotmpl`}),`:`]}),_jsx(CodeBlock,{filename:`deploy/dependencies/ingress-nginx/values.yaml.gotmpl`,highlight:`[5]`,numberOfLines:`11`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`11`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`controller`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` publishService`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` enabled`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` nodeSelector`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line line-highlight`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` doks.digitalocean.com/node-pool`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`pool-app`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`rbac`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` create`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`defaultBackend`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` enabled`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`false`})]}),`\n`]})})})]}),_jsxs(Step,{title:`Install dependencies`,children:[_jsx(_components.p,{children:`Install helm dependencies using helmfile:`}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`helmfile`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` deps`})]}),`\n`]})})})]}),_jsxs(Step,{title:`Review and apply changes`,children:[_jsx(_components.p,{children:`Preview the changes first:`}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`helmfile`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` diff`})]}),`\n`]})})}),_jsx(_components.p,{children:`If the preview looks correct, apply the configuration:`}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`helmfile`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` apply`})]}),`\n`]})})})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`dns-and-ssl`,children:`DNS and SSL`}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Get Load Balancer Address`,children:[_jsx(_components.p,{children:`After deploying ingress-nginx, retrieve the Load Balancer’s external ip:`}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kubectl`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` get`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` svc`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ingress-nginx-controller`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -n`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ingress-nginx`})]}),`\n`]})})}),_jsxs(_components.p,{children:[`Copy the value from the `,_jsx(_components.code,{children:`EXTERNAL-IP`}),` column.`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`NAME`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` TYPE`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` CLUSTER-IP`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` EXTERNAL-IP`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` PORT`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`S`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`AGE`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`ingress-nginx-controller`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` LoadBalancer`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 10.245.201.160`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 138.68.124.241`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 80:30186/TCP,443:32656/TCP`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 28m`})]}),`\n`]})})}),_jsx(Tip,{children:_jsxs(_components.p,{children:[`It take some time while `,_jsx(_components.strong,{children:`ingress-nginx`}),` will configure everything and\nprovide `,_jsx(_components.code,{children:`EXTERNAL-IP`}),`.`]})})]}),_jsxs(Step,{title:`Domain Naming Convention`,children:[_jsx(_components.p,{children:`You can follow this recommended naming pattern for different environments:`}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Environment`}),_jsx(_components.th,{children:`API Domain`}),_jsx(_components.th,{children:`Web Domain`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Production`}),_jsx(_components.td,{children:`api.ship.com`}),_jsx(_components.td,{children:`app.ship.com`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Staging`}),_jsx(_components.td,{children:`api.staging.ship.com`}),_jsx(_components.td,{children:`app.staging.ship.com`})]})]})]})]}),_jsxs(Step,{title:`Configure DNS in Cloudflare`,children:[_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`First, ensure you have a domain in Cloudflare. You can either:`}),`\n`]}),_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`https://developers.cloudflare.com/registrar/get-started/register-domain/`,children:`Register a new domain`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`https://developers.cloudflare.com/registrar/get-started/transfer-domain-to-cloudflare/`,children:`Transfer an existing domain`})}),`\n`]}),_jsxs(_components.ol,{start:`2`,children:[`\n`,_jsxs(_components.li,{children:[`In the Cloudflare DNS tab, create 2 `,_jsx(_components.code,{children:`A`}),` records:`]}),`\n`]}),_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`One for Web interface`}),`\n`,_jsx(_components.li,{children:`One for API endpoint`}),`\n`]}),_jsx(_components.p,{children:`Both should point to your Load Balancer’s external hostname.`}),_jsxs(_components.p,{children:[`Enable the `,_jsx(_components.strong,{children:`Proxied`}),` option to:`]}),_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Route traffic through Cloudflare`}),`\n`,_jsx(_components.li,{children:`Generate SSL certificates automatically`}),`\n`]}),_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/cloudflare-api.png?fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=fd34db7ae916dc5f087d0fbf09c68ff1`,alt:`CloudFlare API DNS Configuration`,\"data-og-width\":`1242`,width:`1242`,\"data-og-height\":`411`,height:`411`,\"data-path\":`images/do/cloudflare-api.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/cloudflare-api.png?w=280\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=b39f9ca86db30de3848627421f862637 280w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/cloudflare-api.png?w=560\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=6e4b81218f38120e92a3e16869dce144 560w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/cloudflare-api.png?w=840\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=64cbba04ba814bf1a541e0e0bd5009f6 840w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/cloudflare-api.png?w=1100\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=4eb0a6126bfd738392b15a5bd8306ed3 1100w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/cloudflare-api.png?w=1650\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=21ea7fb0dd8f759949123f130f9a5c4e 1650w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/cloudflare-api.png?w=2500\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=a214a8e7ddc4b7d8efd069694bb78685 2500w`})}),_jsx(`br`,{}),_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/cloudflare-web.png?fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=aa381fe09926d96df84ea6ea1118e6fb`,alt:`CloudFlare Web DNS Configuration`,\"data-og-width\":`1226`,width:`1226`,\"data-og-height\":`402`,height:`402`,\"data-path\":`images/do/cloudflare-web.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/cloudflare-web.png?w=280\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=f2ab086d40989091dad4004f9db4e2a1 280w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/cloudflare-web.png?w=560\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=157a77eaae7edfe236abf1bd14e59403 560w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/cloudflare-web.png?w=840\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=0650273983e0b260dc50695e970d6512 840w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/cloudflare-web.png?w=1100\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=9455eec63291ab2837bad7a2307f83b9 1100w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/cloudflare-web.png?w=1650\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=45f8e81a903a7fdaad174f3a109c6265 1650w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/cloudflare-web.png?w=2500\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=65d608f2bf2863ac2f5eb410a011f9e8 2500w`})}),_jsx(Note,{children:_jsxs(_components.p,{children:[`Cloudflare’s free Universal SSL certificates only cover the apex domain and one subdomain level. For multiple subdomain levels, you’ll need an `,_jsx(_components.a,{href:`https://developers.cloudflare.com/ssl/edge-certificates/advanced-certificate-manager/manage-certificates/`,children:`Advanced Certificate`}),`.`]})})]}),_jsxs(Step,{title:`Update Configuration Files`,children:[_jsx(_components.p,{children:`Update your domain settings in the appropriate environment configuration files:`}),_jsx(_components.p,{children:`For API service:`}),_jsxs(CodeGroup,{children:[_jsx(CodeBlock,{filename:`deploy/app/api/production.yaml`,numberOfLines:`3`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`3`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`service`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`api`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`port`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`3001`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`domain`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`api.my-ship-app.paralect.com`})]}),`\n`]})})}),_jsx(CodeBlock,{filename:`deploy/app/api/staging.yaml`,numberOfLines:`3`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`3`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`service`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`api`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`port`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`3001`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`domain`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`api.my-ship-app.staging.paralect.com`})]}),`\n`]})})})]}),_jsx(_components.p,{children:`For Web service:`}),_jsxs(CodeGroup,{children:[_jsx(CodeBlock,{filename:`deploy/app/web/production.yaml`,numberOfLines:`3`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`3`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`service`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`web`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`port`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`3002`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`domain`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`my-ship-app.paralect.com`})]}),`\n`]})})}),_jsx(CodeBlock,{filename:`deploy/app/web/staging.yaml`,numberOfLines:`3`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`3`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`service`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`web`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`port`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`3002`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`domain`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`my-ship-app.staging.paralect.com`})]}),`\n`]})})})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`managed-postgresql`,children:`Managed PostgreSQL`}),`\n`,_jsxs(_components.p,{children:[`A managed PostgreSQL service provides automated backups, scaling, and security so you don’t have to operate a database yourself. The API connects through a single `,_jsx(_components.code,{children:`DATABASE_URL`}),` connection string, and the Migrator applies Drizzle migrations against it before the API and Scheduler roll out.`]}),`\n`,provider_1===`aws`\u0026\u0026_jsx(`div`,{children:_jsxs(`p`,{children:[`We recommend `,_jsx(`strong`,{children:_jsx(`a`,{href:`https://aws.amazon.com/rds/postgresql/`,children:`AWS RDS for PostgreSQL`})}),`. Create the instance in the `,_jsx(`strong`,{children:`same region and VPC`}),` as your EKS cluster so the API can reach it over the private network.`]})}),`\n`,provider_1===`do`\u0026\u0026_jsx(`div`,{children:_jsxs(`p`,{children:[`We recommend `,_jsx(`strong`,{children:_jsx(`a`,{href:`https://www.digitalocean.com/products/managed-databases-postgresql`,children:`DO Managed PostgreSQL`})}),`. Create the cluster in the `,_jsx(`strong`,{children:`same region`}),` as your Kubernetes cluster for the lowest latency.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`create-the-database`,children:`Create the Database`}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Provision a PostgreSQL cluster`,children:[provider_1===`aws`\u0026\u0026_jsxs(`div`,{children:[_jsxs(`p`,{children:[`In the AWS console open `,_jsx(`strong`,{children:`RDS`}),` → `,_jsx(`strong`,{children:`Create database`}),` → `,_jsx(`strong`,{children:`PostgreSQL`}),`.`]}),_jsxs(`ul`,{children:[_jsxs(`li`,{children:[_jsx(`strong`,{children:`Staging`}),`: a small burstable instance (e.g. `,_jsx(`code`,{children:`db.t4g.micro`}),`) is enough for development and testing.`]}),_jsxs(`li`,{children:[_jsx(`strong`,{children:`Production`}),`: choose an instance class with the resources your workload needs and enable Multi-AZ for high availability.`]}),_jsxs(`li`,{children:[`Place the instance in the `,_jsx(`strong`,{children:`same VPC`}),` as your EKS cluster and attach a security group that allows inbound traffic from the cluster nodes on port `,_jsx(`code`,{children:`5432`}),`.`]})]})]}),provider_1===`do`\u0026\u0026_jsxs(`div`,{children:[_jsxs(`p`,{children:[`In the Digital Ocean console open `,_jsx(`strong`,{children:`Databases`}),` → `,_jsx(`strong`,{children:`Create Database Cluster`}),` → `,_jsx(`strong`,{children:`PostgreSQL`}),`.`]}),_jsxs(`ul`,{children:[_jsxs(`li`,{children:[_jsx(`strong`,{children:`Staging`}),`: the smallest single-node plan is enough for development and testing.`]}),_jsxs(`li`,{children:[_jsx(`strong`,{children:`Production`}),`: pick a plan with standby nodes for automated failover and daily backups.`]}),_jsxs(`li`,{children:[`Select the `,_jsx(`strong`,{children:`same region`}),` as your Kubernetes cluster.`]})]})]})]}),_jsx(Step,{title:`Choose a major version`,children:_jsx(_components.p,{children:`Use a currently supported PostgreSQL major version (16 or newer). Ship’s Drizzle migrations target standard PostgreSQL and have no version-specific requirements.`})}),_jsx(Step,{title:`Name your databases`,children:_jsxs(_components.p,{children:[`Use environment-specific database names so staging and production never share data, for example `,_jsx(_components.code,{children:`api-staging`}),` and `,_jsx(_components.code,{children:`api-production`}),`.`]})})]}),`\n`,_jsx(Heading,{level:`3`,id:`configure-access`,children:`Configure Access`}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Create a database user`,children:[_jsxs(_components.p,{children:[`Create a dedicated user for the API with read and write access to its database. Use environment-specific names (e.g. `,_jsx(_components.code,{children:`api-production`}),`, `,_jsx(_components.code,{children:`api-staging`}),`) and generate a strong password.`]}),_jsx(Warning,{children:_jsx(_components.p,{children:`Give each environment its own user and database. Never reuse production credentials in staging or in documentation.`})})]}),_jsxs(Step,{title:`Restrict network access`,children:[provider_1===`aws`\u0026\u0026_jsx(`div`,{children:_jsx(`p`,{children:`Keep the instance private. Allow inbound connections only from your EKS cluster's security group rather than opening it to the public internet.`})}),provider_1===`do`\u0026\u0026_jsx(`div`,{children:_jsxs(`p`,{children:[`Under `,_jsx(`strong`,{children:`Trusted Sources`}),`, add your Kubernetes cluster so only it can connect. Avoid allowing access from any IP in production.`]})})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`get-the-connection-string`,children:`Get the Connection String`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Copy connection details`,children:_jsx(_components.p,{children:`From your database dashboard, copy the host, port, user, password, and database name, or the ready-made connection string if the provider gives you one.`})}),_jsxs(Step,{title:`Build the DATABASE_URL`,children:[_jsxs(_components.p,{children:[`The API reads a single `,_jsx(_components.code,{children:`DATABASE_URL`}),` connection string. Compose it in the standard PostgreSQL format:`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`postgresql://api-production:your-password@db-host.example.com:5432/api-production?sslmode`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`=require`})]}),`\n`]})})}),_jsx(Note,{children:_jsxs(_components.p,{children:[`Managed providers require TLS. Keep `,_jsx(_components.code,{children:`sslmode=require`}),` (or stricter) in the connection string for staging and production.`]})})]}),_jsx(Step,{title:`Save the connection string`,children:_jsxs(_components.p,{children:[`Store `,_jsx(_components.code,{children:`DATABASE_URL`}),` securely — you’ll add it to the API secret during environment configuration. The Migrator and API both read it from the same secret.`]})})]}),`\n`,_jsx(Tip,{children:_jsx(_components.p,{children:`Before deploying to production, confirm automated backups are enabled in your provider’s console so you can recover data if needed.`})}),`\n`,_jsx(Heading,{level:`1`,id:`environment-variables`,children:`Environment variables`}),`\n`,_jsx(_components.p,{children:`Kubernetes applications require proper environment variable configuration for both API and Web components. This section covers how to set up and manage environment variables securely using Kubernetes secrets and configuration files.`}),`\n`,_jsx(Heading,{level:`3`,id:`api-environment-variables`,children:`API Environment Variables`}),`\n`,_jsx(_components.p,{children:`For the API deployment, you need to set up environment variables using Kubernetes secrets to securely manage sensitive configuration data.`}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Secrets`}),` in Kubernetes are used to store sensitive information, such as passwords, API tokens, and keys.\nThey are encoded in Base64 format to provide a level of security.\nThese can be mounted into containers as data volumes or used as environment variables.`]})}),`\n`,_jsx(_components.p,{children:`Before deploying the app, make sure all necessary variables from the API config are exist. Here are the minimal set of required variables:`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Name`}),_jsx(_components.th,{children:`Description`}),_jsx(_components.th,{children:`Example value`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`APP_ENV`})}),_jsx(_components.td,{children:`Application environment`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`production`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`DATABASE_URL`})}),_jsx(_components.td,{children:`PostgreSQL connection string`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`postgresql://\u003cusername>:\u003cpassword>@db-host:5432/api-production?sslmode=require`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`API_URL`})}),_jsx(_components.td,{children:`API domain URL`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`https://api.my-ship-app.paralect.com`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`WEB_URL`})}),_jsx(_components.td,{children:`Web app domain URL`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`https://my-ship-app.paralect.com`})})]})]})]}),`\n`,_jsx(Heading,{level:`4`,id:`environment-variable-details`,children:`Environment Variable Details`}),`\n`,_jsx(Accordion,{title:`APP_ENV`,id:`app-env`,children:_jsx(_components.p,{children:`Specifies the application environment (development, staging, production). This controls logging levels, debugging features, error reporting, and other environment-specific behaviors. The API uses this to determine which configuration settings to load.`})}),`\n`,_jsx(Accordion,{title:`DATABASE_URL`,id:`database-url`,children:_jsxs(_components.p,{children:[`PostgreSQL connection string including authentication credentials, host, port, and database name. This is the primary database connection for the API and the Migrator. Format: `,_jsx(_components.code,{children:`postgresql://username:password@host:5432/database?sslmode=require`}),`. Each environment should use a separate database or at minimum separate credentials. Managed providers require TLS, so keep `,_jsx(_components.code,{children:`sslmode=require`}),` in staging and production.`]})}),`\n`,_jsx(Accordion,{title:`API_URL`,id:`api-url`,children:_jsx(_components.p,{children:`The fully qualified domain name where the API will be accessible. This must be a valid HTTPS URL and should match your Kubernetes ingress configuration. Used for CORS settings and internal service communication.`})}),`\n`,_jsx(Accordion,{title:`WEB_URL`,id:`web-url`,children:_jsx(_components.p,{children:`The fully qualified domain name where the web application will be accessible. Used for CORS configuration, redirect URLs, email templates, and social sharing metadata. Must be a valid HTTPS URL.`})}),`\n`,_jsx(Heading,{level:`4`,id:`setting-up-kubernetes-secrets`,children:`Setting up Kubernetes Secrets`}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Create namespaces and secret objects`,children:[_jsx(_components.p,{children:`Create Kubernetes namespaces and secret objects for staging and production environments:`}),_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`4`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kubectl`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` create`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` namespace`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` staging`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kubectl`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` create`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` secret`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` generic`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` api-staging-secret`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -n`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` staging`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kubectl`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` create`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` namespace`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` production`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kubectl`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` create`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` secret`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` generic`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` api-production-secret`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -n`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` production`})]}),`\n`]})})})]}),_jsxs(Step,{title:`Initialize secret storage`,children:[_jsxs(_components.p,{children:[`First, create an `,_jsx(_components.code,{children:`APP_ENV`}),` variable to initialize secret storage for k8sec:`]}),_jsxs(CodeGroup,{children:[_jsx(CodeBlock,{filename:`production`,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`k8sec`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` set`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` api-production-secret`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` APP_ENV=production`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -n`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` production`})]}),`\n`]})})}),_jsx(CodeBlock,{filename:`staging`,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`k8sec`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` set`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` api-staging-secret`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` APP_ENV=staging`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -n`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` staging`})]}),`\n`]})})})]})]}),_jsxs(Step,{title:`Verify secret creation`,children:[_jsx(_components.p,{children:`Run the following command to check the created secret:`}),_jsxs(CodeGroup,{children:[_jsx(CodeBlock,{filename:`production`,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`k8sec`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` list`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` api-production-secret`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -n`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` production`})]}),`\n`]})})}),_jsx(CodeBlock,{filename:`staging`,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`k8sec`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` list`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` api-staging-secret`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -n`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` staging`})]}),`\n`]})})})]})]}),_jsxs(Step,{title:`Prepare environment file`,children:[_jsxs(_components.p,{children:[`Create a `,_jsx(_components.code,{children:`.env.production`}),` file with all required variables:`]}),_jsxs(CodeGroup,{children:[_jsx(CodeBlock,{filename:`.env.production`,numberOfLines:`4`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`4`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`APP_ENV`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`production`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`DATABASE_URL`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`postgresql://username:password@db-host:5432/api-production?`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`sslmode`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`require`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`API_URL`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`https://api.my-ship-app.paralect.com`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`WEB_URL`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`https://my-ship-app.paralect.com`})]}),`\n`]})})}),_jsx(CodeBlock,{filename:`.env.staging`,numberOfLines:`4`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`4`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`APP_ENV`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`staging`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`DATABASE_URL`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`postgresql://username:password@db-host:5432/api-staging?`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`sslmode`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`require`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`API_URL`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`https://api.my-ship-app.staging.paralect.com`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`WEB_URL`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`https://my-ship-app.staging.paralect.com`})]}),`\n`]})})})]}),_jsx(Warning,{children:_jsx(_components.p,{children:`Replace all example values with your actual configuration. Never use production secrets in documentation or version control.`})})]}),_jsxs(Step,{title:`Import secrets to Kubernetes`,children:[_jsx(_components.p,{children:`Import secrets from the .env file to Kubernetes secret using k8sec:`}),_jsxs(CodeGroup,{children:[_jsx(CodeBlock,{filename:`production`,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`k8sec`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` load`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -f`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` .env.production`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` api-production-secret`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -n`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` production`})]}),`\n`]})})}),_jsx(CodeBlock,{filename:`staging`,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`k8sec`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` load`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -f`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` .env.staging`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` api-staging-secret`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -n`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` staging`})]}),`\n`]})})})]})]})]}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`After updating environment variables, you must initiate a new deployment for changes to take effect.\nKubernetes pods cache variable values during startup, requiring a pod restart or rolling update to apply changes.`})}),`\n`,_jsx(Heading,{level:`3`,id:`web-environment-variables`,children:`Web Environment Variables`}),`\n`,_jsxs(_components.p,{children:[`The web application is a TanStack Start app built with Vite. Its environment variables are embedded at build time and made available in the browser through `,_jsx(_components.code,{children:`import.meta.env`}),`. Only variables prefixed with `,_jsx(_components.code,{children:`VITE_`}),` are exposed to the client. Unlike API secrets, these variables are stored directly in the GitHub repository.`]}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Why Web Environment Variables Are Safe in Git`}),`: Web environment variables (prefixed with `,_jsx(_components.code,{children:`VITE_`}),`) contain only public configuration like URLs and API endpoints. They don’t include sensitive data like passwords or API keys, making them safe to store in version control. These values are already exposed to users in the browser, so repository storage doesn’t create additional security risks.`]})}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Security Notice`}),`: Never store sensitive information (passwords, API keys, secrets) in web environment files as they will be accessible on the client side. Only use public configuration values that are safe to expose to end users.`]})}),`\n`,_jsx(Heading,{level:`4`,id:`configuration-files`,children:`Configuration Files`}),`\n`,_jsx(_components.p,{children:`Web environment variables are stored in separate files for each deployment environment:`}),`\n`,_jsxs(CodeGroup,{children:[_jsx(CodeBlock,{filename:`apps/web/.env.production`,numberOfLines:`4`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`4`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`VITE_APP_ENV`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`production`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`VITE_API_URL`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`https://api.my-ship-app.paralect.com`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`VITE_WS_URL`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`https://api.my-ship-app.paralect.com`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`VITE_WEB_URL`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`https://my-ship-app.paralect.com`})]}),`\n`]})})}),_jsx(CodeBlock,{filename:`apps/web/.env.staging`,numberOfLines:`4`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`4`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`VITE_APP_ENV`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`staging`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`VITE_API_URL`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`https://api.my-ship-app.staging.paralect.com`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`VITE_WS_URL`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`https://api.my-ship-app.staging.paralect.com`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`VITE_WEB_URL`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`https://my-ship-app.staging.paralect.com`})]}),`\n`]})})})]}),`\n`,_jsx(Heading,{level:`4`,id:`environment-variables-reference`,children:`Environment Variables Reference`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Variable`}),_jsx(_components.th,{children:`Description`}),_jsx(_components.th,{children:`Example`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VITE_APP_ENV`})}),_jsx(_components.td,{children:`Web application environment`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`production`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VITE_API_URL`})}),_jsx(_components.td,{children:`Base URL for API requests`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`https://api.my-ship-app.paralect.com`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VITE_WS_URL`})}),_jsx(_components.td,{children:`WebSocket server URL for real-time`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`https://api.my-ship-app.paralect.com`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VITE_WEB_URL`})}),_jsx(_components.td,{children:`App’s own URL for redirects/metadata`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`https://my-ship-app.paralect.com`})})]})]})]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Best Practice`}),`: Keep web environment files in your repository and ensure all values are non-sensitive. If you need to reference sensitive data from the frontend, create a secure API endpoint that returns the necessary information after proper authentication.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`setting-up-github-actions-ci/cd`,children:`Setting up GitHub Actions CI/CD`}),`\n`,_jsxs(_components.p,{children:[`To automate deployment through Github Actions you need to configure `,_jsx(_components.a,{href:`https://docs.github.com/en/actions/security-guides/encrypted-secrets`,children:`Github Secrets`}),` inside workflow files.`]}),`\n`,_jsx(Heading,{level:`3`,id:`configuring-github-actions-secrets-and-variables`,children:`Configuring GitHub Actions secrets and variables`}),`\n`,_jsx(Note,{children:_jsx(_components.p,{children:`Before starting, make sure you have created a GitHub repository for your project.`})}),`\n`,_jsx(_components.p,{children:`GitHub Secrets and variables allow you to manage reusable configuration data.`}),`\n`,_jsxs(_components.p,{children:[`Secrets are encrypted and are used for sensitive data. `,_jsx(_components.a,{href:`https://docs.github.com/actions/automating-your-workflow-with-github-actions/creating-and-using-encrypted-secrets`,children:`Learn more about encrypted secrets`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`Variables are shown as plain text and are used for non-sensitive data. `,_jsx(_components.a,{href:`https://docs.github.com/actions/learn-github-actions/variables`,children:`Learn more about variables`}),`.`]}),`\n`,_jsxs(Tip,{children:[_jsx(_components.p,{children:`The deployment will be triggered on each commit:`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Commits to `,_jsx(_components.strong,{children:`main`}),` branch → deploy to `,_jsx(_components.strong,{children:`staging`}),` environment`]}),`\n`,_jsxs(_components.li,{children:[`Commits to `,_jsx(_components.strong,{children:`production`}),` branch → deploy to `,_jsx(_components.strong,{children:`production`}),` environment`]}),`\n`]})]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.a,{href:`https://docs.github.com/en/actions/security-for-github-actions/security-guides/using-secrets-in-github-actions#creating-secrets-for-a-repository`,children:`Configure`}),` the following secrets and variables in your GitHub repository:`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Name`}),_jsx(_components.th,{children:`Type`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`DO_PERSONAL_ACCESS_TOKEN`}),_jsx(_components.td,{children:`secret`}),_jsx(_components.td,{children:`The secret access user created for CI/CD. This allows GitHub Actions to authenticate with DO services`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`CLUSTER_NAME_STAGING`}),_jsx(_components.td,{children:`variable`}),_jsxs(_components.td,{children:[`Name of the staging cluster. (our case: `,_jsx(_components.code,{children:`my-ship-app`}),`)`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`CLUSTER_NAME_PRODUCTION`}),_jsx(_components.td,{children:`variable`}),_jsxs(_components.td,{children:[`Name of the production cluster. (our case: `,_jsx(_components.code,{children:`my-ship-app`}),`, same as staging cluster since we have only one cluster)`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`CLUSTER_NODE_POOL`}),_jsx(_components.td,{children:`variable`}),_jsxs(_components.td,{children:[`Name of the node pool. (our case: `,_jsx(_components.code,{children:`pool-app`}),`)`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`REGISTRY_NAME`}),_jsx(_components.td,{children:`variable`}),_jsxs(_components.td,{children:[`Name of the Digital Ocean Container Registry. (our case: `,_jsx(_components.code,{children:`my-ship-app`}),`)`]})]})]})]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Never commit sensitive credentials directly to your repository. `,_jsx(`br`,{}),`\nAlways use GitHub Secrets for sensitive information like DO keys.`]})}),`\n`,_jsx(Note,{children:_jsx(_components.p,{children:`Variables (unlike secrets) are visible in logs and can be used for non-sensitive configuration values that may need to be referenced or modified.`})}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`We set up `,_jsx(_components.strong,{children:`DO_PERSONAL_ACCESS_TOKEN`}),` to be universal for both production and staging environments with `,_jsx(_components.strong,{children:`Full access`}),` scope.`]})}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`Your `,_jsx(_components.strong,{children:`KUBE_CONFIG_PRODUCTION`}),` and `,_jsx(_components.strong,{children:`KUBE_CONFIG_STAGING`}),` will be the same if you have only one cluster for both environments.`]})}),`\n`,_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/gh-secrets.png?fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=f22e3a8c208ab234e5ddb3b64fbe4799`,alt:`GitHub Secrets`,\"data-og-width\":`7680`,width:`7680`,\"data-og-height\":`4320`,height:`4320`,\"data-path\":`images/do/gh-secrets.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/gh-secrets.png?w=280\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=f1d664eb75f48331ec38de304d010193 280w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/gh-secrets.png?w=560\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=d38bff11c396475177c0cf8838cc250c 560w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/gh-secrets.png?w=840\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=3c040033046fe9556b91ceaeed7195d6 840w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/gh-secrets.png?w=1100\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=ab48588840112692aea73d18a63fda01 1100w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/gh-secrets.png?w=1650\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=ef5669ab05fad657045f65903933674d 1650w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/gh-secrets.png?w=2500\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=77f891391460158de7f402c0997b81f0 2500w`})}),`\n`,_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/gh-variables.png?fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=5756f0a04edd763aed18aa06283ac5da`,alt:`GitHub Variables`,\"data-og-width\":`7680`,width:`7680`,\"data-og-height\":`4320`,height:`4320`,\"data-path\":`images/do/gh-variables.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/gh-variables.png?w=280\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=f15fab5a94d88e983828e9f61d3649dd 280w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/gh-variables.png?w=560\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=448d8317f1b880ad3622bf27f00a79ec 560w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/gh-variables.png?w=840\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=b5c6b9e451d8a612158d51cf6b35ca3b 840w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/gh-variables.png?w=1100\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=9e4e9eeb1875cf390d133896ea81d0d7 1100w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/gh-variables.png?w=1650\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=4ff1c801b68f2387025d4fceba02052e 1650w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/gh-variables.png?w=2500\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=493cebd23b81b7c3bed3513dc7475d7c 2500w`})}),`\n`,_jsxs(_components.p,{children:[`Now commit all changes to GitHub that will trigger deployment, or you can `,_jsx(_components.a,{href:`https://docs.github.com/en/actions/managing-workflow-runs-and-deployments/managing-workflow-runs/manually-running-a-workflow`,children:`run a workflow manually`})]}),`\n`,_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/ci-start.png?fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=bf3f7f7be216469dd91340dd8ab06d66`,alt:`CI start`,\"data-og-width\":`7680`,width:`7680`,\"data-og-height\":`4320`,height:`4320`,\"data-path\":`images/do/ci-start.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/ci-start.png?w=280\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=383bd90e3f7d378aa2c364308a17db1d 280w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/ci-start.png?w=560\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=35c6c2873144834217212e46ec8b02bb 560w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/ci-start.png?w=840\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=bcdb003ba6b6e836744bfc4321e1001c 840w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/ci-start.png?w=1100\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=cfc3f80951ef5e7c35ce821b677ab603 1100w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/ci-start.png?w=1650\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=36d3e933172e6851890242fe9d4f61f1 1650w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/ci-start.png?w=2500\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=02c97286240f11e7e03b8cb40b11339a 2500w`})}),`\n`,_jsx(_components.p,{children:`Done! Application deployed and can be accessed by the provided domain.`}),`\n`,_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/ci-finish.png?fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=0d193c7c09f5b432fdf60cd3cb095e6e`,alt:`CI finish`,\"data-og-width\":`7680`,width:`7680`,\"data-og-height\":`4320`,height:`4320`,\"data-path\":`images/do/ci-finish.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/ci-finish.png?w=280\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=c79f792545320b14ec69f02248947b10 280w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/ci-finish.png?w=560\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=4ebe08a1e26e53ae46ad009b513a3a93 560w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/ci-finish.png?w=840\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=cc5ff33ab27910b6785e86699e6b5d32 840w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/ci-finish.png?w=1100\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=c1ff59f082c816a9b704e137f2327018 1100w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/ci-finish.png?w=1650\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=a473cb7f3b6ed9cdd468c11447b73486 1650w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/ci-finish.png?w=2500\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=70fd34be8636a10a855830231378dd79 2500w`})}),`\n`,_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/deployment-finish.png?fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=26c0f33997a075100e8b28fc47b8d108`,alt:`Deployment finish`,\"data-og-width\":`1920`,width:`1920`,\"data-og-height\":`979`,height:`979`,\"data-path\":`images/do/deployment-finish.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/deployment-finish.png?w=280\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=26a03829db5c03fe69ea0b43d6ed8492 280w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/deployment-finish.png?w=560\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=039c6c1c6abf5e513c304bb80540680e 560w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/deployment-finish.png?w=840\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=61dce74c998eacc2ec3fe42468d0a73d 840w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/deployment-finish.png?w=1100\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=b6c9fe85b7d8d73df1de629274b9fdd3 1100w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/deployment-finish.png?w=1650\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=eb982d7ee443b32326e2d303d944c902 1650w, https://mintcdn.com/ship/aSd7_VT7diYXG7bS/images/do/deployment-finish.png?w=2500\u0026fit=max\u0026auto=format\u0026n=aSd7_VT7diYXG7bS\u0026q=85\u0026s=f3f0103cd029e306559b875b95a0d94a 2500w`})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`26`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`26`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kubectl`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` get`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` pods`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -A`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`NAMESPACE`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` NAME`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` READY`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` STATUS`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` RESTARTS`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` AGE`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`ingress-nginx`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ingress-nginx-controller-6bdff8c8fd-kwxcn`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 1/1`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Running`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 6h50m`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kube-system`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` cilium-tb8td`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 1/1`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Running`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 8h`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kube-system`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` cilium-x5w8n`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 1/1`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Running`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 8h`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kube-system`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` coredns-5679ffb5c8-b7dzj`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 1/1`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Running`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 8h`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kube-system`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` coredns-5679ffb5c8-d465r`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 1/1`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Running`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 8h`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kube-system`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` cpc-bridge-proxy-ebpf-2gzfr`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 1/1`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Running`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 8h`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kube-system`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` cpc-bridge-proxy-ebpf-jknzh`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 1/1`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Running`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 8h`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kube-system`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` csi-do-node-jcqd2`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 2/2`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Running`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 8h`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kube-system`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` csi-do-node-rpx6q`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 2/2`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Running`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 8h`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kube-system`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` do-node-agent-ldhxq`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 1/1`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Running`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 8h`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kube-system`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` do-node-agent-pdksz`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 1/1`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Running`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 8h`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kube-system`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` hubble-relay-66f54dcd57-l7xjb`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 1/1`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Running`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 8h`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kube-system`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` hubble-ui-785bdbc45b-6xd57`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 2/2`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Running`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 8h`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kube-system`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` konnectivity-agent-h79mt`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 1/1`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Running`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 8h`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kube-system`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` konnectivity-agent-hvv67`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 1/1`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Running`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 8h`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`production`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` api-57d7787d98-cj75s`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 1/1`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Running`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 2m15s`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`production`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` migrator-286bq`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 0/1`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Completed`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 2m54s`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`production`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` scheduler-6c497dfbcc-n6b5l`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 1/1`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Running`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 2m6s`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`production`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` web-54c6674974-lv94b`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 1/1`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Running`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 71m`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`redis`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` redis-master-0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 1/1`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Running`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 6h49m`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`staging`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` api-689b75c786-97c4l`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 1/1`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Running`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 71m`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`staging`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` scheduler-57b984f6c-zcc44`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 1/1`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Running`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 71m`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`staging`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` web-55bdd955b-chswp`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 1/1`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Running`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 70m`})]}),`\n`]})})}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`If something went wrong you can check the workflows logs on GitHub and use `,_jsx(_components.a,{href:`https://kubernetes.io/docs/reference/kubectl/cheatsheet/#interacting-with-running-pods`,children:_jsx(_components.strong,{children:`kubectl logs`})}),`, `,_jsx(_components.a,{href:`https://kubernetes.io/docs/reference/kubectl/cheatsheet/#viewing-finding-resources`,children:_jsx(_components.strong,{children:`kubectl describe`})}),` commands.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`setting-up-upstash-redis-database-recommended`,children:`Setting up Upstash Redis database (recommended)`}),`\n`,_jsx(Heading,{level:`1`,id:`upstash-redis-integration`,children:`Upstash Redis Integration`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.a,{href:`https://upstash.com/`,children:`Upstash Redis`}),` is a `,_jsx(_components.strong,{children:`highly available, infinitely scalable`}),` Redis-compatible database that provides enterprise-grade features without the operational complexity.`]}),`\n`,_jsx(Heading,{level:`2`,id:`how-ship-uses-redis`,children:`How Ship Uses Redis`}),`\n`,_jsx(_components.p,{children:`Ship leverages Redis for several critical functionalities:`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Use Case`}),_jsx(_components.th,{children:`Description`}),_jsx(_components.th,{children:`Implementation`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Real-time Communication`})}),_jsx(_components.td,{children:`Pub/Sub mechanism for WebSocket functionality`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://socket.io/docs/v4/redis-adapter/`,children:`Socket.io Redis Adapter`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Rate Limiting`})}),_jsx(_components.td,{children:`API request throttling and abuse prevention`}),_jsx(_components.td,{children:`Redis counters with TTL`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Caching`})}),_jsx(_components.td,{children:`Application data caching for improved performance`}),_jsx(_components.td,{children:`Key-value storage with expiration`})]})]})]}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Redis as a Message Broker`}),`: When scaling to multiple server instances, Redis acts as a message broker between Socket.io servers, ensuring real-time messages reach all connected clients regardless of which server they’re connected to.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`setting-up-upstash-redis`,children:`Setting Up Upstash Redis`}),`\n`,_jsx(Heading,{level:`3`,id:`create-your-database`,children:`Create Your Database`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Access Upstash Console`,children:_jsxs(_components.p,{children:[`Log in to your `,_jsx(_components.a,{href:`https://console.upstash.com/`,children:`Upstash account`}),` and navigate to the Redis section.`]})}),_jsxs(Step,{title:`Create New Database`,children:[_jsxs(_components.p,{children:[`Click `,_jsx(_components.strong,{children:`Create Database`}),` in the upper right corner to open the configuration dialog.`]}),_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://mintcdn.com/ship/NJ8GmOFvTnU_w738/images/upstash-redis/create-global.png?fit=max\u0026auto=format\u0026n=NJ8GmOFvTnU_w738\u0026q=85\u0026s=c7797ba6b2a8538f611365d30d553c7e`,alt:`Create Upstash Redis Database`,\"data-og-width\":`2880`,width:`2880`,\"data-og-height\":`1800`,height:`1800`,\"data-path\":`images/upstash-redis/create-global.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/ship/NJ8GmOFvTnU_w738/images/upstash-redis/create-global.png?w=280\u0026fit=max\u0026auto=format\u0026n=NJ8GmOFvTnU_w738\u0026q=85\u0026s=5b7a389c8d214bc071a66198668abe3d 280w, https://mintcdn.com/ship/NJ8GmOFvTnU_w738/images/upstash-redis/create-global.png?w=560\u0026fit=max\u0026auto=format\u0026n=NJ8GmOFvTnU_w738\u0026q=85\u0026s=7d1c21021d77ef784502bd42e0d34527 560w, https://mintcdn.com/ship/NJ8GmOFvTnU_w738/images/upstash-redis/create-global.png?w=840\u0026fit=max\u0026auto=format\u0026n=NJ8GmOFvTnU_w738\u0026q=85\u0026s=75369756145d7d2d776587624eff70ce 840w, https://mintcdn.com/ship/NJ8GmOFvTnU_w738/images/upstash-redis/create-global.png?w=1100\u0026fit=max\u0026auto=format\u0026n=NJ8GmOFvTnU_w738\u0026q=85\u0026s=ab63aa595dcea30cd127a57ec648f030 1100w, https://mintcdn.com/ship/NJ8GmOFvTnU_w738/images/upstash-redis/create-global.png?w=1650\u0026fit=max\u0026auto=format\u0026n=NJ8GmOFvTnU_w738\u0026q=85\u0026s=4eb03d1621b7945054d2fc95e99e200c 1650w, https://mintcdn.com/ship/NJ8GmOFvTnU_w738/images/upstash-redis/create-global.png?w=2500\u0026fit=max\u0026auto=format\u0026n=NJ8GmOFvTnU_w738\u0026q=85\u0026s=1f5a79ac57a43abdd12f27bf6f08033b 2500w`})})]}),_jsxs(Step,{title:`Configure Database Settings`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Database Name:`}),` Choose a descriptive name for your database (e.g., `,_jsx(_components.code,{children:`my-ship-app-production`}),`)`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Primary Region:`}),` Select the region closest to your main application deployment for optimal write performance.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Read Regions:`}),` Choose additional regions where you expect high read traffic for better global performance.`]})]}),_jsx(Step,{title:`Select Plan \u0026 Deploy`,children:_jsxs(_components.p,{children:[`Choose your pricing plan based on expected usage and click `,_jsx(_components.strong,{children:`Create`}),` to deploy your database.`]})})]}),`\n`,_jsxs(Tip,{children:[provider_0===`aws`\u0026\u0026_jsxs(`p`,{children:[_jsx(`strong`,{children:`Region Selection:`}),` For Kubernetes deployments on AWS, choose the same AWS region as your EKS cluster to minimize latency and data transfer costs.`]}),provider_0===`do`\u0026\u0026_jsxs(`p`,{children:[_jsx(`strong`,{children:`Region Selection:`}),` For Kubernetes deployments on Digital Ocean, choose the same region as your cluster to minimize latency and data transfer costs.`]})]}),`\n`,_jsx(_components.p,{children:`Once your database is created, you’ll need the connection string for your application:`}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Navigate to Connection Info`,children:[_jsxs(_components.p,{children:[`Go to your database dashboard and find the `,_jsx(_components.strong,{children:`Connect to your database`}),` section.`]}),_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://mintcdn.com/ship/NJ8GmOFvTnU_w738/images/upstash-redis/database.png?fit=max\u0026auto=format\u0026n=NJ8GmOFvTnU_w738\u0026q=85\u0026s=9705f2cee3b707820948d3eec2f08734`,alt:`Upstash Redis Connection Details`,\"data-og-width\":`2880`,width:`2880`,\"data-og-height\":`1800`,height:`1800`,\"data-path\":`images/upstash-redis/database.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/ship/NJ8GmOFvTnU_w738/images/upstash-redis/database.png?w=280\u0026fit=max\u0026auto=format\u0026n=NJ8GmOFvTnU_w738\u0026q=85\u0026s=82c1b77e1af7b30332799d149b745146 280w, https://mintcdn.com/ship/NJ8GmOFvTnU_w738/images/upstash-redis/database.png?w=560\u0026fit=max\u0026auto=format\u0026n=NJ8GmOFvTnU_w738\u0026q=85\u0026s=3ff403da9211a59291dbf8637932b5a8 560w, https://mintcdn.com/ship/NJ8GmOFvTnU_w738/images/upstash-redis/database.png?w=840\u0026fit=max\u0026auto=format\u0026n=NJ8GmOFvTnU_w738\u0026q=85\u0026s=fff28964c02ef9da805ee49a6d64f34c 840w, https://mintcdn.com/ship/NJ8GmOFvTnU_w738/images/upstash-redis/database.png?w=1100\u0026fit=max\u0026auto=format\u0026n=NJ8GmOFvTnU_w738\u0026q=85\u0026s=3c0e99bd0e2a14df3ba14e702ca294ef 1100w, https://mintcdn.com/ship/NJ8GmOFvTnU_w738/images/upstash-redis/database.png?w=1650\u0026fit=max\u0026auto=format\u0026n=NJ8GmOFvTnU_w738\u0026q=85\u0026s=796fc214062d077d94d429d026a55a6d 1650w, https://mintcdn.com/ship/NJ8GmOFvTnU_w738/images/upstash-redis/database.png?w=2500\u0026fit=max\u0026auto=format\u0026n=NJ8GmOFvTnU_w738\u0026q=85\u0026s=9a9ffcd82f4eae9a5bfbc2b9151ce375 2500w`})})]}),_jsx(Step,{title:`Copy Connection String`,children:_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Select the `,_jsx(_components.strong,{children:`Node`}),` tab for the appropriate connection string format`]}),`\n`,_jsxs(_components.li,{children:[`Click `,_jsx(_components.strong,{children:`Reveal`}),` to show the hidden password`]}),`\n`,_jsxs(_components.li,{children:[`Copy the complete Redis URI (format: `,_jsx(_components.code,{children:`rediss://username:password@host:port`}),`)`]}),`\n`]})}),_jsxs(Step,{title:`Add to Environment Variables through k8sec`,children:[_jsxs(_components.p,{children:[`Using `,_jsx(_components.code,{children:`k8sec`}),`, add the Redis connection string to your environment configuration:`]}),_jsxs(CodeGroup,{children:[_jsx(CodeBlock,{filename:`production`,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`k8sec`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` set`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` api-production-secret`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -n`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` production`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` REDIS_URI=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$REDIS_URI`})]}),`\n`]})})}),_jsx(CodeBlock,{filename:`staging`,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`k8sec`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` set`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` api-staging-secret`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -n`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` staging`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` REDIS_URI=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$REDIS_URI`})]}),`\n`]})})})]}),_jsxs(Note,{children:[_jsx(_components.p,{children:`After updating environment variables, restart your API pod using:`}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kubectl`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` delete`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` pod`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` \u003c`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`pod-nam`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`e`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`>`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -n`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` \u003c`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`namespac`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`e`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`>`})]}),`\n`]})})}),_jsx(_components.p,{children:`This will trigger Kubernetes to create a new pod with the updated environment variables.`})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`verify-connection-with-redis-insight`,children:`Verify Connection with Redis Insight`}),`\n`,_jsx(_components.p,{children:`Redis Insight is a powerful GUI tool for managing and debugging Redis databases.`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Install Redis Insight`,children:_jsxs(_components.p,{children:[`Download and install `,_jsx(_components.a,{href:`https://redis.io/insight/`,children:`Redis Insight`}),` on your local machine.`]})}),_jsxs(Step,{title:`Add Database Connection`,children:[_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Open Redis Insight`}),`\n`,_jsxs(_components.li,{children:[`Click `,_jsx(_components.strong,{children:`Add Database`})]}),`\n`,_jsxs(_components.li,{children:[`Paste your Upstash Redis connection string in the `,_jsx(_components.strong,{children:`Connection URL`}),` field`]}),`\n`,_jsxs(_components.li,{children:[`Click `,_jsx(_components.strong,{children:`Add Database`})]}),`\n`]}),_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://mintcdn.com/ship/NJ8GmOFvTnU_w738/images/upstash-redis/redis-insight.png?fit=max\u0026auto=format\u0026n=NJ8GmOFvTnU_w738\u0026q=85\u0026s=dc5072c3077144b8c0ebd997c1595074`,alt:`Redis Insight Connection Setup`,\"data-og-width\":`1512`,width:`1512`,\"data-og-height\":`945`,height:`945`,\"data-path\":`images/upstash-redis/redis-insight.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/ship/NJ8GmOFvTnU_w738/images/upstash-redis/redis-insight.png?w=280\u0026fit=max\u0026auto=format\u0026n=NJ8GmOFvTnU_w738\u0026q=85\u0026s=7d7b1d2063b3d8e22dd1b286771a9b25 280w, https://mintcdn.com/ship/NJ8GmOFvTnU_w738/images/upstash-redis/redis-insight.png?w=560\u0026fit=max\u0026auto=format\u0026n=NJ8GmOFvTnU_w738\u0026q=85\u0026s=083f32d2ed3b0c958d75210820df995b 560w, https://mintcdn.com/ship/NJ8GmOFvTnU_w738/images/upstash-redis/redis-insight.png?w=840\u0026fit=max\u0026auto=format\u0026n=NJ8GmOFvTnU_w738\u0026q=85\u0026s=fc6d38ddd7396e9588d5e95f5392df56 840w, https://mintcdn.com/ship/NJ8GmOFvTnU_w738/images/upstash-redis/redis-insight.png?w=1100\u0026fit=max\u0026auto=format\u0026n=NJ8GmOFvTnU_w738\u0026q=85\u0026s=e3b4ae2d98c46bf9cb9358401ec3e611 1100w, https://mintcdn.com/ship/NJ8GmOFvTnU_w738/images/upstash-redis/redis-insight.png?w=1650\u0026fit=max\u0026auto=format\u0026n=NJ8GmOFvTnU_w738\u0026q=85\u0026s=60b52d55861635b2c16bf10098777df5 1650w, https://mintcdn.com/ship/NJ8GmOFvTnU_w738/images/upstash-redis/redis-insight.png?w=2500\u0026fit=max\u0026auto=format\u0026n=NJ8GmOFvTnU_w738\u0026q=85\u0026s=ee88e812ad858956387d744c92a811e2 2500w`})})]}),_jsxs(Step,{title:`Explore Your Database`,children:[_jsx(_components.p,{children:`Once connected, you can use Upstash Redis Console to:`}),_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Browse keys and data structures`}),`\n`,_jsx(_components.li,{children:`Execute Redis commands directly`}),`\n`,_jsx(_components.li,{children:`Monitor real-time performance metrics`}),`\n`,_jsx(_components.li,{children:`Debug application data storage`}),`\n`]}),_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://mintcdn.com/ship/NJ8GmOFvTnU_w738/images/upstash-redis/charts.png?fit=max\u0026auto=format\u0026n=NJ8GmOFvTnU_w738\u0026q=85\u0026s=a5bc78e23381ab469980479d247270b8`,alt:`Upstash Redis Metrics Dashboard`,\"data-og-width\":`1271`,width:`1271`,\"data-og-height\":`279`,height:`279`,\"data-path\":`images/upstash-redis/charts.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/ship/NJ8GmOFvTnU_w738/images/upstash-redis/charts.png?w=280\u0026fit=max\u0026auto=format\u0026n=NJ8GmOFvTnU_w738\u0026q=85\u0026s=546f6728b651e70cb51169f9c42f3be4 280w, https://mintcdn.com/ship/NJ8GmOFvTnU_w738/images/upstash-redis/charts.png?w=560\u0026fit=max\u0026auto=format\u0026n=NJ8GmOFvTnU_w738\u0026q=85\u0026s=6694a5c3f6e6d26b9dd6193d1fc76dc2 560w, https://mintcdn.com/ship/NJ8GmOFvTnU_w738/images/upstash-redis/charts.png?w=840\u0026fit=max\u0026auto=format\u0026n=NJ8GmOFvTnU_w738\u0026q=85\u0026s=677dc96a96a9621074bc7857d9ffdfe3 840w, https://mintcdn.com/ship/NJ8GmOFvTnU_w738/images/upstash-redis/charts.png?w=1100\u0026fit=max\u0026auto=format\u0026n=NJ8GmOFvTnU_w738\u0026q=85\u0026s=bd722d61192a9e2be9b51794f748ea3c 1100w, https://mintcdn.com/ship/NJ8GmOFvTnU_w738/images/upstash-redis/charts.png?w=1650\u0026fit=max\u0026auto=format\u0026n=NJ8GmOFvTnU_w738\u0026q=85\u0026s=4fed9af7f4496af0179e3fedf6761435 1650w, https://mintcdn.com/ship/NJ8GmOFvTnU_w738/images/upstash-redis/charts.png?w=2500\u0026fit=max\u0026auto=format\u0026n=NJ8GmOFvTnU_w738\u0026q=85\u0026s=cad48a52efeed8e0513abe1e64cc4719 2500w`})}),_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Real-time Monitoring`}),`: Upstash Redis updates database metrics automatically every 10 seconds, giving you near real-time visibility into your Redis performance and usage.`]})})]})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{provider_1,provider_0,default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Digital Ocean","description":null,"href":"/deployment/kubernetes/digital-ocean"}}},"mdxSourceWithNoJs":null,"noJsSplices":[[88356,89070,""],[89183,90754,""],[91383,91405,"(Steps,{children:_js"],[91925,92417,""],[154805,155274,""]]},"mdxExtracts":{"tableOfContents":[{"title":"Setup project","slug":"setup-project","depth":2,"children":[]},{"title":"Container registry","slug":"container-registry","depth":2,"children":[]},{"title":"Kubernetes cluster","slug":"kubernetes-cluster","depth":2,"children":[]},{"title":"Personal access token","slug":"personal-access-token","depth":2,"children":[]},{"title":"Accessing cluster from a local machine","slug":"accessing-cluster-from-a-local-machine","depth":2,"children":[]},{"title":"Ingress NGINX Controller","slug":"ingress-nginx-controller","depth":2,"children":[]},{"title":"DNS and SSL","slug":"dns-and-ssl","depth":2,"children":[]},{"title":"Managed PostgreSQL","slug":"managed-postgresql","depth":2,"children":[{"title":"Create the Database","slug":"create-the-database","depth":3,"children":[]},{"title":"Configure Access","slug":"configure-access","depth":3,"children":[]},{"title":"Get the Connection String","slug":"get-the-connection-string","depth":3,"children":[]}]},{"title":"Environment variables","slug":"environment-variables","depth":1,"children":[{"title":"API Environment Variables","slug":"api-environment-variables","depth":3,"children":[]},{"title":"Environment Variable Details","slug":"environment-variable-details","depth":4,"children":[]},{"title":"Setting up Kubernetes Secrets","slug":"setting-up-kubernetes-secrets","depth":4,"children":[]},{"title":"Web Environment Variables","slug":"web-environment-variables","depth":3,"children":[]},{"title":"Configuration Files","slug":"configuration-files","depth":4,"children":[]},{"title":"Environment Variables Reference","slug":"environment-variables-reference","depth":4,"children":[]}]},{"title":"Setting up GitHub Actions CI/CD","slug":"setting-up-github-actions-ci/cd","depth":2,"children":[{"title":"Configuring GitHub Actions secrets and variables","slug":"configuring-github-actions-secrets-and-variables","depth":3,"children":[]}]},{"title":"Setting up Upstash Redis database (recommended)","slug":"setting-up-upstash-redis-database-recommended","depth":2,"children":[]},{"title":"Upstash Redis Integration","slug":"upstash-redis-integration","depth":1,"children":[]},{"title":"How Ship Uses Redis","slug":"how-ship-uses-redis","depth":2,"children":[]},{"title":"Setting Up Upstash Redis","slug":"setting-up-upstash-redis","depth":2,"children":[{"title":"Create Your Database","slug":"create-your-database","depth":3,"children":[]},{"title":"Verify Connection with Redis Insight","slug":"verify-connection-with-redis-insight","depth":3,"children":[]}]}],"codeExamples":{}},"jsLinks":[],"subdomain":"ship","siteName":"Ship","title":"Digital Ocean - Ship","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-06-05T11:08:00.466Z","originalFileLocation":"deployment/kubernetes/digital-ocean.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=\"dark\";if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"dark\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"application-name\" content=\"Ship\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/ship/NdlnMJgtF7Swl5GO/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/docs/mintlify-assets/_mintlify/favicons/ship/NdlnMJgtF7Swl5GO/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/ship/NdlnMJgtF7Swl5GO/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/ship/NdlnMJgtF7Swl5GO/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/ship/NdlnMJgtF7Swl5GO/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/ship/NdlnMJgtF7Swl5GO/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/ship/NdlnMJgtF7Swl5GO/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/ship/NdlnMJgtF7Swl5GO/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/ship/NdlnMJgtF7Swl5GO/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Digital Ocean - Ship\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Ship\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://ship.paralect.com/docs/deployment/kubernetes/digital-ocean\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://ship.mintlify.app/_mintlify/api/og/v2?division=Kubernetes\u0026amp;title=Digital+Ocean\u0026amp;theme=c7bc32dd80081049cf49ba9a\u0026amp;signature=07bb547d37b3d6f28230357578fe95c65dd4d0bda13f1a16a4f91e312a05fed8\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Digital Ocean - Ship\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://ship.mintlify.app/_mintlify/api/og/v2?division=Kubernetes\u0026amp;title=Digital+Ocean\u0026amp;theme=c7bc32dd80081049cf49ba9a\u0026amp;signature=07bb547d37b3d6f28230357578fe95c65dd4d0bda13f1a16a4f91e312a05fed8\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/docs/mintlify-assets/_mintlify/favicons/ship/NdlnMJgtF7Swl5GO/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Ship\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#9166A9\">\u003clink data-mint-head rel=\"canonical\" href=\"https://ship.paralect.com/docs/deployment/kubernetes/digital-ocean\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/docs/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/deployment/kubernetes/digital-ocean.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://ship.paralect.com/#organization\",\"name\":\"Ship\",\"url\":\"https://ship.paralect.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/ship/NJ8GmOFvTnU_w738/logo.png?fit=max\u0026auto=format\u0026n=NJ8GmOFvTnU_w738\u0026q=85\u0026s=ba34fe49f53df6beecde5ee601862f8c\"}},{\"@type\":\"WebSite\",\"@id\":\"https://ship.paralect.com/docs#website\",\"name\":\"Ship\",\"url\":\"https://ship.paralect.com/docs\",\"publisher\":{\"@id\":\"https://ship.paralect.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://ship.paralect.com/docs/deployment/kubernetes/digital-ocean#webpage\",\"url\":\"https://ship.paralect.com/docs/deployment/kubernetes/digital-ocean\",\"name\":\"Digital Ocean\",\"dateModified\":\"2026-06-05T11:08:00.466Z\",\"isPartOf\":{\"@id\":\"https://ship.paralect.com/docs#website\"},\"breadcrumb\":{\"@id\":\"https://ship.paralect.com/docs/deployment/kubernetes/digital-ocean#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://ship.paralect.com/docs/deployment/kubernetes/digital-ocean#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Ship Components\",\"item\":\"https://ship.paralect.com/docs/architecture\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Deployment\",\"item\":\"https://ship.paralect.com/docs/deployment/digital-ocean-apps\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Kubernetes\",\"item\":\"https://ship.paralect.com/docs/deployment/kubernetes/overview\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Digital Ocean\",\"item\":\"https://ship.paralect.com/docs/deployment/kubernetes/digital-ocean\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://ship.paralect.com/docs/deployment/kubernetes/digital-ocean#article\",\"headline\":\"Digital Ocean\",\"name\":\"Digital Ocean\",\"url\":\"https://ship.paralect.com/docs/deployment/kubernetes/digital-ocean\",\"mainEntityOfPage\":{\"@id\":\"https://ship.paralect.com/docs/deployment/kubernetes/digital-ocean#webpage\"},\"dateModified\":\"2026-06-05T11:08:00.466Z\",\"publisher\":{\"@id\":\"https://ship.paralect.com/#organization\"},\"isPartOf\":{\"@id\":\"https://ship.paralect.com/docs#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Ship\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Ship","nav":{"global":{"anchors":[{"anchor":"Twitter","icon":"twitter","href":"https://twitter.com/paralect_ship"},{"anchor":"Discord","icon":"discord","href":"https://discord.gg/zNWEatRWqx"}]},"anchors":[{"anchor":"Documentation","icon":"book-open","groups":[{"group":"Getting Started","pages":[{"title":"Introduction","href":"/introduction"},{"title":"How Ship works","href":"/how-ship-works"},{"title":"create-ship-app","href":"/packages/create-ship-app"},{"title":"Contribution Guide","href":"/contribution-guide"},{"title":"LLMs.txt","href":"/llms"}]},{"group":"Ship Components","pages":[{"title":"Architecture","href":"/architecture"},{"title":"Dev dashboards","href":"/dashboards"},{"group":"API","pages":[{"title":"Overview","href":"/api-reference/overview"},{"group":"Routing","pages":[{"title":"Overview","href":"/api-reference/routing/overview"},{"title":"Middlewares","href":"/api-reference/routing/middlewares"}]},{"title":"API action","href":"/api-reference/api-action"},{"title":"API action validator","href":"/api-reference/api-action-validator"},{"title":"API conventions","href":"/api-reference/api-limitations"},{"title":"Data service","href":"/api-reference/data-service"},{"title":"Event handlers","href":"/api-reference/event-handler"},{"title":"Mutation events","href":"/api-reference/events"},{"title":"Using events","href":"/api-reference/using-events"},{"title":"Middlewares","href":"/api-reference/middlewares"},{"title":"Workflow","href":"/api-reference/workflow"},{"title":"Testing","href":"/api-reference/testing"}]},{"group":"Web","pages":[{"title":"Overview","href":"/web/overview"},{"title":"Routing","href":"/web/routing"},{"title":"Server functions","href":"/web/server-functions"},{"title":"Calling the API","href":"/web/calling-api"},{"title":"Forms","href":"/web/forms"},{"title":"Services","href":"/web/services"},{"title":"Styling","href":"/web/styling"},{"title":"Environment Variables","href":"/web/environment-variables"},{"title":"Storybook","href":"/web/storybook"}]},{"group":"Package sharing","pages":[{"title":"Overview","href":"/package-sharing/overview"},{"title":"Schemas","href":"/package-sharing/schemas"}]},{"title":"Migrator","href":"/migrator"},{"title":"Scheduler","href":"/scheduler"},{"title":"Mailer","href":"/mailer"},{"title":"GitHub Actions","href":"/github-actions"},{"title":"Git Hooks","href":"/git-hooks"},{"group":"Deployment","pages":[{"title":"Digital Ocean Apps","href":"/deployment/digital-ocean-apps"},{"title":"Digital Ocean Apps (IaC)","href":"/deployment/digital-ocean-apps-iac"},{"title":"Render","href":"/deployment/render"},{"group":"Kubernetes","pages":[{"title":"Overview","description":null,"href":"/deployment/kubernetes/overview"},{"title":"Digital Ocean","href":"/deployment/kubernetes/digital-ocean"},{"title":"AWS","description":null,"href":"/deployment/kubernetes/aws"}]}]}]},{"group":"Plugins","pages":[{"title":"Overview","href":"/plugins/overview"},{"title":"Auth","href":"/plugins/auth-starter"},{"title":"Admin","href":"/plugins/admin"},{"title":"AI Chat","href":"/plugins/ai-chat"}]}]}]},"basePath":"","title":"Digital Ocean - Ship","buildId":"dpl_6cCEiK8XNNvaLBBkWzcBhdE9QfLC","deploymentId":"dpl_6cCEiK8XNNvaLBBkWzcBhdE9QfLC","dynamics":["a74be98ba7","07c022d89b"],"chunks":["zoom-image-lightbox-B-WKhCOL.js","lightbox-handle-r17bVUz3.js","Frame-Bj1PpgeO.js","DynamicMarkdown-Bas9A7wq.js"]}