Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).
Tileserver (OpenStreetMap)
Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).
Ein Tileserver erzeugt aus OpenStreetMap-Daten eigene Kartenkacheln (PNG-Bilder), die sich in Webkarten wie Leaflet oder OpenLayers einbinden lassen – ohne Abhängigkeit von fremden Kartendiensten.
Vorbemerkungen
Der Tileserver besteht aus mehreren Bausteinen, die zusammenarbeiten:
| Baustein | Aufgabe |
|---|---|
| PostgreSQL + PostGIS | speichert die importierten OSM-Daten mit Geometrien |
| osm2pgsql | liest eine .osm.pbf-Datei und schreibt sie in die Datenbank |
| OpenStreetMap Carto | Kartenstil (Farben, Linien, Beschriftungen) im CartoCSS-Format |
| carto | übersetzt den Kartenstil in eine Mapnik-XML-Datei |
| Mapnik | zeichnet aus Datenbank und Stil die Kartenbilder |
| renderd | Hintergrunddienst, der Kacheln mit Mapnik rendert und zwischenspeichert |
| Apache + mod_tile | liefert die Kacheln per HTTP aus und beauftragt bei Bedarf renderd |
Hinweise zum Umfang:
- Diese Anleitung importiert als Beispiel nur die Stadt Ahrensburg (Kreis Stormarn). Der kleine Ausschnitt ist in wenigen Sekunden importiert. Größere Gebiete brauchen deutlich mehr Arbeitsspeicher, Festplattenplatz und Zeit. Für ganz Deutschland sollten es mindestens 32 GB RAM und rund 200 GB SSD-Speicher sein.
- Die Kartendaten und der Kartenstil liegen unter
/srv/osm. So muss das Home-Verzeichnis nicht für andere Benutzer freigegeben werden. - Ubuntu 26.04 bringt PostgreSQL 18 und Mapnik 4.2 mit. Pfade und Paketnamen unten sind darauf abgestimmt.
- Quelle: Die Texte dieser Anleitung sind eigenständig geschrieben. Als technische Grundlage für die Befehle zu Datenbank, Import und renderd diente die englische Anleitung „Manually building a tile server (Ubuntu 24.04 LTS)“ der switch2osm-Mitwirkenden, veröffentlicht unter der Lizenz CC BY-SA 2.0. Befehle, Pfade und Versionen sind hier auf Ubuntu 26.04, Mapnik 4.2 und den Ausschnitt Ahrensburg abgestimmt.
Installation der Pakete
1. Paketlisten aktualisieren
Sorgt dafür, dass apt die neuesten Paketversionen aus den Ubuntu-Quellen kennt.
sudo apt update
2. Datenbank-Pakete installieren
Installiert PostgreSQL, die Geodaten-Erweiterung PostGIS und das Importwerkzeug osm2pgsql.
sudo apt install -y postgresql postgresql-contrib postgis postgresql-18-postgis-3 postgresql-18-postgis-3-scripts osm2pgsql
Prüfen: Die Version von osm2pgsql wird ausgegeben.
osm2pgsql --version
3. Render-Pakete installieren
Installiert den Renderdienst renderd, das Apache-Modul mod_tile, den Webserver Apache sowie die Mapnik-Werkzeuge.
sudo apt install -y apache2 renderd libapache2-mod-tile mapnik-utils
Prüfen: Apache läuft (active). renderd meldet an dieser Stelle noch failed – das ist richtig so, denn es ist noch kein Kartenstil eingetragen (Schritt 22).
systemctl is-active apache2 renderd
Port 80 schon belegt? Läuft auf dem Rechner bereits ein anderer Webserver (z. B. nginx), kann Apache nicht starten und meldet
failedmitAddress already in usebzw.no listening sockets available. Dann Apache auf Port 8080 legen und in allen späteren URLslocalhost:8080stattlocalhostverwenden:sudo nano /etc/apache2/ports.confSuche mit Strg+W nach
Listen 80, ändere die Zeile inListen 8080, speichere mit Strg+O und Enter und beende nano mit Strg+X.sudo nano /etc/apache2/sites-available/000-default.confÄndere die erste Zeile
<VirtualHost *:80>in<VirtualHost *:8080>, speichere und beende nano. Danach Apache neu starten:sudo systemctl restart apache2Damit die Karte später auch ohne
:8080erreichbar ist, kann nginx die Kachelanfragen an Apache weiterreichen – siehe nginx als Proxy vor Apache.
4. Werkzeuge für den Kartenstil installieren
node-carto übersetzt den Kartenstil, osmium-tool schneidet ein Stadtgebiet aus einer größeren OSM-Datei aus, gdal-bin und die Python-Module werden vom Hilfsskript für die Küstenlinien- und Grenzdaten gebraucht, git holt den Kartenstil.
sudo apt install -y git curl unzip osmium-tool node-carto gdal-bin python3-psycopg2 python3-yaml python3-requests
Prüfen: carto meldet mindestens Version 1.2.0.
carto -v
5. Schriftarten installieren
Der Kartenstil beschriftet Orte in vielen Schriftsystemen und erwartet dafür die Noto-Schriften. Über apt installiert, findet Mapnik sie automatisch unter /usr/share/fonts.
sudo apt install -y fonts-noto-core fonts-noto-ui-core fonts-noto-cjk fonts-noto-extra fonts-hanazono fonts-unifont
Datenbank einrichten
6. Datenbank gis anlegen
Der Dienst renderd läuft als Systembenutzer _renderd (wurde mit dem Paket angelegt). Deshalb bekommt dieser Benutzer eine gleichnamige Datenbankrolle und wird Besitzer der Datenbank gis. Der Name gis ist im Kartenstil fest eingetragen.
sudo -u postgres createuser _renderd
sudo -u postgres createdb -E UTF8 -O _renderd gis
7. Erweiterungen PostGIS und hstore aktivieren
PostGIS ergänzt die Datenbank um Geometrie-Datentypen, hstore speichert beliebige OSM-Schlüssel/Wert-Paare in einer Spalte.
sudo -u postgres psql -d gis -c "CREATE EXTENSION postgis;" -c "CREATE EXTENSION hstore;"
8. Besitz der PostGIS-Tabellen übertragen
Die beiden Verwaltungstabellen von PostGIS gehören nach dem Anlegen postgres. _renderd braucht Schreibrechte darauf, damit der Import funktioniert.
sudo -u postgres psql -d gis -c "ALTER TABLE geometry_columns OWNER TO _renderd;" -c "ALTER TABLE spatial_ref_sys OWNER TO _renderd;"
Prüfen: In der Liste der Erweiterungen stehen postgis und hstore.
sudo -u postgres psql -d gis -c "\dx"
Kartenstil vorbereiten
9. Arbeitsverzeichnis anlegen
Legt /srv/osm an und macht den eigenen Benutzer zum Besitzer, damit die folgenden Schritte ohne sudo auskommen.
sudo mkdir -p /srv/osm
sudo chown "$USER": /srv/osm
10. OpenStreetMap Carto herunterladen
Klont den Standard-Kartenstil von openstreetmap.org.
git clone https://github.com/gravitystorm/openstreetmap-carto.git /srv/osm/openstreetmap-carto
11. Feste Version auswählen
Wechselt auf die veröffentlichte Version 5.9.0, damit Stil, Importregeln und Datenbankfunktionen sicher zueinander passen.
git -C /srv/osm/openstreetmap-carto switch --detach v5.9.0
12. Kartenstil in Mapnik-XML übersetzen
carto wandelt die Projektdatei project.mml in die Datei mapnik.xml um, die renderd später lädt.
cd /srv/osm/openstreetmap-carto && carto project.mml > mapnik.xml
Prüfen: Die Datei existiert und ist mehrere Megabyte groß. Warnungen von carto sind unkritisch, solange die Datei entsteht.
ls -lh /srv/osm/openstreetmap-carto/mapnik.xml
OSM-Daten importieren
13. Datenverzeichnis anlegen
Hier landet der heruntergeladene Kartenausschnitt.
mkdir -p /srv/osm/data
14. Bundesland Schleswig-Holstein herunterladen
Geofabrik bietet tagesaktuelle Ausschnitte der OSM-Daten an, allerdings nur bis hinunter zu Bundesländern und Regierungsbezirken. Für Ahrensburg wird deshalb zuerst das ganze Bundesland geladen (rund 150 MB). Für ein anderes Gebiet die passende URL von https://download.geofabrik.de/ einsetzen.
curl -L -o /srv/osm/data/schleswig-holstein-latest.osm.pbf https://download.geofabrik.de/europe/germany/schleswig-holstein-latest.osm.pbf
15. Ahrensburg ausschneiden
osmium extract schneidet ein Rechteck aus der Datei heraus. Die Werte nach -b sind die Ecken des Rechtecks als westliche Länge, südliche Breite, östliche Länge, nördliche Breite und umschließen das Stadtgebiet von Ahrensburg. Die Grenzen einer anderen Stadt lassen sich z. B. auf https://www.openstreetmap.org über „Export“ ablesen.
osmium extract -b 10.16,53.63,10.32,53.71 /srv/osm/data/schleswig-holstein-latest.osm.pbf -o /srv/osm/data/ahrensburg.osm.pbf
Prüfen: Die neue Datei ist nur wenige Megabyte groß.
ls -lh /srv/osm/data
16. Daten in die Datenbank importieren
osm2pgsql liest die PBF-Datei und legt die Tabellen an, die OpenStreetMap Carto erwartet. Der Import läuft als _renderd, damit dieser Benutzer die Tabellen besitzt.
Bedeutung der Optionen:
--create --slim: neue Datenbank aufbauen, Zwischendaten in der Datenbank statt im RAM halten (Voraussetzung für spätere Updates)-G: Multipolygone als eine zusammenhängende Geometrie speichern--hstore: legt zusätzlich die Spaltetagsan. Darin landen als Schlüssel/Wert-Paare alle Merkmale eines Objekts, die in der Spaltenliste (-S) nicht vorkommen--tag-transform-scriptund-S: Regeln und Spaltenliste aus dem Kartenstil-C 2500: bis zu 2500 MB Arbeitsspeicher als Zwischenspeicher nutzen – bei wenig RAM kleiner wählen
sudo -u _renderd osm2pgsql -d gis --create --slim -G --hstore \
--tag-transform-script /srv/osm/openstreetmap-carto/openstreetmap-carto.lua \
-S /srv/osm/openstreetmap-carto/openstreetmap-carto.style \
-C 2500 --number-processes 1 \
/srv/osm/data/ahrensburg.osm.pbf
Prüfen: Am Ende meldet osm2pgsql osm2pgsql took ... overall. Die Tabellen sind vorhanden:
sudo -u _renderd psql -d gis -c "\dt"
17. Indizes anlegen
Zusätzliche Indizes beschleunigen die Abfragen, die Mapnik beim Zeichnen der Kacheln stellt.
cd /srv/osm/openstreetmap-carto && sudo -u _renderd psql -d gis -f indexes.sql
18. Datenbankfunktionen einspielen
Der Kartenstil ruft einige eigene SQL-Funktionen auf (z. B. zur Auswahl von Beschriftungen), die hier angelegt werden.
cd /srv/osm/openstreetmap-carto && sudo -u _renderd psql -d gis -f functions.sql
19. Externe Daten laden
Küstenlinien, Meeresflächen und einige Grenzen stammen nicht aus der PBF-Datei, sondern werden separat heruntergeladen und in die Datenbank geladen. Das Verzeichnis data muss _renderd gehören, weil das Skript als dieser Benutzer läuft.
mkdir -p /srv/osm/openstreetmap-carto/data
sudo chown _renderd /srv/osm/openstreetmap-carto/data
cd /srv/osm/openstreetmap-carto && sudo -u _renderd scripts/get-external-data.py
Prüfen: Das Skript endet ohne Fehlermeldung; die Tabelle water_polygons ist gefüllt.
sudo -u _renderd psql -d gis -c "SELECT count(*) FROM water_polygons;"
renderd konfigurieren
20. Konfigurationsdatei öffnen
Die Einstellungen von renderd liegen in /etc/renderd.conf.
sudo nano /etc/renderd.conf
21. Mapnik-Pfade korrigieren
Die mitgelieferte Datei zeigt noch auf das Plugin-Verzeichnis von Mapnik 3.1. Unter Ubuntu 26.04 liegt Mapnik 4.2 an anderer Stelle. Außerdem soll renderd alle Schriften unter /usr/share/fonts finden (die CJK-Schriften liegen unter opentype, nicht unter truetype). Den Abschnitt [mapnik] so ändern:
[mapnik]
plugins_dir=/usr/lib/x86_64-linux-gnu/mapnik/4.2/input
font_dir=/usr/share/fonts
font_dir_recurse=true
Prüfen: Im angegebenen Verzeichnis liegt u. a. postgis+pgraster.input – das ist das Plugin, mit dem Mapnik die Datenbank liest.
ls /usr/lib/x86_64-linux-gnu/mapnik/4.2/input
22. Kartenstil als Kachelsatz eintragen
Am Ende der Datei einen eigenen Abschnitt ergänzen. URI ist der URL-Pfad, unter dem die Kacheln erreichbar sind, XML der in Schritt 12 erzeugte Stil.
[osm]
URI=/osm/
XML=/srv/osm/openstreetmap-carto/mapnik.xml
HOST=localhost
TILESIZE=256
MAXZOOM=20
Anschließend speichern (Strg+O, Enter) und schließen (Strg+X).
23. renderd neu starten
Lädt die geänderte Konfiguration und den Kartenstil.
sudo systemctl restart renderd
Prüfen: Der Dienst ist active (running). Fehler beim Laden des Stils stehen im Journal.
systemctl status renderd --no-pager
journalctl -u renderd -n 30 --no-pager
Apache konfigurieren
24. Modul mod_tile aktivieren
Schaltet das Apache-Modul ein, das Kachel-URLs erkennt und mit renderd spricht. Meist hat das Paket das schon erledigt; die Meldung Module tile already enabled ist dann in Ordnung.
sudo a2enmod tile
25. Konfiguration für mod_tile anlegen
Die Datei sagt mod_tile, wo die Kachelsätze beschrieben sind und über welchen Socket renderd erreichbar ist. Die Zeitlimits legen fest, wie lange Apache auf eine neu gerenderte Kachel wartet.
sudo nano /etc/apache2/conf-available/renderd.conf
Füge diesen Inhalt ein (im Terminal mit Strg+Umschalt+V), speichere mit Strg+O und Enter und beende nano mit Strg+X:
LoadTileConfigFile /etc/renderd.conf
ModTileRenderdSocketName /run/renderd/renderd.sock
ModTileRequestTimeout 3
ModTileMissingRequestTimeout 60
26. Konfiguration aktivieren
Bindet die neue Datei in Apache ein.
sudo a2enconf renderd
27. Apache neu starten
Neu starten statt nur neu laden, weil ein Modul hinzugekommen ist.
sudo systemctl restart apache2
Prüfen: Die Konfiguration ist fehlerfrei.
sudo apache2ctl configtest
Tileserver testen
28. Erste Kachel abrufen
Fordert die Weltkarte in Zoomstufe 0 an. Beim ersten Aufruf rendert renderd die Kachel, das kann einige Sekunden dauern.
curl -o /tmp/kachel.png http://localhost/osm/0/0/0.png
Prüfen: Die Datei ist ein PNG-Bild mit 256 × 256 Pixeln.
file /tmp/kachel.png
29. Testseite mit Leaflet anlegen
Eine kleine HTML-Seite zeigt die eigenen Kacheln als verschiebbare Karte, zentriert auf die Ahrensburger Innenstadt.
sudo nano /var/www/html/karte.html
Füge diesen Inhalt ein (im Terminal mit Strg+Umschalt+V), speichere mit Strg+O und Enter und beende nano mit Strg+X:
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<title>Eigener Tileserver</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/leaflet@1.9.4/dist/leaflet.css">
<script src="https://cdn.jsdelivr.net/npm/leaflet@1.9.4/dist/leaflet.js"></script>
<style>html, body, #karte { height: 100%; margin: 0; }</style>
</head>
<body>
<div id="karte"></div>
<script>
const karte = L.map('karte').setView([53.675, 10.236], 14);
L.tileLayer('/osm/{z}/{x}/{y}.png', {
maxZoom: 20,
attribution: '© OpenStreetMap-Mitwirkende'
}).addTo(karte);
</script>
</body>
</html>
30. Karte im Browser öffnen
Beim Verschieben und Zoomen werden fehlende Kacheln nachgerendert; bereits erzeugte Kacheln kommen aus dem Zwischenspeicher unter /var/cache/renderd/tiles.
xdg-open http://localhost/karte.html
Prüfen: Die Zahl der zwischengespeicherten Metakacheln (je 8 × 8 Kacheln in einer .meta-Datei) wächst, während man in der Karte herumzoomt.
find /var/cache/renderd/tiles -name '*.meta' | wc -l
Installation prüfen
osm2pgsql --version
systemctl is-active postgresql renderd apache2
curl -sI http://localhost/osm/0/0/0.png | head -n 1
Die letzte Zeile sollte HTTP/1.1 200 OK lauten.
Deinstallieren
1. Dienste stoppen
Beendet renderd und Apache, damit keine Dateien mehr in Benutzung sind.
sudo systemctl stop renderd apache2
2. Datenbank und Rolle löschen
Achtung: Alle importierten Kartendaten gehen verloren.
sudo -u postgres dropdb gis
sudo -u postgres dropuser _renderd
3. Kartenstil, Daten und Kachel-Zwischenspeicher löschen
sudo rm -r /srv/osm /var/cache/renderd
4. Testseite und Apache-Konfiguration entfernen
sudo rm /var/www/html/karte.html /etc/apache2/conf-available/renderd.conf
5. Pakete entfernen
purge entfernt auch die Konfigurationsdateien wie /etc/renderd.conf. PostgreSQL und Apache nur mit entfernen, wenn sie nicht für andere Zwecke gebraucht werden.
sudo apt purge renderd libapache2-mod-tile mapnik-utils node-carto osmium-tool osm2pgsql postgresql-18-postgis-3 postgresql-18-postgis-3-scripts postgis
6. Nicht mehr benötigte Pakete entfernen
Entfernt Abhängigkeiten, die nur für den Tileserver installiert wurden.
sudo apt autoremove
Prüfen: Die Befehle werden nicht mehr gefunden.
renderd -h
osm2pgsql --version
Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).
Open Knowledge (Freies Wissen): Alle Texte stehen unter der freien Lizenz Creative Commons Namensnennung – Weitergabe unter gleichen Bedingungen 4.0 International (CC BY-SA 4.0) und können frei gelesen, geteilt und weiterverarbeitet werden.