====== Runbook: DSN Export ======
**Duration:** ~5 minutes \\
**Role:** Sysadmin, DBA \\
**Application:** Migration, documentation, disaster recovery
Export and import of DSN definitions (Data Source Names).
----
===== Workflow =====
flowchart TD
A[Start] --> B{Goal?}
B -->|Export| C[Extract DSN from config]
B -->|Import| D[Insert DSN into config]
C --> E[Save JSON]
D --> F[Restart Gateway]
E --> G[Done]
F --> H[Test DSN]
H --> G
style G fill:#e8f5e9
----
===== 1. DSN Structure =====
DSN are defined in ''appsettings.json'':
{
"Gateway": {
"Databases": {
"demo": {
"Provider": "sqlite",
"ConnectionString": "Data Source=data/demo.db"
},
"production": {
"Provider": "sqlserver",
"ConnectionString": "Server=sql01;Database=ProdDB;User Id=app;Password=***"
},
"reporting": {
"Provider": "postgresql",
"ConnectionString": "Host=pg01;Database=reports;Username=reader;Password=***"
}
}
}
}
----
===== 2. Export DSN =====
**With jq (Linux/macOS):**
# Export all DSN as JSON
jq '.Gateway.Databases' appsettings.json > dsn-export.json
# Export single DSN
jq '.Gateway.Databases.production' appsettings.json > production-dsn.json
# List DSN names
jq -r '.Gateway.Databases | keys[]' appsettings.json
**With PowerShell (Windows):**
# Load JSON
$config = Get-Content "appsettings.json" | ConvertFrom-Json
# Export all DSN
$config.Gateway.Databases | ConvertTo-Json -Depth 10 | Out-File "dsn-export.json"
# List DSN names
$config.Gateway.Databases.PSObject.Properties.Name
----
===== 3. Import DSN =====
**With jq (Linux):**
# Insert DSN from export file into config
jq --slurpfile dsn dsn-export.json '.Gateway.Databases = $dsn[0]' appsettings.json > appsettings.new.json
# Backup and replace
cp appsettings.json appsettings.json.bak
mv appsettings.new.json appsettings.json
**With PowerShell (Windows):**
# Load existing config
$config = Get-Content "appsettings.json" | ConvertFrom-Json
# Load export
$dsnExport = Get-Content "dsn-export.json" | ConvertFrom-Json
# Replace DSN
$config.Gateway.Databases = $dsnExport
# Save
$config | ConvertTo-Json -Depth 10 | Out-File "appsettings.json" -Encoding UTF8
----
===== 4. Add Single DSN =====
**With jq:**
# Add new DSN
jq '.Gateway.Databases.newdb = {
"Provider": "mysql",
"ConnectionString": "Server=mysql01;Database=newdb;User=app;Password=secret"
}' appsettings.json > appsettings.new.json
mv appsettings.new.json appsettings.json
**With PowerShell:**
$config = Get-Content "appsettings.json" | ConvertFrom-Json
# New DSN as PSObject
$newDsn = [PSCustomObject]@{
Provider = "mysql"
ConnectionString = "Server=mysql01;Database=newdb;User=app;Password=secret"
}
# Add
$config.Gateway.Databases | Add-Member -Name "newdb" -Value $newDsn -MemberType NoteProperty
$config | ConvertTo-Json -Depth 10 | Out-File "appsettings.json" -Encoding UTF8
----
===== 5. Migrate DSN Between Environments =====
**Export from production:**
# On prod server
ssh prod-gateway "jq '.Gateway.Databases' /opt/data-gateway/appsettings.json" > prod-dsn.json
**Import to staging (with password adjustment):**
# Replace passwords with staging passwords
jq '.production.ConnectionString = "Server=sql-staging;Database=ProdDB;User Id=app;Password=staging-pwd"' \
prod-dsn.json > staging-dsn.json
# Import to 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. Restart Gateway =====
After DSN changes:
# Linux
sudo systemctl restart data-gateway
# Windows
Restart-Service -Name "DataGateway"
# Docker
docker restart gateway
----
===== 7. Test DSN =====
# Test all 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
**Expected output:**
Testing demo: 200
Testing production: 200
Testing reporting: 200
----
===== 8. Checklist =====
| # | Check | Done |
|---|-------|------|
| 1 | DSN exported | [ ] |
| 2 | Export file backed up | [ ] |
| 3 | Passwords not in clear text in export | [ ] |
| 4 | Import completed | [ ] |
| 5 | Gateway restarted | [ ] |
| 6 | All DSN tested | [ ] |
----
===== Troubleshooting =====
| Problem | Cause | Solution |
|---------|-------|----------|
| ''jq: parse error'' | Invalid JSON | Validate JSON |
| DSN not found | Gateway not restarted | Restart |
| ''Connection failed'' | Wrong connection string | Check credentials |
| Encoding issues | Wrong encoding | Use UTF-8 |
----
===== Security Notes =====
**Passwords in exports:**
* Never commit passwords to Git
* Encrypt or delete export files
* Use environment variables for credentials:
"ConnectionString": "Server=sql01;Database=ProdDB;User Id=${DB_USER};Password=${DB_PASS}"
----
===== Related Runbooks =====
* [[.:config-backup|Config Backup]] - Full backup
* [[..:tagesgeschaeft:dsn-verwalten|Manage DSN]] - DSN administration
* [[..:tagesgeschaeft:server-starten|Start Server]] - After import
----
<< [[.:config-backup|<- Config Backup]] | [[..:start|-> Operator Overview]] >>
----
//Wolfgang van der Stille @ EMSR DATA d.o.o. - Data Gateway Professional//
{{tag>operator runbook dsn export import migration}}