diff --git a/readme.md b/readme.md
index 5337bc8..a984f41 100644
--- a/readme.md
+++ b/readme.md
@@ -1,16 +1,17 @@
# Umfassende Anleitung: Moodle auf STACKIT Cloud Foundry
-Diese Anleitung dokumentiert den gesamten Prozess, um eine Moodle-Instanz auf STACKIT Cloud Foundry zu deployen. Sie umfasst die Ersteinrichtung der CF-Umgebung, die Vorbereitung der Moodle-Anwendung inklusive aller notwendigen Anpassungen für den Proxy- und CDN-Betrieb sowie die Konfiguration für eine externe Datenbank, S3-Dateispeicher, Redis-Caching und Autoskalierung.
+Diese Anleitung dokumentiert den gesamten Prozess, um eine Moodle-Instanz auf STACKIT Cloud Foundry zu deployen. Sie ist als allgemeingültige Vorlage konzipiert und verwendet Platzhalter, die an Ihre Umgebung angepasst werden müssen.
## Architektur
-Die folgende Abbildung zeigt die Architektur der Moodle-Umgebung auf STACKIT als Mermaid-Diagramm.
+Die folgende Abbildung zeigt die Architektur der Moodle-Umgebung. CDN und Redis sind als optionale, aber für den Produktivbetrieb empfohlene Komponenten dargestellt.
```mermaid
graph TD
A[Anwender] --> B(STACKIT DNS);
- B --> C(STACKIT CDN);
- C --> D{Cloud Foundry Router};
+ B --> C(STACKIT CDN
(Optional));
+ C -.-> D{Cloud Foundry Router};
+ B --> D;
subgraph Cloud Foundry Plattform
D --> E1[Moodle Instanz 1];
@@ -19,16 +20,16 @@ graph TD
subgraph Backing Services
F[(MariaDB
Datenbank)];
- G[(Redis
Sessions & Locks)];
+ G[(Redis
Sessions & Locks
(Optional))];
H[(S3 Object Storage
Dateien)];
end
E1 --> F;
- E1 --> G;
+ E1 -.-> G;
E1 --> H;
E2 --> F;
- E2 --> G;
+ E2 -.-> G;
E2 --> H;
````
@@ -36,20 +37,16 @@ graph TD
### 1.1. CLIs installieren
-Für diese Anleitung werden zwei Command Line Interfaces (CLIs) benötigt:
-
* **Cloud Foundry CLI:** Das primäre Werkzeug zur Interaktion mit der Cloud Foundry Plattform.
- * **Download:** [github.com/cloudfoundry/cli/releases](https://github.com/cloudfoundry/cli/releases)
+ * **Download:** `https://github.com/cloudfoundry/cli/releases`
- * **STACKIT CLI:** Wird benötigt, um STACKIT-spezifische Services wie Object Storage zu verwalten.
+ * **STACKIT CLI:** Wird benötigt, um STACKIT-spezifische Services wie DNS, Object Storage und CDN zu verwalten.
- * **Installationsanleitung:** Befolgen Sie die offizielle Anleitung unter [docs.stackit.cloud](https://docs.stackit.cloud/stackit/en/service-plans-redis-75142939.html).
+ * **Installationsanleitung:** `https://docs.stackit.cloud/stackit/de/automatisieren/cli/cli-installieren-200720436.html`
### 1.2. Bei STACKIT Cloud Foundry anmelden
-Nach der Installation des CF CLI müssen Sie sich bei der STACKIT Cloud Foundry API anmelden.
-
* **API-Endpunkt:** `https://api.cf.eu01.stackit.cloud`
* **Login-Befehl:**
@@ -60,25 +57,11 @@ Nach der Installation des CF CLI müssen Sie sich bei der STACKIT Cloud Foundry
### 1.3. Organisation und Space erstellen
-Eine "Organisation" ist der höchste Mandant, ein "Space" eine Umgebung (z.B. Entwicklung, Produktion).
-
-1. **Organisation erstellen:**
-
- ```bash
- cf create-org DEINE_ORGANISATION
- ```
-
-2. **Space erstellen:**
-
- ```bash
- cf create-space produktion -o DEINE_ORGANISATION
- ```
-
-3. **Ziel festlegen:**
-
- ```bash
- cf target -o DEINE_ORGANISATION -s produktion
- ```
+```bash
+cf create-org
+cf create-space -o
+cf target -o -s
+```
## 2\. Moodle-Projekt lokal vorbereiten
@@ -89,9 +72,9 @@ Eine "Organisation" ist der höchste Mandant, ein "Space" eine Umgebung (z.B. En
wget https://packaging.moodle.org/stable500/moodle-5.0.1.tgz
tar -xzf moodle-5.0.1.tgz
-# Redis-Plugin für Moodle installieren
-wget https://moodle.org/plugins/download.php/29037/cachestore_redis_moodle41_2022112800.zip
-unzip cachestore_redis_moodle41_2022112800.zip
+# Redis-Plugin für Moodle installieren (Version passend zu Moodle 5.x)
+wget https://moodle.org/plugins/download.php/30019/cachestore_redis_moodle44_2024051300.zip
+unzip cachestore_redis_moodle44_2024051300.zip
mv redis moodle/cache/stores/
# S3 Object File System Plugin installieren
@@ -102,8 +85,6 @@ cd ..
### 2.2. Buildpack- & System-Workarounds einrichten
-Diese Schritte sind für das `cloudfoundry/php-buildpack` notwendig.
-
```bash
# Web-Verzeichnis festlegen und PHP-Version auf 8.2 erzwingen
echo '{"WEBDIR": ".", "PHP_VERSION": "{PHP_82_LATEST}"}' > moodle/.bp-config/options.json
@@ -128,42 +109,105 @@ ln -s /tmp/php-fpm.pid moodle/php/var/run/php-fpm.pid
#### 3.1. Object Storage Bucket erstellen (STACKIT CLI)
-Verwenden Sie das STACKIT CLI, um einen Bucket zu erstellen.
-
```bash
-# Erstellt einen neuen Bucket
-stackit object-storage bucket create --name
+stackit object-storage bucket create --name
```
-Anschließend benötigen Sie Zugangsdaten, um auf den Bucket zugreifen zu können.
-
```bash
-# Erstellt neue Zugangsdaten für Ihr Projekt
-# Sie müssen Ihre STACKIT Projekt-ID angeben.
stackit object-storage credential create --project-id
```
-**Notieren Sie sich den ausgegebenen `accessKey` und `secretAccessKey`.** Sie werden im nächsten Schritt benötigt.
+**Notieren Sie sich den ausgegebenen `accessKey` und `secretAccessKey`.**
-#### 3.2. Cloud Foundry Services erstellen (CF CLI)
+#### 3.2. CDN-Distribution erstellen (STACKIT CLI, Optional)
-Diese Befehle legen die für Moodle notwendigen CF-Services an.
+1. **CDN-Distribution erstellen:**
+
+ ```bash
+ # Ersetzen Sie , und .
+ stackit curl -X POST --body '{
+ "name": "",
+ "origin": {
+ "path": "/",
+ "hostname": "",
+ "port": 443
+ },
+ "originRequestHeaders": [
+ {
+ "name": "Host",
+ "values": [
+ ""
+ ]
+ },
+ {
+ "name": "Cache-Control",
+ "values": [
+ "no-cache, no-store, must-revalidate"
+ ]
+ }
+ ],
+ "enabled": true
+ }' /cdn/v1beta/projects//distributions
+ ```
+
+ **Notieren Sie sich die `id` der Distribution aus der Antwort.**
+
+2. **CDN-Standard-Domain auslesen:**
+
+ ```bash
+ # Ersetzen Sie und .
+ stackit curl -X GET /cdn/v1beta/projects//distributions/
+ ```
+
+ **Notieren Sie sich den Wert des `domain`-Feldes aus der Antwort. Dies ist Ihr CNAME-Ziel.**
+
+3. **Benutzerdefinierte Domain hinzufügen:**
+
+ ```bash
+ # Ersetzen Sie und .
+ stackit curl -X POST --body '{
+ "domain": ""
+ }' /cdn/v1beta/projects//distributions//domains
+ ```
+
+#### 3.3. DNS-Einträge konfigurieren (STACKIT CLI)
+
+1. **Zone-ID ermitteln:**
+
+ ```bash
+ stackit dns zone list
+ ```
+
+ Notieren Sie sich die `ID` Ihrer Domain-Zone.
+
+2. **CNAME-Eintrag erstellen:**
+
+ ```bash
+ # Für den Betrieb MIT CDN
+ # ist die Standard-Domain, die Sie in Schritt 3.2 ausgelesen haben.
+ stackit dns record-set create --zone-id --name --type CNAME --ttl 300 --records "."
+
+ # Für den Betrieb OHNE CDN (falls benötigt)
+ stackit dns record-set create --zone-id --name --type CNAME --ttl 300 --records "console.apps.01.cf.eu01.stackit.cloud."
+ ```
+
+#### 3.4. Cloud Foundry Services erstellen (CF CLI)
```bash
# Datenbank-Service
-cf create-service moodle-demo-mariadb
+cf create-service
# Redis-Service (Optional)
-cf create-service appcloud-redis7 redis-4.16.100-replica moodle-redis
+cf create-service appcloud-redis7 redis-4.16.100-replica
# Autoscaler-Service
-cf create-service autoscaler autoscaler-free-plan moodle-autoscaler
+cf create-service autoscaler autoscaler-free-plan
-# User-Provided Service für die S3-Credentials aus dem vorherigen Schritt
-cf create-user-provided-service moodle-s3-credentials -p '{
- "access_key": "DEIN_ZUVOR_GENERIERTER_ACCESS_KEY",
- "secret_key": "DEIN_ZUVOR_GENERIERTER_SECRET_KEY",
- "bucket": "DEIN_ZUVOR_GENERIERTES_BUCKET",
+# User-Provided Service für die S3-Credentials
+cf create-user-provided-service -p '{
+ "access_key": "",
+ "secret_key": "",
+ "bucket": "",
"endpoint": "https://object.storage.eu01.onstackit.cloud/"
}'
```
@@ -172,8 +216,6 @@ cf create-user-provided-service moodle-s3-credentials -p '{
#### a) Manifest-Dateien
-Erstellen Sie zwei Manifest-Dateien, um einfach zwischen dem Betrieb mit und ohne CDN wechseln zu können.
-
**`manifest-cdn.yml` (Produktion):**
```yaml
@@ -185,17 +227,17 @@ applications:
buildpack: https://github.com/cloudfoundry/php-buildpack.git
path: moodle
routes:
- - route: moodle.cf.demo.stackit.rocks
- - route: moodle.demo.stackit.rocks
+ - route:
+ - route:
env:
USE_CDN: 'true'
- WWW_ROOT: "https://moodle.demo.stackit.rocks"
+ WWW_ROOT: "https://"
BP_PHP_LOG_LEVEL: WARNING
services:
- - moodle-demo-mariadb
- - moodle-redis
- - moodle-autoscaler
- - moodle-s3-credentials
+ -
+ -
+ -
+ -
autoscaling:
min_instances: 2
max_instances: 4
@@ -225,16 +267,16 @@ applications:
buildpack: https://github.com/cloudfoundry/php-buildpack.git
path: moodle
routes:
- - route: moodle.cf.demo.stackit.rocks
+ - route:
env:
USE_CDN: 'false'
- WWW_ROOT: "https://moodle.cf.demo.stackit.rocks"
+ WWW_ROOT: "https://"
BP_PHP_LOG_LEVEL: WARNING
services:
- - moodle-demo-mariadb
- - moodle-redis
- - moodle-autoscaler
- - moodle-s3-credentials
+ -
+ -
+ -
+ -
autoscaling:
min_instances: 1
max_instances: 4
@@ -243,14 +285,11 @@ applications:
#### b) Dynamische `config.php`
-Kopieren Sie `moodle/config-dist.php` zu `moodle/config.php` und ersetzen Sie den gesamten Inhalt mit dieser finalen, dynamischen Vorlage.
+Kopieren Sie `moodle/config-dist.php` zu `moodle/config.php` und ersetzen Sie den Inhalt mit dieser Vorlage.
```php
wwwroot = $wwwRoot;
$CFG->dirroot = __DIR__;
$CFG->dataroot = '/tmp/moodledata';
$CFG->admin = 'admin';
$CFG->directorypermissions = 0777;
-// --- Proxy-Einstellungen ---
$CFG->sslproxy = 1;
$CFG->slasharguments = false;
if ($useCdn) {
- // Diese Einstellungen sind NUR für den CDN-Betrieb notwendig, um den "reverseproxyabused"-Fehler zu vermeiden.
$CFG->reverseproxy = 1;
- $CFG->trustedproxies = '127.0.0.1, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 185.124.192.185';
+ $CFG->trustedproxies = '127.0.0.1, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, ';
}
-// --- Workaround: Manuelles Erstellen des dataroot-Verzeichnisses ---
if (!file_exists($CFG->dataroot)) {
@mkdir($CFG->dataroot, $CFG->directorypermissions, true);
}
-//=========================================================================
-// 2. DATENBANK-SETUP
-//=========================================================================
$CFG->dbtype = 'mariadb';
$CFG->dblibrary = 'native';
$CFG->prefix = 'mdl_';
$CFG->dboptions = array ('dbpersist' => 0, 'dbcollation' => 'utf8mb4_unicode_ci');
-// --- Lese Service-Konfigurationen aus VCAP_SERVICES ---
$vcap_services_json = getenv('VCAP_SERVICES');
if ($vcap_services_json) {
$vcap_services = json_decode($vcap_services_json, true);
@@ -310,9 +339,9 @@ if ($vcap_services_json) {
}
}
- // Redis (Optional, für bessere Performance)
+ // Redis
$redis_service_key = null;
- if (isset($vcap_services['appcloud-redis60'])) { $redis_service_key = 'appcloud-redis60'; }
+ if (isset($vcap_services['appcloud-redis7'])) { $redis_service_key = 'appcloud-redis7'; }
if ($redis_service_key && isset($vcap_services[$redis_service_key][0]['credentials'])) {
$redis_creds = $vcap_services[$redis_service_key][0]['credentials'];
$CFG->session_handler_class = '\cachestore_redis\session_handler';
@@ -325,7 +354,7 @@ if ($vcap_services_json) {
// S3
if (isset($vcap_services['user-provided'])) {
foreach ($vcap_services['user-provided'] as $service) {
- if ($service['name'] === 'moodle-s3-credentials') {
+ if ($service['name'] === '') {
$s3_creds = $service['credentials'];
$CFG->objectfs_s3_key = $s3_creds['access_key'];
$CFG->objectfs_s3_secret = $s3_creds['secret_key'];
@@ -336,24 +365,17 @@ if ($vcap_services_json) {
}
}
}
-// Fallback auf Datenbank-Sessions, falls Redis nicht konfiguriert ist
if (empty($CFG->session_handler_class)) {
$CFG->session_handler_class = '\core\session\database';
}
-//=========================================================================
-// SESSION COOKIE HANDLING (bedingt durch CDN)
-//=========================================================================
if ($useCdn) {
$CFG->cookiepath = '/';
- $CFG->cookiedomain = 'moodle.demo.stackit.rocks';
+ $CFG->cookiedomain = '';
$CFG->cookiesecure = 1;
$CFG->cookiehttponly = 1;
}
-//=========================================================================
-// DO NOT ADD ANYTHING BELOW THIS LINE
-//=========================================================================
require_once(__DIR__ . '/lib/setup.php');
```
@@ -367,15 +389,10 @@ Wählen Sie das gewünschte Manifest für Ihr Deployment aus.
cf push -f manifest-cdn.yml
```
-**Hinweis:** Der CDN-Fall hat sich als problematisch erwiesen. Wenn Fehler auftreten, liegt es wahrscheinlich an den Caching- oder Header-Einstellungen im CDN selbst, die hier nicht behandelt werden können.
-
**Ohne CDN (Test / Direkter Zugriff):**
```bash
cf push -f manifest-no-cdn.yml
```
-Nach Abschluss des Deployments und dem Durchlaufen der Moodle-Web-Installation ist Ihre Instanz einsatzbereit.
-
-```
-```
\ No newline at end of file
+Nach Abschluss des Deployments und dem Durchlaufen der Moodle-Web-Installation ist Ihre Instanz einsatzbereit.
\ No newline at end of file