CloudLinux.ro
Applications

How to install Data Warehouse Stack on a Cloud VPS

Updated 7/18/2026

A ready-made analytics stack that pairs a columnar data warehouse with visualization tooling for reporting over large datasets.

Self-hosted analytics means you own the data, GDPR compliance is straightforward and there are no event or visitor caps.

One-click install on cloudlinux.ro

The fastest way: Data Warehouse Stack installs automatically at the first boot of a new server.

  1. Create a Cloud VPS from the control panel.
  2. In the configuration step, pick Data Warehouse Stack from the app catalog.
  3. Start the server. The install runs in the background for a few minutes and its status shows on the server page.
  4. Access details and generated passwords are saved on the server in /root/app-credentials.txt. The app will be available on port 5432.

Manual install on any Ubuntu server

If you prefer doing it yourself, below is the exact script our automatic install runs. Execute it as root on a fresh Ubuntu server (24.04 recommended). It stops at the first error, and when it finishes you will find the access details in /root/app-credentials.txt.

export DEBIAN_FRONTEND=noninteractive
curl -fsSL https://get.docker.com | sh
DB_PASS=$(openssl rand -base64 24 | tr -dc 'A-Za-z0-9' | cut -c1-20)
ADMIN_PASS=$(openssl rand -base64 24 | tr -dc 'A-Za-z0-9' | cut -c1-16)
SECRET_KEY=$(openssl rand -base64 42)
IP=$(hostname -I | awk '{print $1}')
mkdir -p /opt/dwh/dags /opt/dwh/logs /opt/dwh/plugins
cd /opt/dwh
cat > init-db.sh <<EOF
#!/bin/bash
set -e
psql -v ON_ERROR_STOP=1 --username warehouse <<SQL
CREATE DATABASE superset_meta;
CREATE DATABASE airflow_meta;
SQL
EOF
chmod +x init-db.sh
cat > superset_config.py <<EOF
SECRET_KEY = "${SECRET_KEY}"
SQLALCHEMY_DATABASE_URI = "postgresql+psycopg2://warehouse:${DB_PASS}@warehouse-db:5432/superset_meta"
EOF
cat > docker-compose.yml <<EOF
services:
  warehouse-db:
    image: postgres:16
    restart: always
    environment:
      POSTGRES_DB: warehouse
      POSTGRES_USER: warehouse
      POSTGRES_PASSWORD: ${DB_PASS}
    ports:
      - '5432:5432'
    volumes:
      - dwh_pg:/var/lib/postgresql/data
      - ./init-db.sh:/docker-entrypoint-initdb.d/init-db.sh:ro
  minio:
    image: quay.io/minio/minio:latest
    restart: always
    command: server /data --console-address ':9001'
    environment:
      MINIO_ROOT_USER: admin
      MINIO_ROOT_PASSWORD: ${ADMIN_PASS}
    ports:
      - '9000:9000'
      - '9001:9001'
    volumes:
      - dwh_minio:/data
  airflow-init:
    image: apache/airflow:2.11.0
    depends_on: [warehouse-db]
    environment:
      AIRFLOW__CORE__EXECUTOR: LocalExecutor
      AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://warehouse:${DB_PASS}@warehouse-db:5432/airflow_meta
    entrypoint: /bin/bash
    command: -c 'airflow db migrate && airflow users create --username admin --password ${ADMIN_PASS} --firstname Admin --lastname User --role Admin --email [email protected]'
  airflow-webserver:
    image: apache/airflow:2.11.0
    restart: always
    depends_on: [warehouse-db]
    environment:
      AIRFLOW__CORE__EXECUTOR: LocalExecutor
      AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://warehouse:${DB_PASS}@warehouse-db:5432/airflow_meta
    command: webserver
    ports:
      - '8080:8080'
    volumes:
      - ./dags:/opt/airflow/dags
      - ./logs:/opt/airflow/logs
      - ./plugins:/opt/airflow/plugins
  airflow-scheduler:
    image: apache/airflow:2.11.0
    restart: always
    depends_on: [warehouse-db]
    environment:
      AIRFLOW__CORE__EXECUTOR: LocalExecutor
      AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://warehouse:${DB_PASS}@warehouse-db:5432/airflow_meta
    command: scheduler
    volumes:
      - ./dags:/opt/airflow/dags
      - ./logs:/opt/airflow/logs
      - ./plugins:/opt/airflow/plugins
  superset:
    image: apache/superset:latest
    restart: always
    depends_on: [warehouse-db]
    ports:
      - '8088:8088'
    volumes:
      - ./superset_config.py:/app/pythonpath/superset_config.py:ro
      - dwh_superset:/app/superset_home
volumes:
  dwh_pg:
  dwh_minio:
  dwh_superset:
EOF
docker compose up -d warehouse-db minio
sleep 20
docker compose run --rm airflow-init
docker compose up -d airflow-webserver airflow-scheduler superset
sleep 20
docker compose exec superset superset db upgrade
docker compose exec superset superset fab create-admin --username admin --firstname Admin --lastname User \
  --email [email protected] --password "$ADMIN_PASS"
docker compose exec superset superset init
printf 'Data Warehouse Stack\nPostgreSQL (warehouse): %s:5432, utilizator warehouse, parola %s\nMinIO consola: http://%s:9001, admin / %s\nAirflow: http://%s:8080, admin / %s (DAG-uri in /opt/dwh/dags)\nSuperset: http://%s:8088, admin / %s\nConecteaza Superset la warehouse cu: postgresql+psycopg2://warehouse:%s@warehouse-db:5432/warehouse\n' \
  "$IP" "$DB_PASS" "$IP" "$ADMIN_PASS" "$IP" "$ADMIN_PASS" "$IP" "$ADMIN_PASS" "$DB_PASS" > /root/app-credentials.txt

You can also save this script as a recipe in your account and reuse it on any new server.

Put this guide into practice on your own VPS

EU cloud servers, billed hourly, ready in minutes, with one-click installs for dozens of apps.

See pricing

Related tutorials