> 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/powershell-universal/da/getting-started/docker/docker-compose-postgresql.md).

# Udrul PowerShell Universal med PostgreSQL ved hjælp af Docker Compose

Kør PowerShell Universal med en PostgreSQL-database på Windows ved hjælp af Docker Compose, med sundhedstjek, persistente volumener, verifikationstrin og fejlfinding.

Denne artikel viser, hvordan De kører PowerShell Universal og en PostgreSQL-database som to Linux-objektbeholdere på en Windows-maskine med Docker Compose. PowerShell Universal gemmer sine data i PostgreSQL i stedet for standard-SQLite-databasen og når den via dens tjenestenavn på Docker-netværket.

For generelle oplysninger om PowerShell Universal-containerimaget, se [Docker](/powershell-universal/da/getting-started/docker.md).

### Forudsætninger

* [Docker Desktop](https://docs.docker.com/desktop/setup/install/windows-install/) til Windows, der kører i tilstanden **Linux containers**, eller Docker Engine på Linux.
* Docker Compose v2. Kør `docker compose version` for at bekræfte, at den er tilgængelig.
* Mindst 2 GB hukommelse tilgængelig for Docker.
* Portene `5000` (PowerShell Universal) og `5432` (PostgreSQL) skal være ledige på værten, eller andre porte efter Deres valg.

### Opret konfigurationsfilerne

1. Opret en tom mappe til udrulningen, f.eks. `C:\psu`.
2. I den mappe skal De oprette en fil med navnet `.env` med følgende indhold og erstatte værdien mellem vinkelparenteser:

   ```
   POSTGRES_PASSWORD=<StrongPostgresPassword>
   ```

{% hint style="warning" %}
Filen `.env` indeholder en adgangskode. Begræns adgangen til den, og hold den ude af versionsstyring. Undgå tegnene `$` og `;` i adgangskoden, da de fortolkes af Docker Compose og af forbindelsesstrengen.
{% endhint %}

3. I den samme mappe skal De oprette en fil med navnet `docker-compose.yml` med følgende indhold:

   ```yaml
   services:
     postgres:
       image: postgres:16-alpine
       container_name: psu-postgres
       restart: unless-stopped
       environment:
         POSTGRES_USER: psu
         POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
         POSTGRES_DB: psu
       ports:
         - "5432:5432"
       volumes:
         - pgdata:/var/lib/postgresql/data
       healthcheck:
         test: ["CMD-SHELL", "pg_isready -U psu -d psu"]
         interval: 5s
         timeout: 5s
         retries: 20

     psu:
       image: devolutions/powershell-universal:latest
       container_name: psu-app
       restart: unless-stopped
       ports:
         - "5000:5000"
       volumes:
         - psudata:/data
       environment:
         Plugins__0: PostgreSQL
         Data__ConnectionString: "Host=postgres;Port=5432;Database=psu;Username=psu;Password=${POSTGRES_PASSWORD}"
         Data__RepositoryPath: /data/Repository
       depends_on:
         postgres:
           condition: service_healthy

   volumes:
     pgdata:
     psudata:
   ```

* `Plugins__0: PostgreSQL` aktiverer PostgreSQL-databasepluginnet, og `Data__ConnectionString` peger PowerShell Universal mod tjenesten `postgres`.
* Sundhedstjekket og `depends_on` får PowerShell Universal til at vente, indtil PostgreSQL accepterer forbindelser. Uden dem kan PowerShell Universal fejle ved den første start.
* Volumenet `pgdata` gemmer databasen, og volumenet `psudata` gemmer PowerShell Universal-lageret (scripts, apps og konfigurationsfiler).
* Publicering af port `5432` er kun nødvendig for at oprette forbindelse til PostgreSQL fra værten, f.eks. med `psql` eller pgAdmin. Fjern posten `ports` for tjenesten `postgres`, hvis De ikke har brug for den.

{% hint style="info" %}
Til produktion skal De fastlåse begge images til en bestemt version i stedet for `latest` eller et flydende tag. De tilgængelige tags er angivet på Docker Hub for [PowerShell Universal](https://hub.docker.com/r/devolutions/powershell-universal/tags) og [PostgreSQL](https://hub.docker.com/_/postgres/tags).
{% endhint %}

### Start udrulningen

1. Åbn PowerShell, og gå til udrulningsmappen:

   ```powershell
   cd C:\psu
   ```
2. Download imagesene:

   ```powershell
   docker compose pull
   ```
3. Start containerne:

   ```powershell
   docker compose up -d
   ```
4. Kontrollér containernes status, og følg PowerShell Universal-loggene:

   ```powershell
   docker compose ps
   docker compose logs -f psu
   ```
5. Efter ca. 30 sekunder skal De åbne `http://localhost:5000` i en browser og fuldføre førstegangsopsætningen.

{% hint style="info" %}
Dette eksempel leverer PowerShell Universal via HTTP. Før De giver brugere adgang, skal De konfigurere HTTPS, f.eks. med en omvendt proxy.
{% endhint %}

### Verificer udrulningen

Bekræft, at PowerShell Universal har oprettet sine tabeller i PostgreSQL:

```powershell
docker exec psu-postgres psql -U psu -d psu -c "\dt"
```

Kommandoen oplister tabellerne i PowerShell Universal. Hvis den returnerer `Did not find any relations`, har PowerShell Universal endnu ikke oprettet forbindelse til databasen; kontrollér loggene med `docker compose logs psu`.

For at vise de aktive forbindelser fra PowerShell Universal:

```powershell
docker exec psu-postgres psql -U psu -d psu -c "SELECT pid, application_name, client_addr, state FROM pg_stat_activity WHERE datname='psu';"
```

### Udrul på en anden server

1. Installér Docker på målserveren (se [Forudsætninger](#prerequisites)).
2. Kopiér filerne `docker-compose.yml` og `.env` til en ny mappe. Sørg for, at filerne hedder præcis `.env` og `docker-compose.yml`, uden en skjult `.txt`-udvidelse.
3. Kør kommandoerne fra [Start udrulningen](#start-the-deployment).

Afhængigt af målserveren:

| Situation                                          | Handling                                                                                 |
| -------------------------------------------------- | ---------------------------------------------------------------------------------------- |
| Port `5000` eller `5432` er allerede i brug        | Skift værtsporten (værdien til venstre) i `ports`-posterne, for eksempel `"8080:5000"`.  |
| Brugere har brug for at nå den fra andre computere | Tillad PowerShell Universal-værtsporten i serverens firewall.                            |
| Flere udrulninger på den samme vært                | Brug én mappe pr. udrulning, med forskellige værdier for `container_name` og værtsporte. |

### Fejlfinding

| Meddelelse i `docker compose logs psu`                             | Løsning                                                                                                                                                                                                                                                                     |
| ------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Failed to connect to postgres:5432` med en timeout                | PostgreSQL var ikke klar. Sørg for, at tjenesten `psu` har `depends_on` med `condition: service_healthy`.                                                                                                                                                                   |
| `password authentication failed for user "psu"` (SQLSTATE `28P01`) | Adgangskoden i forbindelsesstrengen stemmer ikke overens med PostgreSQL-adgangskoden. PostgreSQL bruger kun `POSTGRES_PASSWORD`, første gang voluminet `pgdata` oprettes; hvis De har ændret den efterfølgende, gendan den tidligere adgangskode, eller genopret voluminet. |
| `no pg_hba.conf entry for host` (SQLSTATE `28000`)                 | En brugerdefineret `pg_hba.conf`-fil afviser forbindelsen. Tilføj en regel, der tillader PowerShell Universal-objektbeholderen, eller brug standardkonfigurationen.                                                                                                         |
| `sorry, too many clients already` (SQLSTATE `53300`)               | PostgreSQL har nået sin grænse for `max_connections`. Øg grænsen, eller reducér andre forbindelser til databasen.                                                                                                                                                           |
| En fejl, der angiver, at lagerstien ikke findes                    | Den volumen eller mappe, der er monteret for `Data__RepositoryPath`, mangler eller er ikke skrivbar. Kontrollér posten `volumes` for tjenesten `psu`.                                                                                                                       |

### Sikkerhedskopiér databasen

Opret en sikkerhedskopi af PostgreSQL-databasen, og kopiér den til værten:

```powershell
docker exec psu-postgres pg_dump -U psu -d psu -F c -f /tmp/psu.dump
docker cp psu-postgres:/tmp/psu.dump .\psu.dump
```

For at gendanne den:

```powershell
docker cp .\psu.dump psu-postgres:/tmp/psu.dump
docker exec psu-postgres pg_restore -U psu -d psu --clean --if-exists /tmp/psu.dump
```

### Fjern udrulningen

Stop og fjern containerne, og behold dataene:

```powershell
docker compose down
```

{% hint style="danger" %}
Følgende kommando sletter også volumerne, herunder PostgreSQL-databasen og PowerShell Universal-lageret. Dette kan ikke fortrydes.

```powershell
docker compose down -v
```

{% endhint %}

#### Se også

* [Docker](/powershell-universal/da/getting-started/docker.md)
* [Opgradering](/powershell-universal/da/getting-started/upgrading.md)
* [Migrer og gendan](/powershell-universal/da/getting-started/migration.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/powershell-universal/da/getting-started/docker/docker-compose-postgresql.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.
