fix: VariableAttributes mapping + locations detail parseInt + .gitignore pnpm-store

This commit is contained in:
Eric F
2026-06-15 22:28:31 -04:00
parent 438f9aa952
commit b06dbdbba9
30 changed files with 23411 additions and 0 deletions

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,10 @@
NEXT_PUBLIC_AUTH_PROVIDER=generic
NEXT_PUBLIC_API_URL=https://hasura.digitribe.fr/v1/graphql
NEXT_PUBLIC_CITRINE_CORE_URL=https://citrineos-core.digitribe.fr
HASURA_ADMIN_SECRET=Digitribe972
NEXT_PUBLIC_TENANT_ID=1
NEXT_PUBLIC_ADMIN_EMAIL=admin@digitribe.fr
ADMIN_PASSWORD=Digitribe972
NEXT_PUBLIC_WS_URL=wss://hasura.digitribe.fr/v1/graphql
NEXTAUTH_SECRET=C1tR1n30S2026S3cr3t
NEXTAUTH_URL=https://citrineos.digitribe.fr

View File

@@ -0,0 +1,158 @@
version: '3.8'
services:
citrineos-server:
image: ghcr.io/citrineos/citrineos-server:latest
container_name: cariflex-citrineos-server
restart: unless-stopped
environment:
APP_NAME: "all"
APP_ENV: "docker"
AWS_REGION: us-east-1
AWS_ACCESS_KEY_ID: minioadmin
AWS_SECRET_ACCESS_KEY: minioadmin
DB_STRATEGY: "migrate"
BOOTSTRAP_CITRINEOS_DATABASE_HOST: "cariflex-citrineos-db"
BOOTSTRAP_CITRINEOS_CONFIG_FILENAME: "config.json"
BOOTSTRAP_CITRINEOS_FILE_ACCESS_TYPE: "local"
BOOTSTRAP_CITRINEOS_FILE_ACCESS_LOCAL_FILE_PATH: "/data"
CONFIG_CITRINEOS_WIPE_FILE_ON_START: "true"
depends_on:
cariflex-citrineos-db:
condition: service_healthy
cariflex-amqp:
condition: service_healthy
volumes:
- citrineos-data:/data
ports:
- "8081:8080"
networks:
- cariflex-internal
cariflex-citrineos-db:
image: postgis/postgis:16-3.5
container_name: cariflex-citrineos-db
restart: unless-stopped
environment:
POSTGRES_DB: citrine
POSTGRES_USER: citrine
POSTGRES_PASSWORD: citrine
volumes:
- citrineos-db-data:/var/lib/postgresql/data
healthcheck:
test: pg_isready --username=citrine
interval: 5s
timeout: 10s
retries: 5
networks:
- cariflex-internal
cariflex-amqp:
image: rabbitmq:3-management
container_name: cariflex-amqp
networks:
cariflex-internal:
aliases:
- amqp-broker
traefik-public:
restart: unless-stopped
environment:
RABBITMQ_DEFAULT_USER: guest
RABBITMQ_DEFAULT_PASS: guest
labels:
- "traefik.enable=true"
- "traefik.http.routers.rabbitmq.rule=Host(`amqp.digitribe.fr`)"
- "traefik.http.routers.rabbitmq.entrypoints=websecure"
- "traefik.http.routers.rabbitmq.tls.certresolver=letsencrypt"
- "traefik.http.services.rabbitmq.loadbalancer.server.port=15672"
volumes:
- citrineos-amqp-data:/var/lib/rabbitmq
healthcheck:
test: rabbitmq-diagnostics -q ping
interval: 15s
timeout: 10s
retries: 10
start_period: 30s
hasura:
image: hasura/graphql-engine:v2.40.0
container_name: cariflex-hasura
restart: unless-stopped
ports:
- "8082:8080"
environment:
HASURA_GRAPHQL_DATABASE_URL: "postgresql://citrine:***@cariflex-citrineos-db:5432/citrine"
HASURA_GRAPHQL_ENABLE_CONSOLE: "true"
HASURA_GRAPHQL_DEV_MODE: "true"
HASURA_GRAPHQL_ADMIN_SECRET: "Digitribe972"
HASURA_GRAPHQL_UNAUTHORIZED_ROLE: "anonymous"
depends_on:
cariflex-citrineos-db:
condition: service_healthy
labels:
- "traefik.enable=true"
- "traefik.http.routers.hasura.rule=Host(`hasura.digitribe.fr`)"
- "traefik.http.routers.hasura.entrypoints=websecure"
- "traefik.http.routers.hasura.tls.certresolver=letsencrypt"
- "traefik.http.services.hasura.loadbalancer.server.port=8080"
networks:
- traefik-public
- cariflex-internal
citrineos-operator-ui:
image: citrineos-core-main-citrine-ui:latest
container_name: cariflex-citrineos-operator-ui
restart: unless-stopped
ports:
- "3002:3000"
environment:
NEXTAUTH_SECRET: Digitribe972
ADMIN_PASSWORD: Digitribe972
depends_on:
- hasura
labels:
- "traefik.enable=true"
- "traefik.http.routers.citrineos-ui.rule=Host(`citrineos.digitribe.fr`)"
- "traefik.http.routers.citrineos-ui.entrypoints=websecure"
- "traefik.http.routers.citrineos-ui.tls.certresolver=letsencrypt"
- "traefik.http.services.citrineos-ui.loadbalancer.server.port=3000"
networks:
- traefik-public
- cariflex-internal
# === EVerest (simulateur de charge OCPP 2.0.1) ===
everest-mqtt:
image: ghcr.io/everest/everest-demo/mqtt-server:0.0.16
container_name: cariflex-everest-mqtt
restart: unless-stopped
networks:
- cariflex-internal
everest-nodered:
image: ghcr.io/everest/everest-demo/nodered:0.0.16
container_name: cariflex-everest-nodered
restart: unless-stopped
depends_on:
- everest-mqtt
environment:
- MQTT_SERVER_ADDRESS=everest-mqtt
- FLOWS=/config/config-sil-two-evse-flow.json
networks:
- cariflex-internal
ports:
- "1880:1880"
volumes:
citrineos-data:
driver: local
citrineos-db-data:
driver: local
citrineos-amqp-data:
driver: local
networks:
traefik-public:
external: true
cariflex-internal:
name: config_cariflex-internal
external: true

View File

@@ -0,0 +1,171 @@
version: '3.8'
services:
citrineos-server:
image: ghcr.io/citrineos/citrineos-server:latest
container_name: cariflex-citrineos-server
restart: unless-stopped
environment:
APP_NAME: "all"
APP_ENV: "docker"
AWS_REGION: us-east-1
AWS_ACCESS_KEY_ID: minioadmin
AWS_SECRET_ACCESS_KEY: minioadmin
DB_STRATEGY: "migrate"
BOOTSTRAP_CITRINEOS_DATABASE_HOST: "cariflex-citrineos-db"
BOOTSTRAP_CITRINEOS_CONFIG_FILENAME: "config.json"
BOOTSTRAP_CITRINEOS_FILE_ACCESS_TYPE: "local"
BOOTSTRAP_CITRINEOS_FILE_ACCESS_LOCAL_FILE_PATH: "/data"
CONFIG_CITRINEOS_WIPE_FILE_ON_START: "true"
depends_on:
cariflex-citrineos-db:
condition: service_healthy
cariflex-amqp:
condition: service_healthy
volumes:
- citrineos-data:/data
ports:
- "8081:8080"
networks:
- cariflex-internal
cariflex-citrineos-db:
image: postgis/postgis:16-3.5
container_name: cariflex-citrineos-db
restart: unless-stopped
environment:
POSTGRES_DB: citrine
POSTGRES_USER: citrine
POSTGRES_PASSWORD: citrine
volumes:
- citrineos-db-data:/var/lib/postgresql/data
healthcheck:
test: pg_isready --username=citrine
interval: 5s
timeout: 10s
retries: 5
networks:
- cariflex-internal
cariflex-amqp:
image: rabbitmq:3-management
container_name: cariflex-amqp
networks:
cariflex-internal:
aliases:
- amqp-broker
traefik-public:
restart: unless-stopped
environment:
RABBITMQ_DEFAULT_USER: guest
RABBITMQ_DEFAULT_PASS: guest
labels:
- "traefik.enable=true"
- "traefik.http.routers.rabbitmq.rule=Host(`amqp.digitribe.fr`)"
- "traefik.http.routers.rabbitmq.entrypoints=websecure"
- "traefik.http.routers.rabbitmq.tls.certresolver=letsencrypt"
- "traefik.http.services.rabbitmq.loadbalancer.server.port=15672"
volumes:
- citrineos-amqp-data:/var/lib/rabbitmq
healthcheck:
test: rabbitmq-diagnostics -q ping
interval: 15s
timeout: 10s
retries: 10
start_period: 30s
hasura:
image: hasura/graphql-engine:v2.40.0
container_name: cariflex-hasura
restart: unless-stopped
ports:
- "8082:8080"
environment:
HASURA_GRAPHQL_DATABASE_URL: "postgresql://citrine:citrine@cariflex-citrineos-db:5432/citrine"
HASURA_GRAPHQL_ENABLE_CONSOLE: "true"
HASURA_GRAPHQL_DEV_MODE: "true"
HASURA_GRAPHQL_ADMIN_SECRET: "Digitribe972"
HASURA_GRAPHQL_UNAUTHORIZED_ROLE: "anonymous"
depends_on:
cariflex-citrineos-db:
condition: service_healthy
labels:
- "traefik.enable=true"
- "traefik.http.routers.hasura.rule=Host(`hasura.digitribe.fr`)"
- "traefik.http.routers.hasura.entrypoints=websecure"
- "traefik.http.routers.hasura.tls.certresolver=letsencrypt"
- "traefik.http.services.hasura.loadbalancer.server.port=8080"
networks:
- traefik-public
- cariflex-internal
citrineos-operator-ui:
image: citrineos-core-main-citrine-ui:latest
container_name: cariflex-citrineos-operator-ui
restart: unless-stopped
ports:
- "3002:3000"
environment:
NEXTAUTH_SECRET: Digitribe972
ADMIN_PASSWORD: Digitribe972
depends_on:
- hasura
labels:
- "traefik.enable=true"
- "traefik.http.routers.citrineos-ui.rule=Host(`citrineos.digitribe.fr`)"
- "traefik.http.routers.citrineos-ui.entrypoints=websecure"
- "traefik.http.routers.citrineos-ui.tls.certresolver=letsencrypt"
- "traefik.http.services.citrineos-ui.loadbalancer.server.port=3000"
networks:
- traefik-public
- cariflex-internal
# === EVerest MQTT + NodeRED (UI de contrôle) ===
everest-mqtt:
image: ghcr.io/everest/everest-demo/mqtt-server:0.0.16
container_name: cariflex-everest-mqtt
restart: unless-stopped
networks:
- cariflex-internal
everest-nodered:
image: ghcr.io/everest/everest-demo/nodered:0.0.16
container_name: cariflex-everest-nodered
restart: unless-stopped
depends_on:
- everest-mqtt
environment:
- MQTT_SERVER_ADDRESS=everest-mqtt
- FLOWS=/config/config-sil-two-evse-flow.json
networks:
- cariflex-internal
ports:
- "1880:1880"
# === OCPP 2.0.1 Simulators ===
ocpp-simulator:
build:
context: /home/eric/cariflex/scripts
dockerfile: Dockerfile.simulator
container_name: cariflex-ocpp-simulator
restart: unless-stopped
environment:
OCPP_HOST: "cariflex-citrineos-server"
OCPP_PORT: "8082"
networks:
- cariflex-internal
volumes:
citrineos-data:
driver: local
citrineos-db-data:
driver: local
citrineos-amqp-data:
driver: local
networks:
traefik-public:
external: true
cariflex-internal:
name: config_cariflex-internal
external: true

View File

@@ -0,0 +1,62 @@
cariflex-citrineos-operator-ui citrineos-core-main-citrine-ui:latest Up 5 minutes
cariflex-everest-nodered ghcr.io/everest/everest-demo/nodered:0.0.16 Up 2 minutes (healthy)
cariflex-hasura hasura/graphql-engine:v2.40.0 Up 6 hours (healthy)
cariflex-ocpp-simulator config-ocpp-simulator Up 7 hours
f33f58046fca_cariflex-amqp rabbitmq:3-management Up 7 hours (healthy)
cariflex-everest-manager everest-manager:latest Restarting (1) 38 seconds ago
cariflex-everest-mqtt ghcr.io/everest/everest-demo/mqtt-server:0.0.16 Up 19 hours
cariflex-citrineos-server ghcr.io/citrineos/citrineos-server:latest Up 4 days
cariflex-citrineos-db postgis/postgis:16-3.5 Up 4 days (healthy)
phpipam-phpipam-web-1 phpipam/phpipam-www:latest Up 5 days
phpipam-phpipam-cron-1 phpipam/phpipam-cron:latest Up 5 days
phpipam-phpipam-mariadb-1 mariadb:latest Up 5 days
openadr-ven flexmeasures-openadr-ven Up 5 days
openadr-vtn flexmeasures-openadr-vtn Up 5 days
flexmeasures-redis redis:7-alpine Up 6 days
flexmeasures-worker lfenergy/flexmeasures:latest Up 6 days
flexmeasures-server lfenergy/flexmeasures:latest Up 5 days
smart-city-grafana grafana/grafana:11.3.0 Up 5 days
flexmeasures-db postgres:17 Up 7 days
smart-city-simulator smart-city-digital-twin-martinique_simulator Up 8 days
starrocks-be starrocks/be-ubuntu:3.3.5 Up 8 days
starrocks-fe starrocks/fe-ubuntu:3.3.5 Up 8 days (healthy)
smart-city-orion-ld fiware/orion-ld:latest Up 8 days (healthy)
emqx_emqx_1 emqx/emqx:5.4 Up 8 days
smart-city-chirpstack-rest-api-1 chirpstack/chirpstack-rest-api:4 Up 8 days
smart-city-chirpstack-1 chirpstack/chirpstack:latest Up 8 days
smart-city-chirpstack-gateway-bridge-1 chirpstack/chirpstack-gateway-bridge:4 Up 8 days
smart-city-mosquitto-1 eclipse-mosquitto:2 Up 8 days
smart-city-redis-1 redis:7-alpine Up 8 days
smart-city-postgres-1 postgres:14-alpine Up 8 days
bunkerm-bunkerm-1 bunkeriot/bunkerm:latest Up 8 days (healthy)
metabase-app metabase/metabase:latest Up 8 days (healthy)
smart-city-iot-agent-mosquitto fiware/iotagent-json:latest Up 8 days (healthy)
smart-city-redpanda-consumer python:3.11-slim Up 8 days (unhealthy)
smart-city-geojson-proxy smart-city-geojson-proxy Up 8 days
smart-city-loki grafana/loki:latest Up 8 days
smart-city-telegraf telegraf:1.28 Up 8 days
smart-city-iot-agent-emqx fiware/iotagent-json:latest Up 8 days (healthy)
smart-city-tts-redis redis:7 Up 8 days
smart-city-cratedb crate:5.5 Up 8 days (healthy)
metabase-postgres postgres:15-alpine Up 8 days (healthy)
smart-city-iot-mongodb mongo:4.4 Up 8 days (healthy)
smart-city-tts-postgres postgres:14 Up 8 days
smart-city-influxdb influxdb:2.7-alpine Up 8 days (healthy)
smart-city-promtail grafana/promtail:latest Up 8 days
smart-city-kepler nginx:alpine Up 8 days
kepler-backend crazycapivara/kepler.gl:latest Up 9 days
trino trinodb/trino:450 Up 9 days (healthy)
trino-nginx nginx:alpine Up 10 days
streamlit python:3.11-slim Up 10 days
delta-lake delta-lake:local Up 10 days
clickhouse clickhouse/clickhouse-server:24.5 Up 10 days
duckdb duckdb-api:local Up 10 days
test-backend nginx:alpine Up 10 days
airflow-scheduler apache/airflow:2.9.3-python3.11 Up 12 days (healthy)
airflow-webserver apache/airflow:2.9.3-python3.11 Up 12 days (healthy)
airflow-postgres postgres:16 Up 12 days (healthy)
smartapp-api smartapp-api:latest Up 13 days
smartapp-web nginx:alpine Up 13 days
gitea-runner gitea/act_runner:latest Up 13 days
traefik traefik:v3.1 Up 16 minutes
gitea gitea/gitea:latest Up 13 days

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,29 @@
#!/usr/bin/env python3
"""Configure BasicAuthPassword for all 15 Cariflex charging stations"""
import json, time, urllib.request, urllib.error
CITRINEOS_URL = "http://localhost:8081"
PASSWORD = "DEADBEEFDEADBEEF"
for i in range(1, 16):
cp_id = f"CP{i:03d}"
url = f"{CITRINEOS_URL}/data/monitoring/variableAttribute?stationId={cp_id}&setOnCharger=true"
payload = json.dumps({
"component": {"name": "SecurityCtrlr"},
"variable": {"name": "BasicAuthPassword"},
"variableAttribute": [{"value": PASSWORD}],
"variableCharacteristics": {"dataType": "passwordString", "supportsMonitoring": False}
}).encode()
req = urllib.request.Request(url, data=payload, method='PUT',
headers={'Content-Type': 'application/json'})
try:
resp = urllib.request.urlopen(req, timeout=10)
print(f"OK {cp_id}: HTTP {resp.status}")
except urllib.error.HTTPError as e:
print(f"FAIL {cp_id}: HTTP {e.code}")
except Exception as e:
print(f"FAIL {cp_id}: {e}")
time.sleep(0.2)
print("Done")

View File

@@ -0,0 +1,21 @@
http:
routers:
nodered:
rule: "Host(`nodered.digitribe.fr`)"
entryPoints:
- websecure
service: nodered
tls:
certResolver: letsencrypt
nodered-http:
rule: "Host(`nodered.digitribe.fr`)"
entryPoints:
- web
middlewares:
- redirect-https
service: nodered
services:
nodered:
loadBalancer:
servers:
- url: "http://172.29.0.39:1880"