====== 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}}