chore: migration to Standortplaner repository and local modifications

This commit is contained in:
Johannes Baumeister 2026-06-24 15:44:23 +02:00
parent 415bd6d355
commit 3020ae2ad0
48 changed files with 520 additions and 334 deletions

View File

@ -1,4 +1,4 @@
name: Deploy Bürgerwind name: Deploy Standortplaner
on: on:
push: push:
@ -12,15 +12,33 @@ jobs:
- name: Code holen - name: Code holen
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: .env erstellen - name: Dateien auf Server kopieren
run: | uses: appleboy/scp-action@master
echo "DB_HOST=${{ secrets.DB_HOST }}" > .env with:
echo "DB_PORT=5432" >> .env host: ${{ secrets.SERVER_HOST }}
echo "DB_USER=${{ secrets.DB_USER }}" >> .env username: ${{ secrets.SERVER_USER }}
echo "DB_PASSWORD=${{ secrets.DB_PASSWORD }}" >> .env key: ${{ secrets.SSH_PRIVATE_KEY }}
echo "DB_NAME=${{ secrets.DB_NAME }}" >> .env source: "."
echo "DB_SCHEMA=geodaten" >> .env target: "/opt/automation-stack/standortplaner"
- name: App bauen und starten - name: Deployment auf Server ausführen
run: | uses: appleboy/ssh-action@master
docker compose up -d --build --force-recreate with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
cd /opt/automation-stack/standortplaner
# .env Datei mit den Secrets befüllen
echo "DB_HOST=${{ secrets.DB_HOST }}" > .env
echo "DB_PORT=${{ secrets.DB_PORT }}" >> .env
echo "DB_USER=${{ secrets.DB_USER }}" >> .env
echo "DB_PASSWORD=${{ secrets.DB_PASSWORD }}" >> .env
echo "DB_NAME=${{ secrets.DB_NAME }}" >> .env
echo "DB_SCHEMA=geodaten" >> .env
echo "OIDC_CLIENT_ID=${{ secrets.OIDC_CLIENT_ID }}" >> .env
echo "OIDC_CLIENT_SECRET=${{ secrets.OIDC_CLIENT_SECRET }}" >> .env
# App starten
docker compose up -d --build --force-recreate

81
app.js
View File

@ -12,7 +12,9 @@ document.addEventListener('DOMContentLoaded', async () => {
ownerMapping: { firstName: 'vorname', lastName: 'nachname' }, // Default for ALKIS and modern Shapefiles ownerMapping: { firstName: 'vorname', lastName: 'nachname' }, // Default for ALKIS and modern Shapefiles
ownerStatuses: {}, // { "name vorname": { status: "...", notiz: "..." } } ownerStatuses: {}, // { "name vorname": { status: "...", notiz: "..." } }
showAuxiliary: true, showAuxiliary: true,
isEditMode: false isEditMode: false,
isLoading: true,
hasLoadedFromDB: false
}; };
const STATUS_MAP = { const STATUS_MAP = {
@ -1942,29 +1944,36 @@ document.addEventListener('DOMContentLoaded', async () => {
// Initialize Dynamic Layers and then load data // Initialize Dynamic Layers and then load data
initDynamicLayers().then(async () => { initDynamicLayers().then(async () => {
// Erst Status laden try {
await loadOwnerStatusesFromDB(); // Erst Status laden
await loadOwnerStatusesFromDB();
// Dann WEAs laden // Dann WEAs laden
await loadTurbinesFromDB(); await loadTurbinesFromDB();
// Automatisches Mapping für den Eigentümer-Layer prüfen // Automatisches Mapping für den Eigentümer-Layer prüfen
const ownerLayerName = Object.keys(overlays).find(k => k.toLowerCase().includes('eigentümer')); const ownerLayerName = Object.keys(overlays).find(k => k.toLowerCase().includes('eigentümer'));
if (ownerLayerName && overlays[ownerLayerName]) { if (ownerLayerName && overlays[ownerLayerName]) {
const layer = overlays[ownerLayerName]; const layer = overlays[ownerLayerName];
const layers = layer.getLayers(); const layers = layer.getLayers();
if (layers.length > 0) { if (layers.length > 0) {
const firstFeature = layers[0].feature; const firstFeature = layers[0].feature;
if (firstFeature?.properties) { if (firstFeature?.properties) {
const props = firstFeature.properties; const props = firstFeature.properties;
const vna = Object.keys(props).find(k => k.toUpperCase() === 'VNA'); const vna = Object.keys(props).find(k => k.toUpperCase() === 'VNA');
const gna = Object.keys(props).find(k => k.toUpperCase() === 'GNA' || k.toUpperCase() === 'NBA'); const gna = Object.keys(props).find(k => k.toUpperCase() === 'GNA' || k.toUpperCase() === 'NBA');
if (vna && gna) { if (vna && gna) {
state.ownerMapping = { firstName: vna, lastName: gna }; state.ownerMapping = { firstName: vna, lastName: gna };
refreshOwnerLayerStyle(); refreshOwnerLayerStyle();
}
} }
} }
} }
} catch (e) {
console.error("Fehler bei der Initialisierung des Planungstools:", e);
} finally {
state.isLoading = false;
console.log("Planungstool initialisiert, isLoading = false");
} }
}); });
@ -2004,15 +2013,37 @@ document.addEventListener('DOMContentLoaded', async () => {
// DB Persistence // DB Persistence
let autoSaveTimeout = null; let autoSaveTimeout = null;
function triggerAutoSave() { function triggerAutoSave() {
if (state.isLoading) {
console.log("Auto-Save unterdrückt: App befindet sich noch in der Ladephase.");
return;
}
if (!state.hasLoadedFromDB) {
console.warn("Auto-Save unterdrückt: Datenbank wurde beim Start nicht erfolgreich geladen.");
return;
}
if (autoSaveTimeout) clearTimeout(autoSaveTimeout); if (autoSaveTimeout) clearTimeout(autoSaveTimeout);
autoSaveTimeout = setTimeout(() => { autoSaveTimeout = setTimeout(() => {
saveTurbinesToDB(); saveTurbinesToDB(false);
}, 1500); // 1.5 Seconds debounce }, 1500); // 1.5 Seconds debounce
} }
async function saveTurbinesToDB() { async function saveTurbinesToDB(force = false) {
if (state.isLoading && !force) {
console.log("Speichern unterdrückt: Ladephase aktiv.");
return;
}
if (!state.hasLoadedFromDB && !force) {
console.warn("Speichern unterdrückt: Datenbank wurde beim Start nicht geladen.");
return;
}
if (!state.hasLoadedFromDB && force) {
const confirmSave = confirm("WARNUNG: Die Datenbank wurde beim Start nicht erfolgreich geladen. Wenn Sie jetzt speichern, überschreiben Sie eventuell vorhandene Standorte in der Datenbank. Möchten Sie trotzdem speichern?");
if (!confirmSave) return;
}
const statusEl = document.getElementById('statusInfo'); const statusEl = document.getElementById('statusInfo');
if (statusEl) statusEl.innerText = "Automatische Speicherung..."; if (statusEl) statusEl.innerText = "Speicherung läuft...";
const projekt_id = "BWSamern-Ohne"; const projekt_id = "BWSamern-Ohne";
const turbineData = state.turbines.map(t => ({ const turbineData = state.turbines.map(t => ({
@ -2041,13 +2072,13 @@ document.addEventListener('DOMContentLoaded', async () => {
} }
} catch (err) { } catch (err) {
console.error(err); console.error(err);
if (statusEl) statusEl.innerHTML = `<span style="color: #ff4444;">Auto-Save Fehler: ${err.message}</span>`; if (statusEl) statusEl.innerHTML = `<span style="color: #ff4444;">Speicherfehler: ${err.message}</span>`;
} }
} }
const btnSaveDB = document.getElementById('btnSaveDB'); const btnSaveDB = document.getElementById('btnSaveDB');
if (btnSaveDB) { if (btnSaveDB) {
btnSaveDB.addEventListener('click', saveTurbinesToDB); btnSaveDB.addEventListener('click', () => saveTurbinesToDB(true));
} }
async function loadTurbinesFromDB() { async function loadTurbinesFromDB() {
@ -2102,9 +2133,11 @@ document.addEventListener('DOMContentLoaded', async () => {
} else { } else {
console.log("Datenbank ist leer."); console.log("Datenbank ist leer.");
} }
state.hasLoadedFromDB = true;
} catch (err) { } catch (err) {
console.error("GLOBALER FEHLER beim Laden aus der DB:", err); console.error("GLOBALER FEHLER beim Laden aus der DB:", err);
if (statusEl) statusEl.innerText = "Fehler beim Laden der Standorte."; if (statusEl) statusEl.innerText = "Fehler beim Laden der Standorte.";
state.hasLoadedFromDB = false;
} }
} }

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function check() { async function check() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'enwelo' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function check() { async function check() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'enwelo' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

View File

@ -1,10 +1,11 @@
const { Client } = require('pg'); const { Client } = require('pg');
require('dotenv').config({ path: '../.env' });
const client = new Client({ const client = new Client({
host: '87.106.21.21', host: process.env.DB_HOST,
port: 5432, port: process.env.DB_PORT,
user: 'enwelo_admin', user: process.env.DB_USER,
password: 'WX1t1cgP1qK09', password: process.env.DB_PASSWORD,
database: 'enwelo' database: process.env.DB_NAME
}); });
client.connect().then(async () => { client.connect().then(async () => {
try { try {

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function check() { async function check() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'enwelo' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function check() { async function check() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'enwelo' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function check() { async function check() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'enwelo' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function check() { async function check() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'enwelo' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function check() { async function check() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'enwelo' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function check() { async function check() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'geodata' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function check() { async function check() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'enwelo' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function check() { async function check() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'enwelo' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function check() { async function check() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'enwelo' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

View File

@ -1,10 +1,11 @@
const { Client } = require('pg'); const { Client } = require('pg');
require('dotenv').config({ path: '../.env' });
const client = new Client({ const client = new Client({
host: '87.106.21.21', host: process.env.DB_HOST,
port: 5432, port: process.env.DB_PORT,
user: 'enwelo_admin', user: process.env.DB_USER,
password: 'WX1t1cgP1qK09', password: process.env.DB_PASSWORD,
database: 'enwelo' database: process.env.DB_NAME
}); });
client.connect().then(async () => { client.connect().then(async () => {
try { try {

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function check() { async function check() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'enwelo' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function check() { async function check() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'enwelo' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function check() { async function check() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'enwelo' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function check() { async function check() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'enwelo' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function check() { async function check() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'enwelo' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function clean() { async function clean() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'enwelo' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function fix() { async function fix() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'enwelo' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function fixView() { async function fixView() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'enwelo' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

View File

@ -1,10 +1,11 @@
const { Client } = require('pg'); const { Client } = require('pg');
require('dotenv').config({ path: '../.env' });
const client = new Client({ const client = new Client({
host: '87.106.21.21', host: process.env.DB_HOST,
port: 5432, port: process.env.DB_PORT,
user: 'enwelo_admin', user: process.env.DB_USER,
password: 'WX1t1cgP1qK09', password: process.env.DB_PASSWORD,
database: 'enwelo' database: process.env.DB_NAME
}); });
client.connect().then(async () => { client.connect().then(async () => {
try { try {

View File

@ -1,3 +1,4 @@
require('dotenv').config({ path: require('path').resolve(__dirname, '../.env') });
const { Client } = require('pg'); const { Client } = require('pg');
const client = new Client({ const client = new Client({
@ -5,7 +6,7 @@ const client = new Client({
port: 5432, port: 5432,
database: 'enwelo', database: 'enwelo',
user: 'postgres', user: 'postgres',
password: '' password: process.env.DB_PASSWORD
}); });
async function run() { async function run() {

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function inspect() { async function inspect() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'enwelo' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function inspect() { async function inspect() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'enwelo' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function check() { async function check() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'enwelo' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function check() { async function check() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'enwelo' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function check() { async function check() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'enwelo' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function check() { async function check() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'geodata' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function check() { async function check() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'enwelo' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function check() { async function check() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'enwelo' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function check() { async function check() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'enwelo' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function check() { async function check() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'enwelo' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function check() { async function check() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'enwelo' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function check() { async function check() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'enwelo' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

40
backend/test_art.js Normal file
View File

@ -0,0 +1,40 @@
require('dotenv').config({ path: '../.env' });
const { Pool } = require('pg');
const pool = new Pool({
host: process.env.DB_HOST,
port: process.env.DB_PORT,
database: process.env.DB_NAME,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD
});
async function run() {
try {
const res = await pool.query("SELECT column_name, data_type FROM information_schema.columns WHERE table_schema = 'geodaten' AND table_name = 'artennachweis'");
console.log("Columns:", res.rows);
// Test the exact query
const res2 = await pool.query(`SELECT jsonb_build_object(
'type', 'FeatureCollection',
'features', COALESCE(jsonb_agg(features.feature), '[]'::jsonb)
)
FROM (
SELECT jsonb_build_object(
'type', 'Feature',
'geometry', ST_AsGeoJSON(ST_Transform(geom, 4326))::jsonb,
'properties', jsonb_build_object(
'art', art
)
) AS feature
FROM geodaten.artennachweis
) features`);
console.log("Query Success! First few chars of result:", JSON.stringify(res2.rows[0]).substring(0, 100));
} catch (err) {
console.error("Error:", err.message);
} finally {
pool.end();
}
}
run();

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function test_insert() { async function test_insert() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'enwelo' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function testFullLogic() { async function testFullLogic() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'enwelo' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function check() { async function check() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'enwelo' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function testInsert() { async function testInsert() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'enwelo' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

47
backend/test_ltg.js Normal file
View File

@ -0,0 +1,47 @@
require('dotenv').config({ path: '../.env' });
const { Pool } = require('pg');
const pool = new Pool({
host: process.env.DB_HOST,
port: process.env.DB_PORT,
database: process.env.DB_NAME,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD
});
async function run() {
try {
const result = await pool.query(
`SELECT jsonb_build_object(
'type', 'FeatureCollection',
'features', COALESCE(jsonb_agg(features.feature), '[]'::jsonb)
)
FROM (
SELECT jsonb_build_object(
'type', 'Feature',
'geometry', ST_AsGeoJSON(ST_Transform(geom, 4326))::jsonb,
'properties', jsonb_build_object(
'art', art,
'spannung', spannung,
'ltg_name', ltg_name,
'bezeichnun', bezeichnun,
'bemerkung', bemerkung,
'status', status,
'quelle', quelle,
'info', info,
'vorschlag', vorschlag
)
) AS feature
FROM geodaten.leitungsverlaeufe
WHERE art ILIKE '%wasserstoff%' OR art ILIKE '%freileitung%'
) features`
);
console.log("Success! Output:", JSON.stringify(result.rows[0]).substring(0, 100));
} catch (err) {
console.error("DB Error:", err.message);
} finally {
pool.end();
}
}
run();

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function testQuery() { async function testQuery() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'enwelo' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function testProject() { async function testProject() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'enwelo' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

View File

@ -1,5 +1,12 @@
const { Client } = require('pg'); const { Client } = require('pg');
const client = new Client({ host: '87.106.21.21', port: 5432, user: 'enwelo_admin', password: 'WX1t1cgP1qK09', database: 'enwelo' }); require('dotenv').config({ path: '../.env' });
const client = new Client({
host: process.env.DB_HOST,
port: process.env.DB_PORT,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME
});
async function resolveProjectId(client, input) { async function resolveProjectId(client, input) {
if (!input) return null; if (!input) return null;

View File

@ -1,13 +1,14 @@
const { Client } = require('pg'); const { Client } = require('pg');
async function check() { async function check() {
const client = new Client({ require('dotenv').config({ path: '../.env' });
host: '87.106.21.21', const client = new Client({
port: 5432, host: process.env.DB_HOST,
user: 'enwelo_admin', port: process.env.DB_PORT,
password: 'WX1t1cgP1qK09', user: process.env.DB_USER,
database: 'enwelo' password: process.env.DB_PASSWORD,
}); database: process.env.DB_NAME
});
try { try {
await client.connect(); await client.connect();

View File

@ -1,25 +1,24 @@
services: services:
bw-samern-ohne: standortplaner:
# Baut das Image basierend auf deinem Dockerfile
build: . build: .
container_name: bw-samern-ohne container_name: standortplaner
restart: always restart: always
# Lädt die Umgebungsvariablen (die durch deine deploy.yaml erstellt werden)
env_file:
- .env
networks: networks:
- proxy - proxy
labels: labels:
# 1. Aktivierung in Traefik
- "traefik.enable=true" - "traefik.enable=true"
# URL-Routing
# 2. Router-Konfiguration (Domain & HTTPS) - "traefik.http.routers.standortplaner.rule=Host(`standortplaner.enwelo-serverumgebung.cloud`)"
- "traefik.http.routers.bw-samern-ohne.rule=Host(`bw-samern-ohne.enwelo-serverumgebung.cloud`)" - "traefik.http.routers.standortplaner.entrypoints=websecure"
- "traefik.http.routers.bw-samern-ohne.entrypoints=websecure" - "traefik.http.routers.standortplaner.tls.certresolver=le"
- "traefik.http.routers.bw-samern-ohne.tls.certresolver=le" # Authentik-Schutz
- "traefik.http.routers.standortplaner.middlewares=authentik@file"
# 3. Zuweisung des internen Service-Ports # Port-Mapping
- "traefik.http.services.bw-samern-ohne.loadbalancer.server.port=3000" - "traefik.http.services.standortplaner.loadbalancer.server.port=3000"
# 4. Authentik-Schutz (Middleware)
# Wir nutzen jetzt den Namen aus unserer neuen Server-Datei:
- "traefik.http.routers.bw-samern-ohne.middlewares=authentik@file"
networks: networks:
proxy: proxy: