Schritt für Schritt Anleitung für eine simple Basisinstallation einer leeren und frischen Drupal 11 Instanz. Sie ist auch Basis für ein neues per.net Projekt, die sich an einigen Stellen aber untersheiden können. Ist im Manual aber vermerkt.
Ziel
Dieses Manual zeigt Schritt für Schritt eine Drupal Installation mit Composer, inkl. Einrichten von MAMP, MySQL Datenbank, drush und git und Einrichten eines Gitlab Repositories. Es basiert auf meiner Testumgebung, die ich zum Testen von einzelnen Task verwenden will und schnell mittels komplettem Backup wieder auf den Ursprungszustand zurücksetzen kann.
Die Testinstallation dient ausschliesslich zum Testen von Drupal-Core, Modulen und Konfigurationen.
Nach Abschluss eines Tests kann die komplette Installation mittels Backup wieder auf den Ausgangszustand zurückgesetzt werden.
Die Installation dient als reproduzierbare Drupal-Basis. Neue Tests beginnen immer wieder von diesem definierten Ausgangszustand, ohne Basismodule, ausser shield zum schützen der Testumgebung.
Namenskonventionen
Domain DB User PW
d11-test1.selfip.net d11-test1 d11-test1Admin tester1
d11-test2.selfip.net d11-test2 d11-test2Admin tester2
d11-test3.selfip.net d11-test3 d11-test3Admin tester31 -- Installation
Projektverzeichnis mit der folgenden Struktur anlegen:
d11-test1/ Projektverzeichnis
├── --pernet-arbeitsfiles/
├── --pernet-docs/
├── config/
├── private/
├── db-dump/
├── tmp/
└── public/ Composer-Root
├── composer.json
├── composer.lock
├── vendor/
└── web/ Drupal-Root / Site-Folder (Mamp)
└── tools/ Lokale Erweiterungen, z.B. browser-sync
├── frontend/1.1 -- Datenbank einrichten
Neue Datenbank gemäss Namenskonvention (oben) einrichten:
- MAMP
- Webstart > Tools > PHPmyAdmin
- PHPmyAdmin
- Neue Datenbank erstellen (Kollation: utf8mb4_general_ci)
- Neuen Benutzer anlegen (Nur Benutzername, PW, keine weiteren Settings nötig)
so wird der Benutzer direkt der neu erstellten DB zugeordnet und erhält alle Rechte
1.2 -- Drupal Struktur mit Composer anlegen
- vscode > Terminal
- ### WICHTIG: ins Public Verzeichnis wechseln:
cd public
- PHP Version prüfen (Aktuell für Drupal 11.4: php 8.3)
- ### WICHTIG!!!
- MAMP php Version muss mit der Composer PHP übereinstimmen.
which php php -v usephp83 php -v- Konfiguration für verschiedene PHP-Versionen ist in ~/.zshrc definiert und aktuell für
- php 7.4, php 8.3, php 8.4
- definiert (Stand August 2026)
composer create-project drupal/recommended-project .
- ### WICHTIG: ins Public Verzeichnis wechseln:
- sites/default/default.settings.php > in settings.php duplizieren
- hash_salt erzeugen: (Terminal)
php -r 'echo bin2hex(random_bytes(32)), PHP_EOL;'
- Ausgabe kopieren und in der settings.php einfügen:
$settings['hash_salt'] = 'HIER_DEN_ERZEUGTEN_WERT_EINSETZEN';
- DB-Einstellungen inklusive Kollation und Config-Sync-Verzeichnis am Ende der settings.php einfügen. Damit wird sichergestellt, dass beim Erstellen von Datenbanktabellen die richtige Kollation verwendet wird und die DB-Einträge nicht mehr abgefragt und ohne Kollation überschrieben werden. Mit diesen Einstellungen, wird die DB-Einstellungsseite im Installationsprozess nicht mehr angezeigt.
/** * Database connection. */ $databases['default']['default'] = array ( 'database' => 'DB-NAME_drupal', 'username' => 'DB-USERAdmin', 'password' => 'DB-PASSWORD', 'prefix' => '', 'host' => '127.0.0.1', 'port' => '3306', 'collation' => 'utf8mb4_general_ci', 'isolation_level' => 'READ COMMITTED', 'driver' => 'mysql', 'namespace' => 'Drupal\\mysql\\Driver\\Database\\mysql', 'autoload' => 'core/modules/mysql/src/Driver/Database/mysql/', ); /** * Location of the site configuration files. */ $settings['config_sync_directory'] = dirname($app_root, 2) . '/config/sync';
1.3 -- MAMP einrichten
- MAMP
- New Site > Empty
- Site name: [domainname.selfip.net]
- Site folder festlegen: /public/web
- PHP Version prüfen (Aktuell für Drupal 11.4: php 8.3)
- SSL einrichten (manual folgt ...)
1.4 -- Drupal Installieren
- Site-URL im Browser aufrufen
- Installation in Englisch starten
- Installationsprofil: Standard
- DB-Daten: Diese Seite wird übersprungen, weil wir in der settings.php schon alles definiert haben.
- Site Name und weitere Basisinfos eintragen:
- Sitename: Projektname
- Site email address: webmaster@projektname.ch
- (Systemmeldungen werden mit dieser Absenderadresse versandt)
- Username: [Mein Adminname]
- Password: [xxxx]
- E-Mail: mail@per-net.ch
- Timezone: Zurich
1.5. -- Settings und unverzichtbare Module installieren
- Drush installieren >> Checken ob ich im /public stehe:
composer require --dev 'drush/drush'
- Shield installieren:
composer require 'drupal/shield:^1.8'
- Shield aktivieren und konfigurieren
- WICHTIG: Für Installation eines per.net Projektes Shield nur aktivieren, aber keine PW einrichten und das Modul auch nicht enablen. Das wird in den lokalen Settings gemacht und ist beim Aritkel settings explizit dokumentiert, damit beim config export (drushh cex) die PW nicht versioniert in git liegen.
User: pernet PW: pernet- Allow command line access > aktiviert lassen, sonst funktioniert drush oder composer nicht.
- Konfigurations-Export prüfen, nachdem drush läuft, damit wir sichergestellt haben, dass config richtig exportiert wird.
drushh cex
WICHTIG:
Ab hier nur noch für die einfache Testinstallation weiter machen. Für ein neues per.net Projekt den Anweisungen unter «per.net Projekt einrichten» folgen.
1.5 -- Git einrichten
- ### WICHTIG: ins Projektverzeichnis wechseln, nicht in public aufrufen.
Es muss die komplette Struktur ins Git Repository aufgenommen werden, nicht nur der Inhalt von project. - ### WICHTIG: Die Testinstallation hat nicht das Settings-Setup, das ich für Standardprojekte verwende.
Ist zum testen nicht nötig und unnötig aufwändig zum einrichten. git init- .gitignore erstellen und folgenden Code einkopieren:
# macOS .DS_Store # VS Code .vscode/ # Composer-Abhängigkeiten public/vendor/ # Drupal Core public/web/core/ # Öffentliche Dateien public/web/sites/*/files/ # Private Dateien private/ # Logs *.log # Lokale Drupal-Einstellungen mit Datenbankzugang public/web/sites/default/settings.php # DB-Dump --pernet-docs/db-dump
1.6 -- Gitlab einrichten
- Neues Projekt anlegen
- User auswählen: per.net
- Projektname angeben z.B.: [domainname]
- Keine Readme-Datei erstellen
- Nur für Testumgebungen:
- Projekt in gitlab anwählen, linke Spalte:
- Settings > Repository > Branch rules > main > view details
- «Allow force push» einschalten (Ausdrücklich nur für Testumgebung, um Projekt ohne Neuinstallation wieder zurücksetzen zu können.)
- «Allow force push» ermöglicht den Befehl: git push --force-with-lease origin main
- der wie weiter unten beschrieben beim «reseten» den aktuellen Stand auf gitlab überschreibt.
1.7 -- Git mit Repository verknüpfen
- im Root-Verzeichnis:
git remote add origin git@gitlab.com:per.net/[domainname].git- Zur Kontrolle:
git remote -v
1.8 -- Erster commit
git status git add . git commit -m "Initial commit - Drupal 11.4.4 - 16.07.2026 - Base install with Drush and Shield" git push -u origin main- ### WICHTIG:
Gilt nur für den ersten push in ein neues, leeres Gitlab Projekt.
Legt Branch main auf GitLab an und verbindet meinen lokalen main damit git push -u origin maingit push --force-with-lease origin main- ### WICHTIG:
- git push --force-with-lease origin main
- Gilt, wenn ein bestehendes gitlab Projekt vorhanden ist.
Erklärung: Der Branch main wird durch den lokalen Stand ersetzt. Frühere Commits gehören danach nicht mehr zum sichtbaren Verlauf von main. git push
Dieser Kurzbefehl reicht für alle späteren push Befehle- ### TIPP: Falls in vscode noch Punkte da stehen, obwohl git clean ist, folgenden Schritt in vscode ausführen:
- Cmd + Shift + P (oder Menu > View > Command palette)
Developer: Reload Window
1.9 -- BACKUP
- DB-Dump in --pernet-docs/db-dump legen
- Wie früher komplette Codebase vom Projektverzeichnis duplizieren, zippen und klar benennen, mit Datum und Version und in übergeordneten Backup Ordner schieben. Das ungezipte Duplikat kann man nach dem zippen löschen.
- Namensmuster: d11--test-1--BACKUP--d11.4.4--16.07.2026.zip
2 -- Reset
2.1 -- Daten zurückspielen
- Gesamten Inhalt im Projekt-Root löschen
- DB-Backup wieder zurück kopieren
- DB: Alle Tabellen in Sequal Ace löschen und Backup einspielen
- gitlab wieder auf den ersten commit zurücksetzen, falls gepusht wurde
- Erst prüfen ob git ok ist
git status git remote -v git fetch origin git push --force-with-lease origin main- Erklärung
git remote -v- Zuerst prüfen ob auf das richtige gitlab Repository zugegrifen wird
git fetch origin- Lädt den aktuellen Stand von GitLab herunter, ohne lokale Dateien zu verändern (fetch vs pull). Dadurch weiss Git, welcher Commit aktuell auf origin/main liegt.
git push --force-with-lease origin main- Ersetzt den Branch main auf GitLab durch den lokalen Stand.
- Der neue Initial-Commit wird dadurch zum aktuellen Startpunkt des Projekts. Ältere Commits gehören nicht mehr zum sichtbaren Branch-Verlauf.