> For the complete documentation index, see [llms.txt](https://docs.devolutions.net/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.devolutions.net/server/da/knowledge-base/how-to-articles/devolutions-server-docker-deployment/advanced-docker-configuration-for-devolutions-server.md).

# Avanceret Docker-konfiguration til Devolutions Server

Konfigurer Devolutions Server i Docker med SQL Server, PostgreSQL eller SQLite, og opsæt TLS-certifikater, reverse proxies, hemmeligheder og versionsopdateringer.

Denne artikel dækker avancerede konfigurationsmuligheder for Docker-imaget til Devolutions Server: den fulde reference over miljøvariabler, databasekonfiguration til SQL Server, PostgreSQL og SQLite, TLS-certifikater, indstillinger for omvendt proxy, sikkerhedshærdning og versionsopdateringer.

Devolutions Server-imaget er udgivet på Docker Hub som [`devolutions/devolutions-server`](https://hub.docker.com/r/devolutions/devolutions-server). Det er et Linux-image (Debian), der er bygget til `linux/amd64` og `linux/arm64`.

Imaget understøtter følgende databasemotorer:

| Motor      | Værdi af `DATABASE_TYPE` | Notes                                                                                                                                                                                                                                                       |
| ---------- | ------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| SQL Server | `SqlServer` (standard)   | Lokal SQL Server eller en administreret tjeneste som Azure SQL Database.                                                                                                                                                                                    |
| PostgreSQL | `PostgreSQL`             | PostgreSQL 14 eller nyere, selvhostet eller administreret, med en rolle, der har attributten `SUPERUSER`. Til forberedelsen på serversiden skal De se [PostgreSQL](/server/da/getting-started/installation/database-setup/database-instance/postgresql.md). |
| SQLite     | `SQLite`                 | Eksperimentel. Én aktiv Devolutions Server-node, kun på lokalt lager.                                                                                                                                                                                       |

{% hint style="info" %}
De fleste korte eksempler i denne artikel bruger Bash-linjefortsættelse (`\`). I PowerShell skal De afslutte hver fortsat linje med et accenttegn (`` ` ``) i stedet.
{% endhint %}

### Reference for miljøvariabler

#### Variabler for databaseforbindelse

Hver variabel i kolonnen *Alias* er et alternativt navn på den samme indstilling (Azure-specifik navngivning). Angiv enten standardnavnet eller dets alias, ikke begge dele: når begge er angivet, bruges standardnavnet.

| Variable                            | Alias                     | Påkrævet               | Standard                                 | Description                                                                                                                                                                                                                                                                                                                                                  |
| ----------------------------------- | ------------------------- | ---------------------- | ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `DATABASE_TYPE`                     | —                         | Nej                    | `SqlServer`                              | Databasemotor: `SqlServer`, `PostgreSQL` eller `SQLite`. Værdien skelner ikke mellem store og små bogstaver, og `MSSQL` og `Postgres` accepteres som aliaser. Enhver anden værdi stopper containeren ved start.                                                                                                                                              |
| `DATABASE_HOST`                     | `AZURE_SQL_HOST`          | SQL Server, PostgreSQL | —                                        | Værtsnavn eller IP-adresse for databaseserveren. SQL Server accepterer formatet `host,port` (for eksempel `sql.example.com,1435`). PostgreSQL accepterer formatet `host:port` (for eksempel `postgres.example.com:5433`), som tilsidesætter `DATABASE_PORT`. Formatet `host,port` virker ikke med PostgreSQL.                                                |
| `DATABASE_NAME`                     | `AZURE_SQL_DATABASE`      | SQL Server, PostgreSQL | —                                        | Navn på Devolutions Server-databasen.                                                                                                                                                                                                                                                                                                                        |
| `DATABASE_USERNAME`                 | `AZURE_SQL_USERNAME`      | SQL Server, PostgreSQL | —                                        | Databasekonto, der bruges af Devolutions Server. SQL Server: et SQL Server-login, der er medlem af `db_owner` i Devolutions Server-databasen. PostgreSQL: en dedikeret rolle, der ejer Devolutions Server-databasen, med attributten `SUPERUSER` for at oprette databaseskemaet.                                                                             |
| `DATABASE_PASSWORD`                 | `AZURE_SQL_PASSWORD`      | SQL Server, PostgreSQL | —                                        | Adgangskode til databasekontoen. Behandl den som en hemmelighed: brug `DATABASE_PASSWORD_FILE` med Docker-secrets eller et hemmelighedslager som Azure Key Vault.                                                                                                                                                                                            |
| `DATABASE_PASSWORD_FILE`            | `AZURE_SQL_PASSWORD_FILE` | Nej                    | —                                        | Sti til en fil, der indeholder databaseadgangskoden, f.eks. en Docker-secret monteret på `/run/secrets/dvls_db_password`. Bruges kun, når hverken `DATABASE_PASSWORD` eller `AZURE_SQL_PASSWORD` er angivet. Filen må ikke være tom. Afsluttende linjeskift fjernes.                                                                                         |
| `DATABASE_PORT`                     | `AZURE_SQL_PORT`          | Nej                    | `1433` (SQL Server), `5432` (PostgreSQL) | Port til databaseserveren. SQL Server: tilføjes til `DATABASE_HOST` som `host,port`, når den afviger fra `1433`, og `DATABASE_HOST` ikke allerede indeholder en port. PostgreSQL: skal være et heltal mellem 1 og 65535.                                                                                                                                     |
| `DATABASE_ENCRYPT`                  | —                         | Nej                    | `false`                                  | Angiv `true` for at kryptere databaseforbindelsen med TLS. SQL Server: angiver `Encrypt`. PostgreSQL: `false` angiver `SSL Mode=Disable` (forbindelsen er ikke krypteret). `true` angiver `SSL Mode=VerifyFull` eller `SSL Mode=Require`, når `DATABASE_TRUST_SERVER_CERTIFICATE=true`. Læses ved hver start af containeren: send den ved hver `docker run`. |
| `DATABASE_TRUST_SERVER_CERTIFICATE` | —                         | Nej                    | `false`                                  | Angiv `true` sammen med `DATABASE_ENCRYPT=true` for at acceptere databaseserverens certifikat uden at validere det (for eksempel et selvsigneret certifikat). SQL Server: angiver `TrustServerCertificate`. PostgreSQL: vælger `SSL Mode=Require` i stedet for `VerifyFull`. Læses ved hver start af containeren.                                            |
| `DATABASE_PATH`                     | —                         | SQLite                 | —                                        | Absolut sti til SQLite-databasefilen i `$DVLS_PATH/App_Data` (for eksempel `/opt/devolutions/dvls/App_Data/dvls.sqlite`). Bruges kun med `DATABASE_TYPE=SQLite`.                                                                                                                                                                                             |

{% hint style="info" %}
Med `DATABASE_TYPE=SQLite` nægter containeren at starte, når `DATABASE_HOST`, `DATABASE_NAME`, `DATABASE_USERNAME`, `DATABASE_PASSWORD`, `DATABASE_PASSWORD_FILE`, `DATABASE_PORT` eller et af deres aliaser er angivet.
{% endhint %}

#### Konfiguration af webserver

| Variable                | Påkrævet | Standard                                                 | Description                                                                                                                                                                                                                                                                                                                     |
| ----------------------- | -------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `HOSTNAME`              | Nej      | Værtsnavn for containeren (`localhost`, når det er tomt) | Serverens værtsnavn, der bruges til adgangs-URI'en, servernavnet og det selvsignerede certifikat. Docker sætter `HOSTNAME` til containerens værtsnavn (container-id'et, medmindre `--hostname` bruges), så De skal sende `-e HOSTNAME=<public host name>`. Tilsidesættes af `WEBSITE_HOSTNAME` på Azure.                        |
| `WEB_SCHEME`            | Nej      | `http`                                                   | Protokol, som containeren lytter på: `http` eller `https`. Angiv `https` for at aktivere TLS.                                                                                                                                                                                                                                   |
| `PORT` / `WEB_PORT`     | Nej      | `5000`                                                   | Port, som containeren lytter på, på alle grænseflader. Når begge er angivet, bruges `PORT`. `ASPNETCORE_URLS` har ingen virkning: containeren skriver selv lytteadressen.                                                                                                                                                       |
| `EXTERNAL_WEB_SCHEME`   | Nej      | Værdi af `WEB_SCHEME`                                    | Offentlig protokol, når Devolutions Server kører bag en reverse proxy (for eksempel `https`, når proxyen håndterer TLS).                                                                                                                                                                                                        |
| `EXTERNAL_WEB_PORT`     | Nej      | Værdi af `PORT` / `WEB_PORT`                             | Offentlig port, når Devolutions Server kører bag en reverse proxy (for eksempel `443`). Portene `443` (HTTPS) og `80` (HTTP) udelades fra adgangs-URI'en.                                                                                                                                                                       |
| `EXTERNAL_WEB_HOSTNAME` | Nej      | Værdi af `HOSTNAME`                                      | Offentligt værtsnavn, der bruges i adgangs-URI'en, for eksempel et brugerdefineret domæne, når `WEBSITE_HOSTNAME` er adressen `azurewebsites.net`. Når denne variabel er angivet, omskriver hver normal start (ikke initialisering eller opdateringstilstand) den adgangs-URI, der er gemt i databasen, så den stemmer overens. |

#### Konfiguration af TLS-certifikat

| Variable               | Påkrævet | Standard | Description                                                                                                                                        |
| ---------------------- | -------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| `TLS_CERTIFICATE_FILE` | Nej      | —        | Sti til en monteret PEM-certifikatfil (for eksempel `/opt/devolutions/dvls/certs/server.pem`). Bruges, når filen findes.                           |
| `TLS_PRIVATE_KEY_FILE` | Nej      | —        | Sti til en monteret PEM-fil med privat nøgle (for eksempel `/opt/devolutions/dvls/certs/server.key`). Bruges, når filen findes.                    |
| `TLS_CERTIFICATE_B64`  | Nej      | —        | Base64-kodet certifikatindhold, der skrives til `App_Data/server.pem`. Bruges, når `TLS_CERTIFICATE_FILE` ikke peger på en eksisterende fil.       |
| `TLS_PRIVATE_KEY_B64`  | Nej      | —        | Base64-kodet indhold af privat nøgle, der skrives til `App_Data/server.key`. Bruges, når `TLS_PRIVATE_KEY_FILE` ikke peger på en eksisterende fil. |

{% hint style="info" %}
Hvis `WEB_SCHEME=https`, og der hverken er angivet et certifikat eller en privat nøgle, genererer containeren et selvsigneret certifikat (gyldigt i 5 år, 2048-bit RSA). Hvis kun ét af de to er angivet, stopper containeren ved opstart. Brug filmonteringer eller base64-variabler til produktionscertifikater.
{% endhint %}

#### Konfiguration af driftstilstand

Containeren kører i en af tre tilstande:

| Mode              | Condition                                                       | Funktionsmåde                                                                                                                                                                                                                |
| ----------------- | --------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Kørsel (standard) | `DVLS_INIT` og `DVLS_UPDATE_MODE` er ikke angivet eller `false` | Bruger ventende opgraderinger af databaseskemaet (når `DVLS_DATABASE_UPGRADE_ON_STARTUP=true`), starter derefter Devolutions Server og bliver ved med at køre.                                                               |
| Initialisering    | `DVLS_INIT=true`                                                | Klargør en ny database og dens første administrator, starter derefter Devolutions Server og bliver ved med at køre.                                                                                                          |
| Opdatering        | `DVLS_UPDATE_MODE=true`                                         | Sikkerhedskopierer konfigurations- og installationsfilerne, tager et øjebliksbillede af databasen kun for SQLite, opgraderer databaseskemaet, gendanner konfigurationen og de brugerdefinerede mapper og afslutter derefter. |

{% hint style="info" %}
`DVLS_INIT` og `DVLS_UPDATE_MODE` udelukker hinanden. Hvis begge sættes til `true`, stopper containeren med en fejl.
{% endhint %}

| Variable                             | Påkrævet | Standard                  | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| ------------------------------------ | -------- | ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `DVLS_INIT`                          | Nej      | `false`                   | Angiv `true` ved den første start mod en ny database. Containeren opretter databasen, hvis den ikke findes (SQL Server og PostgreSQL), opretter eller opgraderer skemaet, skriver standardindstillingerne, krypteringsnøglerne og nøgleparret til gatewayen, opretter administratoren og starter derefter Devolutions Server. Når `Initialization completed successfully.` vises i loggene, skal De stoppe containeren og starte den igen uden `DVLS_INIT`: en anden initialisering mislykkes, fordi administratoren allerede findes. |
| `DVLS_UPDATE_MODE`                   | Nej      | `false`                   | Angiv `true` for at køre opdateringstilstand og derefter afslutte. Opdateringstilstanden sikkerhedskopierer ikke SQL Server- eller PostgreSQL-databaser: sikkerhedskopiér dem, før De kører den.                                                                                                                                                                                                                                                                                                                                      |
| `DVLS_BACKUP_PATH`                   | Nej      | `/tmp/dvls-backup`        | Mappe, hvor opdateringstilstand kopierer konfigurationsfilerne (`config`) og installationsmappen (`installation`). Standardmappen ligger inde i containeren: montér en volumen for at beholde sikkerhedskopien. Når denne variabel er angivet, gemmes SQLite-øjebliksbilleder fra før opdateringen også der (i `database`). Ellers gemmes de i `App_Data/Backups/database`.                                                                                                                                                           |
| `DVLS_DATABASE_UPGRADE_ON_STARTUP`   | Nej      | `true` (angivet i imaget) | Bruger ventende opgraderinger af databaseskemaet under en normal start, før Devolutions Server accepterer anmodninger. Hvis opgraderingen mislykkes, starter containeren ikke. Accepterer kun `true` eller `false`.                                                                                                                                                                                                                                                                                                                   |
| `DVLS_DATABASE_UPGRADE_LOCK_TIMEOUT` | Nej      | `300` (angivet i imaget)  | Det maksimale antal sekunder, en startende container venter på den lås til skemaopgradering, som en anden container holder på den samme database. Når ventetiden udløber, starter containeren ikke. Heltal mellem 1 og 2147483.                                                                                                                                                                                                                                                                                                       |
| `DVLS_SKIP_ACCESS_URI_UPDATE`        | Nej      | `false`                   | Angiv `true` for at bevare den adgangs-URI, der er gemt i databasen, uændret, når `EXTERNAL_WEB_HOSTNAME` er angivet.                                                                                                                                                                                                                                                                                                                                                                                                                 |

#### Variabler for initialiseringstilstand

Disse variabler bruges kun under initialiseringen (`DVLS_INIT=true`):

| Variable              | Påkrævet | Standard           | Description                                                                                                       |
| --------------------- | -------- | ------------------ | ----------------------------------------------------------------------------------------------------------------- |
| `DVLS_ADMIN_USERNAME` | Nej      | `dvls-admin`       | Brugernavn for den administratorkonto, der oprettes under initialiseringen.                                       |
| `DVLS_ADMIN_PASSWORD` | Nej      | `dvls-admin`       | Startadgangskode for administratorkontoen. Angiv en anden værdi: administratoren skal ændre den ved første logon. |
| `DVLS_ADMIN_EMAIL`    | Nej      | `admin@<HOSTNAME>` | E-mailadresse for administratorkontoen.                                                                           |

#### Systemkonfiguration

| Variable                     | Påkrævet | Standard                                   | Description                                                                                                                                                                                                           |
| ---------------------------- | -------- | ------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `DVLS_PATH`                  | Nej      | `/opt/devolutions/dvls`                    | Installationsrodsti (placering af `appsettings.json` og `App_Data`).                                                                                                                                                  |
| `DVLS_EXECUTABLE_PATH`       | Nej      | `/opt/devolutions/dvls/Devolutions.Server` | Den eksekverbare fil til Devolutions Server, som startes af imagets indgangspunkt.                                                                                                                                    |
| `DVLS_TELEMETRY`             | Nej      | `true`                                     | Aktiverer eller deaktiverer indsamling af telemetri.                                                                                                                                                                  |
| `DVLS_ENCRYPTION_CONFIG_B64` | Nej      | —                                          | Base64-kodet krypteringskonfiguration, der skrives til `App_Data/encryption.config` ved hver start. Påkrævet for at beholde de samme krypteringsnøgler på tværs af genstarter, genudrulninger og skalerede instanser. |
| `DVLS_PG_DUMP_PATH`          | Nej      | `pg_dump` på `PATH`                        | Fuld sti til den eksekverbare fil `pg_dump`, som det indbyggede sikkerhedskopieringsjob bruger med PostgreSQL. Imaget indeholder den ikke.                                                                            |
| `DVLS_PG_RESTORE_PATH`       | Nej      | `pg_restore` på `PATH`                     | Fuld sti til den eksekverbare fil `pg_restore`, der bruges til at validere sikkerhedskopier med PostgreSQL. Imaget indeholder den ikke.                                                                               |

#### Konfiguration af SSH-adgang

| Variable       | Påkrævet                   | Standard  | Description                                                                                                                       |
| -------------- | -------------------------- | --------- | --------------------------------------------------------------------------------------------------------------------------------- |
| `SSH_ENABLED`  | Nej                        | `false`   | Aktiverer SSH-dæmonen til fejlfinding. Aktiveres automatisk på Azure App Service, medmindre den angives eksplicit.                |
| `SSH_PORT`     | Nej                        | `2222`    | SSH-lytteport (publicer den med `-p 2222:2222`).                                                                                  |
| `SSH_PASSWORD` | Ja, når `SSH_ENABLED=true` | `Docker!` | Root-adgangskode til SSH. Standardværdien gælder kun, når SSH aktiveres automatisk på Azure. Den må ikke indeholde et linjeskift. |

{% hint style="info" %}
Hvis `SSH_ENABLED=true` er angivet uden `SSH_PASSWORD`, nægter containeren at starte.
{% endhint %}

#### Variabler for Azure Web App

Disse variabler angives automatisk af Azure App Service:

| Variable              | Angivet af | Description                                                                                                                                     |
| --------------------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| `WEBSITE_HOSTNAME`    | Azure      | Tilsidesætter `HOSTNAME` (for eksempel `dvls-prod.azurewebsites.net`).                                                                          |
| `WEBSITE_INSTANCE_ID` | Azure      | Aktiverer SSH, medmindre `SSH_ENABLED` er angivet. Med `WEBSITE_HOSTNAME` gennemtvinges `EXTERNAL_WEB_SCHEME=https` og `EXTERNAL_WEB_PORT=443`. |

### Konfiguration af TLS-certifikat

#### Automatisk genereret selvsigneret certifikat

Når `WEB_SCHEME=https` er angivet uden certifikatvariabler, genererer containeren et selvsigneret certifikat (gyldigt i 5 år, 2048-bit RSA, `CN` og subject alternative name sat til `HOSTNAME`):

**Windows (PowerShell):**

```powershell
docker run -d --name dvls-server `
  -e DATABASE_HOST=your-sql-server `
  -e DATABASE_NAME=dvls `
  -e DATABASE_USERNAME=dvls_user `
  -e DATABASE_PASSWORD='YourPassword!' `
  -e HOSTNAME=localhost `
  -e WEB_SCHEME=https `
  -e PORT=5000 `
  -p 5000:5000 `
  devolutions/devolutions-server:release-20XX.X
```

**macOS/Linux (Bash):**

```bash
docker run -d --name dvls-server \
  -e DATABASE_HOST=your-sql-server \
  -e DATABASE_NAME=dvls \
  -e DATABASE_USERNAME=dvls_user \
  -e DATABASE_PASSWORD='YourPassword!' \
  -e HOSTNAME=localhost \
  -e WEB_SCHEME=https \
  -e PORT=5000 \
  -p 5000:5000 \
  devolutions/devolutions-server:release-20XX.X
```

{% hint style="warning" %}
Brug det selvsignerede certifikat kun til udvikling og test. Browsere viser en sikkerhedsadvarsel for det.
{% endhint %}

#### Certifikatfiler via volumenmontering

Montér certifikatfiler fra værten:

**Windows (PowerShell):**

```powershell
New-Item -ItemType Directory -Force -Path C:\dvls\certs
Copy-Item C:\path\to\server.pem, C:\path\to\server.key -Destination C:\dvls\certs\

docker run -d --name dvls-server `
  -e DATABASE_HOST=your-sql-server `
  -e DATABASE_NAME=dvls `
  -e DATABASE_USERNAME=dvls_user `
  -e DATABASE_PASSWORD='YourPassword!' `
  -e HOSTNAME=devolutions-server.company.com `
  -e WEB_SCHEME=https `
  -e PORT=5000 `
  -e TLS_CERTIFICATE_FILE=/opt/devolutions/dvls/certs/server.pem `
  -e TLS_PRIVATE_KEY_FILE=/opt/devolutions/dvls/certs/server.key `
  -p 5000:5000 `
  -v C:\dvls\certs:/opt/devolutions/dvls/certs:ro `
  devolutions/devolutions-server:release-20XX.X
```

**macOS/Linux (Bash):**

```bash
mkdir -p /host/certs
cp /path/to/server.pem /host/certs/
cp /path/to/server.key /host/certs/
chmod 600 /host/certs/server.key

docker run -d --name dvls-server \
  -e DATABASE_HOST=your-sql-server \
  -e DATABASE_NAME=dvls \
  -e DATABASE_USERNAME=dvls_user \
  -e DATABASE_PASSWORD='YourPassword!' \
  -e HOSTNAME=devolutions-server.company.com \
  -e WEB_SCHEME=https \
  -e PORT=5000 \
  -e TLS_CERTIFICATE_FILE=/opt/devolutions/dvls/certs/server.pem \
  -e TLS_PRIVATE_KEY_FILE=/opt/devolutions/dvls/certs/server.key \
  -p 5000:5000 \
  -v /host/certs:/opt/devolutions/dvls/certs:ro \
  devolutions/devolutions-server:release-20XX.X
```

Krav til certifikatformat:

* Certifikat: PEM-format (`.pem`, `.crt`).
* Privat nøgle: PEM-format (`.key`, `.pem`).
* Kæde: medtag de mellemliggende certifikater i certifikatfilen.

Eksempel på certifikatfil med kæde:

```
-----BEGIN CERTIFICATE-----
<Your certificate>
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
<Intermediate CA certificate>
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
<Root CA certificate>
-----END CERTIFICATE-----
```

#### Base64-kodede certifikater

Brug base64-kodede certifikater, når De arbejder med systemer til administration af hemmeligheder (Azure Key Vault, Kubernetes Secrets):

**Windows (PowerShell):**

```powershell
$certificate = [System.Convert]::ToBase64String([System.IO.File]::ReadAllBytes("C:\path\to\server.pem"))
$privateKey = [System.Convert]::ToBase64String([System.IO.File]::ReadAllBytes("C:\path\to\server.key"))

docker run -d --name dvls-server `
  -e DATABASE_HOST=your-sql-server `
  -e DATABASE_NAME=dvls `
  -e DATABASE_USERNAME=dvls_user `
  -e DATABASE_PASSWORD='YourPassword!' `
  -e HOSTNAME=devolutions-server.company.com `
  -e WEB_SCHEME=https `
  -e PORT=5000 `
  -e TLS_CERTIFICATE_B64="$certificate" `
  -e TLS_PRIVATE_KEY_B64="$privateKey" `
  -p 5000:5000 `
  devolutions/devolutions-server:release-20XX.X
```

**macOS/Linux (Bash):**

```bash
base64 -w 0 server.pem > server.pem.b64
base64 -w 0 server.key > server.key.b64

docker run -d --name dvls-server \
  -e DATABASE_HOST=your-sql-server \
  -e DATABASE_NAME=dvls \
  -e DATABASE_USERNAME=dvls_user \
  -e DATABASE_PASSWORD='YourPassword!' \
  -e HOSTNAME=devolutions-server.company.com \
  -e WEB_SCHEME=https \
  -e PORT=5000 \
  -e TLS_CERTIFICATE_B64="$(cat server.pem.b64)" \
  -e TLS_PRIVATE_KEY_B64="$(cat server.key.b64)" \
  -p 5000:5000 \
  devolutions/devolutions-server:release-20XX.X
```

På macOS skal De bruge `base64 -i server.pem -o server.pem.b64` i stedet for `base64 -w 0`.

Certifikatet og den private nøgle skrives til `/opt/devolutions/dvls/App_Data/` og henvises til i konfigurationen af Devolutions Server.

### Databasekonfiguration

#### Format for forbindelsesstreng

Ved hver start opbygger containeren databaseforbindelsesstrengen ud fra miljøvariablerne og skriver den til `appsettings.json` (afsnittet `ConnectionStrings`). Forbindelsesstrengen indeholder følgende nøgler:

| Nøgle i forbindelsesstreng (SQL Server) | Nøgle i forbindelsesstreng (PostgreSQL) | Kildevariabel                                      |
| --------------------------------------- | --------------------------------------- | -------------------------------------------------- |
| `Data Source`                           | `Host` og `Port`                        | `DATABASE_HOST`, `DATABASE_PORT`                   |
| `Initial Catalog`                       | `Database`                              | `DATABASE_NAME`                                    |
| `User ID`                               | `Username`                              | `DATABASE_USERNAME`                                |
| `Password`                              | `Password`                              | `DATABASE_PASSWORD` eller `DATABASE_PASSWORD_FILE` |
| `Encrypt`                               | `SSL Mode`                              | `DATABASE_ENCRYPT`                                 |
| `TrustServerCertificate`                | `SSL Mode`                              | `DATABASE_TRUST_SERVER_CERTIFICATE`                |

Fordi forbindelsesstrengen genopbygges ved hver start, skal De sende de samme databasevariabler ved hvert `docker run`: initialisering, kørsel og opdatering.

#### SQL Server

Standardport (`1433`), hvor `DATABASE_PORT` er udeladt:

```bash
-e DATABASE_HOST=sql.example.com
```

Ikke-standardport, enten i værtsnavnet eller i en separat variabel:

```bash
-e DATABASE_HOST=sql.example.com,1435
```

```bash
-e DATABASE_HOST=sql.example.com \
-e DATABASE_PORT=1435
```

Azure SQL Database, med de Azure-specifikke aliaser:

```bash
-e AZURE_SQL_HOST=dvls-sql-server.database.windows.net \
-e AZURE_SQL_DATABASE=dvls \
-e AZURE_SQL_USERNAME=dvls_user@dvls-sql-server \
-e AZURE_SQL_PASSWORD='YourPassword!'
```

Med `DVLS_INIT=true` oprettes en database, der ikke findes, med sorteringen `Latin1_General_CS_AS`. Loginnet skal da have tilladelse til at oprette databaser. Ellers skal De oprette databasen på forhånd.

#### PostgreSQL

Angiv `DATABASE_TYPE=PostgreSQL`. Standardporten bliver `5432`. Minimalt eksempel:

```bash
-e DATABASE_TYPE=PostgreSQL \
-e DATABASE_HOST=postgres.example.com \
-e DATABASE_NAME=dvls \
-e DATABASE_USERNAME=dvls_owner \
-e DATABASE_PASSWORD='YourPassword!' \
-e DATABASE_ENCRYPT=true
```

Til en ikke-standardport skal De bruge `DATABASE_PORT=5433` eller `DATABASE_HOST=postgres.example.com:5433`. Med en IP-adresse skal De angive porten med `DATABASE_PORT`. SQL Server-formatet `host,port` virker ikke med PostgreSQL.

PostgreSQL-forbindelsesstrengen indeholder nøglerne `Host`, `Port`, `Username`, `Password`, `Database` og `SSL Mode`. Under kørsel tilføjer Devolutions Server også `Search Path=dbo,public` og `Keep Alive=30`, når de mangler. I `psql` er tabellerne i Devolutions Server med små bogstaver i skemaet `dbo` (for eksempel `dbo.connections`).

`DATABASE_ENCRYPT` og `DATABASE_TRUST_SERVER_CERTIFICATE` angiver `SSL Mode`:

| `DATABASE_ENCRYPT` | `DATABASE_TRUST_SERVER_CERTIFICATE` | Resulterende `SSL Mode` | Resultat                                                             |
| ------------------ | ----------------------------------- | ----------------------- | -------------------------------------------------------------------- |
| `false` (standard) | Enhver værdi                        | `Disable`               | Forbindelsen er ikke krypteret.                                      |
| `true`             | `true`                              | `Require`               | Forbindelsen er krypteret; servercertifikatet valideres ikke.        |
| `true`             | `false` (standard)                  | `VerifyFull`            | Forbindelsen er krypteret; certifikatkæden og værtsnavnet valideres. |

{% hint style="warning" %}
Med standardværdierne er PostgreSQL-forbindelsen ikke krypteret. Angiv `DATABASE_ENCRYPT=true`, når databasen tilgås over et netværk.
{% endhint %}

**Databasekonto og oprettelse**

* Brug en dedikeret rolle, der ejer Devolutions Server-databasen. Devolutions Server bruger denne ene ejerrolle til oprettelse af skemaet, skemaopgraderinger og kørsel: de kørselsroller med færrest privilegier, der findes til SQL Server, gælder ikke for PostgreSQL.
* Rollen skal have attributten `SUPERUSER` for at oprette databaseskemaet, fordi oprettelsen af skemaet ændrer PostgreSQL-typecasts. Skemaet oprettes med `DVLS_INIT=true` eller ved opstart, når databasen er tom. Når skemaet findes, kræver rollen ikke attributten: fjern den med `ALTER ROLE <role> NOSUPERUSER;`.
* Med `DVLS_INIT=true` oprettes en database, der ikke findes, via vedligeholdelsesdatabasen `postgres`. Rollen skal derefter have `CONNECT` på databasen `postgres`.

**Sikkerhedskopier**

* Det indbyggede sikkerhedskopieringsjob kører `pg_dump --format=custom` og validerer resultatet med `pg_restore --list`. Imaget indeholder ikke disse værktøjer: byg et afledt image, der installerer PostgreSQL-klientpakken, eller montér binærfilerne, og angiv `DVLS_PG_DUMP_PATH` og `DVLS_PG_RESTORE_PATH`.
* Hovedversionen af `pg_dump` skal være lig med eller nyere end hovedversionen af PostgreSQL-serveren; ellers mislykkes sikkerhedskopieringen.
* En databasesikkerhedskopi indeholder ikke krypteringsnøglerne. Opbevar `encryption.config` (eller værdien `DVLS_ENCRYPTION_CONFIG_B64`) i en separat sikkerhedskopi.

#### SQLite

Understøttelse af SQLite er eksperimentel. Den kører én aktiv Devolutions Server-node mod en databasefil på lokalt lager og egner sig ikke til høj tilgængelighed, flere replikaer eller netværksfilsystemer eller distribuerede filsystemer (SMB, NFS).

```bash
-e DATABASE_TYPE=SQLite \
-e DATABASE_PATH=/opt/devolutions/dvls/App_Data/dvls.sqlite \
-v dvls-sqlite-data:/opt/devolutions/dvls/App_Data
```

`DATABASE_PATH` skal være en absolut filsti inde i `App_Data`. Bevar hele mappen `App_Data` på en volumen: den indeholder databasefilen og krypteringskonfigurationen. En lås forhindrer en anden container i at bruge den samme databasefil, mens den første kører.

#### Krypteret databaseforbindelse (TLS) <a href="#encrypted-database-connection-tls" id="encrypted-database-connection-tls"></a>

Som standard opretter Devolutions Server forbindelse til databasen uden TLS. Hvis SQL Server gennemtvinger kryptering (for eksempel en instans, hvor ***Force Encryption*** er aktiveret), mislykkes forbindelsen, indtil kryptering er aktiveret på klientsiden. Hvis PostgreSQL-serveren kræver SSL, afvises standardforbindelsen `SSL Mode=Disable`. Med PostgreSQL vælger `DATABASE_ENCRYPT=true` `SSL Mode=VerifyFull` eller `SSL Mode=Require`, når `DATABASE_TRUST_SERVER_CERTIFICATE=true` også er angivet.

{% hint style="warning" %}
Disse variabler læses ved hver start af containeren, ikke kun under initialiseringen. Forbindelsesstrengen gendannes ud fra dem ved hver start, så De skal sende dem ved hver `docker run`: initialisering, kørsel og opdatering. Hvis De udelader dem under kørsel, omskrives forbindelsesstrengen med kryptering deaktiveret.
{% endhint %}

| Scenarie                                                   | Påkrævede variabler                                                 |
| ---------------------------------------------------------- | ------------------------------------------------------------------- |
| SQL Server eller PostgreSQL med et CA-godkendt certifikat  | `DATABASE_ENCRYPT=true`                                             |
| SQL Server eller PostgreSQL med et selvsigneret certifikat | `DATABASE_ENCRYPT=true` og `DATABASE_TRUST_SERVER_CERTIFICATE=true` |

**Windows (PowerShell):**

```powershell
$encryptionConfig = Get-Content "$env:TEMP\encryption.config.b64" -Raw

docker run -d --name dvls-server `
  -e DATABASE_HOST=your-sql-server `
  -e DATABASE_NAME=dvls `
  -e DATABASE_USERNAME=dvls_user `
  -e DATABASE_PASSWORD='YourPassword!' `
  -e DATABASE_ENCRYPT=true `
  -e DATABASE_TRUST_SERVER_CERTIFICATE=true `
  -e HOSTNAME=localhost `
  -e WEB_SCHEME=https `
  -e PORT=5000 `
  -e DVLS_ENCRYPTION_CONFIG_B64="$encryptionConfig" `
  -p 5000:5000 `
  devolutions/devolutions-server:release-20XX.X
```

**macOS/Linux (Bash):**

```bash
docker run -d --name dvls-server \
  -e DATABASE_HOST=your-sql-server \
  -e DATABASE_NAME=dvls \
  -e DATABASE_USERNAME=dvls_user \
  -e DATABASE_PASSWORD='YourPassword!' \
  -e DATABASE_ENCRYPT=true \
  -e DATABASE_TRUST_SERVER_CERTIFICATE=true \
  -e HOSTNAME=localhost \
  -e WEB_SCHEME=https \
  -e PORT=5000 \
  -e DVLS_ENCRYPTION_CONFIG_B64="$(cat /tmp/encryption.config.b64)" \
  -p 5000:5000 \
  devolutions/devolutions-server:release-20XX.X
```

{% hint style="warning" %}
Hvis De angiver `DATABASE_TRUST_SERVER_CERTIFICATE=true`, deaktiveres certifikatvalideringen. Brug den kun med selvsignerede certifikater i betroede netværk. I produktion skal De installere et certifikat, der er betroet af en certifikatmyndighed, på databaseserveren og kun angive `DATABASE_ENCRYPT=true`.
{% endhint %}

#### Databasegodkendelse

Docker-containere understøtter kun godkendelse med brugernavn og adgangskode: SQL Server-godkendelse eller en PostgreSQL-rolle med en adgangskode. Windows-godkendelse (integreret sikkerhed) og Microsoft Entra-godkendelse understøttes ikke. SQLite bruger ingen databasegodkendelse. Beskyt i stedet adgangen til dens volumen.

### Konfiguration af reverse proxy

Når Devolutions Server kører bag en reverse proxy, en nginx-ingress eller Azure App Service, skal De konfigurere indstillingerne for den eksterne URL-adresse:

**Windows (PowerShell):**

```powershell
docker run -d --name dvls-server `
  -e DATABASE_HOST=your-sql-server `
  -e DATABASE_NAME=dvls `
  -e DATABASE_USERNAME=dvls_user `
  -e DATABASE_PASSWORD='YourPassword!' `
  -e HOSTNAME=devolutions-server.company.com `
  -e WEB_SCHEME=http `
  -e PORT=5000 `
  -e EXTERNAL_WEB_SCHEME=https `
  -e EXTERNAL_WEB_PORT=443 `
  devolutions/devolutions-server:release-20XX.X
```

**macOS/Linux (Bash):**

```bash
docker run -d --name dvls-server \
  -e DATABASE_HOST=your-sql-server \
  -e DATABASE_NAME=dvls \
  -e DATABASE_USERNAME=dvls_user \
  -e DATABASE_PASSWORD='YourPassword!' \
  -e HOSTNAME=devolutions-server.company.com \
  -e WEB_SCHEME=http \
  -e PORT=5000 \
  -e EXTERNAL_WEB_SCHEME=https \
  -e EXTERNAL_WEB_PORT=443 \
  devolutions/devolutions-server:release-20XX.X
```

Vigtige indstillinger:

* `WEB_SCHEME=http`: containeren bruger HTTP.
* `EXTERNAL_WEB_SCHEME=https`: den offentlige URL-adresse bruger HTTPS.
* `EXTERNAL_WEB_PORT=443`: standard-HTTPS-port, udeladt fra URL-adressen.
* `HOSTNAME=devolutions-server.company.com`: offentligt værtsnavn.

Med disse værdier er adgangs-URI'en `https://devolutions-server.company.com/`. Adgangs-URI'en gemmes i databasen under initialiseringen. For at ændre den i en eksisterende udrulning skal De angive `EXTERNAL_WEB_HOSTNAME`: hver normal start omskriver derefter den gemte adgangs-URI ud fra `EXTERNAL_WEB_SCHEME`, `EXTERNAL_WEB_HOSTNAME` og `EXTERNAL_WEB_PORT`. Angiv `DVLS_SKIP_ACCESS_URI_UPDATE=true` for at forhindre denne omskrivning.

### Sikkerhedshærdning

#### Administration af hemmeligheder

{% hint style="danger" %}
Skriv ikke adgangskoder i `docker run`-kommandoer eller compose-filer, der gemmes eller deles. Brug Docker-secrets, miljøfiler, der holdes ude af versionsstyring, eller et hemmelighedslager.
{% endhint %}

**Docker-secrets (Swarm-tilstand)**

`DATABASE_PASSWORD_FILE` læser adgangskoden fra hemmelighedsfilen. Den bruges kun, når `DATABASE_PASSWORD` ikke er angivet.

**Windows (PowerShell):**

```powershell
"YourPassword!" | docker secret create dvls_db_password -

docker service create `
  --name dvls-server `
  --secret dvls_db_password `
  -e DATABASE_PASSWORD_FILE=/run/secrets/dvls_db_password `
  ...
```

**macOS/Linux (Bash):**

```bash
echo 'YourPassword!' | docker secret create dvls_db_password -

docker service create \
  --name dvls-server \
  --secret dvls_db_password \
  -e DATABASE_PASSWORD_FILE=/run/secrets/dvls_db_password \
  ...
```

**Miljøfiler**

Opret en `.env`-fil, og hold den ude af versionsstyringen:

```bash
DATABASE_PASSWORD=YourPassword!
DVLS_ADMIN_PASSWORD=AdminPassword!
```

Send den til containeren:

**Windows (PowerShell):**

```powershell
docker run -d --name dvls-server `
  --env-file .env `
  -e DATABASE_HOST=your-sql-server `
  ...
```

**macOS/Linux (Bash):**

```bash
docker run -d --name dvls-server \
  --env-file .env \
  -e DATABASE_HOST=your-sql-server \
  ...
```

**Azure Key Vault**

Brug ***Managed Identity*** til at hente hemmeligheder fra Key Vault under kørsel. Se [Udrulning af Devolutions Server til Azure App Service ved hjælp af en container](/server/da/knowledge-base/how-to-articles/devolutions-server-docker-deployment/devolutions-server-deployment-to-azure-app-service-using-a-container.md) for at få flere oplysninger.

#### Netværksisolation

Brug Docker-netværk til at isolere Devolutions Server:

**Windows (PowerShell):**

```powershell
docker network create dvls-network

docker run -d --name dvls-server `
  --network dvls-network `
  -p 127.0.0.1:5000:5000 `
  -e DATABASE_HOST=sql-server `
  ...
```

**macOS/Linux (Bash):**

```bash
docker network create dvls-network

docker run -d --name dvls-server \
  --network dvls-network \
  -p 127.0.0.1:5000:5000 \
  -e DATABASE_HOST=sql-server \
  ...
```

#### SSH-adgang

Deaktiver SSH i produktion, medmindre det er nødvendigt til fejlfinding:

```bash
-e SSH_ENABLED=false
```

Hvis SSH er aktiveret:

* Brug en lang, unik adgangskode.
* Skift standardadgangskoden.
* Begræns adgangen med firewallregler.
* Overvej godkendelse med SSH-nøgle (kræver et brugerdefineret image).

#### Versionsopdateringer

**Versionsmærkning**

* Imaget `devolutions/devolutions-server` mærkes efter udgivelse (for eksempel `release-20XX.X`) og efter build (for eksempel `20XX.X.X.0`). Tags, der slutter med `-beta`, er betabuilds.
* Et release-tag peger altid på det seneste build af den udgivelse: hvis De henter det igen, får De de nyere builds af den samme udgivelse. Et build-tag fastlåser et bestemt build.
* Der findes ikke et `latest`-tag: angiv altid et tag.
* Ved hver normal start bruger containeren de ventende opgraderinger af databaseskemaet, før den accepterer anmodninger (`DVLS_DATABASE_UPGRADE_ON_STARTUP=true` i imaget). Opdateringstilstand er ikke nødvendig for at skifte version.

**Opdatering til en ny version**

1. Sikkerhedskopiér databasen: `BACKUP DATABASE` til SQL Server, `pg_dump --format=custom` til PostgreSQL. Til SQLite skal De først køre opdateringstilstand med det nye tag: den tager et integritetskontrolleret øjebliksbillede af databasefilen.
2. Hent det nye image-tag:

   ```bash
   docker pull devolutions/devolutions-server:release-20XX.X
   ```
3. Stop og fjern den aktuelle container:

   ```bash
   docker stop dvls-server
   docker rm dvls-server
   ```
4. Start en container fra det nye tag med de samme miljøvariabler:

   ```bash
   docker run -d --name dvls-server \
     -e DATABASE_HOST=your-sql-server \
     -e DATABASE_NAME=dvls \
     -e DATABASE_USERNAME=dvls_user \
     -e DATABASE_PASSWORD='YourPassword!' \
     -e HOSTNAME=localhost \
     -e WEB_SCHEME=https \
     -e PORT=5000 \
     -e DVLS_ENCRYPTION_CONFIG_B64="$(cat /tmp/encryption.config.b64)" \
     -p 5000:5000 \
     devolutions/devolutions-server:release-20XX.X
   ```

   ```powershell
   $encryptionConfig = Get-Content "$env:TEMP\encryption.config.b64" -Raw
   docker run -d --name dvls-server `
     -e DATABASE_HOST=your-sql-server `
     -e DATABASE_NAME=dvls `
     -e DATABASE_USERNAME=dvls_user `
     -e DATABASE_PASSWORD='YourPassword!' `
     -e HOSTNAME=localhost `
     -e WEB_SCHEME=https `
     -e PORT=5000 `
     -e DVLS_ENCRYPTION_CONFIG_B64="$encryptionConfig" `
     -p 5000:5000 `
     devolutions/devolutions-server:release-20XX.X
   ```
5. Kontrollér opstartsloggene med `docker logs dvls-server`. Hvis skemaopgraderingen mislykkes, stopper containeren, før den accepterer anmodninger.

Når flere containere deler den samme database, bruger én container skemaopgraderingen, mens de andre venter på den, i op til `DVLS_DATABASE_UPGRADE_LOCK_TIMEOUT` sekunder. For at styre, hvornår skemaet ændres, skal De starte én container med det nye tag først og derefter de andre replikaer.

**Opdateringstilstand (valgfri)**

Opdateringstilstand (`DVLS_UPDATE_MODE=true`) opgraderer databaseskemaet og afsluttes uden at starte Devolutions Server. Den kopierer konfigurationsfilerne (`appsettings.json`, `web.config`, `encryption.config`) og installationsmappen til `DVLS_BACKUP_PATH` og tager kun et databaseøjebliksbillede for SQLite. For SQL Server og PostgreSQL skal De sikkerhedskopiere databasen, før De kører den. Montér en volumen på `DVLS_BACKUP_PATH` for at beholde sikkerhedskopien, efter at containeren afsluttes.

**Windows (PowerShell):**

```powershell
$encryptionConfig = Get-Content "$env:TEMP\encryption.config.b64" -Raw

docker run --rm `
  -e DATABASE_HOST=your-sql-server `
  -e DATABASE_NAME=dvls `
  -e DATABASE_USERNAME=dvls_user `
  -e DATABASE_PASSWORD='YourPassword!' `
  -e DVLS_UPDATE_MODE=true `
  -e DVLS_BACKUP_PATH=/backup `
  -e DVLS_ENCRYPTION_CONFIG_B64="$encryptionConfig" `
  -v dvls-backups:/backup `
  devolutions/devolutions-server:release-20XX.X
```

**macOS/Linux (Bash):**

```bash
docker run --rm \
  -e DATABASE_HOST=your-sql-server \
  -e DATABASE_NAME=dvls \
  -e DATABASE_USERNAME=dvls_user \
  -e DATABASE_PASSWORD='YourPassword!' \
  -e DVLS_UPDATE_MODE=true \
  -e DVLS_BACKUP_PATH=/backup \
  -e DVLS_ENCRYPTION_CONFIG_B64="$(cat /tmp/encryption.config.b64)" \
  -v dvls-backups:/backup \
  devolutions/devolutions-server:release-20XX.X
```

Når opdateringstilstanden afsluttes, skal De starte kørselscontaineren fra det samme tag.

### Sikkerhedstjekliste

Se [Sikkerhedshærdning af Devolutions Server](/server/da/getting-started/security-checklist/devolutions-server-security-hardening.md) for:

* Indstillinger for administrationskonti
* Adgangskodepolitikker
* Multifaktorgodkendelse
* IP-begrænsninger
* Revisionslogning
* Krypteringsindstillinger

#### Se også

* [Udrul Devolutions Server med Docker](/server/da/knowledge-base/how-to-articles/devolutions-server-docker-deployment.md)
* [Udrulning af Devolutions Server til Azure App Service med en container](/server/da/knowledge-base/how-to-articles/devolutions-server-docker-deployment/devolutions-server-deployment-to-azure-app-service-using-a-container.md)
* [PostgreSQL](/server/da/getting-started/installation/database-setup/database-instance/postgresql.md)
* [Installér Devolutions Server til Linux](/server/da/knowledge-base/how-to-articles/install-devolutions-server-for-linux.md)
* [Systemkrav](/server/da/overview-of-devolutions-server/system-requirements.md)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.devolutions.net/server/da/knowledge-base/how-to-articles/devolutions-server-docker-deployment/advanced-docker-configuration-for-devolutions-server.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
