Drupal ist ein leistungsfähiges Open-Source CMS für komplexe Webprojekte. Es wird von Regierungen, Universitäten und großen Unternehmen eingesetzt.

Drupal-Stärken

Features

- Flexibles Content-Modell
- Taxonomie-System
- Multisite-fähig
- REST API integriert
- Granulare Berechtigungen
- Revisionssystem
- Workflows
- Headless-Modus

Einsatzgebiete

| Anwendung | Beispiele | |-----------|-----------| | Regierung | whitehouse.gov (früher) | | Bildung | Universitäts-Portale | | Medien | News-Websites | | Enterprise | Unternehmens-Intranets | | E-Commerce | Mit Commerce-Modul |

Voraussetzungen

Systemanforderungen

- PHP 8.1+ (8.2 empfohlen)
- MySQL 8.0+ / MariaDB 10.3.7+ / PostgreSQL 12+
- Apache/Nginx
- 512 MB RAM (2 GB empfohlen)
- Composer

PHP-Erweiterungen

apt install php8.2-fpm php8.2-mysql php8.2-xml php8.2-gd php8.2-curl php8.2-mbstring php8.2-zip php8.2-opcache php8.2-apcu

Composer installieren

curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer

Installation

Mit Composer (empfohlen)

cd /var/www
composer create-project drupal/recommended-project drupal

# Berechtigungen
chown -R www-data:www-data drupal
chmod -R 755 drupal

Datenbank erstellen

CREATE DATABASE drupal CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'drupal'@'localhost' IDENTIFIED BY 'sicheres_passwort';
GRANT ALL ON drupal.* TO 'drupal'@'localhost';
FLUSH PRIVILEGES;

Nginx-Konfiguration

# /etc/nginx/sites-available/drupal

server {
    listen 80;
    server_name example.de;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.de;

    ssl_certificate /etc/letsencrypt/live/example.de/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.de/privkey.pem;

    root /var/www/drupal/web;
    index index.php;

    # Logs
    access_log /var/log/nginx/drupal.access.log;
    error_log /var/log/nginx/drupal.error.log;

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    # Sicherheit
    location ~ \..*/.*\.php$ {
        return 403;
    }

    location ~ ^/sites/.*/private/ {
        return 403;
    }

    location ~ ^/sites/[^/]+/files/.*\.php$ {
        deny all;
    }

    # Clean URLs
    location / {
        try_files $uri /index.php?$query_string;
    }

    # PHP
    location ~ '\.php$|^/update.php' {
        fastcgi_split_path_info ^(.+?\.php)(|/.*)$;
        include fastcgi_params;
        fastcgi_param HTTP_PROXY "";
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param QUERY_STRING $query_string;
        fastcgi_intercept_errors on;
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
    }

    # Statische Dateien
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
        try_files $uri @rewrite;
        expires max;
        log_not_found off;
    }

    location @rewrite {
        rewrite ^/(.*)$ /index.php?q=$1;
    }
}

Web-Installation

1. https://example.de aufrufen
2. Sprache wählen: Deutsch
3. Installationsprofil: Standard
4. Datenbank konfigurieren:
   - Typ: MySQL
   - Name: drupal
   - Benutzer: drupal
   - Passwort: sicheres_passwort
   - Host: localhost
5. Website konfigurieren:
   - Site-Name
   - E-Mail
   - Admin-Account
6. Installation abschließen

Vertrauenswürdige Hosts

// web/sites/default/settings.php

$settings['trusted_host_patterns'] = [
  '^example\.de$',
  '^www\.example\.de$',
];

Drush (CLI)

Installation

composer require drush/drush

Wichtige Befehle

cd /var/www/drupal

# Cache leeren
./vendor/bin/drush cache:rebuild

# Status
./vendor/bin/drush status

# Updates
./vendor/bin/drush updatedb

# Modul aktivieren
./vendor/bin/drush en module_name

# Modul deaktivieren
./vendor/bin/drush pm:uninstall module_name

# Benutzer erstellen
./vendor/bin/drush user:create admin --mail="admin@example.de" --password="passwort"

# Admin-Rolle zuweisen
./vendor/bin/drush user:role:add administrator admin

# Login-Link generieren
./vendor/bin/drush user:login

Module installieren

Mit Composer

# Modul herunterladen
composer require drupal/admin_toolbar

# Modul aktivieren
./vendor/bin/drush en admin_toolbar

Empfohlene Module

# Administration
admin_toolbar          # Bessere Admin-Navigation
coffee                # Quick-Search (Alt+D)
module_filter         # Modul-Übersicht

# Content
pathauto              # Automatische URL-Aliase
metatag               # SEO Meta-Tags
redirect              # URL-Redirects
token                 # Token-System
ckeditor5             # WYSIWYG-Editor

# Medien
media                 # Medienverwaltung (Core)
media_library         # Medienbibliothek

# Sicherheit
seckit                # Security Headers
captcha               # Spam-Schutz
honeypot              # Anti-Spam

# Performance
big_pipe              # Progressive Page Rendering
dynamic_page_cache    # Seiten-Cache

Modul-Suche

composer search drupal/
# Oder auf drupal.org/project/modules

Content-Typen

Erstellen

Struktur → Inhaltstypen → Inhaltstyp hinzufügen

- Name: Artikel
- Beschreibung: Blog-Artikel
- Einstellungen konfigurieren

Felder hinzufügen

Struktur → Inhaltstypen → Artikel → Felder verwalten

Feldtypen:
- Text (plain/formatted)
- Number (integer/decimal)
- Boolean
- Date
- Entity Reference
- Media
- Link
- List (select/checkboxes)

Display-Modi

Struktur → Inhaltstypen → Artikel → Anzeige verwalten

Modi:
- Default
- Teaser
- Full
- Custom

Taxonomie

Vokabular erstellen

Struktur → Taxonomie → Vokabular hinzufügen

- Name: Kategorien
- Beschreibung: Artikel-Kategorien

Begriffe hinzufügen

Struktur → Taxonomie → Kategorien → Begriff hinzufügen

Hierarchie möglich (Parent-Child)

Mit Content-Typ verknüpfen

Struktur → Inhaltstypen → Artikel → Felder verwalten
→ Feld hinzufügen → Reference → Taxonomy term

Themes

Theme installieren

composer require drupal/bootstrap5
./vendor/bin/drush en bootstrap5

Theme aktivieren

Design → Bootstrap5 → Als Standard festlegen

Sub-Theme erstellen

# Theme-Verzeichnis
mkdir -p web/themes/custom/mytheme

# mytheme.info.yml
name: My Theme
type: theme
description: Custom theme
core_version_requirement: ^10
base theme: bootstrap5

# mytheme.libraries.yml
global-styling:
  css:
    theme:
      css/style.css: {}

Views

View erstellen

Struktur → Views → View hinzufügen

- Name: Artikel-Liste
- Show: Content of type Artikel
- Create a page/block

Konfiguration

Format: Unformatted list / Table / Grid
Fields: Titel, Bild, Zusammenfassung
Filter: Published (yes), Type (Artikel)
Sort: Created date (desc)
Pager: 10 items per page

Benutzer und Rollen

Rolle erstellen

Personen → Rollen → Rolle hinzufügen

- Name: Redakteur
- Berechtigungen konfigurieren

Berechtigungen

Personen → Berechtigungen

Wichtige Bereiche:
- Node: Create, Edit, Delete
- Media: Create, Edit, Delete
- Taxonomy: Administer
- Administration: Access

Mehrsprachigkeit

Module aktivieren

./vendor/bin/drush en language content_translation config_translation interface_translation

Sprachen hinzufügen

Konfiguration → Regional und Sprache → Sprachen → Sprache hinzufügen

Übersetzung aktivieren

Konfiguration → Regional und Sprache → Inhaltssprache

Content-Typ → Einstellungen → Übersetzung aktivieren

Performance

Caching

// settings.php

// Page Cache
$settings['cache']['bins']['render'] = 'cache.backend.database';
$settings['cache']['bins']['dynamic_page_cache'] = 'cache.backend.database';

// Redis (optional)
$settings['redis.connection']['interface'] = 'PhpRedis';
$settings['redis.connection']['host'] = '127.0.0.1';
$settings['cache']['default'] = 'cache.backend.redis';

Cache leeren

./vendor/bin/drush cache:rebuild

CSS/JS aggregieren

Konfiguration → Entwicklung → Leistung

- CSS-Dateien aggregieren: Ja
- JavaScript-Dateien aggregieren: Ja

Sicherheit

Updates prüfen

./vendor/bin/drush pm:security

Dateiberechtigungen

# Verzeichnisse
find /var/www/drupal -type d -exec chmod 755 {} \;

# Dateien
find /var/www/drupal -type f -exec chmod 644 {} \;

# Settings
chmod 444 web/sites/default/settings.php

# Files-Verzeichnis
chmod 755 web/sites/default/files

Security-Modul

composer require drupal/seckit
./vendor/bin/drush en seckit
Konfiguration → System → SecKit

- X-Frame-Options: SAMEORIGIN
- X-Content-Type-Options: nosniff
- CSP konfigurieren

Backup

Mit Drush

# Datenbank
./vendor/bin/drush sql:dump --result-file=/backup/drupal-$(date +%Y-%m-%d).sql

# Dateien
tar -czf /backup/drupal-files-$(date +%Y-%m-%d).tar.gz web/sites/default/files

Backup-Modul

composer require drupal/backup_migrate
./vendor/bin/drush en backup_migrate

Updates

Drupal Core

# Prüfen
composer outdated drupal/core

# Update
composer update drupal/core-* --with-dependencies
./vendor/bin/drush updatedb
./vendor/bin/drush cache:rebuild

Module

composer update drupal/module_name
./vendor/bin/drush updatedb
./vendor/bin/drush cache:rebuild

Troubleshooting

Weißer Bildschirm

// settings.php
$config['system.logging']['error_level'] = 'verbose';

Datenbank-Probleme

./vendor/bin/drush updatedb --force

Berechtigungen

chown -R www-data:www-data /var/www/drupal

Cache-Probleme

./vendor/bin/drush cache:rebuild
# Oder
rm -rf web/sites/default/files/php

Zusammenfassung

| Befehl (Drush) | Funktion | |----------------|----------| | cache:rebuild | Cache leeren | | updatedb | DB-Updates | | en module | Modul aktivieren | | pm:uninstall | Modul deaktivieren | | sql:dump | DB-Backup | | user:login | Login-Link |

| Verzeichnis | Inhalt | |-------------|--------| | web/core | Drupal Core | | web/modules | Module | | web/themes | Themes | | web/sites/default/files | Uploads | | vendor | Composer-Pakete |

| Datei | Funktion | |-------|----------| | settings.php | Konfiguration | | services.yml | Service-Definition | | composer.json | Dependencies |

Fazit

Drupal ist die richtige Wahl für komplexe, inhaltsreiche Webprojekte. Das flexible Content-Modell ermöglicht maßgeschneiderte Datenstrukturen. Die Views-Funktion erlaubt beliebige Datenausgaben ohne Programmierung. Mit Composer und Drush wird die Verwaltung zum Kinderspiel. Für Enterprise-Anforderungen mit komplexen Workflows und Mehrsprachigkeit ist Drupal konkurrenzlos.