f932f0103f
Bumps [moka](https://github.com/moka-rs/moka) from 0.12.1 to 0.12.2. <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/moka-rs/moka/blob/main/CHANGELOG.md">moka's changelog</a>.</em></p> <blockquote> <h2>Version 0.12.2</h2> <h3>Fixed</h3> <ul> <li>Prevent timing issues in writes that cause inconsistencies between the cache's internal data structures (<a href="https://redirect.github.com/moka-rs/moka/issues/348">#348</a>[gh-pull-0348]): <ul> <li>One way to trigger the issue is that insert the same key twice quickly, once when the cache is full and a second time when there is a room in the cache. <ul> <li>When it occurs, the cache will not return the value inserted in the second call (which is wrong), and the <code>entry_count</code> method will keep returning a non zero value after calling the <code>invalidate_all</code> method (which is also wrong).</li> </ul> </li> </ul> </li> <li>Now the last access time of a cached entry is updated immediately after the entry is read (<a href="https://redirect.github.com/moka-rs/moka/issues/363">#363</a>[gh-pull-0363]): <ul> <li>When the time-to-idle of a cache is set, the last access time of a cached entry is used to determine if the entry has been expired.</li> <li>Before this fix, the access time was updated (to the time when it was read) when pending tasks were processed. This delay caused issue that some entries become temporarily unavailable for reads even though they have been accessed recently. And then they will become available again after the pending tasks are processed.</li> <li>Now the last access time is updated immediately after the entry is read. The entry will remain valid until the time-to-idle has elapsed.</li> </ul> </li> </ul> <p>Note that both of <a href="https://redirect.github.com/moka-rs/moka/issues/348">#348</a>[gh-pull-0348] and <a href="https://redirect.github.com/moka-rs/moka/issues/363">#363</a>[gh-pull-0363] were already present in <code>v0.11.x</code> and older versions. However they were less likely to occur because they had background threads to periodically process pending tasks. So there were much shorter time windows for these issues to occur.</p> <h3>Changed</h3> <ul> <li>Updated the Rust edition from 2018 to 2021. (<a href="https://redirect.github.com/moka-rs/moka/issues/339">#339</a>[gh-pull-0339], by [<a href="https://github.com/nyurik"><code>@nyurik</code></a>][gh-nyurik]) <ul> <li>The MSRV remains at Rust 1.65.</li> </ul> </li> <li>Changed to use inline format arguments throughout the code, including examples. (<a href="https://redirect.github.com/moka-rs/moka/issues/340">#340</a>[gh-pull-0340], by [<a href="https://github.com/nyurik"><code>@nyurik</code></a>][gh-nyurik])</li> </ul> <h3>Added</h3> <ul> <li>Added an example for cascading drop triggered by eviction (<a href="https://redirect.github.com/moka-rs/moka/issues/350">#350</a>[gh-pull-0350], by [<a href="https://github.com/peter-scholtens"><code>@peter-scholtens</code></a>][gh-peter-scholtens])</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href=" |
||
---|---|---|
.cargo-husky/hooks | ||
.github | ||
debian | ||
demo | ||
docs | ||
martin | ||
martin-tile-utils | ||
mbtiles | ||
tests | ||
.dockerignore | ||
.gitignore | ||
Cargo.lock | ||
Cargo.toml | ||
CHANGELOG.md | ||
CODE_OF_CONDUCT.md | ||
docker-compose.yml | ||
justfile | ||
LICENSE-APACHE | ||
LICENSE-MIT | ||
logo.png | ||
README.md | ||
rustfmt.toml | ||
SECURITY_POLICY.txt |
Martin is a tile server able to generate and serve vector tiles on the fly from large PostGIS databases, PMTile (local or remote), and MBTile files, allowing multiple tile sources to be dynamically combined into one. Martin optimizes for speed and heavy traffic, and is written in Rust.
Additionally, there are several tools for generating tiles in bulk from any Martin-supported sources (similar to tilelive-copy
), copying tiles between MBTiles files, creating deltas (patches) and applying them, and validating MBTiles files.
See Martin book for complete documentation.
Installation
See installation instructions in the Martin book.
Prerequisites: If using Martin with PostgreSQL database, you must install PostGIS with at least v3.0+, v3.1+ recommended.
You can download martin from GitHub releases page.
Platform | AMD-64 | ARM-64 |
---|---|---|
Linux | .tar.gz (gnu) .tar.gz (musl) .deb |
.tar.gz (musl) |
macOS | .tar.gz | .tar.gz |
Windows | .zip |
If you are using macOS and Homebrew you can install martin
and mbtiles
using Homebrew tap.
brew tap maplibre/martin
brew install martin
Running Martin Service
See running instructions in the Martin book.
Martin supports any number of PostgreSQL/PostGIS database connections with geospatial-enabled tables and tile-producing SQL functions, as well as PMTile and MBTile files as tile sources.
Martin can auto-discover tables and functions using a connection string. A PG connection string can also be passed via the DATABASE_URL
environment variable.
Each tile source will have a TileJSON endpoint.
Examples
# publish all tables and functions from a single database
export DATABASE_URL="postgresql://user:password@host:port/database"
martin
# same as above, but passing connection string via CLI, together with a directory of .mbtiles/.pmtiles files
martin postgresql://user:password@host:port/database path/to/dir
# publish all discovered tables/funcs from two DBs
# and generate config file with all detected sources
martin postgres://... postgres://... --save-config config.yaml
# use configuration file instead of auto-discovery
martin --config config.yaml
Docker Example
See Docker instructions in the Martin book.
Martin is also available as a Docker image. You could either share a configuration file from the host with the container via the -v
param, or you can let Martin auto-discover all sources e.g. by passing DATABASE_URL
or specifying the .mbtiles/.pmtiles files.
export PGPASSWORD=postgres # secret!
docker run -p 3000:3000 \
-e PGPASSWORD \
-e DATABASE_URL=postgresql://user@host:port/db \
-v /path/to/config/dir:/config \
ghcr.io/maplibre/martin --config /config/config.yaml
API
See API documentation in the Martin book.
Martin data is available via the HTTP GET
endpoints:
URL | Description |
---|---|
/ |
Status text, that will eventually show web UI |
/catalog |
List of all sources |
/{sourceID} |
Source TileJSON |
/{sourceID}/{z}/{x}/{y} |
Map Tiles |
/{source1},…,{sourceN} |
Composite Source TileJSON |
/{source1},…,{sourceN}/{z}/{x}/{y} |
Composite Source Tiles |
/sprite/{spriteID}[@2x].{json,png} |
Sprites (low and high DPI, index/png) |
/font/{font}/{start}-{end} |
Font source |
/font/{font1},…,{fontN}/{start}-{end} |
Composite Font source |
/health |
Martin server health check: returns 200 OK |
Re-use Martin as a library
Martin can be used as a standalone server, or as a library in your own Rust application. When used as a library, you can use the following features:
- postgres - enable PostgreSQL/PostGIS tile sources
- pmtiles - enable PMTile tile sources
- mbtiles - enable MBTile tile sources
- fonts - enable font sources
- sprites - enable sprite sources
Documentation
See Martin book for complete documentation.
License
Licensed under either of
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT) at your option.
Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.