From 8c709572fd9152539864191e7a44897b2fb433b9 Mon Sep 17 00:00:00 2001 From: Ahson Shaikh Date: Mon, 4 May 2026 21:01:49 +0500 Subject: [PATCH] Added Template Open Meteo --- templates/open-meteo/assets/logo.png | Bin 0 -> 6018 bytes templates/open-meteo/index.ts | 59 ++++++++++++++++++ templates/open-meteo/meta.yaml | 88 +++++++++++++++++++++++++++ 3 files changed, 147 insertions(+) create mode 100644 templates/open-meteo/assets/logo.png create mode 100644 templates/open-meteo/index.ts create mode 100644 templates/open-meteo/meta.yaml diff --git a/templates/open-meteo/assets/logo.png b/templates/open-meteo/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9cdf9741e83969e3abbd4005db4d40d7e77bff45 GIT binary patch literal 6018 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 literal 0 HcmV?d00001 diff --git a/templates/open-meteo/index.ts b/templates/open-meteo/index.ts new file mode 100644 index 000000000..1819ec81d --- /dev/null +++ b/templates/open-meteo/index.ts @@ -0,0 +1,59 @@ +import { Output, Services } from "~templates-utils"; +import { Input } from "./meta"; + +export function generate(input: Input): Output { + const services: Services = []; + + services.push({ + type: "app", + data: { + serviceName: input.appServiceName, + source: { + type: "image", + image: input.appServiceImage, + }, + env: ["LOG_LEVEL=info"].join("\n"), + domains: [ + { + host: "$(EASYPANEL_DOMAIN)", + port: 8080, + }, + ], + mounts: [ + { + type: "volume", + name: "open-meteo-data", + mountPath: "/app/data", + }, + ], + deploy: { + command: + "./openmeteo-api serve --env production --hostname 0.0.0.0 --port 8080", + }, + }, + }); + + services.push({ + type: "app", + data: { + serviceName: input.syncServiceName, + source: { + type: "image", + image: input.appServiceImage, + }, + env: ["LOG_LEVEL=info"].join("\n"), + mounts: [ + { + type: "volume", + name: "open-meteo-data", + mountPath: "/app/data", + }, + ], + deploy: { + command: input.syncCommand, + }, + }, + }); + + return { services }; +} diff --git a/templates/open-meteo/meta.yaml b/templates/open-meteo/meta.yaml new file mode 100644 index 000000000..f4f614525 --- /dev/null +++ b/templates/open-meteo/meta.yaml @@ -0,0 +1,88 @@ +name: Open-Meteo +description: + Open-Meteo is a free and open-source weather API that provides high-resolution + forecast data through a simple JSON interface. This template deploys both the + Open-Meteo API service and a background sync service that continuously updates + selected weather model data into local storage. +instructions: + After deployment, Open-Meteo API is available on your project domain at port + 8080. Example request; + /v1/forecast?latitude=47.1&longitude=8.6&hourly=temperature_2m&models=dwd_icon. + The sync service in this template downloads and refreshes dwd_icon + temperature_2m data on a repeating interval. You can customize models, + variables, and sync interval by editing the sync service command. +changeLog: + - date: 2026-05-04 + description: First Release +links: + - label: Website + url: https://open-meteo.com/ + - label: GitHub + url: https://github.com/open-meteo/open-meteo + - label: Documentation + url: https://github.com/open-meteo/open-meteo/blob/main/docs/getting-started.md +contributors: + - name: Ahson Shaikh + url: https://github.com/Ahson-Shaikh +schema: + type: object + required: + - appServiceName + - appServiceImage + - syncServiceName + - syncCommand + properties: + appServiceName: + type: string + title: API Service Name + default: open-meteo + appServiceImage: + type: string + title: Open-Meteo Image + default: ghcr.io/open-meteo/open-meteo:1.5.1 + syncServiceName: + type: string + title: Sync Service Name + default: open-meteo-sync + syncCommand: + type: string + title: Sync Command + default: + ./openmeteo-api sync dwd_icon temperature_2m --past-days 2 + --repeat-interval 1 --concurrent 1 +benefits: + - title: Self-Hosted Weather API + description: + Run a production-ready weather API in your own infrastructure with full + control over your deployment and data lifecycle. + - title: Continuous Data Synchronization + description: + Includes a dedicated sync service to continuously download and refresh + weather datasets for up-to-date forecasts. + - title: Simple JSON Forecast Endpoints + description: + Access weather forecasts with easy HTTP endpoints that integrate quickly + with dashboards, automation workflows, and applications. +features: + - title: Open-Meteo API Server + description: + Exposes forecast endpoints compatible with Open-Meteo API query + parameters. + - title: Background Sync Worker + description: + Downloads weather model data on a repeat interval and stores it in a + shared volume. + - title: Shared Persistent Storage + description: + API and sync worker share the same `/app/data` volume so downloaded model + data remains available across restarts. + - title: Configurable Sync Behavior + description: + Customize weather models, variables, historical depth, and refresh + interval from template inputs. +tags: + - Weather + - API + - Forecasting + - Data + - Self-Hosted