occ – die Kommandozeile
occ ist das Verwaltungswerkzeug von owncloud.online auf der Kommandozeile. Es
liegt als Datei occ im Wurzelverzeichnis der Installation, startet dieselbe
Umgebung wie die Weboberfläche und lädt zusätzlich die Befehle der aktivierten
Apps. Der Befehlsvorrat ist deshalb nicht fest: Er hängt davon ab, ob die
Instanz installiert ist, ob sie im Wartungsmodus steht und welche Apps
aktiviert sind.
Aufruf
# alle verfügbaren Befehle auflisten
sudo -u www-data php8.4 /var/www/owncloud.online/occ list
# Hilfe zu einem einzelnen Befehl mit allen Optionen
sudo -u www-data php8.4 /var/www/owncloud.online/occ user:add --help
Der Aufruf funktioniert aus jedem Arbeitsverzeichnis, solange der vollständige
Pfad angegeben wird — console.php wechselt selbst in das Installationsverzeichnis.
Auf dieser Seite ist der Pfad in den Beispielen der Kürze halber weggelassen.
Vorausgesetzt werden die PHP-Erweiterungen posix (harte Bedingung, ohne sie
bricht occ sofort ab) und pcntl (weiche Bedingung, ohne sie lassen sich
lang laufende Befehle nicht sauber unterbrechen; es erscheint eine Warnung).
Rechte: immer als Webserver-Benutzer
occ prüft vor jeder Ausführung, ob der aufrufende Benutzer identisch mit dem
Eigentümer von config/config.php ist. Ist er es nicht, bricht der Aufruf ab:
Console has to be executed with the user that owns the file config/config.php
In der Standardinstallation ist das www-data. Deshalb gilt ausnahmslos:
sudo -u www-data php8.4 /var/www/owncloud.online/occ status
Ein Aufruf als root ist auch dann falsch, wenn er durchläuft: Dateien und
Verzeichnisse, die dabei entstehen — Logdatei, Vorschaubilder, Dateien im
Datenverzeichnis — gehören danach root und sind für den Webserver nicht mehr
beschreibbar. Dasselbe gilt für den Cron-Eintrag, siehe
Hintergrund-Jobs.
Globale Optionen
| Option | Wirkung |
|---|---|
--help, -h |
Hilfe zum Befehl statt Ausführung |
-v, -vv, -vvv |
Ausführlichere Ausgabe |
--no-warnings |
Unterdrückt globale Hinweise, gibt nur die Befehlsausgabe aus |
--output=plain|json|json_pretty |
Maschinenlesbare Ausgabe — nur bei Befehlen, die auf OC\Core\Command\Base aufbauen, unter anderem status, check, app:list, user:list, group:list, config:list |
sudo -u www-data php8.4 occ status --output=json_pretty
Wartungsmodus
Der Wartungsmodus wird über occ gesetzt und schreibt den Systemwert
maintenance nach config/config.php:
sudo -u www-data php8.4 occ maintenance:mode --on
sudo -u www-data php8.4 occ maintenance:mode --off
# ohne Option: aktuellen Zustand anzeigen
sudo -u www-data php8.4 occ maintenance:mode
Entscheidend für die Praxis: Im Wartungsmodus lädt occ keine Apps. Damit
verschwinden auch deren Befehle aus der Liste. occ weist beim Start darauf
hin:
owncloud.online is in maintenance mode - no app have been loaded
| Vorgang | Im Wartungsmodus |
|---|---|
Core-Befehle (user:*, group:*, config:*, db:*, migrations:*, maintenance:*, upgrade, log:*) |
verfügbar |
App-Befehle (files:*, trashbin:*, versions:*, dav:*, files_external:*, market:*) |
nicht verfügbar — die Apps werden nicht geladen |
occ system:cron — und damit auch cron.php auf der Kommandozeile, das nur occ system:cron aufruft |
bricht mit „We are in maintenance mode, skipping cron" ab |
Weboberfläche (index.php) |
HTTP 503 mit Retry-After: 120 und Wartungsseite |
Sync-Clients (remote.php, WebDAV) |
HTTP 503 „System in maintenance mode." — ohne Retry-After |
Zwei weitere Zustände schränken den Befehlsvorrat ebenso ein:
- Nicht installiert: Es steht nur
maintenance:installzur Verfügung, dazu die wenigen Befehle, die keine Installation brauchen (status,check,integrity:*,app:check-code,l10n:createjs). - Update ausstehend: Meldet die Instanz „owncloud.online or one of the apps
require upgrade", werden die Apps nicht geladen — der Befehlsvorrat entspricht
dem im Wartungsmodus, die Core-Befehle bleiben also vorhanden. Der Weg heraus
ist
occ upgrade.
Der Einzelbenutzermodus (maintenance:singleuser, Systemwert singleuser) ist
davon zu unterscheiden: Er lässt die Apps geladen. occ system:cron bricht darin
mit „We are in admin only mode, skipping cron" ab, die Weboberfläche antwortet
Konten außerhalb der Gruppe admin mit HTTP 503, und der WebDAV-Endpunkt
verweigert jede Anfrage mit „System in single user mode." — auch die von
Administratoren.
Wartung und Update
| Befehl | Zweck |
|---|---|
status |
Version, Edition und Installationszustand ausgeben |
check |
Abhängigkeiten der Server-Umgebung prüfen |
upgrade |
Update-Routinen nach dem Einspielen einer neuen Version ausführen |
maintenance:mode |
Wartungsmodus ein- und ausschalten oder abfragen |
maintenance:singleuser |
Einzelbenutzermodus ein- und ausschalten oder abfragen |
maintenance:repair |
Reparaturschritte ausführen (--list, --single, --include-expensive) |
maintenance:file-locks |
Transaktionale Dateisperren anzeigen und aufräumen |
maintenance:data-fingerprint |
Datenfingerabdruck nach dem Zurückspielen eines Backups erneuern |
maintenance:update:htaccess |
Die .htaccess neu schreiben |
maintenance:mimetype:update-db |
MIME-Typen in Datenbank und Dateicache aktualisieren |
maintenance:mimetype:update-js |
mimetypelist.js neu erzeugen |
maintenance:install |
Instanz einrichten (nur vor der Installation vorhanden) |
previews:cleanup |
Vorschaubilder ohne zugehörige Datei entfernen |
integrity:check-core |
Signatur des Core-Codes prüfen |
integrity:check-app |
Signatur einer App prüfen |
Ein Update spielt zuerst den Code ein und lässt danach occ upgrade laufen:
sudo -u www-data php8.4 occ maintenance:mode --on
sudo -u www-data php8.4 occ upgrade
sudo -u www-data php8.4 occ maintenance:mode --off
integrity:check-core liefert auf dem ausgelieferten Kanal keine belastbare
Aussage — die Einzelheiten stehen unter
Sicherheit und Setup-Warnungen.
Steckengebliebene Dateisperren nach einem Absturz löst dieser Befehl:
# gefahrlos im laufenden Betrieb: nur abgelaufene Sperren
sudo -u www-data php8.4 occ maintenance:file-locks --cleanup-expired
# alle Sperren — verlangt aktiven Wartungsmodus
sudo -u www-data php8.4 occ maintenance:file-locks --all
Mit --dry-run zeigt der Befehl nur an, was er löschen würde.
Konten und Gruppen
| Befehl | Zweck |
|---|---|
user:add |
Konto anlegen |
user:delete |
Konto löschen |
user:modify |
Angaben eines Kontos ändern |
user:disable |
Konto sperren |
user:enable |
Gesperrtes Konto wieder freigeben |
user:list |
Konten mit ihren Attributen auflisten |
user:list-groups |
Gruppen eines Kontos auflisten |
user:lastseen |
Letzte Anmeldung eines Kontos anzeigen |
user:inactive |
Konten melden, die sich seit N Tagen nicht angemeldet haben |
user:report |
Anzahl der Konten mit Zugang ausgeben |
user:resetpassword |
Passwort eines Kontos zurücksetzen |
user:setting |
Einstellungen eines Kontos lesen und ändern |
user:sync |
Konten aus einem Backend in die Kontentabelle übernehmen |
user:move-home |
Heimatverzeichnis eines Kontos verschieben |
user:home:list-dirs |
Alle benutzten Wurzelverzeichnisse für Heimatverzeichnisse auflisten |
user:home:list-users |
Alle Konten auflisten, deren Heimat unter einem Pfad liegt |
group:add |
Gruppe anlegen |
group:delete |
Gruppe löschen |
group:list |
Gruppen auflisten |
group:add-member |
Mitglieder zu einer Gruppe hinzufügen |
group:remove-member |
Mitglieder aus einer Gruppe entfernen |
group:list-members |
Mitglieder einer Gruppe auflisten |
twofactorauth:enable |
Zwei-Faktor-Anmeldung für ein Konto einschalten |
twofactorauth:disable |
Zwei-Faktor-Anmeldung für ein Konto ausschalten |
user:sync ist der Befehl für angebundene Verzeichnisdienste. Er kennt die
Kurzformen ldap, samba und shibboleth anstelle des vollen Klassennamens
und listet mit --list die aktiven Backends auf:
sudo -u www-data php8.4 occ user:sync --list
sudo -u www-data php8.4 occ user:sync ldap --missing-account-action=disable
--missing-account-action nimmt disable oder remove. remove löscht mit
dem Konto auch dessen Daten und Dateien — im Regelbetrieb gehört dort
disable hin.
Dateien und Dateisystem
| Befehl | Zweck |
|---|---|
files:scan |
Dateisystem auf Änderungen prüfen und den Dateicache nachziehen |
files:cleanup |
Verwaiste Einträge aus dem Dateicache entfernen |
files:check-cache |
Prüfen, ob eine Datei im primären Speicher tatsächlich vorhanden ist |
files:remove-storage |
Einen Speicher samt zugehöriger Cache-Einträge aus der Datenbank entfernen |
files:checksums:verify |
Gespeicherte Prüfsummen gegen neu berechnete vergleichen |
files:transfer-ownership |
Alle Dateien und Ordner eines Kontos auf ein anderes übertragen, Freigaben eingeschlossen |
files:troubleshoot-transfer-ownership |
Nach Problemen aus einer vorangegangenen Übertragung suchen |
trashbin:cleanup |
Gelöschte Dateien endgültig entfernen |
trashbin:expire |
Papierkorb nach den eingestellten Regeln ablaufen lassen |
versions:cleanup |
Dateiversionen entfernen |
versions:expire |
Dateiversionen nach den eingestellten Regeln ablaufen lassen |
files_external:list |
Eingerichtete externe Speicher auflisten |
files_external:create |
Externen Speicher anlegen |
files_external:delete |
Externen Speicher löschen |
files_external:config |
Backend-Konfiguration eines Speichers verwalten |
files_external:option |
Einbindungsoptionen eines Speichers verwalten |
files_external:applicable |
Zuständige Konten und Gruppen eines Speichers verwalten |
files_external:backends |
Verfügbare Speicher- und Anmelde-Backends anzeigen |
files_external:verify |
Konfiguration eines Speichers gegen das Ziel prüfen |
files_external:import |
Speicherkonfigurationen einlesen |
files_external:export |
Speicherkonfigurationen ausgeben |
files:scan ist der Befehl, den man nach jedem Eingriff direkt im
Datenverzeichnis braucht — der Dateicache kennt sonst die neuen Dateien nicht:
# ein Konto
sudo -u www-data php8.4 occ files:scan alice
# nur ein Unterpfad
sudo -u www-data php8.4 occ files:scan --path="/alice/files/Musik"
# alle Konten
sudo -u www-data php8.4 occ files:scan --all
Zusätzlich gibt es --group, --unscanned (nur unvollständig erfasste
Dateien) und --repair für abgehängte Cache-Einträge. --repair ist deutlich
langsamer und gehört in ein Wartungsfenster.
Freigaben
| Befehl | Zweck |
|---|---|
sharing:cleanup-remote-storages |
shared::-Speicher entfernen, zu denen kein Eintrag in shares_external mehr existiert |
incoming-shares:poll |
Eingehende föderierte Freigaben von Hand auf Änderungen abfragen |
federation:trusted-servers:add |
Vertrauenswürdigen Server eintragen |
federation:trusted-servers:list |
Vertrauenswürdige Server auflisten |
federation:trusted-servers:remove |
Vertrauenswürdigen Server entfernen |
Beim Übertragen eines Kontos wandern die Freigaben mit — dafür ist
files:transfer-ownership zuständig, siehe voriger Abschnitt.
Konfiguration
| Befehl | Zweck |
|---|---|
config:list |
Alle Werte ausgeben (system, ein App-Name oder all) |
config:system:get |
Einen Wert aus config.php lesen |
config:system:set |
Einen Wert in config.php setzen |
config:system:delete |
Einen Wert aus config.php entfernen |
config:app:get |
Einen App-Wert aus der Datenbank lesen |
config:app:set |
Einen App-Wert in der Datenbank setzen |
config:app:delete |
Einen App-Wert aus der Datenbank entfernen |
config:import |
Eine Liste von Werten einlesen |
sudo -u www-data php8.4 occ config:list system
sudo -u www-data php8.4 occ config:system:set loglevel --value 2 --type integer
config:list ersetzt einen fest hinterlegten Satz vertraulicher Systemwerte
durch ***REMOVED SENSITIVE VALUE*** — darunter dbpassword, passwordsalt,
secret, mail_smtppassword, ldap_agent_password, license-key und die
Zugangsdaten unter redis und objectstore. Erst --private gibt sie im
Klartext aus. Die App-Werte aus der Datenbank filtert der Befehl nicht — sie
stehen bei config:list all und config:list <app> auch ohne --private
unverändert in der Ausgabe. Die Ausgabe gehört deshalb in keinem Fall ungeprüft
in ein Ticket oder ein Repository. Die einzelnen Schlüssel beschreibt
Konfiguration (config.php).
Hintergrundaufträge
| Befehl | Zweck |
|---|---|
background:cron |
Ausführungsart auf System-Cron stellen |
background:ajax |
Ausführungsart auf AJAX stellen |
background:webcron |
Ausführungsart auf Webcron stellen |
background:queue:status |
Zustand der Warteschlange anzeigen |
background:queue:execute |
Einen einzelnen Auftrag aus der Warteschlange ausführen |
background:queue:delete |
Einen Auftrag aus der Warteschlange löschen |
system:cron |
Hintergrundaufträge einmal wie ein Cron-Lauf abarbeiten |
Die drei background:-Befehle schreiben denselben App-Wert
core / backgroundjobs_mode; abfragen lässt er sich mit
config:app:get core backgroundjobs_mode. Empfohlen ist cron, Einrichtung
und Prüfung stehen unter Hintergrund-Jobs.
system:cron bricht ab, wenn ein Update aussteht, der Wartungsmodus oder der
Einzelbenutzermodus aktiv ist oder die Ausführungsart auf none steht. Mit
--progress zeigt es einen Fortschrittsbalken — diese Option gehört
ausdrücklich nicht in einen Crontab-Eintrag.
Datenbank
| Befehl | Zweck |
|---|---|
db:convert-mysql-charset |
Zeichensatz einer MySQL-/MariaDB-Datenbank auf utf8mb4 umstellen |
db:restore-default-row-format |
Standard-Zeilenformat der MySQL-/MariaDB-Tabellen wiederherstellen |
migrations:status |
Zustand der Migrationen anzeigen |
migrations:migrate |
Migrationen bis zu einer Version oder bis zur neuesten ausführen |
migrations:execute |
Eine einzelne Migration gezielt ausführen |
Vor jedem dieser Eingriffe gehört ein Datenbank-Backup angelegt, siehe
Backups und Updates. Im Regelbetrieb ruft man
migrations:* nicht direkt auf — occ upgrade erledigt das.
Protokoll
| Befehl | Zweck |
|---|---|
log:manage |
Backend, Stufe und Zeitzone der Protokollierung setzen und anzeigen |
log:owncloud |
Das dateibasierte Backend einschalten, Pfad und Rotationsgröße setzen |
# Stufe auf Warnungen, Ausgabe in eine Datei
sudo -u www-data php8.4 occ log:manage --level warning
sudo -u www-data php8.4 occ log:owncloud --enable --rotate-size 100M
log:manage schreibt die Systemwerte log_type (owncloud, syslog oder
errorlog), loglevel (debug, info, warning, error, fatal) und
logtimezone. log:owncloud schreibt logfile und log_rotate_size
(0 schaltet die Rotation ab). Zum Lesen und Auswerten siehe
Serverprotokoll und Fehlermeldungen.
Apps
| Befehl | Zweck |
|---|---|
app:list |
Alle vorhandenen Apps mit Zustand auflisten |
app:enable |
App aktivieren |
app:disable |
App deaktivieren |
app:getpath |
Absoluten Pfad zum Verzeichnis einer App ausgeben |
app:check-code |
Code einer App auf Regelkonformität prüfen |
market:list |
Im Katalog verfügbare Apps auflisten |
market:install |
App aus dem Katalog installieren, vorhandene bei Bedarf aktualisieren |
market:upgrade |
Neue App-Versionen aus dem Katalog einspielen |
market:uninstall |
App entfernen |
Die vier market:-Befehle stammen aus der Markt-App und stehen nur zur
Verfügung, wenn diese aktiviert ist; Katalog und Konfiguration beschreibt
Apps und Marketplace.
Das gilt allgemein: Eine App bringt ihre Befehle nur mit, solange sie
aktiviert ist. Nach app:disable files_external verschwinden alle
files_external:*-Befehle aus occ list.
Weitere registrierte Befehlsgruppen
| Befehl | Zweck |
|---|---|
encryption:status |
Zustand der serverseitigen Verschlüsselung anzeigen |
encryption:enable |
Verschlüsselung einschalten |
encryption:disable |
Verschlüsselung ausschalten |
encryption:list-modules |
Verfügbare Verschlüsselungsmodule auflisten |
encryption:set-default-module |
Standardmodul festlegen |
encryption:encrypt-all |
Alle Dateien aller Konten verschlüsseln |
encryption:decrypt-all |
Verschlüsselung abschalten und alle Dateien entschlüsseln |
encryption:show-key-storage-root |
Aktuelles Wurzelverzeichnis der Schlüsselablage anzeigen |
encryption:change-key-storage-root |
Wurzelverzeichnis der Schlüsselablage wechseln |
security:certificates |
Vertrauenswürdige Zertifikate auflisten |
security:certificates:import |
Vertrauenswürdiges Zertifikat einlesen |
security:certificates:remove |
Vertrauenswürdiges Zertifikat entfernen |
security:routes |
Verwendete Routen auflisten |
security:sign-key:create |
Signaturschlüssel eines Kontos für signierte URLs anlegen oder erneuern |
dav:cleanup-chunks |
Liegengebliebene Upload-Fragmente entfernen |
dav:create-addressbook |
Adressbuch anlegen |
dav:create-calendar |
Kalender anlegen |
dav:sync-birthday-calendar |
Geburtstagskalender abgleichen |
dav:sync-system-addressbook |
Konten in das System-Adressbuch übernehmen |
federation:sync-addressbooks |
Adressbücher aller föderierten Instanzen abgleichen |
integrity:sign-core |
Core mit einem privaten Schlüssel signieren |
integrity:sign-app |
App mit einem privaten Schlüssel signieren |
l10n:createjs |
JavaScript-Übersetzungsdateien einer App erzeugen |
migrations:generate |
Gerüst für eine neue Migration erzeugen (Entwicklung) |
Die Einzelheiten zur Verschlüsselung stehen unter Verschlüsselung.
Fehlersuche
| Symptom | Ursache | Abhilfe |
|---|---|---|
| „Console has to be executed with the user that owns the file config/config.php" | Aufruf als falscher Benutzer, meist als root oder als angemeldeter Administrator |
Aufruf mit sudo -u www-data wiederholen |
| „The posix extensions are required" | PHP-Erweiterung posix fehlt in der CLI-Konfiguration |
posix in der CLI-php.ini bereitstellen |
| Hinweis auf fehlendes PCNTL | PHP-Erweiterung pcntl fehlt |
Erweiterung nachrüsten oder den Hinweis mit --no-warnings unterdrücken |
App-Befehle wie files:scan fehlen in occ list |
Wartungsmodus aktiv, oder die zugehörige App ist deaktiviert | occ maintenance:mode prüfen, sonst occ app:list |
| „owncloud.online or one of the apps require upgrade" | Der Code ist neuer als der Datenbankstand | occ upgrade ausführen |
| „owncloud.online is not installed" | Es gibt noch keine Installation | occ maintenance:install verwenden |
| „Environment not properly prepared." | occ hat beim Start Umgebungsfehler gefunden und bricht ab |
occ check aufrufen — dieser Befehl umgeht die Abbruchprüfung und nennt die Fehler einzeln |
| „Refusing to delete all file locks while maintenance mode is disabled." | maintenance:file-locks --all ohne Wartungsmodus |
erst occ maintenance:mode --on, oder stattdessen --cleanup-expired verwenden |
| „We are in maintenance mode, skipping cron" | system:cron bei aktivem Wartungsmodus |
Wartungsmodus beenden |
| „We are in admin only mode, skipping cron" | Einzelbenutzermodus aktiv | occ maintenance:singleuser --off |
| „Background Jobs are disabled!" | backgroundjobs_mode steht auf none |
occ background:cron setzen |
Nach occ gehören neue Dateien root |
Ein früherer Aufruf lief als root |
Eigentümer zurücksetzen (chown -R www-data:www-data) und künftig sudo -u www-data verwenden |
| Neue Dateien im Datenverzeichnis erscheinen nicht in der Weboberfläche | Der Dateicache kennt sie nicht | occ files:scan für das betroffene Konto oder den Pfad |