b273098b50
Viele docker-compose-Dateien (z. B. Graylog) setzen Images per
${IMAGE:-default}. Bisher wurde alles mit "$" uebersprungen, sodass genau
diese Images nicht gefunden wurden. Jetzt werden ${VAR:-default} und
${VAR-default} mit ihrem Standardwert aufgeloest; nur Variablen ohne
Default (${VAR}, ${VAR:?...}) bleiben uebersprungen.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
171 lines
4.8 KiB
Markdown
171 lines
4.8 KiB
Markdown
# Docker Registry mit Benutzerverwaltung
|
|
|
|
Private Docker Registry mit Web-Oberflaeche zur Benutzerverwaltung, HTTPS via Caddy und SQLite als Datenbank.
|
|
|
|
## Voraussetzungen
|
|
|
|
- Docker und Docker Compose
|
|
- Eine Domain die auf den Server zeigt (A-Record)
|
|
- Port 80 und 443 frei
|
|
|
|
## Einrichtung
|
|
|
|
### 1. `.env` Datei anpassen
|
|
|
|
```bash
|
|
nano .env
|
|
```
|
|
|
|
Folgende Werte setzen:
|
|
|
|
| Variable | Beschreibung |
|
|
|----------|-------------|
|
|
| `DOMAIN` | Deine Domain, z.B. `registry.meinserver.de` |
|
|
| `ADMIN_USER` | Benutzername fuer die Web-Oberflaeche |
|
|
| `ADMIN_PASSWORD` | Passwort fuer die Web-Oberflaeche |
|
|
| `SECRET_KEY` | Zufaelliger Schluessel (siehe unten) |
|
|
|
|
### 2. Secret Key generieren
|
|
|
|
```bash
|
|
./generate-secret.sh
|
|
```
|
|
|
|
Traegt automatisch einen zufaelligen Schluessel in die `.env` Datei ein.
|
|
|
|
### 3. Starten
|
|
|
|
```bash
|
|
docker compose up -d --build
|
|
```
|
|
|
|
Caddy holt sich automatisch ein Let's Encrypt HTTPS-Zertifikat fuer die konfigurierte Domain.
|
|
|
|
## Benutzerverwaltung
|
|
|
|
Web-Oberflaeche oeffnen unter:
|
|
|
|
```
|
|
https://DEINE-DOMAIN/
|
|
```
|
|
|
|
Dort mit den Admin-Zugangsdaten aus der `.env` anmelden. Ueber die Oberflaeche kannst du:
|
|
|
|
- Neue Registry-Benutzer anlegen
|
|
- Passwoerter aendern
|
|
- Benutzer loeschen
|
|
|
|
## Images pushen und pullen
|
|
|
|
### Anmelden
|
|
|
|
```bash
|
|
docker login registry.meinserver.de
|
|
```
|
|
|
|
Benutzername und Passwort eingeben (die in der Web-Oberflaeche angelegten Zugangsdaten).
|
|
|
|
### Image taggen und pushen
|
|
|
|
```bash
|
|
# Lokales Image taggen
|
|
docker tag mein-image:latest registry.meinserver.de/mein-image:latest
|
|
|
|
# Image hochladen
|
|
docker push registry.meinserver.de/mein-image:latest
|
|
```
|
|
|
|
### Image pullen
|
|
|
|
```bash
|
|
docker pull registry.meinserver.de/mein-image:latest
|
|
```
|
|
|
|
### Image mit Build direkt pushen
|
|
|
|
```bash
|
|
docker build -t registry.meinserver.de/mein-app:1.0 .
|
|
docker push registry.meinserver.de/mein-app:1.0
|
|
```
|
|
|
|
## Image aus anderer Registry holen (Web-Oberflaeche)
|
|
|
|
Im Tab **Images** der Web-Oberflaeche kann ein Image direkt aus einer anderen
|
|
Registry (z. B. Docker Hub) in diese Registry kopiert werden – ganz ohne
|
|
lokalen Docker-Client:
|
|
|
|
1. Quell-Image eintragen, z. B. `nginx:latest`, `bitnami/redis:7` oder
|
|
`ghcr.io/owner/app:v1`.
|
|
2. **Public Images** (Normalfall) brauchen nichts weiter. Bei **privaten**
|
|
Quell-Images passend ankreuzen:
|
|
- **Benutzername / Kennwort** – fuer Docker Hub (Access Token als Kennwort)
|
|
und die meisten Registries.
|
|
- **Access Token** – fuer Registries mit direktem Bearer-Token.
|
|
3. Auf **Holen** klicken. Das Image wird per [skopeo](https://github.com/containers/skopeo)
|
|
inklusive aller Architekturen kopiert und erscheint anschliessend in der Liste
|
|
der gespeicherten Images.
|
|
|
|
Ist ein Image mit dem **gleichen Digest** bereits vorhanden, wird es automatisch
|
|
uebersprungen – so wird ein Doppel-Upload vermieden, auch wenn der Tag (z. B.
|
|
`latest`) nicht eindeutig ist.
|
|
|
|
### Mehrere Images aus einer docker-compose holen
|
|
|
|
Im selben Tab kann der Inhalt einer `docker-compose.yml` in ein Textfeld eingefuegt
|
|
oder eine Datei hochgeladen werden. Mit **Alle Images holen** werden alle
|
|
`image:`-Eintraege der Services in die Registry kopiert. Variablen mit Standardwert
|
|
(z. B. `${GRAYLOG_IMAGE:-graylog/graylog:7.1}`) werden mit ihrem Standardwert
|
|
aufgeloest. Eintraege mit Variablen *ohne* Standardwert (z. B. `${TAG}`) oder die
|
|
bereits auf diese Registry zeigen, werden uebersprungen.
|
|
|
|
## Images loeschen und Speicher aufraeumen (Web-Oberflaeche)
|
|
|
|
Im Tab **Images** kann jeder Tag ueber das Muelltonnen-Symbol (mit Rueckfrage)
|
|
geloescht werden. Der Tag verschwindet sofort, der belegte Speicherplatz wird
|
|
aber erst durch die **Garbage Collection** freigegeben:
|
|
|
|
- Button **Speicher aufraeumen (Garbage Collection)** entfernt alle Daten, die
|
|
von keinem Image mehr referenziert werden (laeuft direkt ueber die
|
|
registry-Binary, kein Docker-Socket noetig).
|
|
- **Wichtig:** Waehrend der Aufraeumung keine Images hochladen – frisch
|
|
hochgeladene, noch nicht referenzierte Daten koennten sonst entfernt werden.
|
|
|
|
## Nuetzliche Befehle
|
|
|
|
```bash
|
|
# Alle Images in der Registry auflisten
|
|
curl -u benutzer:passwort https://registry.meinserver.de/v2/_catalog
|
|
|
|
# Tags eines Images auflisten
|
|
curl -u benutzer:passwort https://registry.meinserver.de/v2/mein-image/tags/list
|
|
|
|
# Logs anzeigen
|
|
docker compose logs -f
|
|
|
|
# Stoppen
|
|
docker compose down
|
|
|
|
# Stoppen und alle Daten loeschen
|
|
docker compose down
|
|
rm -rf data/
|
|
```
|
|
|
|
## Datenverzeichnisse
|
|
|
|
Alle Daten liegen lokal im `./data/` Ordner:
|
|
|
|
| Pfad | Inhalt |
|
|
|------|--------|
|
|
| `data/caddy/` | TLS-Zertifikate (Let's Encrypt) |
|
|
| `data/registry/` | Gespeicherte Docker Images |
|
|
| `data/auth/users.db` | SQLite Datenbank mit Benutzern |
|
|
| `data/htpasswd/` | Generierte htpasswd fuer die Registry |
|
|
|
|
## Backup
|
|
|
|
Fuer ein vollstaendiges Backup reicht es den `data/` Ordner und die `.env` Datei zu sichern:
|
|
|
|
```bash
|
|
tar czf backup-$(date +%Y%m%d).tar.gz data/ .env
|
|
```
|