Skip to content

Commit f038dc0

Browse files
committed
chore: openmaptiles fonts are bundled in the image
1 parent 9d7b074 commit f038dc0

3 files changed

Lines changed: 30 additions & 8 deletions

File tree

Dockerfile

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,20 @@ RUN apk add --no-cache python3 make g++ git
1111
COPY package.json package-lock.json ./
1212
RUN npm ci --omit=dev --omit=optional --no-audit --no-fund
1313

14+
##########################
15+
FROM alpine:3.19 AS fonts
16+
17+
RUN apk add --no-cache wget unzip
18+
RUN mkdir -p /app/fonts && \
19+
wget -q https://github.com/openmaptiles/fonts/releases/download/v2.0/v2.0.zip -O /tmp/fonts.zip && \
20+
unzip -q /tmp/fonts.zip -d /app/fonts && \
21+
rm /tmp/fonts.zip
22+
1423
##########################
1524
FROM base AS main
1625

1726
COPY --from=deps /app/node_modules node_modules
27+
COPY --from=fonts /app/fonts /app/fonts
1828
COPY src src
1929
COPY package.json README.md* LICENSE ./
2030

src/build-config.ts

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
import { mkdir, writeFile } from 'node:fs/promises'
1+
import { mkdir, rm, writeFile } from 'node:fs/promises'
2+
import { createReadStream } from 'node:fs'
23
import { join, relative } from 'node:path'
3-
import { ensureArtefact, ensureArtefactFile } from '@data-fair/lib-node-registry'
4+
import { ensureArtefactFile, extractTarball } from '@data-fair/lib-node-registry'
45
import config from '#config'
56
import log from '#log'
67
import { listArtefacts, type Artefact } from './registry-client.ts'
@@ -34,17 +35,19 @@ export const buildTileserverConfig = async (): Promise<TileserverConfig> => {
3435
root: config.dataDir,
3536
mbtiles: join(cacheRoot, 'tilesets'),
3637
styles: join(cacheRoot, 'styles'),
37-
fonts: join(cacheRoot, 'fonts'),
38+
fonts: config.fontsDir,
3839
sprites: join(cacheRoot, 'sprites')
3940
}
40-
for (const d of Object.values(dirs)) await mkdir(d, { recursive: true })
41+
for (const d of [dirs.root, dirs.mbtiles, dirs.styles, dirs.sprites]) await mkdir(d, { recursive: true })
42+
const styleTarballs = join(cacheRoot, 'style-tarballs')
43+
await mkdir(styleTarballs, { recursive: true })
4144

4245
log.info('listing tilesets from registry...')
4346
const tilesets = await listArtefacts({ category: 'tileset', format: 'file' })
4447
log.info(`found ${tilesets.length} tilesets`)
4548

4649
log.info('listing styles from registry...')
47-
const styles = await listArtefacts({ category: 'maplibre-style' })
50+
const styles = await listArtefacts({ category: 'maplibre-style', format: 'file' })
4851
log.info(`found ${styles.length} styles`)
4952

5053
const data: TileserverConfig['data'] = {}
@@ -66,13 +69,20 @@ export const buildTileserverConfig = async (): Promise<TileserverConfig> => {
6669
const stylesCfg: TileserverConfig['styles'] = {}
6770
for (const s of styles) {
6871
log.info(`ensuring style ${s._id}...`)
69-
const { path: styleDir } = await ensureArtefact({
72+
const { path: tarballPath, downloaded } = await ensureArtefactFile({
7073
registryUrl: config.registryUrl,
7174
secretKey: config.registrySecret,
7275
artefactId: s._id,
73-
version: 'latest',
74-
cacheDir: dirs.styles
76+
cacheDir: styleTarballs,
77+
fileName: `${s._id}.tgz`
7578
})
79+
const styleDir = join(dirs.styles, s._id)
80+
if (downloaded) {
81+
log.info(`style ${s._id} downloaded, extracting...`)
82+
await rm(styleDir, { recursive: true, force: true })
83+
await mkdir(styleDir, { recursive: true })
84+
await extractTarball(createReadStream(tarballPath), styleDir)
85+
}
7686
const styleName = stylePackageName(s)
7787
await normalizeStyle({ styleDir, styleName, tilesetIds })
7888
const rel = relative(dirs.styles, join(styleDir, 'style.json'))

src/config.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ const EnvSchema = z.object({
44
REGISTRY_URL: z.string().url(),
55
REGISTRY_SECRET: z.string().min(1),
66
DATA_DIR: z.string().default('/data'),
7+
FONTS_DIR: z.string().default('/app/fonts'),
78
PUBLIC_URL: z.string().url().optional(),
89
PORT: z.coerce.number().int().positive().default(8080),
910
LOG_LEVEL: z.enum(['trace', 'debug', 'info', 'warn', 'error']).default('info'),
@@ -27,6 +28,7 @@ const config = {
2728
registryUrl: env.REGISTRY_URL,
2829
registrySecret: env.REGISTRY_SECRET,
2930
dataDir: env.DATA_DIR,
31+
fontsDir: env.FONTS_DIR,
3032
publicUrl: env.PUBLIC_URL,
3133
port: env.PORT,
3234
logLevel: env.LOG_LEVEL,

0 commit comments

Comments
 (0)