diff --git a/.woodpecker.yaml b/.woodpecker.yaml index 27c502e..602e63e 100644 --- a/.woodpecker.yaml +++ b/.woodpecker.yaml @@ -6,6 +6,21 @@ when: branch: main 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: image: docker:28-cli privileged: true @@ -14,6 +29,13 @@ steps: - /home/george:/home/george environment: APP_NAME: *app_name + FORGEJO_USER: + from_secret: FORGEJO_USER + FORGEJO_TOKEN: + from_secret: FORGEJO_TOKEN commands: - - cp -r . /home/george/$APP_NAME/ - - docker compose -p $APP_NAME -f /home/george/$APP_NAME/docker-compose.yaml up -d --pull always --force-recreate \ No newline at end of file + - echo $FORGEJO_TOKEN | docker login git.georgew.dev -u $FORGEJO_USER --password-stdin + - 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 \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml index 42c4799..7ab5e05 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -25,6 +25,20 @@ services: volumes: - 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: influxdb_data: grafana_data: diff --git a/fetcher/Dockerfile b/fetcher/Dockerfile new file mode 100644 index 0000000..fe55841 --- /dev/null +++ b/fetcher/Dockerfile @@ -0,0 +1,10 @@ +FROM node:20-slim + +WORKDIR /app + +COPY package*.json ./ +RUN npm install --production + +COPY . . + +CMD ["node", "index.js"] \ No newline at end of file diff --git a/fetcher/index.js b/fetcher/index.js new file mode 100644 index 0000000..7740e89 --- /dev/null +++ b/fetcher/index.js @@ -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(); \ No newline at end of file diff --git a/fetcher/package.json b/fetcher/package.json new file mode 100644 index 0000000..843a82e --- /dev/null +++ b/fetcher/package.json @@ -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" + } +} \ No newline at end of file