We can get from zero to a working report in superset in about 10 minutes.
The installation requires some dependencies and the use of command-line tools.
This tutorial walks you through the process, shows the commands and explains each step.
In short, we will cover the following steps:
- Install the coasti CLI.
- Initialize a new coasti project folder.
- Setup our Superset docker container.
- Add a demo content package and run its setup to prepare local configuration.
- Execute the transformation pipeline to get the BI data ready and deploy it to Superset.
- Upload the packages frontend assets to Superset.
For production deployments, we set up coasti so that superset runs on a different machine than the transformations. This way, expensive computations of the data-pipeline do not affect the user experience. For simplicity, we put both on the same host in this tutorial.
Requirements
- docker
- git
- uv (used in this tutorial, but most python package managers will do)
- Full Requirements: a broader overview, hardware, and more details.
Get the coasti installer
The coasti installer is a small python package that wraps around existing open-source tools.
It allows us to create and manage coasti projects, set up version control, and to add or update content.
The easiest way to get the coasti installer is through uv:
curl -LsSf https://astral.sh/uv/install.sh | sh
uv tool install coasti
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
uv tool install coasti
To check it worked, try the help option:
coasti --help
Usage: coasti [OPTIONS] COMMAND [ARGS]...
Coasti Installer - Initialize projects and install products.
╭─ Options ────────────────────────────────────────────────────────────────────╮
│ --verbose -v INTEGER Increase verbosity (-v, -vv, -vvv) [default: 0] │
│ --quiet -q Avoid user prompts │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────╮
│ version Shows the version of the coasti installer. │
│ init Initialize a coasti workspace │
│ product List, add or update products. │
│ superset-io Import or export superset frontend assets. │
╰──────────────────────────────────────────────────────────────────────────────╯
▋
Initialize a coasti project
All products, content and metadata that you use with coasti live in a central folder, a coasti project.
Projects are initialized via coasti init and you need to provide a folder path to use.
We recommend to use an absolute and simple path like /coasti.
This makes it a bit easier to map configs into containers, where it helps to use the same paths inside and out.
coasti init /coasti
🎤 Do you want to setup version control?
(Without version control, you will have to update products manually)
local
Copying from template version 0.2.2
create tools
create tools/.gitkeep
create products
create products/.gitkeep
create .gitignore
create config
create config/secrets
create config/secrets/sample_pass
create config/secrets/vcs_auth_coasti
create config/products.yml
create config/install_answers.yml
create config/tools.yml
create logs
create logs/.gitkeep
create data
create data/.gitkeep
> Running task 1 of 4: git init
Initialized empty Git repository in /coasti/.git/
> Running task 2 of 4: git add .
> Running task 3 of 4: git commit -m "Coasti init"
[main (root-commit) 044656e] Coasti init
6 files changed, 57 insertions(+)
create mode 100644 .gitignore
create mode 100644 config/install_answers.yml
create mode 100644 config/products.yml
create mode 100644 config/tools.yml
create mode 100644 products/.gitkeep
create mode 100644 tools/.gitkeep
Coasti folder structure created at "/coasti"
Next steps:
- Change directory to the project root:
cd /coasti
- See "README.md" and start coding.
- To add products, see:
coasti product --help
- Push the local repo to your remote origin:
git push --set-upstream origin main
▋
Install Apache Superset
With the coasti project set up, we can add superset as a product.
We provide a batteries-included docker image that streamlines the installation.
First, coasti asks a few questions on how to get the product.
This lets you choose which branch to use (products are just git repositories) or how to gain access, if your product is in a private repo. Because superset is in a public repo, we dont need authentication.
cd /coasti
coasti product add https://github.com/coasti-org/superset_docker.git
🎤 Install location:
products/superset_docker
🎤 Version control reference (git branch, tag or commit)
main
Added superset_docker in products.yml
🎤 Do you want to install superset_docker now?
No
▋
After adding superset as a product to coasti's metadata, we are asked to install it.
We can either do this directly (type y or ↵) or install later via coasti product install.
This will clone the repository, and guide us through the questions needed to configure superset.
For most questions, choosing the default by pressing ↵ is fine.
You can later check the details based on your answers in /coasti/products/superset_docker/config/.env.
coasti product install superset_docker
Using copier to install superset_docker. Downloading...
🎤 Domain of the superset instance
localhost
🕵️ Superset secret key (generated randomly by default)
****************************************************************
🎤 Superset Admin User Name
admin
🕵️ Superset Admin User Password (generated randomly by default)
*****
🎤 Superset Admin User Email (also used for caddy ssl certificates)
admin@example.com
🎤 Do you want to configure superset's email reports?
No
🎤 Do you want to create a copy of the example configs for easier editing?
(config/superset_config.py and docker/docker-compose.yml)
Yes
Copying from template version 0.1.4.post4.dev0+b214409
create docker
...
create translations/README.md
> Running task 1 of 4: cp config/superset_config_sample.py config/superset_config.py
> Running task 2 of 4: cp docker/docker-compose-sample.yml docker/docker-compose.yml
Superset folder structure created at "/coasti/products/superset_docker"
Next steps
==========
- You must put 'superset_config.py' and '.env' into your .gitignore!
- Check your config/.env, it contains you given answers and generated passwords.
- Pull docker images:
docker compose -f ./docker/docker-compose.yml --env-file ./config/.env pull
- Start the stack:
docker compose -f ./docker/docker-compose.yml --env-file ./config/.env up superset-app
▋
To launch superset, we follow the suggested next steps.
This will download the docker image, and launch the container.
cd /coasti/products/superset_docker
docker compose -f ./docker/docker-compose.yml --env-file ./config/.env pull
[+] pull 4/4
✔ Image caddy:2 Pulled 1.2s
✔ Image ghcr.io/coasti-org/superset_docker:0.1.4-superset.6.1.0 Pulled 1.5s
✔ Image postgres:17 Pulled 2.6s
✔ Image redis:7 Pulled 1.3s
▋
To launch superset, we follow the suggested next steps.
This will download the docker image, and launch the container.
docker compose -f ./docker/docker-compose.yml --env-file ./config/.env up superset-app
[+] up 3/3
✔ Container superset-postgres Created 0.2s
✔ Container superset-caddy Created 0.3s
✔ Container superset-redis Created 0.2s
Attaching to superset-app
Container superset-postgres Healthy
Container superset-caddy Healthy
Container superset-redis Healthy
superset-app | ==============================================
superset-app | Starting Apache Superset Web Server
superset-app | ==============================================
superset-app ...
▋
Now, we can open a browser and navigate to http://localhost:8088 to login with the credentials we entered earlier.

With the up command we just used, we launched the superset-app container and attached to it. This directly shows all output in the Terminal.
To stop the container, and return to our shell, we can press ctrl + c.
If we want the superset containers to run in the background, we can start detached by using docker compose up -d
docker compose -f ./docker/docker-compose.yml --env-file ./config/.env up -d superset-app
Adding content and running dbt
Now that we have superset up and running, let's add some reports.
Here, we use the demo package that shows a few selected stats from Destatis.
cd /coasti
coasti product add https://github.com/coasti-org/linkfish_genesis_stats
🎤 Optional: How to authenticate at https://github.com/coasti-org/linkfish_genesis_stats
skip
🎤 Unique Product identifier:
linkfish_genesis_stats
🎤 Install location:
products/linkfish_genesis_stats
🎤 Version control reference (git branch, tag or commit)
main
Updated linkfish_genesis_stats in products.yml
🎤 Do you want to install linkfish_genesis_stats now?
Yes
Using copier to install linkfish_genesis_stats. Downloading...
========================================
Installation Genesis Statistik
========================================
Zum Konfigurieren der Installation bitte folgende Fragen beantworten:
🎤 Welches dbt-Profil soll standardmäßig verwendet werden?
lfgs_duckdb
🎤 Wo soll die DuckDB erzeugt werden, die für ETL genutzt wird?
/coasti/products/linkfish_genesis_stats/data/lfgs_etl.duckdb
🎤 Wohin soll die verkleinerte DuckDB kopiert werden, die Superset lädt?
/coasti/products/superset_docker/data/linkfish_genesis_stats.duckdb
🎤 Soll die benötigte Umgebung erstellt werden (python/.venv)?
Yes
🎤 Soll der Daten-Download von Gestatis konfiguriert werden?
Benötigt zwei Accounts:
https://genesis.destatis.de/datenbank/online
https://www.regionalstatistik.de/genesis/online
No
Copying from template version 1.0.0
create coasti_install_answers.yml
create LICENSE
create .gitignore
create CHANGELOG.md
...
> Running task 1 of 2: uv --directory ./python sync
Using CPython 3.12.11
Creating virtual environment at: .venv
> Running task 2 of 2: python ./python/rollout.py
========================================
Creating required directories
========================================
Checked data directory: data
Checked data directory: logs
========================================
Copying sample files
========================================
Copied sample: config/genesis_sources.yml
Copied sample: config/linkfish_genesis_stats.code-workspace
Copied sample: config/profiles.yml
Copied sample: python/orchestration.py
========================================
Installation abgeschlossen
========================================
"linkfish_genesis_stats" installiert nach "/coasti/products/linkfish_genesis_stats"
========================================
Nächste Schritte
========================================
- In den Produkt-Ordner wechseln:
cd /coasti/products/linkfish_genesis_stats
- Workspace in vscode öffnen:
code config/linkfish_genesis_stats.code_workspace
- Ggf. Anpassen folgender Beispiele in config/
- config/genesis_sources.yml
- config/profiles.yml
- Orchestrierung starten (erster Aufruf dauert etwas):
uv run --project ./python ./python/orchestration.py --help
uv run --project ./python ./python/orchestration.py run --env-file ./config/.env --log-file ./logs/lfgs.log -s all
▋
To get us started quickly, the example already contains raw data, so that we do not need an ingestion and can omit the download step.
However, we still need to run the transformations that will create the BI data for our reports.
The following command is the bread-and butter step of a the content package.
In a production setup, it would run regularly, e.g. every night, to fetch new raw data, process it, and update the BI data visible in the reports.
cd /coasti/products/linkfish_genesis_stats
uv run --project python ./python/orchestration.py run --env-file ./config/.env --select all --omit download_seeds
... output truncated
Orchestration run complete
╷ ╷
Step │ Status │ Log
════════════════════╪════════╪══════════════════════════════════════════════════════════
dbt_deps │ PASS │ 14:06:37 Running with dbt=1.9.10
│ │ ...
│ │ 14:06:38 Up to date!
────────────────────┼────────┼──────────────────────────────────────────────────────────
list_versions │ PASS │ DBT Package Versions:
│ │ linkfish_genesis_stats 1.0.0
│ │ dbt-labs/dbt_utils 1.4.1
│ │ pystatis 0.5.5
────────────────────┼────────┼──────────────────────────────────────────────────────────
dbt_seed │ PASS │ 14:06:39 Running with dbt=1.9.10
│ │ 14:06:39 Registered adapter: duckdb=1.9.6
│ │ ...
│ │ 14:06:40 Done. PASS=9 WARN=0 ERROR=0 SKIP=0 TOTAL=9
────────────────────┼────────┼──────────────────────────────────────────────────────────
dbt_run │ PASS │ 14:06:42 Running with dbt=1.9.10
│ │ 14:06:42 Registered adapter: duckdb=1.9.6
│ │ ...
│ │ 14:06:43 Done. PASS=22 WARN=0 ERROR=0 SKIP=0
│ │ TOTAL=22
────────────────────┼────────┼──────────────────────────────────────────────────────────
dbt_test │ PASS │ 14:06:45 Running with dbt=1.9.10
│ │ 14:06:45 Registered adapter: duckdb=1.9.6
│ │ ...
│ │ 14:06:45 Done. PASS=2 WARN=0 ERROR=0 SKIP=0 TOTAL=2
────────────────────┼────────┼──────────────────────────────────────────────────────────
minimize_duckdb │ PASS │ Reduced size of
│ │ ./data/lfgs_etl.duckdb
│ │ saved to
│ │ ./data/lfgs_etl_mini.db
────────────────────┼────────┼──────────────────────────────────────────────────────────
deploy_to_frontend │ PASS │ Copied duckdb to
│ │ /coasti/products/superset_docker/data/
│ │ linkfish_genesis_stats.duckdb
────────────────────┼────────┼──────────────────────────────────────────────────────────
download_seeds │ OMIT │ Did not run (as requested via CLI)
╵ ╵
▋
This created the following files for us:
./data/lfgs_etl.duckdb The large duckdb that contains a copy of the ingestion data and our transformation output. This is the final BI data (placed in the mart and presentation layers).
./data/lfgs_etl_mini.db A smaller duckdb, that only contains those final layers of BI data.
- A copy of this
_mini.db, located in supersets data directory. This is where our frontend reports will look for it (file name and location have to match).
Deploying content frontend to superset
Now that we have data in superset, we want to show the preconfigured reports in superset.
Usually, they come as part of the content package and follow supersets format (that is, yaml files with a certain structure).
In the demo content package, these yaml files live at superset/frontend (click here to get a feeling for what they look like).
To upload the assets into superset, we use the superset-io tool that is part of coasti:
cd /coasti/products/linkfish_genesis_stats
coasti superset-io upload ./superset/frontend
INFO:superset_io:Connecting to Superset at: http://localhost:8088
INFO:superset_io:Connecting to Superset as: admin
Password [admin]: **doesnt appear when typing**
▋
The upload should finish after a few seconds, and the reports should show up in superset:
