Files
docker-repo/README.md
T
duffyduck 41daacd56c Images aus Fremd-Registries holen, loeschen und Speicher aufraeumen
Tab "Images" um Verwaltungsfunktionen erweitert:
- Einzel-Pull: Image aus anderer Registry (z. B. Docker Hub) per skopeo
  in die eigene Registry kopieren, optional mit Benutzername/Kennwort
  oder Access Token fuer private Quell-Registries
- Bulk-Pull: alle image-Eintraege einer docker-compose (Textfeld oder
  Datei-Upload) auf einmal holen; Variablen/eigene Registry werden ignoriert
- Digest-Dedup: bereits mit gleichem Digest vorhandene Images werden
  uebersprungen (kopiert mit --all, damit Multi-Arch-Digests matchen)
- Loeschen: Muelltonne hinter jedem Tag mit Rueckfrage
- Garbage Collection: gibt belegten Speicher frei, laeuft per registry-Binary
  (Multi-Stage-Build) direkt auf dem gemounteten Speicher, kein Docker-Socket

gunicorn: 1 Worker (gemeinsames Service-Passwort) + 8 Threads, Timeout 1800s
fuer lange Kopiervorgaenge.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 10:34:42 +02:00

170 lines
4.7 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 &ndash; 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** &ndash; fuer Docker Hub (Access Token als Kennwort)
und die meisten Registries.
- **Access Token** &ndash; 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 &ndash; 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. Eintraege mit nicht
aufgeloesten Variablen (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 &ndash; 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
```