====== Runbook: DSN-Export ====== **Durata:** ~5 minuti \\ **Ruolo:** Sysadmin, DBA \\ **Applicazione:** Migrazione, Documentazione, Disaster Recovery Export e import di definizioni DSN (Data Source Names). ---- ===== Workflow ===== flowchart TD A[Start] --> B{Obiettivo?} B -->|Export| C[Estrarre DSN da Config] B -->|Import| D[Inserire DSN in Config] C --> E[Salvare JSON] D --> F[Riavviare Gateway] E --> G[Finito] F --> H[Testare DSN] H --> G style G fill:#e8f5e9 ---- ===== 1. Struttura DSN ===== I DSN sono definiti in ''appsettings.json'': { "Gateway": { "Databases": { "demo": { "Provider": "sqlite", "ConnectionString": "Data Source=data/demo.db" }, "produzione": { "Provider": "sqlserver", "ConnectionString": "Server=sql01;Database=ProdDB;User Id=app;Password=***" }, "reporting": { "Provider": "postgresql", "ConnectionString": "Host=pg01;Database=reports;Username=reader;Password=***" } } } } ---- ===== 2. Esportare DSN ===== **Con jq (Linux/macOS):** # Esportare tutti i DSN come JSON jq '.Gateway.Databases' appsettings.json > dsn-export.json # Esportare singolo DSN jq '.Gateway.Databases.produzione' appsettings.json > produzione-dsn.json # Elencare nomi DSN jq -r '.Gateway.Databases | keys[]' appsettings.json **Con PowerShell (Windows):** # Caricare JSON $config = Get-Content "appsettings.json" | ConvertFrom-Json # Esportare tutti i DSN $config.Gateway.Databases | ConvertTo-Json -Depth 10 | Out-File "dsn-export.json" # Elencare nomi DSN $config.Gateway.Databases.PSObject.Properties.Name ---- ===== 3. Importare DSN ===== **Con jq (Linux):** # Inserire DSN da file export in Config jq --slurpfile dsn dsn-export.json '.Gateway.Databases = $dsn[0]' appsettings.json > appsettings.new.json # Backup e sostituire cp appsettings.json appsettings.json.bak mv appsettings.new.json appsettings.json **Con PowerShell (Windows):** # Caricare Config esistente $config = Get-Content "appsettings.json" | ConvertFrom-Json # Caricare Export $dsnExport = Get-Content "dsn-export.json" | ConvertFrom-Json # Sostituire DSN $config.Gateway.Databases = $dsnExport # Salvare $config | ConvertTo-Json -Depth 10 | Out-File "appsettings.json" -Encoding UTF8 ---- ===== 4. Aggiungere Singolo DSN ===== **Con jq:** # Aggiungere nuovo DSN jq '.Gateway.Databases.nuovodb = { "Provider": "mysql", "ConnectionString": "Server=mysql01;Database=newdb;User=app;Password=secret" }' appsettings.json > appsettings.new.json mv appsettings.new.json appsettings.json **Con PowerShell:** $config = Get-Content "appsettings.json" | ConvertFrom-Json # Nuovo DSN come PSObject $newDsn = [PSCustomObject]@{ Provider = "mysql" ConnectionString = "Server=mysql01;Database=newdb;User=app;Password=secret" } # Aggiungere $config.Gateway.Databases | Add-Member -Name "nuovodb" -Value $newDsn -MemberType NoteProperty $config | ConvertTo-Json -Depth 10 | Out-File "appsettings.json" -Encoding UTF8 ---- ===== 5. Migrare DSN tra Ambienti ===== **Export da Produzione:** # Su server Prod ssh prod-gateway "jq '.Gateway.Databases' /opt/data-gateway/appsettings.json" > prod-dsn.json **Import in Staging (con adattamento password):** # Sostituire password con quelle staging jq '.produzione.ConnectionString = "Server=sql-staging;Database=ProdDB;User Id=app;Password=staging-pwd"' \ prod-dsn.json > staging-dsn.json # Importare in Staging scp staging-dsn.json staging-gateway:/tmp/ ssh staging-gateway "jq --slurpfile dsn /tmp/staging-dsn.json \ '.Gateway.Databases = \$dsn[0]' /opt/data-gateway/appsettings.json > /tmp/new.json && \ mv /tmp/new.json /opt/data-gateway/appsettings.json && \ systemctl restart data-gateway" ---- ===== 6. Riavviare Gateway ===== Dopo modifiche DSN: # Linux sudo systemctl restart data-gateway # Windows Restart-Service -Name "DataGateway" # Docker docker restart gateway ---- ===== 7. Testare DSN ===== # Testare tutti i DSN for dsn in $(jq -r '.Gateway.Databases | keys[]' appsettings.json); do echo -n "Testing $dsn: " curl -s -o /dev/null -w "%{http_code}\n" "http://localhost:5000/api/v1/dsn/$dsn/tables" done **Output atteso:** Testing demo: 200 Testing produzione: 200 Testing reporting: 200 ---- ===== 8. Checklist ===== | # | Punto di verifica | v | |---|-----------|---| | 1 | DSN esportato | ☐ | | 2 | File export salvato | ☐ | | 3 | Password non in chiaro nell'export | ☐ | | 4 | Import eseguito | ☐ | | 5 | Gateway riavviato | ☐ | | 6 | Tutti i DSN testati | ☐ | ---- ===== Troubleshooting ===== | Problema | Causa | Soluzione | |---------|---------|--------| | ''jq: parse error'' | JSON non valido | Validare JSON | | DSN non trovato | Gateway non riavviato | Restart | | ''Connection failed'' | Connection String errato | Verificare credenziali | | Problemi encoding | Encoding errato | Usare UTF-8 | ---- ===== Note sulla Sicurezza ===== **Password negli Export:** * Mai committare password in Git * Crittografare o eliminare file export * Usare variabili ambiente per credenziali: "ConnectionString": "Server=sql01;Database=ProdDB;User Id=${DB_USER};Password=${DB_PASS}" ---- ===== Runbook Correlati ===== * [[.:config-backup|Config-Backup]] - Backup completo * [[..:tagesgeschaeft:dsn-verwalten|Gestire DSN]] - Amministrazione DSN * [[..:tagesgeschaeft:server-starten|Avviare server]] - Dopo Import ---- << [[.:config-backup|<- Config-Backup]] | [[..:start|-> Panoramica Operatore]] >> ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Data Gateway Professional// {{tag>operator runbook dsn export import migration}}