LogoLogo
HomeAcademyLoginTry for free
  • Welcome
  • What's new
    • Q2 2025
    • Q1 2025
    • Q4 2024
    • Q3 2024
    • Q2 2024
    • Q1 2024
    • Q4 2023
    • Q3 2023
    • Q2 2023
    • Q1 2023
    • Q4 2022
    • Q3 2022
  • FAQs
    • Accounts
    • Migration to the new platform
    • User & organization setup
    • General
    • Builder
    • Workflows
    • Data Observatory
    • Analytics Toolbox
    • Development Tools
    • Deployment Options
    • CARTO Basemaps
    • CARTO for Education
    • Support Packages
    • Security and Compliance
  • Getting started
    • What is CARTO?
    • Quickstart guides
      • Connecting to your data
      • Creating your first map
      • Creating your first workflow
      • Developing your first application
    • CARTO Academy
  • CARTO User Manual
    • Overview
      • Creating your CARTO organization
      • CARTO Cloud Regions
      • CARTO Workspace overview
    • Maps
      • Data sources
        • Simple features
        • Spatial Indexes
        • Pre-generated tilesets
        • Rasters
        • Defining source spatial data
        • Managing data freshness
        • Changing data source location
      • Layers
        • Point
          • Grid point aggregation
          • H3 point aggregation
          • Heatmap point aggregation
          • Cluster point aggregation
        • Polygon
        • Line
        • Grid
        • H3
        • Raster
        • Zoom to layer
      • Widgets
        • Formula widget
        • Category widget
        • Pie widget
        • Histogram widget
        • Range widget
        • Time Series widget
        • Table widget
      • SQL Parameters
        • Date parameter
        • Text parameter
        • Numeric parameter
        • Publishing SQL parameters
      • Interactions
      • Legend
      • Basemaps
        • Basemap selector
      • AI Agents
      • SQL analyses
      • Map view modes
      • Map description
      • Feature selection tool
      • Search locations
      • Measure distances
      • Exporting data
      • Download PDF reports
      • Managing maps
      • Sharing and collaboration
        • Editor collaboration
        • Map preview for editors
        • Map settings for viewers
        • Comments
        • Embedding maps
        • URL parameters
      • Performance considerations
    • Workflows
      • Workflow canvas
      • Results panel
      • Components
        • Aggregation
        • Custom
        • Data Enrichment
        • Data Preparation
        • Generative AI
        • Input / Output
        • Joins
        • Parsers
        • Raster Operations
        • Spatial Accessors
        • Spatial Analysis
        • Spatial Constructors
        • Spatial Indexes
        • Spatial Operations
        • Statistics
        • Tileset Creation
        • BigQuery ML
        • Snowflake ML
        • Google Earth Engine
        • Google Environment APIs
        • Telco Signal Propagation Models
      • Data Sources
      • Scheduling workflows
      • Sharing workflows
      • Using variables in workflows
      • Executing workflows via API
      • Temporary data in Workflows
      • Extension Packages
      • Managing workflows
      • Workflows best practices
    • Data Explorer
      • Creating a map from your data
      • Importing data
        • Importing rasters
      • Geocoding data
      • Optimizing your data
    • Data Observatory
      • Terminology
      • Browsing the Spatial Data Catalog
      • Subscribing to public and premium datasets
      • Accessing free data samples
      • Managing your subscriptions
      • Accessing your subscriptions from your data warehouse
        • Access data in BigQuery
        • Access data in Snowflake
        • Access data in Databricks
        • Access data in Redshift
        • Access data in PostgreSQL
    • Connections
      • Google BigQuery
      • Snowflake
      • Databricks
      • Amazon Redshift
      • PostgreSQL
      • CARTO Data Warehouse
      • Sharing connections
      • Deleting a connection
      • Required permissions
      • IP whitelisting
      • Customer data responsibilities
    • Applications
    • Settings
      • Understanding your organization quotas
      • Activity Data
        • Activity Data Reference
        • Activity Data Examples
        • Activity Data Changelog
      • Users and Groups
        • Inviting users to your organization
        • Managing user roles
        • Deleting users
        • SSO
        • Groups
        • Mapping groups to user roles
      • CARTO Support Access
      • Customizations
        • Customizing appearance and branding
        • Configuring custom color palettes
        • Configuring your organization basemaps
        • Enabling AI Agents
      • Advanced Settings
        • Managing applications
        • Configuring S3 Bucket for Redshift Imports
        • Configuring OAuth connections to Snowflake
        • Configuring OAuth U2M connections to Databricks
        • Configuring S3 Bucket integration for RDS for PostgreSQL Exports in Builder
        • Configuring Workload Identity Federation for BigQuery
      • Data Observatory
      • Deleting your organization
    • Developers
      • Managing Credentials
        • API Base URL
        • API Access Tokens
        • SPA OAuth Clients
        • M2M OAuth Clients
      • Named Sources
  • Data and Analysis
    • Analytics Toolbox Overview
    • Analytics Toolbox for BigQuery
      • Getting access
        • Projects maintained by CARTO in different BigQuery regions
        • Manual installation in your own project
        • Installation in a Google Cloud VPC
        • Core module
      • Key concepts
        • Tilesets
        • Spatial indexes
      • SQL Reference
        • accessors
        • clustering
        • constructors
        • cpg
        • data
        • http_request
        • import
        • geohash
        • h3
        • lds
        • measurements
        • placekey
        • processing
        • quadbin
        • random
        • raster
        • retail
        • routing
        • s2
        • statistics
        • telco
        • tiler
        • transformations
      • Guides
        • Running queries from Builder
        • Working with Raster data
      • Release notes
      • About Analytics Toolbox regions
    • Analytics Toolbox for Snowflake
      • Getting access
        • Native App from Snowflake's Marketplace
        • Manual installation
      • Key concepts
        • Spatial indexes
        • Tilesets
      • SQL Reference
        • accessors
        • clustering
        • constructors
        • data
        • http_request
        • import
        • h3
        • lds
        • measurements
        • placekey
        • processing
        • quadbin
        • random
        • raster
        • retail
        • s2
        • statistics
        • tiler
        • transformations
      • Guides
        • Running queries from Builder
        • Working with Raster data
      • Release Notes
    • Analytics Toolbox for Databricks
      • Getting access
        • Personal (former Single User) cluster
        • Standard (former Shared) cluster
      • Reference
        • lds
        • tiler
      • Guides
      • Release Notes
    • Analytics Toolbox for Redshift
      • Getting access
        • Manual installation in your database
        • Installation in an Amazon Web Services VPC
        • Core version
      • Key concepts
        • Tilesets
        • Spatial indexes
      • SQL Reference
        • clustering
        • constructors
        • data
        • http_request
        • import
        • lds
        • placekey
        • processing
        • quadbin
        • random
        • s2
        • statistics
        • tiler
        • transformations
      • Guides
        • Running queries from Builder
      • Release Notes
    • Analytics Toolbox for PostgreSQL
      • Getting access
        • Manual installation
        • Core version
      • Key concepts
        • Tilesets
        • Spatial Indexes
      • SQL Reference
        • h3
        • quadbin
        • tiler
      • Guides
        • Creating spatial index tilesets
        • Running queries from Builder
      • Release Notes
    • CARTO + Python
      • Installation
      • Authentication Methods
      • Visualizing Data
      • Working with Data
        • How to work with your data in the CARTO Data Warehouse
        • How to access your Data Observatory subscriptions
        • How to access CARTO's Analytics Toolbox for BigQuery and create visualizations via Python notebooks
        • How to access CARTO’s Analytics Toolbox for Snowflake and create visualizations via Python notebooks
        • How to visualize data from Databricks
      • Reference
    • CARTO QGIS Plugin
  • CARTO for Developers
    • Overview
    • Key concepts
      • Architecture
      • Libraries and APIs
      • Authentication methods
        • API Access Tokens
        • OAuth Access Tokens
        • OAuth Clients
      • Connections
      • Data sources
      • Visualization with deck.gl
        • Basemaps
          • CARTO Basemap
          • Google Maps
            • Examples
              • Gallery
              • Getting Started
              • Basic Examples
                • Hello World
                • BigQuery Tileset Layer
                • Data Observatory Tileset Layer
              • Advanced Examples
                • Arc Layer
                • Extrusion
                • Trips Layer
            • What's New
          • Amazon Location
            • Examples
              • Hello World
              • CartoLayer
            • What's New
        • Rapid Map Prototyping
      • Charts and widgets
      • Filtering and interactivity
      • Summary
    • Quickstart
      • Make your first API call
      • Visualize your first dataset
      • Create your first widget
    • Guides
      • Build a public application
      • Build a private application
      • Build a private application using SSO
      • Visualize massive datasets
      • Integrate CARTO in your existing application
      • Use Boundaries in your application
      • Avoid exposing SQL queries with Named Sources
      • Managing cache in your CARTO applications
    • Reference
      • Deck (@deck.gl reference)
      • Data Sources
        • vectorTableSource
        • vectorQuerySource
        • vectorTilesetSource
        • h3TableSource
        • h3QuerySource
        • h3TilesetSource
        • quadbinTableSource
        • quadbinQuerySource
        • quadbinTilesetSource
        • rasterSource
        • boundaryTableSource
        • boundaryQuerySource
      • Layers (@deck.gl/carto)
      • Widgets
        • Data Sources
        • Server-side vs. client-side
        • Models
          • getFormula
          • getCategories
          • getHistogram
          • getRange
          • getScatter
          • getTimeSeries
          • getTable
      • Filters
        • Column filters
        • Spatial filters
      • CARTO APIs Reference
    • Release Notes
    • Examples
    • CARTO for React
      • Guides
        • Getting Started
        • Views
        • Data Sources
        • Layers
        • Widgets
        • Authentication and Authorization
        • Basemaps
        • Look and Feel
        • Query Parameters
        • Code Generator
        • Sample Applications
        • Deployment
        • Upgrade Guide
      • Examples
      • Library Reference
        • Introduction
        • API
        • Auth
        • Basemaps
        • Core
        • Redux
        • UI
        • Widgets
      • Release Notes
  • CARTO Self-Hosted
    • Overview
    • Key concepts
      • Architecture
      • Deployment requirements
    • Quickstarts
      • Single VM deployment (Kots)
      • Orchestrated container deployment (Kots)
      • Advanced Orchestrated container deployment (Helm)
    • Guides
      • Guides (Kots)
        • Configure your own buckets
        • Configure an external in-memory cache
        • Enable Google Basemaps
        • Enable the CARTO Data Warehouse
        • Configure an external proxy
        • Enable BigQuery OAuth connections
        • Configure Single Sign-On (SSO)
        • Use Workload Identity in GCP
        • High availability configuration for CARTO Self-hosted
        • Configure your custom service account
      • Guides (Helm)
        • Configure your own buckets (Helm)
        • Configure an external in-memory cache (Helm)
        • Enable Google Basemaps (Helm)
        • Enable the CARTO Data Warehouse (Helm)
        • Configure an external proxy (Helm)
        • Enable BigQuery OAuth connections (Helm)
        • Configure Single Sign-On (SSO) (Helm)
        • Use Workload Identity in GCP (Helm)
        • Use EKS Pod Identity in AWS (Helm)
        • Enable Redshift imports (Helm)
        • Migrating CARTO Self-hosted installation to an external database (Helm)
        • Advanced customizations (Helm)
        • Configure your custom service account (Helm)
    • Maintenance
      • Maintenance (Kots)
        • Updates
        • Backups
        • Uninstall
        • Rotating keys
        • Monitoring
        • Change the Admin Console password
      • Maintenance (Helm)
        • Monitoring (Helm)
        • Rotating keys (Helm)
        • Uninstall (Helm)
        • Backups (Helm)
        • Updates (Helm)
    • Support
      • Get debug information for Support (Kots)
      • Get debug information for Support (Helm)
    • CARTO Self-hosted Legacy
      • Key concepts
        • Architecture
        • Deployment requirements
      • Quickstarts
        • Single VM deployment (docker-compose)
      • Guides
        • Configure your own buckets
        • Configure an external in-memory cache
        • Enable Google Basemaps
        • Enable the CARTO Data Warehouse
        • Configure an external proxy
        • Enable BigQuery OAuth connections
        • Configure Single Sign-On (SSO)
        • Enable Redshift imports
        • Configure your custom service account
        • Advanced customizations
        • Migrating CARTO Self-Hosted installation to an external database
      • Maintenance
        • Updates
        • Backups
        • Uninstall
        • Rotating keys
        • Monitoring
      • Support
    • Release Notes
  • CARTO Native App for Snowflake Containers
    • Deploying CARTO using Snowflake Container Services
  • Get Help
    • Legal & Compliance
    • Previous libraries and components
    • Migrating your content to the new CARTO platform
Powered by GitBook
On this page
  • Requirements
  • 1. Add Helm repository
  • 2. Add your minimal customization
  • Domain
  • External database
  • 3. Configure your storage buckets
  • 4. Execute the preflight checks
  • 5. Install CARTO
  • 6. Configure an HTTPS endpoint
  • 7. Post-installation checks
  • Analytics Toolbox in CARTO Self-Hosted
  • Troubleshooting

Was this helpful?

Export as PDF
  1. CARTO Self-Hosted
  2. Quickstarts

Advanced Orchestrated container deployment (Helm)

Deploy CARTO Self-hosted using Kubernetes and Helm

PreviousOrchestrated container deployment (Kots)NextGuides

Last updated 1 month ago

Was this helpful?

Estimated time: Completing this deployment guide is expected to take approximately 3 hours. This estimate may vary based on individual familiarity with the technology stack involved and the complexity of your organization's environment.

Requirements

To deploy CARTO Self-Hosted on Kubernetes, you need:

  • A CARTO Self-Hosted installation package containing your environment configuration and a license key. The package has two YAML files: carto-secrets.yaml and carto-values.yaml If you don't have it yet, you can ask for it at .

  • A domain you own, to which you can add a DNS record.

  • A Kubernetes cluster. To create a cluster, see documentation on , , and . This cluster must fit our hardware and software for Kubernetes.

  • A working installation of kubectl. To install kubectl, see documentation on , , and .

  • A working on version 3.6.0 or later.

  • installed to run the preflight checks

1. Add Helm repository

Type this command to add the helm repository

# Add the carto repo.
helm repo add carto https://helm.carto.com

Search for the repo to confirm you can access the carto chart.

helm search repo carto -l

2. Add your minimal customization

Domain

Create a file customizations.yaml with the domain name you want to use

appConfigValues:
  selfHostedDomain: "my.domain.com"

A full domain is required. You cannot install CARTO in a domain path like https://my.domain.com/carto

External database

Create the secret with both passwords:

kubectl create secret generic \
  carto-postgresql \
  --from-literal=user-password='<userPassword>' \

Edit customizations.yaml:

  • user: The carto user to be created. It will be created with the previous admin user.

  • user-password: The new password to be created.

  • database: The database to be created.

internalPostgresql:
  # Disable the internal Postgres
  enabled: false
externalPostgresql:
  host: <YourServerIPorDNS>
  user: "carto_worskpace_admin"
  existingSecret: "carto-postgresql"
  existingSecretPasswordKey: "user-password"
  database: "carto_workspace"
  port: "5432"

SSL

In some scenarios, an SSL connection to the external database is required. In that case, you should add to customizations.yaml:

externalPostgresql:
  sslEnabled: true
  # Only applies if your PostgreSQL SSL certificate it's self-signed
    sslCA: |
    -----BEGIN CERTIFICATE-----
    ....
    -----END CERTIFICATE-----

Mutual TLS connections between the external database and the APIs are not supported, so client certificates can't be configured on your external database

3. Configure your storage buckets

CARTO Self-hosted platform needs access to some storage buckets to save some resources needed by the platform. These buckets are in charge of storing assets such as imported datasets, map snapshots and custom markers.

You can create and use your own storage buckets in any of the following supported storage providers:

4. Execute the preflight checks

Before installing CARTO Self-Hosted, you can use preflight checks to validate your configuration. Keep iterating until all checks pass—this ensures that your environment is fully prepared for installation.

Use the following command to run the preflight checks:

helm template \
  carto \
  carto/carto \
  -f carto-values.yaml \
  -f carto-secrets.yaml \
  -f customizations.yaml -n <NAMESPACE> | kubectl preflight -

The previous command performs validation checks to ensure that your customizations.yaml file is correctly configured for installing the CARTO platform and that you're infrastructure is ready to host a CARTO Self-Hosted installation.

Once the checks are complete, you will see the following output in your terminal:

If you encounter any issues during the preflight checks, verify the following:

  • PostgreSQL Configuration: Ensure your PostgreSQL credentials are correctly set up and that the database is accessible from your cluster.

By addressing these areas, you can resolve common setup issues and proceed with a smooth installation.

5. Install CARTO

Use the following command to install CARTO in your Kubernetes cluster.

helm install \
  carto \
  carto/carto \
  -f carto-values.yaml \
  -f carto-secrets.yaml \
  -f customizations.yaml -n <NAMESPACE>

After installing CARTO, verify you have the required pods running by running the following command (It can take up to 5 minutes to have everything running):

kubectl get pods
NAME                                          READY   STATUS    RESTARTS   AGE
carto-accounts-www-5778cc7c7f-l42rx           1/1     Running   0          3m6s
carto-cdn-invalidator-sub-bd69b7b96-c6mmt     1/1     Running   0          3m5s
carto-http-cache-864d54db46-56xs2             1/1     Running   0          3m6s
carto-import-api-c845759bd-9m7bd              1/1     Running   0          3m7s
carto-import-worker-5bf456f684-b9mg9          1/1     Running   0          3m7s
carto-lds-api-676dcdd9c8-lqmcf                1/1     Running   0          3m6s
carto-maps-api-5699c99fb6-9dj5s               1/1     Running   0          3m4s
carto-maps-api-5699c99fb6-msfr2               1/1     Running   0          3m4s
carto-notifier-cf8f7576d-5wnm5                1/1     Running   0          3m5s
carto-redis-master-0                          1/1     Running   0          3m6s
carto-router-7578cdd848-mbrxw                 2/2     Running   0          3m5s
carto-sql-worker-64d7598c56-zt5xr             1/1     Running   0          3m6s
carto-workspace-api-66dbbdb69-cqd4p           1/1     Running   0          3m5s
carto-workspace-api-66dbbdb69-z4tj9           1/1     Running   0          3m4s
carto-workspace-subscriber-54f9cbc589-qk94m   1/1     Running   0          3m5s
carto-workspace-www-7bb5f78577-k66rr          1/1     Running   0          3m6s

Once all the services are running, verify the installation by port forwarding to localhost. Execute the following:

export CARTO_HOST_IP=127.0.0.1
export CARTO_HTTP_PORT=80
export CARTO_HTTPS_PORT=443
kubectl port-forward --namespace default svc/carto-router 80:80 443:443

Add to your /etc/hosts the domain you will use:

echo "127.0.0.1 my.domain.com" >> /etc/hosts

6. Configure an HTTPS endpoint

The first step here is to make the router accessible using a LoadBalancer. This provides an externally-accessible IP address that we will later configure our DNS.

Add to customizations.yaml based on the cloud you are using:

router:
  service:
    type: LoadBalancer
router:
  service:
    type: LoadBalancer
    annotations:
      # https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.4/guide/service/nlb/
      # https://kubernetes.io/docs/concepts/services-networking/service/#ssl-support-on-aws
      service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout: "605"
router:
  service:
    type: LoadBalancer
    annotations:
      # https://docs.microsoft.com/en-us/azure/aks/load-balancer-standard#additional-customizations-via-kubernetes-annotations
      service.beta.kubernetes.io/azure-load-balancer-tcp-idle-timeout: "10"

After that, upgrade the cluster:

helm upgrade carto \
  carto/carto \
  -f carto-values.yaml \
  -f carto-secrets.yaml \
  -f customizations.yaml

Get the EXTERNAL-IP of your CARTO Self-Hosted deployment with this command:

$ kubectl get svc --namespace default -w carto-router

NAME           TYPE           CLUSTER-IP   EXTERNAL-IP     PORT(S)                      AGE
carto-router   LoadBalancer   10.64.3.11   34.136.204.51   80:32339/TCP,443:32602/TCP   8h

At this point, you need to configure a DNS record that points my.domain.com to the EXTERNAL-IP (34.136.204.51).

Use your own TLS certificate

By default, the package generates a self-signed certificate with a validity of 365 days.

If you want to add your own certificate you need to create a secret:

kubectl create secret tls -n <namespace> <certificate name> \
  --cert=path/to/cert/file \
  --key=path/to/key/file

Edit customizations.yaml:

tlsCerts:
  httpsEnabled: true
  autoGenerate: false
  existingSecret:
    name: "<certificate name>"
    keyKey: "tls.key"
    certKey: "tls.crt"

Apply the changes:

helm upgrade carto \
  carto/carto \
  -f carto-values.yaml \
  -f carto-secrets.yaml \
  -f customizations.yaml

If your TLS certificate key is protected with a passphrase the CARTO Self-hosted installation won't be able to work as expected. You can easily generate a new key file without passphrase protection using the following command:

openssl rsa -in keyfile_with_passphrase.key -out new_keyfile.key

7. Post-installation checks

In order to verify CARTO Self Hosted was correctly installed, and it's functional, we recommend performing the following checks:

  1. Sign in to your Self Hosted, create a user and a new organization.

  2. Go to the Connections page, in the left-hand menu, create a new connection to one of the available providers.

  3. Go to the Data Explorer page, click on the Upload button right next to the Connections panel. Import a dataset from a local file.

  4. Go back to the Maps page, and create a new map.

  5. In this new map, add a new layer from a table using the connection created in step 3.

  6. Create a new layer from a SQL Query to the same table. You can use a simple query like:

SELECT * FROM <dataset_name.table_name> LIMIT 100;
  1. Create a new layer from the dataset imported in step 4.

  2. Make the map public, copy the sharing URL and open it in a new incognito window.

  3. Go back to the Maps page, and verify your map appears there, and the map thumbnail represents the latest changes you made to the map.

Congrats! Once you've configured your custom buckets, you should have a production-ready deployment of CARTO Self-Hosted at https://my.domain.com

You may notice that the onboarding experience (demo maps, demo workflows...) and the Data Observatory-automated features (subscriptions, enrichment...) are disabled by default in your new organization, because the CARTO Data Warehouse is not enabled.

If you prefer not to enable the CARTO Data Warehouse, you can still use the Data Observatory without the UI features: after getting in touch, our team can deliver the data (both premium and public subscriptions) manually to your data warehouse.

Analytics Toolbox in CARTO Self-Hosted

To fully leverage CARTO's capabilities you need to gain access to the Analytics Toolbox functions. This step is crucial to fully leverage CARTO's capabilities. Please refer to the documentation of your data warehouse provider for detailed instructions:

Troubleshooting

The following standard commands of kubectl could be used to debug possible issues that might arise:

kubectl logs and kubectl describe

Database

The container workspace-migrations (included at the pod carto-workspace-api-*) will be responsible for creating a new user carto_worskpace_admin and a database carto_workspace.

To debug possible errors with the connection of the external database you might need to check the logs of this container:

kubectl logs carto-workspace-api-585f4bbd7c-qt65g -c workspace-migrations

At this point, we are setting up the configuration of the . You need to provide a PostgreSQL user with full permission on a logical database.

If you're installing in EKS and you'd like to use EKS Pod Identity to authenticate to your RDS PostgreSQL database, follow .

And in order to configure them, there is a available that you should follow to complete the Self-Hosted configuration process.

External Proxy: If using an , confirm that it is correctly configured for connecting to external domains.

Egress Requirements: Check that your environment meets the necessary for CARTO Self-Hosted.

Storage Configuration: Verify that your are correctly set up and that the provided credentials are valid.

The entry point to the CARTO Self-Hosted is through the router service. By default, it is configured in ClusterIP mode, and it's only accessible in your machine with ).

If you'd like to enable the onboarding experience and the Data Observatory features, follow the or contact .

For further assistance check our page.

this guide
Google Cloud Storage
AWS S3
Azure Blob Storage
detailed guide
external proxy
egress requirements
storage buckets
kubectl port-forward
guide to enable the CARTO Data Warehouse
support@carto.com
Google BigQuery
Amazon Redshift
Snowflake
PostgreSQL
Support
support@carto.com
Google Cloud Platform
AWS
Azure
Google Cloud Platform
AWS
Azure
installation of Helm v3
Troubleshoot.sh
requirements
external database