user create

user create legt das Konto an, mit dem du dich an Apparats Web-Oberfläche anmeldest. Apparat hat genau einen Operator-Account — eine öffentliche Registrierung gibt es bewusst nicht, der Zugang wird ausschließlich über diesen Befehl provisioniert. Setup für die Bedienung in der Web-Oberfläche.

Wofür ist das?

Aufruf

Interaktiv (Standard) — der Befehl fragt Name, E-Mail-Adresse und Passwort nacheinander ab; das Passwort wird zur Bestätigung zweimal eingegeben und nicht im Klartext angezeigt:

apparat user create

Ein-Zeiler mit Flags — geeignet für reproduzierbare Setups, achte auf die Shell-History (das Passwort steht im Klartext im Aufruf):

apparat user create \
  --name="Maria Beispiel" \
  --email="maria@example.com" \
  --password="ChooseSomethingStrong123!"

Mischform — Felder als Flags, das Passwort interaktiv anfordern:

apparat user create --name="Maria Beispiel" --email="maria@example.com"

In Skripten / CI ohne Prompts — alle Pflichtfelder müssen als Flags kommen, sonst bricht der Befehl ab:

apparat user create \
  --name="CI Operator" \
  --email="ci@example.com" \
  --password="$CI_PASSWORD" \
  --no-interaction

Flags

Flag Bedeutung
--name=… Anzeigename, der nach dem Login als Begrüßung erscheint.
--email=… Adresse, mit der du dich anmeldest. Muss ein @ enthalten.
--password=… Passwort. Wird gegen die Standard-Passwortregeln von Laravel geprüft (Mindestlänge, Mix aus Zeichenklassen). Lässt du das Flag weg, fragt der Befehl interaktiv mit doppelter Eingabe.
--force Überschreibe das vorhandene Konto mit dieser E-Mail. Ohne --force bricht der Befehl mit Hinweis ab, wenn die Adresse schon existiert.
--no-interaction Kein Prompt. Dann sind --name, --email und --password zwingend.

Beispielausgaben

Konto neu angelegt:

✅ User created: Maria Beispiel <maria@example.com>

Bestehendes Konto ohne --force:

❌ A user with email maria@example.com already exists. Re-run with --force to overwrite.

Bestehendes Konto mit --force überschrieben:

✅ User updated: Maria Beispiel <maria@example.com>

Pflichtfeld fehlt unter --no-interaction:

❌ --name is required in non-interactive mode.

Exit-Codes

Code Bedeutung
0 Konto angelegt oder mit --force überschrieben.
1 Pflichtfeld fehlt, Validierung fehlgeschlagen, oder bestehendes Konto ohne --force.

Was nebenbei wichtig ist

Der Befehl schreibt direkt in die Anwendungsdatenbank database/database.sqlite. Das ist genau dieselbe Datei, die der Container über den Bind-Mount sieht — du kannst den Befehl also auf dem Host oder im Container ausführen, das Resultat ist identisch. Das Passwort wird mit bcrypt gehasht; im Klartext landet es nirgends.

Nach dem ersten erfolgreichen Aufruf ist die Web-Oberfläche unter https://localhost/login erreichbar (oder unter dem Host und Port, den deine WEB_PORT/WEB_HTTPS_PORT-Variablen festlegen). Der Login-Bildschirm akzeptiert die hier vergebene Adresse und das Passwort.