Added js fetcher
This commit is contained in:
parent
3de474fbd2
commit
94a2e8415d
|
|
@ -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
|
||||||
|
|
@ -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
10
fetcher/Dockerfile
Normal 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
42
fetcher/index.js
Normal 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}¤t=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
10
fetcher/package.json
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue