diff --git a/docs/assets/serving-tiles/ubuntu-22-04-deps.txt b/docs/assets/serving-tiles/ubuntu-22-04-deps.txt index 23dd6de..b4040ec 100644 --- a/docs/assets/serving-tiles/ubuntu-22-04-deps.txt +++ b/docs/assets/serving-tiles/ubuntu-22-04-deps.txt @@ -1,11 +1,9 @@ - +sudo apt update sudo apt upgrade && sudo apt install \ screen locate libapache2-mod-tile renderd \ - git tar unzip wget bzip2 apache2 lua5.1 \ + git tar unzip wget bzip2 apache2 lua5.1 \ mapnik-utils python3-mapnik python3-psycopg2 \ - python3-yaml gdal-bin npm fonts-noto-cjk \ - fonts-noto-hinted fonts-noto-unhinted \ - fonts-unifont fonts-hanazono postgresql \ - postgresql-contrib postgresql-14-postgis-3 \ - postgis postgresql-14-postgis-3-scripts \ - osm2pgsql net-tools curl \ No newline at end of file + python3-yaml gdal-bin npm postgresql \ + postgresql-contrib postgis postgresql-14-postgis-3 \ + postgresql-14-postgis-3-scripts osm2pgsql \ + net-tools curl \ No newline at end of file diff --git a/docs/assets/serving-tiles/ubuntu-24-04-deps.txt b/docs/assets/serving-tiles/ubuntu-24-04-deps.txt new file mode 100644 index 0000000..f68f40e --- /dev/null +++ b/docs/assets/serving-tiles/ubuntu-24-04-deps.txt @@ -0,0 +1,9 @@ +sudo apt update +sudo apt upgrade && sudo apt install \ + screen locate libapache2-mod-tile renderd \ + git tar unzip wget bzip2 apache2 lua5.1 \ + mapnik-utils python3-mapnik python3-psycopg2 \ + python3-yaml gdal-bin npm node-carto \ + postgresql postgresql-contrib postgis \ + postgresql-16-postgis-3 postgresql-16-postgis-3-scripts \ + osm2pgsql net-tools curl \ No newline at end of file diff --git a/docs/en/serving-tiles/manually-building-a-tile-server-ubuntu-24-04-lts.md b/docs/en/serving-tiles/manually-building-a-tile-server-ubuntu-24-04-lts.md new file mode 100644 index 0000000..fda1b74 --- /dev/null +++ b/docs/en/serving-tiles/manually-building-a-tile-server-ubuntu-24-04-lts.md @@ -0,0 +1,360 @@ +--- +title: Manually building a tile server (Ubuntu 24.04) +dist: Ubuntu 24.04 +dl_timestamp: "2024-04-24T20:21:40Z" +lang: en +--- + +# {{ title }} + +!!! info "" + This page describes how to install, setup and configure all the necessary software to operate your own tile server. These step-by-step instructions were written for [Ubuntu Linux](https://en.wikipedia.org/wiki/Ubuntu){: target=_blank} [24.04](http://www.releases.ubuntu.com/24.04/){: target=_blank} (Noble Numbat), and were tested in April 2024. + +## Software installation + +The OSM tile server stack is a collection of programs and libraries that work together to create a tile server. As so often with OpenStreetMap, there are many ways to achieve this goal and nearly all of the components have alternatives that have various specific advantages and disadvantages. This tutorial describes the most standard version that is similar to that used on the main OpenStreetMap.org tile servers. + +It consists of 5 main components: `mod_tile`, `renderd`, `mapnik`, `osm2pgsql` and a `postgresql/postgis` database. Mod_tile is an apache module that serves cached tiles and decides which tiles need re-rendering  – either because they are not yet cached or because they are outdated. Renderd provides a priority queueing system for different sorts of requests to manage and smooth out the load from rendering requests. Mapnik is the software library that does the actual rendering and is used by renderd. + +Thanks to the work done by the Debian and Ubuntu maintainers to incorporate the latest versions of these packages into {{ dist }}, these instructions are somewhat shorter than earlier versions. + +These instructions are have been written and tested against a newly-installed {{ dist }} server. If you have got other versions of some software already installed (perhaps you upgraded from an earlier version, or you set up some PPAs to load from) then you may need to make some adjustments. + +In order to build these components, a variety of dependencies need to be installed first. + +This guide assumes that you run everything from a non-root user via `sudo`. Don't try and do everything below as `root`; it won't work. + +```sh +--8<-- "docs/assets/serving-tiles/ubuntu-24-04-deps.txt" +``` + +At this point, a couple of new accounts have been added. You can see them with `tail /etc/passwd`. `postgres` is used for managing the databases that we use to hold data for rendering. `_renderd` is used for the `renderd` daemon, and we'll need to make sure lots of the commands below are run as that user. + +Now you need to create a postgis database. The defaults of various programs assume the database is called gis and we will use the same convention in this tutorial, although this is not necessary. Note that `_renderd` below matches the user that the `renderd` daemon will run from. + +```sh +sudo -u postgres -i +createuser _renderd +createdb -E UTF8 -O _renderd gis +``` + +While still working as the `postgres` user, set up PostGIS on the PostgreSQL database: + +```sh +psql +``` + +(that'll put you at a `postgres=#` prompt) + +```sh +\c gis +``` + +(it'll answer "You are now connected to database 'gis' as user 'postgres'".) + +```sql +CREATE EXTENSION postgis; +``` + +(it'll answer CREATE EXTENSION) + +```sql +CREATE EXTENSION hstore; +``` + +(it'll answer CREATE EXTENSION) + +```sql +ALTER TABLE geometry_columns OWNER TO _renderd; +``` + +(it'll answer ALTER TABLE) + +```sql +ALTER TABLE spatial_ref_sys OWNER TO _renderd; +``` + +(it'll answer ALTER TABLE) + +```sh +\q +``` + +(it'll exit psql and go back to a normal Linux prompt) + +```sh +exit +``` + +(to exit back to be the user that we were before we did `sudo -u postgres -i` above) + +## Mapnik + +Mapnik was installed above. We'll check that it has been installed correctly by doing this: + +```py +python3 +>>> import mapnik +>>> +``` + +If python replies with the second chevron prompt `>>>` and without errors, then Mapnik library was found by Python. Congratulations! You can leave Python with this command: + +```py +>>> quit() +``` + +## Stylesheet configuration + +Now that all of the necessary software is installed, you will need to download and configure a stylesheet. + +The style we'll use here is the one that use by the "standard" map on the openstreetmap.org website. It's chosen because it's well documented, and should work anywhere in the world (including in places with non-latin placenames). There are a couple of downsides though - it's very much a compromise designed to work globally, and it's quite complicated to understand and modify, should you need to do that. + +The home of "OpenStreetMap Carto" on the web is {: target=_blank} and it has it's own installation instructions at {: target=_blank}, although we'll cover everything that needs to be done here. + +Here we're assuming that we're storing the stylesheet details in a directory below `~/src` below the home directory of whichever non-root user account you are using; we'll change access so that the `_renderd` user can access it below. + +```sh +mkdir ~/src +cd ~/src +git clone https://github.com/gravitystorm/openstreetmap-carto +cd openstreetmap-carto +``` + +Next, we'll install a suitable version of the `carto` compiler. + +```sh +sudo npm install -g carto +carto -v +``` + +That should respond with a number that is at least as high as: + +```sh +1.2.0 +``` + +Then we convert the carto project into something that Mapnik can understand: + +```sh +carto project.mml > mapnik.xml +``` + +You now have a Mapnik XML stylesheet at `/home/youruseraccount/src/openstreetmap-carto/mapnik.xml`. + +## Loading data + +Initially, we'll load only a small amount of test data. Other download locations are available, but `download.geofabrik.de` has a wide range of options. In this example we'll download the data for Azerbaijan, which is currently about 32Mb. + +Browse to {: target=_blank} and note the "This file was last modified" date (e.g. "{{ dl_timestamp }}"). We'll need that later if we want to update the database with people's subsequent changes to OpenStreetMap. Download it as follows: + +```sh +mkdir ~/data +cd ~/data +wget https://download.geofabrik.de/asia/azerbaijan-latest.osm.pbf +``` + +Next, we need to make sure that the `_renderd` user can access the stylesheet. In order to do this it needs access to wherever you downloaded it, and by default it won't have access to your home directory. If it's in `~/src` below your user account then + +```sh +chmod o+rx ~ +``` + +will work. If you don't want to do this you can move it and amend references to the file locations in subsequent commands. + +The following command will insert the OpenStreetMap data you downloaded earlier into the database. This step is very disk I/O intensive; importing the full planet might take many hours, days or weeks depending on the hardware. For smaller extracts the import time is much faster accordingly, and you may need to experiment with different `-C` values to fit within your machine's available memory. Note that the `_renderd` user is used for this process. + +```sh +sudo -u _renderd \ + osm2pgsql -d gis --create --slim -G --hstore \ + --tag-transform-script \ + ~/src/openstreetmap-carto/openstreetmap-carto.lua \ + -C 2500 --number-processes 1 \ + -S ~/src/openstreetmap-carto/openstreetmap-carto.style \ + ~/data/azerbaijan-latest.osm.pbf +``` + +It's worth explaining a little bit about what those options mean: + +`-d gis` +: The database to work with (`gis` used to be the default; now it must be specified). + +`--create` +: Load data into an empty database rather than trying to append to an existing one. + +`--slim` +: osm2pgsql can use different table layouts; "slim" tables works for rendering. + +`-G` +: Determines how multipolygons are processed. + +`--hstore` +: Allows tags for which there are no explicit database columns to be used for rendering. + +`--tag-transform-script ~/src/openstreetmap-carto/openstreetmap-carto.lua` +: Defines the lua script used for tag processing. This an easy is a way to process OSM tags before the style itself processes them, making the style logic potentially much simpler. + +`-C 2500` +: Allocate 2.5 Gb of memory to osm2pgsql to the import process. If you have less memory you could try a smaller number, and if the import process is killed because it runs out of memory you'll need to try a smaller number or a smaller OSM extract. + +`--number-processes 1` +: Use 1 CPU. If you have more cores available you can use more. + +`-S ~/src/openstreetmap-carto/openstreetmap-carto.style` +: Create the database columns in this file (actually these are unchanged from "openstreetmap-carto") + +`~/data/azerbaijan-latest.osm.pbf` +: The final argument is the data file to load. + +That command will complete with something like "osm2pgsql took 163s (2m 43s) overall". + +### Creating indexes + +Since version v5.3.0, some extra indexes now need to be [applied manually](https://github.com/gravitystorm/openstreetmap-carto/blob/master/CHANGELOG.md#v530---2021-01-28){: target=_blank}: + +```sh +cd ~/src/openstreetmap-carto/ +sudo -u _renderd psql -d gis -f indexes.sql +``` + +It should respond with `CREATE INDEX` 14 times. + +### Shapefile download + +Although most of the data used to create the map is directly from the OpenStreetMap data file that you downloaded above, some shapefiles for things like low-zoom country boundaries are still needed. To download and index these, using the same account as we used previously: + +```sh +cd ~/src/openstreetmap-carto/ +mkdir data +sudo chown _renderd data +sudo -u _renderd scripts/get-external-data.py +``` + +This process involves a sizable download and may take some time - not much will appear on the screen when it is running. Some data will go directly into the database, and some will go into a “data” directory below “openstreetmap-carto”. If there is a problem here then the Natural Earth data may have moved - look at [this issue](https://github.com/nvkelso/natural-earth-vector/issues/581#issuecomment-913988101){: target=_blank} and other issues at Natural Earth for more details. If you need to change the Natural Earth download location your copy of [this file](https://github.com/gravitystorm/openstreetmap-carto/blob/master/external-data.yml){: target=_blank} is the one to edit. + +### Fonts + +In version v5.6.0 and above of Carto, fonts need to be installed manually: + +```sh +cd ~/src/openstreetmap-carto/ +scripts/get-fonts.sh +``` + +Our test data area (Azerbaijan) was chosen both because it was a small area and because some place names in that region have names containing non-latin characters. + +## Setting up your webserver + +### Configure renderd + +The config file for `renderd` on {{ dist }} is `/etc/renderd.conf`. Edit that with a text editor such as nano: + +```sh +sudo nano /etc/renderd.conf +``` + +Add a section like the following at the end: + +```ini +[s2o] +URI=/hot/ +XML=/home/accountname/src/openstreetmap-carto/mapnik.xml +HOST=localhost +TILESIZE=256 +MAXZOOM=20 +``` + +The location of the XML file `/home/accountname/src/openstreetmap-carto/mapnik.xml` will need to be changed to the actual location on your system. You can change `[s2o]` and `URI=/hot/` as well if you like. If you want to render more than one set of tiles from one server you can - just add another section like `[s2o]` with a different name referring to a different map style. If you want it to refer to a different database to the default `gis` you can, but that's out of the scope of this document. If you've only got 2Gb or so of memory you'll also want to reduce `num_threads` to 2. `URI=/hot/` was chosen so that the tiles generated here can more easily be used in place of the HOT tile layer at OpenStreetMap.org. You can use something else here, but `/hot/` is as good as anything. + +When this guide was first written, the version of Mapnik provided by {{ dist }} was 3.1, and the `plugins_dir` setting in the `[mapnik]` part of the file was `/usr/lib/mapnik/3.1/input`. That "3.1" may change again in the future. If an error occurs when trying to render tiles such as this: + +!!! warning "" + An error occurred while loading the map layer 's2o': Could not create datasource for type: 'postgis' (no datasource plugin directories have been successfully registered) encountered during parsing of layer 'landcover-low-zoom' + +then look in `/usr/lib/mapnik` and see what version directories there are, and also look in `/usr/lib/mapnik/(version)/input` to make sure that a file `postgis.input` exists there. + +Now that we've told `renderd` how to react to tile rendering requests we need to tell the apache web server to send them. Unfortunately, the configuration for this has been removed from recent versions of mod_tile. It can however, currently be installed from here + +```sh +cd /etc/apache2/conf-available/ +sudo wget https://raw.githubusercontent.com/openstreetmap/mod_tile/python-implementation/etc/apache2/renderd.conf +sudo a2enconf renderd +sudo systemctl reload apache2 +``` + +#### Making sure that you can see debug messages + +It'd be really useful at this point to be able to see the output from the tile rendering process, including any errors. By default, with recent mod_tile versions, this is turned off. To turn it on: + +```sh +sudo nano /usr/lib/systemd/system/renderd.service +``` + +If it is not there already, add: + +```ini +Environment=G_MESSAGES_DEBUG=all +``` + +after `[Service]`. Then: + +```sh +sudo systemctl daemon-reload +sudo systemctl restart renderd +sudo systemctl restart apache2 +``` + +### Configuring Apache + +If you look at `/var/log/syslog`, you should see messages from the `renderd` service. There will initially be some font warnings - don't worry about those for now. Next: + +```sh +sudo /etc/init.d/apache2 restart +``` + +In `syslog` you should see a message like: + +```log +Apr 23 11:14:10 servername apachectl[2031]: [Sat Apr 23 11:14:10.190678 2024] [tile:notice] [pid 2031:tid 140608477239168] Loading tile config s2o at /hot/ for zooms 0 - 20 from tile directory /var/cache/renderd/tiles with extension .png and mime type image/png +``` + +Next, point a web browser at `http://your.server.ip.address/index.html` (change `yours.erver.ip.address` to your actual server address). You should see "Apache2 Ubuntu Default Page". + +!!! tip + If you don't know what IP address it will have been assigned, you can likely use `ifconfig` to find out - if the network configuration is not too complicated it'll probably be the `inet addr` that is not `127.0.0.1`. + +If you're using a server at a hosting provider then it's likely that your server's internal address will be different to the external address that has been allocated to you, but that external IP address will have already been sent to you, and it'll probably be the one that you're accessing the server on currently. + +Note that this is just the `http` (port 80) site - you'll need to do a little bit more Apache configuration if you want to enable `https`, but that's out of the scope of these instructions. However, if you use "Let's Encrypt" to issue certificates, then the process of setting that up can also configure the Apache HTTPS site as well. + +Next, point a web browser at: `http://your.server.ip.address/hot/0/0/0.png` + +You'll need to edit that of course if you changed `URI=/hot/` above. You should see a small map of the world. If you don't, investigate the errors that it displays. These will most likely be permissions errors or perhaps related to accidentally missing some steps from the instructions above. If you don't get a tile and get other errors again, save the full output in a Pastebin and ask a question about the problem somewhere like [`community.openstreetmap.org`](https://community.openstreetmap.org){: target=_blank}. + +## Viewing tiles + +In order to see tiles, we’ll cheat and use an html file `sample_leaflet.html` that allows you to view a very simple map. To obtain this: + +```sh +cd /var/www/html +sudo wget https://raw.githubusercontent.com/SomeoneElseOSM/mod_tile/switch2osm/extra/sample_leaflet.html +sudo nano sample_leaflet.html +``` + +Edit so that the IP address matches `your.server.address` rather than just saying `127.0.0.1`. That should allow you to access this server from others. Then browse to `http://your.server.address/sample_leaflet.html`. + +The initial map display will take a little while. You'll be able to zoom in and out, but depending on server speed some tiles may initially display as grey because they can't be rendered in time for the browser. However, once done they’ll be ready for the next time that they are needed. If you look in `/var/log/syslog` you should see requests for tiles. + +So to see these as they are requested, from an ssh connection do: + +```sh +tail -f /var/log/syslog | grep " TILE " +``` + +(note the spaces around `" TILE "` there) + +That will show a line every time a tile is requested, and one every time rendering of one is completed. + +If desired, you can increase the setting `ModTileMissingRequestTimeout` in `/etc/apache2/conf-available/renderd.conf` from 10 seconds to perhaps 30 or 60, in order to wait longer for tiles to be rendered in the background before a grey tile is given to the user. Make sure you `#!sh sudo service renderd restart` and `#!sh sudo service apache2 restart` after changing it. + +Congratulations. Head over to the [using tiles](/using-tiles/index.md) section to create a map that uses your new tile server. diff --git a/docs/en/serving-tiles/monitoring-using-munin.md b/docs/en/serving-tiles/monitoring-using-munin.md index fe765e6..6a373f5 100644 --- a/docs/en/serving-tiles/monitoring-using-munin.md +++ b/docs/en/serving-tiles/monitoring-using-munin.md @@ -5,7 +5,7 @@ lang: en # {{ title }} -"Munin" can be used to monitor the activity of `renderd` and `mod_tile` on a server. Munin is available on a number of platforms; these instructions were tested on Ubuntu Linux 22.04 in June 2022. +"Munin" can be used to monitor the activity of `renderd` and `mod_tile` on a server. Munin is available on a number of platforms; these instructions were tested on Ubuntu Linux 22.04 in June 2022 and Ubuntu Linux 24.04 in April 2024. First, install the necessary software: diff --git a/docs/en/serving-tiles/updating-as-people-edit-osm2pgsql-replication.md b/docs/en/serving-tiles/updating-as-people-edit-osm2pgsql-replication.md index 877474c..4a0949f 100644 --- a/docs/en/serving-tiles/updating-as-people-edit-osm2pgsql-replication.md +++ b/docs/en/serving-tiles/updating-as-people-edit-osm2pgsql-replication.md @@ -7,7 +7,7 @@ lang: en Every day there are millions of new map updates, so to prevent a map becoming "stale" you can refresh the data used to create map tiles regularly. -Using `osm2pgsql` (version 1.4.2 or above) it's now much easier to do this than it was previously. Version 1.6.0 is distributed as part of Ubuntu 22.04; version 1.8.0 as part of Debian 12, and it can also be obtained by following [these instructions](https://osm2pgsql.org/doc/install.html){: target=_blank}. With `osm2pgsql` comes [osm2pgsql-replication](https://osm2pgsql.org/doc/manual.html#updating-an-existing-database){: target=_blank} - that provides a relatively simple way to keep a database up to date. A more flexible approach is to call `PyOsmium` directly - see [this guide](/serving-tiles/updating-as-people-edit-pyosmium.md) for how to do that. +Using `osm2pgsql` (version 1.4.2 or above) it's now much easier to do this than it was previously. Version 1.6.0 is distributed as part of Ubuntu 22.04; version 1.8.0 as part of Debian 12; version 1.11.0 as part of Ubuntu 24.04, and it can also be obtained by following [these instructions](https://osm2pgsql.org/doc/install.html){: target=_blank}. With `osm2pgsql` comes [osm2pgsql-replication](https://osm2pgsql.org/doc/manual.html#updating-an-existing-database){: target=_blank} - that provides a relatively simple way to keep a database up to date. A more flexible approach is to call `PyOsmium` directly - see [this guide](/serving-tiles/updating-as-people-edit-pyosmium.md) for how to do that. It's possible to set up replication from many different sources. OpenStreetMap itself provides minutely, hourly and daily updates, and other sources such as Geofabrik can provide daily updates that match the regional data extracts available at [download.geofabrik.de](http://download.geofabrik.de/index.html){: target=_blank}. diff --git a/docs/en/serving-tiles/updating-as-people-edit-pyosmium.md b/docs/en/serving-tiles/updating-as-people-edit-pyosmium.md index 98d76b5..5baa587 100644 --- a/docs/en/serving-tiles/updating-as-people-edit-pyosmium.md +++ b/docs/en/serving-tiles/updating-as-people-edit-pyosmium.md @@ -7,7 +7,7 @@ lang: en Every day there are millions of new map updates so to prevent a map becoming "stale" you can refresh the data used to create map tiles regularly. -Using osm2pgsql (version 1.4.2 or above) it's now much easier to do this than it was previously. Suitable versions are distributed as part of Ubuntu 22.04 and Debian 12, and it can also be obtained by following [these instructions](https://osm2pgsql.org/doc/install.html){: target=_blank}. +Using osm2pgsql (version 1.4.2 or above) it's now much easier to do this than it was previously. Suitable versions are distributed as part of Ubuntu 22.04 and 24.04, and Debian 12, and it can also be obtained by following [these instructions](https://osm2pgsql.org/doc/install.html){: target=_blank}. A simpler, but less flexible, method to update a database is to use `osm2pgsql-replication`, described [here](/serving-tiles/updating-as-people-edit-osm2pgsql-replication.md). In this example, we'll use `PyOsmium` to update a database initially loaded from Geofabrik with minutely updates from {: target=_blank}. diff --git a/docs/uk/serving-tiles/manually-building-a-tile-server-ubuntu-24-04-lts.md b/docs/uk/serving-tiles/manually-building-a-tile-server-ubuntu-24-04-lts.md new file mode 100644 index 0000000..0bed444 --- /dev/null +++ b/docs/uk/serving-tiles/manually-building-a-tile-server-ubuntu-24-04-lts.md @@ -0,0 +1,360 @@ +--- +title: Створення тайлового сервера вручну (Ubuntu 24.04) +dist: Ubuntu 24.04 +dl_timestamp: "2024-04-24T20:21:40Z" +lang: uk +--- + +# {{ title }} + +!!! info "" + На цій сторінці міститься опис зі встановлення, розгортання та налаштування всього потрібного програмного забезпечення для роботи вашого тайлового сервера. Покрокові інструкції описують встановлення тайлового сервера на [Ubuntu Linux](https://uk.wikipedia.org/wiki/Ubuntu){: target=_blank} [24.04](http://www.releases.ubuntu.com/24.04/){: target=_blank} (Jammy Jellyfish), вони були перевірені у квітні 2024. + +## Встановлення програмного забезпечення + +Тайловий сервер OpenStreetMap – це набір програмного забезпечення та бібліотек, які працюють разом генеруючи тайли. Як це трапляється доволі часто в OpenStreetMap, існує кілька різних шляхів для досягнення мети і майже кожен компонент має альтернативу, з власними недоліками та перевагами. Цей посібник описує найбільш стандартну версію, що схожа на те, що використовується головним тайловим сервером OpenStreetMap. + +Тайловий сервер складається з пʼяти головних частин: `mod_tile`, `renderd`, `mapnik`, `osm2pgsql` та база даних `postgresql/postgis`. Mod_tile – модуль сервера Apache, який обслуговує тайловий кеш та визначає які тайли потрібно перегенерувати, через їх відсутність у кеші або тому, що вони застаріли. Renderd визначає пріоритети в чергах різного штибу запитів для згладжування навантаження. Mapnik – бібліотека, яка відповідає безпосередньо за створення тайлів з черги, якою керує renderd. + +Завдяки роботі, виконаній супроводжувачами Debian та Ubuntu, по включенню останніх версій цих пакунків у {{ dist }}, ця інструкція є дещо коротшою, ніж її попередні версії. + +Зауважте, що це керівництво було написане та протестоване з використанням нововстановленого сервера з операційною системою {{ dist }}. Якщо у вас встановлені інші версії програмного забезпечення (можливо ви оновились з попередньої версії Ubuntu, або у вас підʼєднані інші репозиторії PPA), можливо вам доведеться внести певні зміни. + +Для того, щоб створити всі ці компоненти, вам спочатку треба встановити наступні залежності. + +Ці настанови передбачають що всі команди виконуються в оточені звичайного облікового запису (не root) з використаннями `sudo`. Не намагайтесь та не робіть все в оточені `root`; система не буде працювати. + +```sh +--8<-- "docs/assets/serving-tiles/ubuntu-24-04-deps.txt" +``` + +На цьому етапі було додано кілька нових облікових записів. Ви можете ознайомитись з ними за допомогою `tail /etc/passwd`. `postgres` – використовується для керування базами даних, які ми будемо використовувати для збереження даних потрібних нам для рендерингу. `_renderd` – використовується фоновою службою `renderd`, і нам далі доведеться переконатись, що більшість команд запускаються саме цим обліковим записом. + +Тепер вам треба створити базу даних postgis. Типові налаштування різноманітних програм очікують що база даних називатиметься gis, тож ми будемо дотримуватись цієї угоди в цім керівництві, хоча це й не обовʼязково. Зверніть увагу, що `_renderd` нижче збігається з іменем користувача, який використовується для фонової служби `renderd`. + +```sh +sudo -u postgres -i +createuser _renderd +createdb -E UTF8 -O _renderd gis +``` + +Поки ви працюєте як користувач `postgres`, встановіть PostGIS в базу даних PostgreSQL: + +```sh +psql +``` + +(це призведе до появи `postgres=#` на початку рядка консолі) + +```sh +\c gis +``` + +(у відповідь ви побачите: "You are now connected to database `'gis'` as user `'postgres'`"
\["Тепер ви підʼєднані до бази даних `'gis'` як користувач `'postgres'`"\]) + +```sql +CREATE EXTENSION postgis; +``` + +(у відповідь ви побачите: CREATE EXTENSION) + +```sql +CREATE EXTENSION hstore; +``` + +(у відповідь ви побачите: CREATE EXTENSION) + +```sql +ALTER TABLE geometry_columns OWNER TO _renderd; +``` + +(у відповідь ви побачите: ALTER TABLE) + +```sql +ALTER TABLE spatial_ref_sys OWNER TO _renderd; +``` + +(у відповідь ви побачите: ALTER TABLE) + +```sh +\q +``` + +(це призведе до виходу з сесії psql та повернення назад у консоль Linux) + +```sh +exit +``` + +(повернення назад до сесії користувача, в якій ми знаходились до виконання команди `sudo -u postgres -i` вище) + +## Mapnik + +Mapnik ми встановили раніше, разом із "sudo", перевіримо чи він працює: + +```py +python3 +>>> import mapnik +>>> +``` + +Якщо python у відповідь видає тільки `>>>` без повідомлення про помилки, значить бібліотека Mapnik є доступною в Python. Вітаємо! Для виходу із сесії Python скористайтесь наступною командою: + +```py +>>> quit() +``` + +## Налаштування стилів + +Тепер, після того, як все потрібне програмне забезпечення встановлене, вам треба завантажити та налаштувати стилі. + +Стиль, який ми будемо використовувати, – це стиль який застосовується для створення "Стандартного" шару на сайті openstreetmap.org. Ми обрали його через гарну документацію і те, що він здатен працювати для будь-якої частини світу, навіть там де не використовується латинка. Але у нього є й певні недоліки – це компромісні рішення для того, щоб працювати в глобальних масштабах, він дуже складний для розуміння та внесення змін, якщо вам доведеться їх вносити. + +Код стилю "OpenStreetMap Carto" з веб-сайту openstreetmap.org знаходиться на GitHub – {: target=_blank} та також має власні інструкції зі встановлення – {: target=_blank}. Про те, що потрібно зробити, ми розповімо тут. + +Передбачається що ми розміщуємо стиль в теці `~/src` домашньої директорії звичайного користувача (не root); потім ми надамо доступ до нього обліковому запису `_renderd`. + +```sh +mkdir ~/src +cd ~/src +git clone https://github.com/gravitystorm/openstreetmap-carto +cd openstreetmap-carto +``` + +Далі, встановимо потрібну версію компілятора `carto`. + +```sh +sudo npm install -g carto +carto -v +``` + +У відповідь ми маємо отримати інформацію про номер версії, яка має бути не менше ніж: + +```sh +1.2.0 +``` + +Після цього ми перетворимо проєкт carto у зрозумілий для Mapnik вигляд: + +```sh +carto project.mml > mapnik.xml +``` + +Тепер у нас є стиль Mapnik XML – `/home/youruseraccount/src/openstreetmap-carto/mapnik.xml`. + +## Завантаження даних + +Для початку, завантажимо невеличку частину тестових даних. Серед різномаїття місць для отримання даних, оберемо `download.geofabrik.de`, що містить великий перелік різних варіантів для завантаження. Візьмімо для прикладу Азербайджан (~32.4 Мб). + +Перейдіть за посиланням {: target=_blank} та зверніть увагу на дату "This file was last modified" (щось схоже на "{{ dl_timestamp }}"). Вона нам знадобиться потім, коли у нас виникне потреба оновити наші дані даними, які учасники OpenStreetMap додали з моменту нашого імпорту. Завантажимо дані: + +```sh +mkdir ~/data +cd ~/data +wget https://download.geofabrik.de/asia/azerbaijan-latest.osm.pbf +``` + +Далі нам треба переконатись, що обліковий запис `_renderd` має доступ до стилю. Йому потрібен доступ до всього, що ви завантажили для нього, але, типово, він не повинен мати доступу до вашої домашньої теки. Якщо ми передбачаємо використовувати теку `~/src` для цього перейдіть до неї та виконайте команду + +```sh +chmod o+rx ~ +``` + +Якщо ви не бажаєте робити цього, ви можете перемістити стиль в інше місце та змінити посилання на розташування файлів у наступних командах. + +Наступна команда допоможе вам перенести завантажені дані до вашої бази даних. На цьому етапі зросте навантаження на дискові операції через потребу перенесення значного обсягу інформації; імпорт всієї планети може тривати кілька годин, днів та навіть тижнів, в залежності від потужностей вашого серверного обладнання. Зрозуміло, що для невеликих частин даних імпорт відбувається значно швидше, можливо вам доведеться поекспериментувати зі значенням параметра `-C`, щоб вкластись у наявну оперативну памʼять вашого сервера. Зверніть увагу, що ми робимо це в оточені користувача `_renderd`. + +```sh +sudo -u _renderd osm2pgsql \ + -d gis --create --slim -G --hstore \ + --tag-transform-script \ + ~/src/openstreetmap-carto/openstreetmap-carto.lua \ + -C 2500 --number-processes 1 \ + -S ~/src/openstreetmap-carto/openstreetmap-carto.style \ + ~/data/azerbaijan-latest.osm.pbf +``` + +Розберімося що означають всі ці параметри: + +`-d gis` +: База даних, з якою ми працюємо (типово використовується `gis`; тут треба вказати її явно). + +`--create` +: Завантажити дані в пусту базу даних, замість спроб додати їх до наявних. + +`--slim` +: osm2pgsql може використовувати різноманітні схеми таблиць; "slim" годиться для генерації тайлів. + +`-G` +: Визначає, яким чином будуть оброблятись мультиполігони. + +`--hstore` +: Дозволяє використовувати для генерації тайлів теґи, для яких немає окремих стовпців в базі даних. + +`--tag-transform-script ~/src/openstreetmap-carto/openstreetmap-carto.lua` +: Визначає скрипт lua, який використовується для обробки теґів. Це простий спосіб обробки теґів OSM до того, як вони будуть використані в стилі, що спрощує логіку самого стилю. + +`-C 2500` +: Виділяє 2.5 Гб оперативної памʼяті для osm2pgsql на виконання імпорту. Якщо у вас менше оперативної памʼяті, спробуйте менше значення. Якщо процес імпорту буде знищений через нестачу оперативної памʼяті, спробуйте зменшити це число або використовуйте менший обсяг даних. + +`--number-processes 1` +: Використовувати одне ядро процесора. Якщо у вас багатоядерний процесор можете використовувати більшу кількість ядер. + +`-S ~/src/openstreetmap-carto/openstreetmap-carto.style` +: Створювати стовпці в базі даних використовуючи вказаний файл (в нашому випадку він нічим не відрізняється від стандартного "openstreetmap-carto") + +`~/data/azerbaijan-latest.osm.pbf` +: Останній аргумент – це файл з даними для завантаження в базу. + +Результатом роботи цієї команди має бути щось схоже на "osm2pgsql took 163s (2m 43s) overall". + +### Створення індексів + +Починаючи з версії 5.3.0, деякі додаткові індекси мають бути [застосовані вручну](https://github.com/gravitystorm/openstreetmap-carto/blob/master/CHANGELOG.md#v530---2021-01-28){: target=_blank}:. + +```sh +cd ~/src/openstreetmap-carto/ +sudo -u _renderd psql -d gis -f indexes.sql +``` + +Скрипт має повідомити `CREATE INDEX` 14 разів. + +### Завантаження Shapefile + +Попри те, що більшість даних для створення мапи береться з файлу з даними OpenStreetMap, який ви завантажили раніше, деякі файли в форматі shapefile все ж такі потрібні для таких речей, наприклад, як кордони країн на великих масштабах. Завантажте їх та проіндексуйте: + +```sh +cd ~/src/openstreetmap-carto/ +mkdir data +sudo chown _renderd data +sudo -u _renderd scripts/get-external-data.py +``` + +Цей процес вимагає завантаження великої порції даних та триватиме деякий час без будь-яких помітних змін на екрані. Частина даних записується безпосередньо у базу даних, а інша у підтеку "data" в "openstreetmap-carto". Якщо у вас тут виникнуть проблеми, то це скоріше через те, що [дані Natural Earth](https://github.com/nvkelso/natural-earth-vector/issues/581#issuecomment-913988101){: target=_blank} можуть бути не в тому місці. Якщо вам потрібно змінити місце куди ви завантажуєте дані Natural Earth – внесіть зміни у власну копію [цього файлу](https://github.com/gravitystorm/openstreetmap-carto/blob/master/external-data.yml){: target=_blank}. + +### Шрифти + +Починаючи з версії v5.6.0 шрифти для Carto потрібно встановити вручну: + +```sh +cd ~/src/openstreetmap-carto/ +scripts/get-fonts.sh +``` + +Наші тестові дані (Азербайджан) були обрані через їх невеликий обсяг, а також через те, що армянська писемність використовує власну абетку. + +## Налаштування веб-сервера + +### Конфігурація renderd + +Налаштування `renderd` в {{ dist }} знаходяться у файлі `/etc/renderd.conf`. Відредагуємо його за допомогою текстового редактора, такого як nano: + +```sh +sudo nano /etc/renderd.conf +``` + +Додайте розділ, подібний наведеному, в кінець файлу налаштувань: + +```ini +[s2o] +URI=/hot/ +XML=/home/accountname/src/openstreetmap-carto/mapnik.xml +HOST=localhost +TILESIZE=256 +MAXZOOM=20 +``` + +Можливо розташування файлу XML `/home/accountname/src/openstreetmap-carto/mapnik.xml` доведеться змінити на те, що використовується у вашій системі. Ви можете змінити `[s2o]` та `URI=/hot/` на те, що вам треба. Якщо ви бажаєте рендерити більше одного набору тайлів на одному сервері, ви можете додати ще один розділ, подібний до `[s2o]`, з налаштуваннями для іншого стилю. Якщо ви бажаєте, щоб він посилався на іншу базу замість типової `gis`, ви також можете зробити це, але пояснення того, як це робити виходить за межі цього документа. Якщо у вас десь 2 Гб оперативної памʼяті, можливо вам доведеться зменшити кількість потоків (`num_threads`) до 2. `URI=/hot/` було обрано для того щоби було простіше використовувати ваші тайли замість шару Humanitarian з сайту OpenStreetMap.org. Ви можете вказати щось інше, але `/hot/` також годиться. + +Під час написання цієї інструкції, версія Mapnik в {{ dist }} була 3.1, а налаштування `plugins_dir` – в розділі `[mapnik]` файлу `/usr/lib/mapnik/3.1/input`. Номер версії "3.1" може змінитись в майбутньому. У разі виникнення помилки під час спроб рендерингу тайлів, на кшталт цієї: + +!!! warning "" + An error occurred while loading the map layer 's2o': Could not create datasource for type: 'postgis' (no datasource plugin directories have been successfully registered) encountered during parsing of layer 'landcover-low-zoom' + +перевірте `/usr/lib/mapnik` та подивіться, яка версія в назві теки, а також погляньте на `/usr/lib/mapnik/(version)/input`, щоб переконатись, що файл `postgis.input` знаходиться там. + +Тепер, коли ми вказали `renderd`, як реагувати на запити рендерингу тайлів, нам потрібно повідомити вебсерверу Apache, що він може надсилати їх. На жаль, конфігурацію для цього було видалено з останніх версій `mod_tile`. Однак зараз її можна встановити звідси: + +```sh +cd /etc/apache2/conf-available/ +sudo wget https://raw.githubusercontent.com/openstreetmap/mod_tile/python-implementation/etc/apache2/renderd.conf +sudo a2enconf renderd +sudo systemctl reload apache2 +``` + +#### Переконайтеся, що у вас є повідомлення для відлагодження + +На цьому етапі було б дуже корисно бачити результати процесу рендерінгу тайлів, включаючи будь-які помилки. Типово в останніх версіях mod_tile це вимкнено. Щоб увімкнути: + +```sh +sudo nano /usr/lib/systemd/system/renderd.service +``` + +Якщо немає, додайте наступний рядок + +```ini +Environment=G_MESSAGES_DEBUG=all +``` + +після `[Service]`. Потім: + +```sh +sudo systemctl daemon-reload +sudo systemctl restart renderd +sudo systemctl restart apache2 +``` + +### Конфігурація Apache + +Якщо ви глянете у `/var/log/syslog`, ви маєте побачити повідомлення від служби `renderd`. Можливо там будуть тільки повідомлення про помилки, не переймайтесь зараз цим. Далі: + +```sh +sudo /etc/init.d/apache2 restart +``` + +В `syslog` має бути щось подібне до наступного: + +```log +Apr 23 11:14:10 servername apachectl[2031]: [Sat Apr 23 11:14:10.190678 2024] [tile:notice] [pid 2031:tid 140608477239168] Loading tile config s2o at /hot/ for zooms 0 - 20 from tile directory /var/cache/renderd/tiles with extension .png and mime type image/png +``` + +Далі, відкрийте в оглядачі `http://ip.вашого.сервера/index.html` (замініть `ip.вашого.сервера` на відповідну адресу). Ви маєте побачити типову сторінку сервера Apache2 встановленого в Ubuntu. + +!!! tip "Порада" + якщо ви не знаєте IP адресу призначену серверу, її можна дізнатись за допомогою команди `ifconfig` – якщо мережеві налаштування не надто складні, то це має бути щось типу `inet addr` відмінне від `127.0.0.1`. + +Якщо ви використовуєте сервер постачальника послуг хостингу, то, швидше за все, внутрішня адреса вашого сервера буде відрізнятися від зовнішньої адреси, яка була надана вам, але ця зовнішня IP-адреса вже буде надіслана вам, і, ймовірно, ви її використовуєте зараз для доступу до сервера. + +Зауважте, що це лише сайт `http` (порт 80) – вам потрібно витратити трохи більше часу для налаштування Apache на використання `https`, але це виходить за межі цих інструкцій. Однак якщо ви використовуєте "Let's Encrypt" для отримання сертифікатів, інструкція зі встановлення може також містити поради щодо налаштування сайту Apache для використання https. + +Далі, в оглядачі відкрийте посилання: `http://ip.вашого.сервера/hot/0/0/0.png` + +Якщо ви вище поміняли `URI=/hot/` вам доведеться підправити посилання. Ви маєте побачити маленьку мапу світу. Якщо її немає, перевірте повідомлення про помилки в консолі. Скоріш за все ви щось наплутали з дозволами, або ви пропустили якийсь крок з інструкції. Якщо ви не отримали тайл та отримуєте інші посилання, скопіюйте вивід в Pastebin, та зверніться за допомогою, наприклад, в [`community.openstreetmap.org`](https://community.openstreetmap.org){: target=_blank}. + +## Перегляд тайлів + +Для того, щоб побачити тайли, ми трохи змахлюємо користуючись файлом `sample_leaflet.html` з теки “extras” в mod_tile. + +```sh +cd /var/www/html +sudo wget https://raw.githubusercontent.com/SomeoneElseOSM/mod_tile/switch2osm/extra/sample_leaflet.html +sudo nano sample_leaflet.html +``` + +Змініть його так, щоб IP-адреса була `ip.вашого.сервера`, а не просто `127.0.0.1`. Це повинно дозволити вам отримати доступ до цього сервера. Потім перейдіть до `http://ip.вашого.сервера/sample_leaflet.html`. + +Згодом ви побачите мапу. Ви зможете збільшувати та зменшувати її масштаб, але в залежності від потужностей сервера, деякі тайли можуть бути сірими (вони ще не встигли обробитись сервером). Однак, як тільки їх обробка завершиться, вони будуть готові для перегляду. Якщо ви подивитесь у `/var/log/syslog`, ви маєте побачити запити на показ тайлів. + +Отже, щоб побачити їх, коли вони запитуються, підʼєднайтеся через ssh та виконайте команду: + +```sh +tail -f /var/log/syslog | grep " TILE " +``` + +(зверніть увагу на пробіли довкола `" TILE "`) + +У відповідь ви отримуватимете по рядку кожного разу, коли буде приходити запит на показ тайлів, або буде закінчуватись їх створення. + +За бажанням, ви можете збільшити значення `ModTileMissingRequestTimeout` у `/etc/apache2/conf-available/renderd.conf` з 10 секунд до, скажімо, 30 або 60, для того, щоб дати більше часу серверу на створення тайлів перед тим як показати сірий фон на замість них. Перевірте, що ви виконали команди `#!shsudo service renderd restart` та `#!shsudo service apache2 restart` після внесення змін. + +Вітаємо! Тепер ви можете повернутись до розділу [Використання тайлів](/using-tiles/index.md) для додавання мапи, що використовує ваш новий тайловий сервер. diff --git a/docs/uk/serving-tiles/monitoring-using-munin.md b/docs/uk/serving-tiles/monitoring-using-munin.md index a5806a3..9e522e5 100644 --- a/docs/uk/serving-tiles/monitoring-using-munin.md +++ b/docs/uk/serving-tiles/monitoring-using-munin.md @@ -5,7 +5,7 @@ lang: uk # {{ title }} -Для моніторингу активності служб `renderd` та `mod_tile` можна використовувати "Munin". Munin доступний на багатьох платформах; ця інструкція була протестована на Ubuntu Linux 22.04 в червні 2022. +Для моніторингу активності служб `renderd` та `mod_tile` можна використовувати "Munin". Munin доступний на багатьох платформах; ця інструкція була протестована на Ubuntu Linux 22.04 в червні 2022 та Ubuntu Linux 24.04 у квітні 2024. Встановимо потрібне програмне забезпечення: diff --git a/docs/uk/serving-tiles/updating-as-people-edit-osm2pgsql-replication.md b/docs/uk/serving-tiles/updating-as-people-edit-osm2pgsql-replication.md index 54da5b6..f9cd454 100644 --- a/docs/uk/serving-tiles/updating-as-people-edit-osm2pgsql-replication.md +++ b/docs/uk/serving-tiles/updating-as-people-edit-osm2pgsql-replication.md @@ -7,7 +7,7 @@ lang: uk Щодня зʼявляються мільйони нових оновлень на мапі, щоб не допустити, щоб ваша мапа стала «застарілою», ви можете регулярно оновлювати дані, які використовуються для створення тайлів. -З переходом на останню версію `osm2pgsql` (версія 1.4.2 та свіжіше) оновлювати дані стало на багато простіше ніж раніш. Версія 1.6.0 постачається в складі Ubuntu 22.04; версія 1.8.0 – як частина Debian 12, їх можна встановити слідуючи [інструкції з osm2pgsql.org](https://osm2pgsql.org/doc/install.html){: target=_blank}. Разом з `osm2pgsql` йде [osm2pgsql-replication](https://osm2pgsql.org/doc/manual.html#updating-an-existing-database){: target=_blank} – що надає порівняно простий спосіб підтримувати дані в базі в актуальному стані. Більш гнучким способом буде безпосередній виклик `PyOsmium`, [тут докладніше](/serving-tiles/updating-as-people-edit-pyosmium.md) про це. +З переходом на останню версію `osm2pgsql` (версія 1.4.2 та свіжіше) оновлювати дані стало на багато простіше ніж раніш. Версія 1.6.0 постачається в складі Ubuntu 22.04; версія 1.8.0 – як частина Debian 12; версія 1.11.0 – як частина Ubuntu 24.04, їх можна встановити слідуючи [інструкції з osm2pgsql.org](https://osm2pgsql.org/doc/install.html){: target=_blank}. Разом з `osm2pgsql` йде [osm2pgsql-replication](https://osm2pgsql.org/doc/manual.html#updating-an-existing-database){: target=_blank} – що надає порівняно простий спосіб підтримувати дані в базі в актуальному стані. Більш гнучким способом буде безпосередній виклик `PyOsmium`, [тут докладніше](/serving-tiles/updating-as-people-edit-pyosmium.md) про це. Ви можете налаштувати отримання даних з різних джерел. OpenStreetMap надає можливість отримувати щохвилинні, щогодинні та щоденні оновлення, інші джерела можуть надавати щоденні оновлення, наприклад Geofabrik надає щоденні оновлення регіональних витягів даних, які можна отримати на [download.geofabrik.de](http://download.geofabrik.de/index.html){: target=_blank}. diff --git a/docs/uk/serving-tiles/updating-as-people-edit-pyosmium.md b/docs/uk/serving-tiles/updating-as-people-edit-pyosmium.md index e1e4427..690aab1 100644 --- a/docs/uk/serving-tiles/updating-as-people-edit-pyosmium.md +++ b/docs/uk/serving-tiles/updating-as-people-edit-pyosmium.md @@ -7,7 +7,7 @@ lang: uk Щодня зʼявляються мільйони нових оновлень на мапі, щоб не допустити, щоб ваша мапа стала «застарілою», ви можете регулярно оновлювати дані, які використовуються для створення тайлів. -З переходом на останню версію osm2pgsql (версія 1.4.2 та свіжіше) оновлювати дані стало на багато простіше ніж раніше. Відповідні версії розповсюджується в складі Ubuntu 22.04 та Debian 12, їх можна встановити слідуючи [інструкції з osm2pgsql.org](https://osm2pgsql.org/doc/install.html){: target=_blank}. +З переходом на останню версію osm2pgsql (версія 1.4.2 та свіжіше) оновлювати дані стало на багато простіше ніж раніше. Відповідні версії розповсюджується в складі Ubuntu 22.04, 24.04 та Debian 12, їх можна встановити слідуючи [інструкції з osm2pgsql.org](https://osm2pgsql.org/doc/install.html){: target=_blank}. Простіший, але менш гнучкий метод оновлення даних, – використання `osm2pgsql-replication` (див [тут](/serving-tiles/updating-as-people-edit-osm2pgsql-replication.md)). Тут для оновлення даних в нашій базі ми будемо використовувати `PyOsmium` для оновлення даних, які ми отримали з Geofabrik хвилинними оновленнями з {: target=_blank}. diff --git a/mkdocs.yml b/mkdocs.yml index 04b8f22..b6a90be 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,8 +1,8 @@ site_name: Switch2OSM -site_url: https://switch2osm.org +site_url: https://andygol.co.ua/switch2osm-mkdocs -repo_url: https://github.com/switch2osm/switch2osm -repo_name: switch2osm/switch2osm +repo_url: https://github.com/Andygol/switch2osm-mkdocs +repo_name: Andygol/switch2osm-mkdocs edit_uri: edit/main/docs/ @@ -113,6 +113,7 @@ nav: - Manually: - Debian 12: serving-tiles/manually-building-a-tile-server-debian-12.md - Debian 11: serving-tiles/manually-building-a-tile-server-debian-11.md + - Ubuntu 24.04: serving-tiles/manually-building-a-tile-server-ubuntu-24-04-lts.md - Ubuntu 22.04: serving-tiles/manually-building-a-tile-server-ubuntu-22-04-lts.md - Ubuntu 20.04: serving-tiles/manually-building-a-tile-server-ubuntu-20-04-lts.md - Ubuntu 18.04: serving-tiles/manually-building-a-tile-server-ubuntu-18-04-lts.md @@ -240,6 +241,6 @@ plugins: Providers: 提供者 More: 取得協助 - locale: "null" - fixed_link: https://github.com/switch2osm/switch2osm#Translation + fixed_link: https://app.transifex.com/osm-ua/swtch2osm/dashboard/#/ name: Help to translate - \ No newline at end of file +