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?
- Erst-Setup einer Apparat-Installation. Nach
composer setupund dem ersten Container-Start fehlt noch die einzige Sache, die nicht automatisiert ist: ein Login.user createfüllt diese Lücke. - Passwort zurücksetzen ohne E-Mail-Versand. Wenn der Mailversand für den Forgot-Password-Flow noch nicht konfiguriert ist (oder du das Reset-Mail nicht mehr erreichst), schreibt
user create --forcedas Passwort der existierenden Adresse einfach neu. - Account-Daten korrigieren. Tippfehler im Namen oder in der Adresse direkt nach dem ersten Anlegen lassen sich mit
--forcereparieren, ohne den Datenbankzustand manuell anzufassen.
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.