# 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. 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 – 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 ```