From eed72368c1a6fb89d993d368d3a1f4799c3cdb2b Mon Sep 17 00:00:00 2001 From: Kevin Veen-Birkenbach Date: Sun, 6 Jul 2025 12:08:37 +0200 Subject: [PATCH] Added simple-icons role draft --- roles/docker-simpleicons/templates/Dockerfile | 25 +++++++++ .../templates/docker-compose.yml | 14 +++++ .../docker-simpleicons/templates/package.json | 9 +++ roles/docker-simpleicons/templates/server.js | 55 +++++++++++++++++++ 4 files changed, 103 insertions(+) create mode 100644 roles/docker-simpleicons/templates/Dockerfile create mode 100644 roles/docker-simpleicons/templates/docker-compose.yml create mode 100644 roles/docker-simpleicons/templates/package.json create mode 100644 roles/docker-simpleicons/templates/server.js diff --git a/roles/docker-simpleicons/templates/Dockerfile b/roles/docker-simpleicons/templates/Dockerfile new file mode 100644 index 00000000..5efaebf5 --- /dev/null +++ b/roles/docker-simpleicons/templates/Dockerfile @@ -0,0 +1,25 @@ +# ---- Builder Stage ---- +FROM node:latest AS builder + +WORKDIR /app +# Nur package.json und package-lock.json kopieren für schnellere Caching-Layers +COPY package*.json ./ + +# simple-icons installieren +RUN npm install + +# ---- Runtime Stage ---- +FROM node:latest + +WORKDIR /app +# Nur node_modules aus dem Builder übernehmen +COPY --from=builder /app/node_modules ./node_modules +# Kopiere den Server-Code +COPY server.js . + +# Port, auf dem der Server lauscht +ENV PORT=3000 +EXPOSE 3000 + +# Startbefehl +CMD ["node", "server.js"] diff --git a/roles/docker-simpleicons/templates/docker-compose.yml b/roles/docker-simpleicons/templates/docker-compose.yml new file mode 100644 index 00000000..fde6408f --- /dev/null +++ b/roles/docker-simpleicons/templates/docker-compose.yml @@ -0,0 +1,14 @@ +version: '3.8' + +services: + icons: + build: + context: . + dockerfile: Dockerfile + image: simpleicons-server:latest + container_name: simpleicons-server + ports: + - "3000:3000" + environment: + - PORT=3000 + restart: unless-stopped diff --git a/roles/docker-simpleicons/templates/package.json b/roles/docker-simpleicons/templates/package.json new file mode 100644 index 00000000..c42640b6 --- /dev/null +++ b/roles/docker-simpleicons/templates/package.json @@ -0,0 +1,9 @@ +{ + "name": "simpleicons-server", + "type": "module", + "dependencies": { + "express": "^4.18.2", + "simple-icons": "^9.0.0", + "sharp": "^0.32.0" + } +} diff --git a/roles/docker-simpleicons/templates/server.js b/roles/docker-simpleicons/templates/server.js new file mode 100644 index 00000000..6db151ec --- /dev/null +++ b/roles/docker-simpleicons/templates/server.js @@ -0,0 +1,55 @@ +import express from 'express'; +import * as icons from 'simple-icons'; +import sharp from 'sharp'; + +const app = express(); +const port = process.env.PORT || 3000; + +// Helper: turn 'nextcloud' → 'siNextcloud' +function getExportName(slug) { + return 'si' + slug + .split('-') + .map(part => part[0].toUpperCase() + part.slice(1)) + .join(''); +} + +// GET /icons/:slug.svg +app.get('/icons/:slug.svg', (req, res) => { + const slug = req.params.slug.toLowerCase(); + const exportName = getExportName(slug); + const icon = icons[exportName]; + + if (!icon) { + return res.status(404).send('Icon not found'); + } + + res.type('image/svg+xml').send(icon.svg); +}); + +// GET /icons/:slug.png?size=... +app.get('/icons/:slug.png', async (req, res) => { + const slug = req.params.slug.toLowerCase(); + const size = parseInt(req.query.size, 10) || 128; + const exportName = getExportName(slug); + const icon = icons[exportName]; + + if (!icon) { + return res.status(404).send('Icon not found'); + } + + try { + const png = await sharp(Buffer.from(icon.svg)) + .resize(size, size) + .png() + .toBuffer(); + + res.type('image/png').send(png); + } catch (err) { + console.error('PNG generation error:', err); + res.status(500).send('PNG generation error'); + } +}); + +app.listen(port, () => { + console.log(`Simple-Icons server listening at http://0.0.0.0:${port}`); +});