Added js fetcher

This commit is contained in:
GeorgeWebberley 2026-01-27 20:25:52 +01:00
parent 3de474fbd2
commit 94a2e8415d
5 changed files with 100 additions and 2 deletions

View file

@ -6,6 +6,21 @@ when:
branch: main branch: main
steps: steps:
build-fetcher:
image: woodpeckerci/plugin-docker-buildx
privileged: true
settings:
platforms: linux/amd64
registry: git.georgew.dev
repo: git.georgew.dev/georgew/surf-hub-fetcher
tags: latest
dockerfile: fetcher/Dockerfile
context: fetcher
username:
from_secret: FORGEJO_USER
password:
from_secret: FORGEJO_TOKEN
deploy: deploy:
image: docker:28-cli image: docker:28-cli
privileged: true privileged: true
@ -14,6 +29,13 @@ steps:
- /home/george:/home/george - /home/george:/home/george
environment: environment:
APP_NAME: *app_name APP_NAME: *app_name
FORGEJO_USER:
from_secret: FORGEJO_USER
FORGEJO_TOKEN:
from_secret: FORGEJO_TOKEN
commands: commands:
- cp -r . /home/george/$APP_NAME/ - echo $FORGEJO_TOKEN | docker login git.georgew.dev -u $FORGEJO_USER --password-stdin
- docker compose -p $APP_NAME -f /home/george/$APP_NAME/docker-compose.yaml up -d --pull always --force-recreate - mkdir -p /home/george/$APP_NAME
- cp docker-compose.yaml /home/george/$APP_NAME/
- docker compose -p $APP_NAME -f /home/george/$APP_NAME/docker-compose.yaml pull
- docker compose -p $APP_NAME -f /home/george/$APP_NAME/docker-compose.yaml up -d --force-recreate --remove-orphans

View file

@ -25,6 +25,20 @@ services:
volumes: volumes:
- grafana_data:/var/lib/grafana - grafana_data:/var/lib/grafana
fetcher:
image: git.georgew.dev/georgew/surf-hub-fetcher:latest
container_name: surf-fetcher
restart: always
networks:
- web_traffic
depends_on:
- influxdb
environment:
- INFLUX_URL=http://influxdb:8086
- INFLUX_TOKEN=${INFLUX_TOKEN}
- INFLUX_ORG=${DOCKER_INFLUXDB_INIT_ORG}
- INFLUX_BUCKET=${DOCKER_INFLUXDB_INIT_BUCKET}
volumes: volumes:
influxdb_data: influxdb_data:
grafana_data: grafana_data:

10
fetcher/Dockerfile Normal file
View file

@ -0,0 +1,10 @@
FROM node:20-slim
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY . .
CMD ["node", "index.js"]

42
fetcher/index.js Normal file
View file

@ -0,0 +1,42 @@
const { InfluxDB, Point } = require('@influxdata/influxdb-client');
const axios = require('axios');
const token = process.env.INFLUX_TOKEN;
const url = process.env.INFLUX_URL;
const org = process.env.DOCKER_INFLUXDB_INIT_ORG;
const bucket = process.env.DOCKER_INFLUXDB_INIT_BUCKET;
const client = new InfluxDB({ url, token });
const writeApi = client.getWriteApi(org, bucket);
async function fetchSurfData() {
try {
// Change these coordinates to your local beach!
// These are for Bondi Beach, Sydney as an example.
const lat = -33.89;
const lon = 151.27;
console.log("🌊 Fetching latest swell data...");
const response = await axios.get(`https://marine-api.open-meteo.com/v1/marine?latitude=${lat}&longitude=${lon}&current=swell_wave_height,swell_wave_period`);
const swellHeight = response.data.current.swell_wave_height;
const swellPeriod = response.data.current.swell_wave_period;
const point = new Point('surf_conditions')
.tag('location', 'local_break')
.floatField('swell_height', swellHeight)
.floatField('swell_period', swellPeriod);
writeApi.writePoint(point);
// Important: Flush the buffer to ensure data is sent
await writeApi.flush();
console.log(`✅ Sent: ${swellHeight}m at ${swellPeriod}s`);
} catch (error) {
console.error("❌ Fetch error:", error.message);
}
}
// Fetch every hour
setInterval(fetchSurfData, 1000 * 60 * 60);
fetchSurfData();

10
fetcher/package.json Normal file
View file

@ -0,0 +1,10 @@
{
"name": "surf-hub-fetcher",
"version": "1.0.0",
"description": "Polls surf APIs and sends data to InfluxDB",
"main": "index.js",
"dependencies": {
"@influxdata/influxdb-client": "^1.33.0",
"axios": "^1.6.0"
}
}