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.
- Create a Cloud VPS from the control panel.
- In the configuration step, pick Data Warehouse Stack from the app catalog.
- Start the server. The install runs in the background for a few minutes and its status shows on the server page.
- 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 pricingRelated tutorials
How to install WordPress on a Cloud VPS
Complete WordPress guide: one-click install on cloudlinux.ro or manual setup on any Ubuntu server, step by step.
Updated 7/18/2026ApplicationsHow to install ProjectSend on a Cloud VPS
Complete ProjectSend guide: one-click install on cloudlinux.ro or manual setup on any Ubuntu server, step by step.
Updated 7/18/2026ApplicationsHow to install Prometheus + Grafana on a Cloud VPS
Complete Prometheus + Grafana guide: one-click install on cloudlinux.ro or manual setup on any Ubuntu server, step by step.
Updated 7/18/2026