From ed192d79c25fd9de7a012c0d8fb37083561c7549 Mon Sep 17 00:00:00 2001 From: Robert Rapp Date: Fri, 6 Mar 2026 15:00:13 +0100 Subject: [PATCH] Restructure repository into administration and website areas --- .dockerignore | 7 +- .gitignore | 12 +-- README.md | 91 ++---------------- Dockerfile => administration/Dockerfile | 2 +- administration/README.md | 60 ++++++++++++ .../docker-compose.traefik-routes.yml | 24 ++--- .../docker-compose.yml | 8 +- ...-03-03-dom-json-wysiwyg-sync-brainstorm.md | 0 ...4-wysiwyg-inline-editor-sync-brainstorm.md | 0 ...eat-dom-to-json-content-extraction-plan.md | 0 ...feat-inline-wysiwyg-html-json-sync-plan.md | 0 .../scripts}/add-webpage.sh | 15 +-- .../scripts}/editor_server.php | 17 ++-- administration/scripts/extract_content.sh | 8 ++ .../scripts}/extract_dom_content.php | 2 +- .../scripts}/new-route.sh | 0 administration/scripts/run_editor_server.sh | 10 ++ .../serve-offline.sh | 17 ++-- .../stop-offline.sh | 6 +- index.html | 2 +- scripts/extract_content.sh | 8 -- scripts/run_editor_server.sh | 10 -- .../1698d822c6d3fe9b0c50b3ab44ef524a.js | 0 website/README.md | 33 +++++++ .../content}/site-content.de.json | 0 {editor => website/editor}/wysiwyg-editor.css | 0 {editor => website/editor}/wysiwyg-editor.js | 4 +- .../f73f70e70b0ac5f1d474abd842fb4b24.js | 0 .../ikfreunde.com.html | 0 ...8280abc143a883560f-projektteasercofinp.jpg | Bin ...7ec1a757d022015dd12f1-telefonicateaser.jpg | Bin ...c2520731c5868840c6e-heroimage1200x6253.jpg | Bin ...8ad7e05d35f620d42a-wassermonitorteaser.jpg | Bin .../1698d822c6d3fe9b0c50b3ab44ef524a.js | 0 ...98a8556e5bef366e8c-wassermonitorteaser.jpg | Bin ...8f56dc025ce04c0cc07-telefonicateaser2x.jpg | Bin ...3e0e6a5b1c347aa7c0-ruhrfuturprojteaser.jpg | Bin ...c47f8a89c1515aebc1-ruhrfuturprojteaser.jpg | Bin ...c58a8b501a139a8a81-heroimage1200x62532.jpg | Bin ...5482dcbe896ed51ab7-tideprojektteaser85.jpg | Bin ...7a7cd48abf995fdbed-tideprojektteaser85.jpg | Bin ...034c6e71e0ddabc103-projektteasercofinp.jpg | Bin .../ikfreunde.com_files}/brandeins@2x.png | Bin ...6fc7cb69cd6f27c3d7-kobimoprojekteimage.jpg | Bin .../ikfreunde.com_files}/detektorfm@2x.png | Bin .../ikfreunde.com_files}/dpok@2.png | Bin .../ikfreunde.com_files}/dt_land@2.png | Bin ...d16f52570f63266e6c-kobimoprojekteimage.jpg | Bin .../ee792949df0da81967291f5675ce6b3b.css | 0 .../f73f70e70b0ac5f1d474abd842fb4b24.js | 0 .../ikfreunde.com_files}/gdv@2x.png | Bin .../google-analytics_analytics.js | 0 .../ikfreunde.com_files}/google@2x.png | Bin .../ikfreunde.com_files}/grimmeonline@2.png | Bin .../ic_bildung_1_brown.svg | 0 .../ikfreunde.com_files}/ic_coins_brown.svg | 0 .../ikfreunde.com_files}/ic_fire.svg | 0 .../ikfreunde.com_files}/ic_mic_brown.svg | 0 .../ic_mobility_brown.svg | 0 .../ic_monitoring_1_brown.svg | 0 .../ikfreunde.com_files}/ic_pokal.svg | 0 .../ikfreunde.com_files}/ic_smiley.svg | 0 .../ikfreunde.com_files}/ic_team_2_brown.svg | 0 .../ic_wasser_1_brown.svg | 0 .../ikfreunde.com_files}/leadawards.png | Bin .../ikfreunde.com_files}/logo-df.svg | 0 .../ikfreunde.com_files}/ndr@2x.png | Bin .../ikfreunde.com_files}/prixeuropa@2.png | Bin .../ikfreunde.com_files}/shz@2x.png | Bin .../ikfreunde.com_files}/spon@2x.png | Bin .../stifterverband@2x.png | Bin .../ikfreunde.com_files}/tagesschau@2.png | Bin .../ikfreunde.com_files}/telefonica@2x.png | Bin .../ikfreunde.com_files}/tide@2x.png | Bin .../ikfreunde.com_files}/zdf@2x.png | Bin 75 files changed, 179 insertions(+), 157 deletions(-) rename Dockerfile => administration/Dockerfile (74%) create mode 100644 administration/README.md rename docker-compose.traefik-routes.yml => administration/docker-compose.traefik-routes.yml (78%) rename docker-compose.yml => administration/docker-compose.yml (63%) rename {docs => administration/docs}/brainstorms/2026-03-03-dom-json-wysiwyg-sync-brainstorm.md (100%) rename {docs => administration/docs}/brainstorms/2026-03-04-wysiwyg-inline-editor-sync-brainstorm.md (100%) rename {docs => administration/docs}/plans/2026-03-04-feat-dom-to-json-content-extraction-plan.md (100%) rename {docs => administration/docs}/plans/2026-03-04-feat-inline-wysiwyg-html-json-sync-plan.md (100%) rename {scripts => administration/scripts}/add-webpage.sh (82%) rename {scripts => administration/scripts}/editor_server.php (98%) create mode 100755 administration/scripts/extract_content.sh rename {scripts => administration/scripts}/extract_dom_content.php (98%) rename {scripts => administration/scripts}/new-route.sh (100%) create mode 100755 administration/scripts/run_editor_server.sh rename serve-offline.sh => administration/serve-offline.sh (58%) rename stop-offline.sh => administration/stop-offline.sh (73%) delete mode 100755 scripts/extract_content.sh delete mode 100755 scripts/run_editor_server.sh rename 1698d822c6d3fe9b0c50b3ab44ef524a.js => website/1698d822c6d3fe9b0c50b3ab44ef524a.js (100%) create mode 100644 website/README.md rename {content => website/content}/site-content.de.json (100%) rename {editor => website/editor}/wysiwyg-editor.css (100%) rename {editor => website/editor}/wysiwyg-editor.js (99%) rename f73f70e70b0ac5f1d474abd842fb4b24.js => website/f73f70e70b0ac5f1d474abd842fb4b24.js (100%) rename ikfreunde.com.html => website/ikfreunde.com.html (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/026d3a0dcea46e3c6ea8418280abc143a883560f-projektteasercofinp.jpg (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/07eb52c038c4c75165c7ec1a757d022015dd12f1-telefonicateaser.jpg (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/0ffcdedcfc816182f817ac2520731c5868840c6e-heroimage1200x6253.jpg (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/15542365f25229683d4a118ad7e05d35f620d42a-wassermonitorteaser.jpg (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/1698d822c6d3fe9b0c50b3ab44ef524a.js (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/20dc495acdb78d71a5e6cf98a8556e5bef366e8c-wassermonitorteaser.jpg (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/307019ce368b35d809ed78f56dc025ce04c0cc07-telefonicateaser2x.jpg (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/3915f694fef49b9b513d693e0e6a5b1c347aa7c0-ruhrfuturprojteaser.jpg (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/3b61b2909589fd44ec1af7c47f8a89c1515aebc1-ruhrfuturprojteaser.jpg (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/524569d400cf68ef1cf160c58a8b501a139a8a81-heroimage1200x62532.jpg (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/6b404ebe8b24e5c0d6b7c65482dcbe896ed51ab7-tideprojektteaser85.jpg (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/9faf87d7e48c5116e700e47a7cd48abf995fdbed-tideprojektteaser85.jpg (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/b1b5ffb75041c644f7fe52034c6e71e0ddabc103-projektteasercofinp.jpg (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/brandeins@2x.png (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/c54c8a64fe535bf7249d676fc7cb69cd6f27c3d7-kobimoprojekteimage.jpg (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/detektorfm@2x.png (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/dpok@2.png (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/dt_land@2.png (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/e679b01b355748edfb67d2d16f52570f63266e6c-kobimoprojekteimage.jpg (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/ee792949df0da81967291f5675ce6b3b.css (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/f73f70e70b0ac5f1d474abd842fb4b24.js (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/gdv@2x.png (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/google-analytics_analytics.js (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/google@2x.png (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/grimmeonline@2.png (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/ic_bildung_1_brown.svg (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/ic_coins_brown.svg (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/ic_fire.svg (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/ic_mic_brown.svg (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/ic_mobility_brown.svg (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/ic_monitoring_1_brown.svg (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/ic_pokal.svg (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/ic_smiley.svg (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/ic_team_2_brown.svg (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/ic_wasser_1_brown.svg (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/leadawards.png (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/logo-df.svg (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/ndr@2x.png (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/prixeuropa@2.png (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/shz@2x.png (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/spon@2x.png (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/stifterverband@2x.png (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/tagesschau@2.png (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/telefonica@2x.png (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/tide@2x.png (100%) rename {ikfreunde.com_files => website/ikfreunde.com_files}/zdf@2x.png (100%) diff --git a/.dockerignore b/.dockerignore index f7b4946..694ebb2 100644 --- a/.dockerignore +++ b/.dockerignore @@ -3,5 +3,8 @@ node_modules .DS_Store *.log -.offline-server.log -.offline-server.pid +administration/.offline-server.log +administration/.offline-server.pid +website/content/.editor-credentials.json +website/content/.editor-reset.json +website/content/.editor-rate-limit.json diff --git a/.gitignore b/.gitignore index 45a2621..2faae01 100644 --- a/.gitignore +++ b/.gitignore @@ -2,17 +2,17 @@ .DS_Store # Local runtime files -.offline-server.log -.offline-server.pid +administration/.offline-server.log +administration/.offline-server.pid # Editor auth + reset + rate limit state (never commit) -content/.editor-credentials.json -content/.editor-reset.json -content/.editor-rate-limit.json +website/content/.editor-credentials.json +website/content/.editor-reset.json +website/content/.editor-rate-limit.json # Generated backups *.bak -content/*.bak +website/content/*.bak # Optional local tooling node_modules/ diff --git a/README.md b/README.md index c5d4786..178e035 100644 --- a/README.md +++ b/README.md @@ -1,87 +1,14 @@ -# ikfreunde WYSIWYG Multi-Route Deploy +# interkollektives micro website -This project runs a local-content WYSIWYG editor behind Traefik and supports multiple route instances on one domain. +Diese Repository-Struktur ist in zwei Zielgruppen getrennt: -Examples: -- `https://mydomain.de/webpage1/` -- `https://mydomain.de/webpage2/` -- `https://mydomain.de/webpage3/` +- `administration/` +Für Deployment, Docker, Traefik, Server-Skripte und technische Wartung. -## Files -- `docker-compose.traefik-routes.yml`: Traefik-ready multi-service compose file -- `scripts/add-webpage.sh`: auto-generate new `webpageN` route + compose service -- `scripts/editor_server.php`: local API + static server (`/api/content`, `/api/save`) -- See [Brute-Force Protection](#brute-force-protection) for auth hardening details +- `website/` +Für Website-Inhalte (HTML, JSON, Bilder, Editor-Frontend) und redaktionelle Arbeit. -## Requirements -- Docker + Docker Compose -- Traefik with external network named `proxy` +## Einstieg -## First deploy -```bash -docker compose -f docker-compose.traefik-routes.yml up -d --build -``` - -## Add a new route (autogenerator) -```bash -./scripts/add-webpage.sh webpage4 mydomain.de -``` - -What it does: -1. Creates route data folder: `/srv/ikfreunde/webpage4/` -2. Seeds files if missing: -- `/srv/ikfreunde/webpage4/ikfreunde.com.html` -- `/srv/ikfreunde/webpage4/site-content.de.json` -3. Injects `webpage4` service into `docker-compose.traefik-routes.yml` - -Then redeploy: -```bash -docker compose -f docker-compose.traefik-routes.yml up -d --build -``` - -Open: -- `https://mydomain.de/webpage4/` - -## Notes -- Edit mode is only active with `?edit=1`. -- Saves write both HTML and JSON and create `.bak` backups. -- Route names can include letters, numbers, `_`, `-`. - -## Editor claim, login, reset (v1) -- New deployment starts as **unclaimed** (viewer-only by default). -- Open `https://mydomain.de/webpageN/?edit=1` to run first-time onboarding. -- First onboarding claim uses `email + password` and creates: - - `content/.editor-credentials.json` -- Afterwards, editing requires login. Without auth, users remain viewer. - -### Password reset (without SMTP) -- On failed login, trigger reset request. -- Server writes reset data to: - - `content/.editor-reset.json` -- The file contains `reset_url` with token. -- Open that URL, set new password, then login again. - -Security note: -- `content/.editor-credentials.json` and `content/.editor-reset.json` are blocked from HTTP access by the server router. -- Access to these files requires container/filesystem access. -- Simple brute-force protection is enabled in-app for login/reset (`content/.editor-rate-limit.json`) with account-based + global per-site thresholds (IP-independent). -- L3/L4 DDoS and global rate limiting should be handled at Traefik/network level. - -## Brute-Force Protection -- Login/Reset limits are enforced in `scripts/editor_server.php`. -- Limiting is account-based + global per site (not IP-bound), so IP hopping is less effective. -- Buckets currently used: - - `login_account`, `login_global` - - `reset_request_account`, `reset_request_global` - - `reset_confirm_account`, `reset_confirm_global` -- Rate-limit state is stored in: - - `content/.editor-rate-limit.json` - -## Optional env overrides -- `ROOT_BASE` (default: `/srv/ikfreunde`) -- `COMPOSE_FILE` (default: `docker-compose.traefik-routes.yml`) - -Example: -```bash -ROOT_BASE=/data/pages COMPOSE_FILE=docker-compose.traefik-routes.yml ./scripts/add-webpage.sh webpage5 mydomain.de -``` +- Technik/DevOps: siehe `administration/README.md` +- Redaktion/Content: siehe `website/README.md` diff --git a/Dockerfile b/administration/Dockerfile similarity index 74% rename from Dockerfile rename to administration/Dockerfile index e47c146..a9b6f31 100644 --- a/Dockerfile +++ b/administration/Dockerfile @@ -6,4 +6,4 @@ COPY . /app EXPOSE 4173 -CMD ["php", "-d", "opcache.enable_cli=0", "-S", "0.0.0.0:4173", "scripts/editor_server.php"] +CMD ["php", "-d", "opcache.enable_cli=0", "-S", "0.0.0.0:4173", "administration/scripts/editor_server.php"] diff --git a/administration/README.md b/administration/README.md new file mode 100644 index 0000000..c1bf050 --- /dev/null +++ b/administration/README.md @@ -0,0 +1,60 @@ +# Administration (Technik) + +Dieser Bereich ist für Deployment, Betrieb und technische Wartung. + +## Struktur + +- `Dockerfile` +- `docker-compose.yml` +- `docker-compose.traefik-routes.yml` +- `scripts/` (Server, Extraktion, Route-Generator) +- `docs/` (Planungs-/Brainstorm-Dokumente) + +## Voraussetzungen + +- Docker + Docker Compose +- Traefik mit externem Netzwerk `proxy` + +## Lokaler Editor-Server + +```bash +./administration/scripts/run_editor_server.sh +``` + +Aufruf: `http://127.0.0.1:4173/` + +## Traefik Deploy + +```bash +docker compose -f administration/docker-compose.traefik-routes.yml up -d --build +``` + +## Neue Route erzeugen + +```bash +./administration/scripts/add-webpage.sh webpage4 mydomain.de +``` + +Danach: + +```bash +docker compose -f administration/docker-compose.traefik-routes.yml up -d --build +``` + +## Security / Editor Auth + +- Unclaimed by default (Viewer-Rolle) +- Claim/Login/Reset über API im `editor_server.php` +- Sensible Dateien liegen unter `website/content/` und sind via HTTP blockiert: + - `.editor-credentials.json` + - `.editor-reset.json` + - `.editor-rate-limit.json` + +## Brute-Force Schutz + +Buckets: +- `login_account`, `login_global` +- `reset_request_account`, `reset_request_global` +- `reset_confirm_account`, `reset_confirm_global` + +Implementierung: `administration/scripts/editor_server.php` diff --git a/docker-compose.traefik-routes.yml b/administration/docker-compose.traefik-routes.yml similarity index 78% rename from docker-compose.traefik-routes.yml rename to administration/docker-compose.traefik-routes.yml index b129d09..d0a505d 100644 --- a/docker-compose.traefik-routes.yml +++ b/administration/docker-compose.traefik-routes.yml @@ -1,12 +1,12 @@ services: webpage1: build: - context: . - dockerfile: Dockerfile + context: .. + dockerfile: administration/Dockerfile container_name: ikfreunde-webpage1 volumes: - - /srv/ikfreunde/webpage1/ikfreunde.com.html:/app/ikfreunde.com.html - - /srv/ikfreunde/webpage1/site-content.de.json:/app/content/site-content.de.json + - /srv/ikfreunde/webpage1/ikfreunde.com.html:/app/website/ikfreunde.com.html + - /srv/ikfreunde/webpage1/site-content.de.json:/app/website/content/site-content.de.json restart: unless-stopped networks: - proxy @@ -24,12 +24,12 @@ services: webpage2: build: - context: . - dockerfile: Dockerfile + context: .. + dockerfile: administration/Dockerfile container_name: ikfreunde-webpage2 volumes: - - /srv/ikfreunde/webpage2/ikfreunde.com.html:/app/ikfreunde.com.html - - /srv/ikfreunde/webpage2/site-content.de.json:/app/content/site-content.de.json + - /srv/ikfreunde/webpage2/ikfreunde.com.html:/app/website/ikfreunde.com.html + - /srv/ikfreunde/webpage2/site-content.de.json:/app/website/content/site-content.de.json restart: unless-stopped networks: - proxy @@ -47,12 +47,12 @@ services: webpage3: build: - context: . - dockerfile: Dockerfile + context: .. + dockerfile: administration/Dockerfile container_name: ikfreunde-webpage3 volumes: - - /srv/ikfreunde/webpage3/ikfreunde.com.html:/app/ikfreunde.com.html - - /srv/ikfreunde/webpage3/site-content.de.json:/app/content/site-content.de.json + - /srv/ikfreunde/webpage3/ikfreunde.com.html:/app/website/ikfreunde.com.html + - /srv/ikfreunde/webpage3/site-content.de.json:/app/website/content/site-content.de.json restart: unless-stopped networks: - proxy diff --git a/docker-compose.yml b/administration/docker-compose.yml similarity index 63% rename from docker-compose.yml rename to administration/docker-compose.yml index dd90e6d..1764dfc 100644 --- a/docker-compose.yml +++ b/administration/docker-compose.yml @@ -1,13 +1,13 @@ services: editor: build: - context: . - dockerfile: Dockerfile + context: .. + dockerfile: administration/Dockerfile container_name: ikfreunde-editor ports: - "4173:4173" volumes: - - .:/app + - ..:/app working_dir: /app - command: ["php", "-d", "opcache.enable_cli=0", "-S", "0.0.0.0:4173", "scripts/editor_server.php"] + command: ["php", "-d", "opcache.enable_cli=0", "-S", "0.0.0.0:4173", "administration/scripts/editor_server.php"] restart: unless-stopped diff --git a/docs/brainstorms/2026-03-03-dom-json-wysiwyg-sync-brainstorm.md b/administration/docs/brainstorms/2026-03-03-dom-json-wysiwyg-sync-brainstorm.md similarity index 100% rename from docs/brainstorms/2026-03-03-dom-json-wysiwyg-sync-brainstorm.md rename to administration/docs/brainstorms/2026-03-03-dom-json-wysiwyg-sync-brainstorm.md diff --git a/docs/brainstorms/2026-03-04-wysiwyg-inline-editor-sync-brainstorm.md b/administration/docs/brainstorms/2026-03-04-wysiwyg-inline-editor-sync-brainstorm.md similarity index 100% rename from docs/brainstorms/2026-03-04-wysiwyg-inline-editor-sync-brainstorm.md rename to administration/docs/brainstorms/2026-03-04-wysiwyg-inline-editor-sync-brainstorm.md diff --git a/docs/plans/2026-03-04-feat-dom-to-json-content-extraction-plan.md b/administration/docs/plans/2026-03-04-feat-dom-to-json-content-extraction-plan.md similarity index 100% rename from docs/plans/2026-03-04-feat-dom-to-json-content-extraction-plan.md rename to administration/docs/plans/2026-03-04-feat-dom-to-json-content-extraction-plan.md diff --git a/docs/plans/2026-03-04-feat-inline-wysiwyg-html-json-sync-plan.md b/administration/docs/plans/2026-03-04-feat-inline-wysiwyg-html-json-sync-plan.md similarity index 100% rename from docs/plans/2026-03-04-feat-inline-wysiwyg-html-json-sync-plan.md rename to administration/docs/plans/2026-03-04-feat-inline-wysiwyg-html-json-sync-plan.md diff --git a/scripts/add-webpage.sh b/administration/scripts/add-webpage.sh similarity index 82% rename from scripts/add-webpage.sh rename to administration/scripts/add-webpage.sh index 8e52a91..2cb5012 100755 --- a/scripts/add-webpage.sh +++ b/administration/scripts/add-webpage.sh @@ -16,8 +16,9 @@ if [[ ! "$NAME" =~ ^[a-zA-Z0-9][a-zA-Z0-9_-]*$ ]]; then exit 1 fi +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" ROOT_BASE="${ROOT_BASE:-/srv/ikfreunde}" -COMPOSE_FILE="${COMPOSE_FILE:-docker-compose.traefik-routes.yml}" +COMPOSE_FILE="${COMPOSE_FILE:-$ROOT_DIR/administration/docker-compose.traefik-routes.yml}" ROOT="${ROOT_BASE}/${NAME}" if [[ ! -f "$COMPOSE_FILE" ]]; then @@ -28,12 +29,12 @@ fi mkdir -p "$ROOT" if [[ ! -f "$ROOT/ikfreunde.com.html" ]]; then - cp ikfreunde.com.html "$ROOT/ikfreunde.com.html" + cp "$ROOT_DIR/website/ikfreunde.com.html" "$ROOT/ikfreunde.com.html" echo "Created: $ROOT/ikfreunde.com.html" fi if [[ ! -f "$ROOT/site-content.de.json" ]]; then - cp content/site-content.de.json "$ROOT/site-content.de.json" + cp "$ROOT_DIR/website/content/site-content.de.json" "$ROOT/site-content.de.json" echo "Created: $ROOT/site-content.de.json" fi @@ -47,12 +48,12 @@ else ${NAME}: build: - context: . - dockerfile: Dockerfile + context: .. + dockerfile: administration/Dockerfile container_name: ikfreunde-${NAME} volumes: - - ${ROOT}/ikfreunde.com.html:/app/ikfreunde.com.html - - ${ROOT}/site-content.de.json:/app/content/site-content.de.json + - ${ROOT}/ikfreunde.com.html:/app/website/ikfreunde.com.html + - ${ROOT}/site-content.de.json:/app/website/content/site-content.de.json restart: unless-stopped networks: - proxy diff --git a/scripts/editor_server.php b/administration/scripts/editor_server.php similarity index 98% rename from scripts/editor_server.php rename to administration/scripts/editor_server.php index e952e26..5c2c6ea 100644 --- a/scripts/editor_server.php +++ b/administration/scripts/editor_server.php @@ -1,12 +1,13 @@ \n"); + fwrite(STDERR, "Usage: php administration/scripts/extract_dom_content.php \n"); exit(1); } diff --git a/scripts/new-route.sh b/administration/scripts/new-route.sh similarity index 100% rename from scripts/new-route.sh rename to administration/scripts/new-route.sh diff --git a/administration/scripts/run_editor_server.sh b/administration/scripts/run_editor_server.sh new file mode 100755 index 0000000..c1327f6 --- /dev/null +++ b/administration/scripts/run_editor_server.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +cd "$ROOT_DIR" + +PORT="${1:-4173}" + +ln -sf ikfreunde.com.html website/index.html +php -d opcache.enable_cli=0 -S 127.0.0.1:"$PORT" administration/scripts/editor_server.php diff --git a/serve-offline.sh b/administration/serve-offline.sh similarity index 58% rename from serve-offline.sh rename to administration/serve-offline.sh index 196c865..b96d453 100755 --- a/serve-offline.sh +++ b/administration/serve-offline.sh @@ -1,12 +1,11 @@ #!/usr/bin/env bash set -euo pipefail -ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -cd "$ROOT_DIR" - +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +WEB_DIR="$ROOT_DIR/website" PORT="${1:-4173}" -PID_FILE=".offline-server.pid" -LOG_FILE=".offline-server.log" +PID_FILE="$ROOT_DIR/administration/.offline-server.pid" +LOG_FILE="$ROOT_DIR/administration/.offline-server.log" if [[ -f "$PID_FILE" ]] && kill -0 "$(cat "$PID_FILE")" 2>/dev/null; then echo "Offline server already running on PID $(cat "$PID_FILE")." @@ -16,19 +15,19 @@ fi rm -f "$PID_FILE" -ln -sf ikfreunde.com.html index.html -nohup python3 -m http.server "$PORT" --bind 127.0.0.1 >"$LOG_FILE" 2>&1 & +ln -sf ikfreunde.com.html "$WEB_DIR/index.html" +nohup python3 -m http.server "$PORT" --bind 127.0.0.1 --directory "$WEB_DIR" >"$LOG_FILE" 2>&1 & SERVER_PID=$! echo "$SERVER_PID" > "$PID_FILE" sleep 0.3 if ! kill -0 "$SERVER_PID" 2>/dev/null; then echo "Failed to start offline server on port $PORT." - echo "Check log: $ROOT_DIR/$LOG_FILE" + echo "Check log: $LOG_FILE" rm -f "$PID_FILE" exit 1 fi echo "Offline server started (PID $SERVER_PID)." echo "Open: http://127.0.0.1:${PORT}/" -echo "Log: $ROOT_DIR/$LOG_FILE" +echo "Log: $LOG_FILE" diff --git a/stop-offline.sh b/administration/stop-offline.sh similarity index 73% rename from stop-offline.sh rename to administration/stop-offline.sh index ea95478..e530f06 100755 --- a/stop-offline.sh +++ b/administration/stop-offline.sh @@ -1,10 +1,8 @@ #!/usr/bin/env bash set -euo pipefail -ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -cd "$ROOT_DIR" - -PID_FILE=".offline-server.pid" +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +PID_FILE="$ROOT_DIR/administration/.offline-server.pid" if [[ ! -f "$PID_FILE" ]]; then echo "No PID file found. Server may already be stopped." diff --git a/index.html b/index.html index eb86f1f..ab695d2 120000 --- a/index.html +++ b/index.html @@ -1 +1 @@ -ikfreunde.com.html \ No newline at end of file +website/ikfreunde.com.html \ No newline at end of file diff --git a/scripts/extract_content.sh b/scripts/extract_content.sh deleted file mode 100755 index 67f0020..0000000 --- a/scripts/extract_content.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -INPUT_HTML="${1:-ikfreunde.com.html}" -OUTPUT_JSON="${2:-content/site-content.de.json}" - -mkdir -p "$(dirname "$OUTPUT_JSON")" -php -d opcache.enable_cli=0 scripts/extract_dom_content.php "$INPUT_HTML" "$OUTPUT_JSON" diff --git a/scripts/run_editor_server.sh b/scripts/run_editor_server.sh deleted file mode 100755 index 8729de2..0000000 --- a/scripts/run_editor_server.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -cd "$ROOT_DIR" - -PORT="${1:-4173}" - -ln -sf ikfreunde.com.html index.html -php -d opcache.enable_cli=0 -S 127.0.0.1:"$PORT" scripts/editor_server.php diff --git a/1698d822c6d3fe9b0c50b3ab44ef524a.js b/website/1698d822c6d3fe9b0c50b3ab44ef524a.js similarity index 100% rename from 1698d822c6d3fe9b0c50b3ab44ef524a.js rename to website/1698d822c6d3fe9b0c50b3ab44ef524a.js diff --git a/website/README.md b/website/README.md new file mode 100644 index 0000000..abfcb3a --- /dev/null +++ b/website/README.md @@ -0,0 +1,33 @@ +# Website (Content) + +Dieser Bereich ist für Menschen gedacht, die Inhalte bearbeiten möchten. + +## Was liegt hier? + +- `ikfreunde.com.html` (die Seite) +- `content/site-content.de.json` (Text- und Bilddaten) +- `ikfreunde.com_files/` (Assets) +- `editor/` (WYSIWYG im Browser) + +## Editor nutzen + +1. Seite öffnen: `https:////?edit=1` +2. Beim ersten Mal: Claim mit `E-Mail + Passwort` +3. Danach: Login erforderlich, sonst Viewer-Modus + +## Bearbeiten + +- Text: Doppelklick auf Text +- Bilder: Klick aufs Bild, dann URL/Alt im Overlay ändern +- Speichern: über Editor-Steuerung + +## Passwort-Reset + +- Bei Login-Fehlern kann ein Reset angefordert werden +- Reset-Link wird in `content/.editor-reset.json` abgelegt +- Mit dem `reset_url` Link neues Passwort setzen + +## Wichtiger Hinweis + +Nicht direkt in versteckten `.editor-*` Dateien arbeiten. +Diese Dateien gehören zum Auth-System. diff --git a/content/site-content.de.json b/website/content/site-content.de.json similarity index 100% rename from content/site-content.de.json rename to website/content/site-content.de.json diff --git a/editor/wysiwyg-editor.css b/website/editor/wysiwyg-editor.css similarity index 100% rename from editor/wysiwyg-editor.css rename to website/editor/wysiwyg-editor.css diff --git a/editor/wysiwyg-editor.js b/website/editor/wysiwyg-editor.js similarity index 99% rename from editor/wysiwyg-editor.js rename to website/editor/wysiwyg-editor.js index a3d0bfc..3ad8c44 100644 --- a/editor/wysiwyg-editor.js +++ b/website/editor/wysiwyg-editor.js @@ -197,7 +197,7 @@ if (!response.ok) { const wantsReset = window.confirm( - "Login fehlgeschlagen. Passwort-Reset anfordern (Token wird in content/.editor-reset.json erzeugt)?" + "Login fehlgeschlagen. Passwort-Reset anfordern (Token wird in website/content/.editor-reset.json erzeugt)?" ); if (wantsReset) { await triggerResetRequest(email); @@ -229,7 +229,7 @@ } alert( - "Reset angefordert. Prüfe im Container die Datei content/.editor-reset.json und nutze den reset_url Link." + "Reset angefordert. Prüfe im Container die Datei website/content/.editor-reset.json und nutze den reset_url Link." ); } diff --git a/f73f70e70b0ac5f1d474abd842fb4b24.js b/website/f73f70e70b0ac5f1d474abd842fb4b24.js similarity index 100% rename from f73f70e70b0ac5f1d474abd842fb4b24.js rename to website/f73f70e70b0ac5f1d474abd842fb4b24.js diff --git a/ikfreunde.com.html b/website/ikfreunde.com.html similarity index 100% rename from ikfreunde.com.html rename to website/ikfreunde.com.html diff --git a/ikfreunde.com_files/026d3a0dcea46e3c6ea8418280abc143a883560f-projektteasercofinp.jpg b/website/ikfreunde.com_files/026d3a0dcea46e3c6ea8418280abc143a883560f-projektteasercofinp.jpg similarity index 100% rename from ikfreunde.com_files/026d3a0dcea46e3c6ea8418280abc143a883560f-projektteasercofinp.jpg rename to website/ikfreunde.com_files/026d3a0dcea46e3c6ea8418280abc143a883560f-projektteasercofinp.jpg diff --git a/ikfreunde.com_files/07eb52c038c4c75165c7ec1a757d022015dd12f1-telefonicateaser.jpg b/website/ikfreunde.com_files/07eb52c038c4c75165c7ec1a757d022015dd12f1-telefonicateaser.jpg similarity index 100% rename from ikfreunde.com_files/07eb52c038c4c75165c7ec1a757d022015dd12f1-telefonicateaser.jpg rename to website/ikfreunde.com_files/07eb52c038c4c75165c7ec1a757d022015dd12f1-telefonicateaser.jpg diff --git a/ikfreunde.com_files/0ffcdedcfc816182f817ac2520731c5868840c6e-heroimage1200x6253.jpg b/website/ikfreunde.com_files/0ffcdedcfc816182f817ac2520731c5868840c6e-heroimage1200x6253.jpg similarity index 100% rename from ikfreunde.com_files/0ffcdedcfc816182f817ac2520731c5868840c6e-heroimage1200x6253.jpg rename to website/ikfreunde.com_files/0ffcdedcfc816182f817ac2520731c5868840c6e-heroimage1200x6253.jpg diff --git a/ikfreunde.com_files/15542365f25229683d4a118ad7e05d35f620d42a-wassermonitorteaser.jpg b/website/ikfreunde.com_files/15542365f25229683d4a118ad7e05d35f620d42a-wassermonitorteaser.jpg similarity index 100% rename from ikfreunde.com_files/15542365f25229683d4a118ad7e05d35f620d42a-wassermonitorteaser.jpg rename to website/ikfreunde.com_files/15542365f25229683d4a118ad7e05d35f620d42a-wassermonitorteaser.jpg diff --git a/ikfreunde.com_files/1698d822c6d3fe9b0c50b3ab44ef524a.js b/website/ikfreunde.com_files/1698d822c6d3fe9b0c50b3ab44ef524a.js similarity index 100% rename from ikfreunde.com_files/1698d822c6d3fe9b0c50b3ab44ef524a.js rename to website/ikfreunde.com_files/1698d822c6d3fe9b0c50b3ab44ef524a.js diff --git a/ikfreunde.com_files/20dc495acdb78d71a5e6cf98a8556e5bef366e8c-wassermonitorteaser.jpg b/website/ikfreunde.com_files/20dc495acdb78d71a5e6cf98a8556e5bef366e8c-wassermonitorteaser.jpg similarity index 100% rename from ikfreunde.com_files/20dc495acdb78d71a5e6cf98a8556e5bef366e8c-wassermonitorteaser.jpg rename to website/ikfreunde.com_files/20dc495acdb78d71a5e6cf98a8556e5bef366e8c-wassermonitorteaser.jpg diff --git a/ikfreunde.com_files/307019ce368b35d809ed78f56dc025ce04c0cc07-telefonicateaser2x.jpg b/website/ikfreunde.com_files/307019ce368b35d809ed78f56dc025ce04c0cc07-telefonicateaser2x.jpg similarity index 100% rename from ikfreunde.com_files/307019ce368b35d809ed78f56dc025ce04c0cc07-telefonicateaser2x.jpg rename to website/ikfreunde.com_files/307019ce368b35d809ed78f56dc025ce04c0cc07-telefonicateaser2x.jpg diff --git a/ikfreunde.com_files/3915f694fef49b9b513d693e0e6a5b1c347aa7c0-ruhrfuturprojteaser.jpg b/website/ikfreunde.com_files/3915f694fef49b9b513d693e0e6a5b1c347aa7c0-ruhrfuturprojteaser.jpg similarity index 100% rename from ikfreunde.com_files/3915f694fef49b9b513d693e0e6a5b1c347aa7c0-ruhrfuturprojteaser.jpg rename to website/ikfreunde.com_files/3915f694fef49b9b513d693e0e6a5b1c347aa7c0-ruhrfuturprojteaser.jpg diff --git a/ikfreunde.com_files/3b61b2909589fd44ec1af7c47f8a89c1515aebc1-ruhrfuturprojteaser.jpg b/website/ikfreunde.com_files/3b61b2909589fd44ec1af7c47f8a89c1515aebc1-ruhrfuturprojteaser.jpg similarity index 100% rename from ikfreunde.com_files/3b61b2909589fd44ec1af7c47f8a89c1515aebc1-ruhrfuturprojteaser.jpg rename to website/ikfreunde.com_files/3b61b2909589fd44ec1af7c47f8a89c1515aebc1-ruhrfuturprojteaser.jpg diff --git a/ikfreunde.com_files/524569d400cf68ef1cf160c58a8b501a139a8a81-heroimage1200x62532.jpg b/website/ikfreunde.com_files/524569d400cf68ef1cf160c58a8b501a139a8a81-heroimage1200x62532.jpg similarity index 100% rename from ikfreunde.com_files/524569d400cf68ef1cf160c58a8b501a139a8a81-heroimage1200x62532.jpg rename to website/ikfreunde.com_files/524569d400cf68ef1cf160c58a8b501a139a8a81-heroimage1200x62532.jpg diff --git a/ikfreunde.com_files/6b404ebe8b24e5c0d6b7c65482dcbe896ed51ab7-tideprojektteaser85.jpg b/website/ikfreunde.com_files/6b404ebe8b24e5c0d6b7c65482dcbe896ed51ab7-tideprojektteaser85.jpg similarity index 100% rename from ikfreunde.com_files/6b404ebe8b24e5c0d6b7c65482dcbe896ed51ab7-tideprojektteaser85.jpg rename to website/ikfreunde.com_files/6b404ebe8b24e5c0d6b7c65482dcbe896ed51ab7-tideprojektteaser85.jpg diff --git a/ikfreunde.com_files/9faf87d7e48c5116e700e47a7cd48abf995fdbed-tideprojektteaser85.jpg b/website/ikfreunde.com_files/9faf87d7e48c5116e700e47a7cd48abf995fdbed-tideprojektteaser85.jpg similarity index 100% rename from ikfreunde.com_files/9faf87d7e48c5116e700e47a7cd48abf995fdbed-tideprojektteaser85.jpg rename to website/ikfreunde.com_files/9faf87d7e48c5116e700e47a7cd48abf995fdbed-tideprojektteaser85.jpg diff --git a/ikfreunde.com_files/b1b5ffb75041c644f7fe52034c6e71e0ddabc103-projektteasercofinp.jpg b/website/ikfreunde.com_files/b1b5ffb75041c644f7fe52034c6e71e0ddabc103-projektteasercofinp.jpg similarity index 100% rename from ikfreunde.com_files/b1b5ffb75041c644f7fe52034c6e71e0ddabc103-projektteasercofinp.jpg rename to website/ikfreunde.com_files/b1b5ffb75041c644f7fe52034c6e71e0ddabc103-projektteasercofinp.jpg diff --git a/ikfreunde.com_files/brandeins@2x.png b/website/ikfreunde.com_files/brandeins@2x.png similarity index 100% rename from ikfreunde.com_files/brandeins@2x.png rename to website/ikfreunde.com_files/brandeins@2x.png diff --git a/ikfreunde.com_files/c54c8a64fe535bf7249d676fc7cb69cd6f27c3d7-kobimoprojekteimage.jpg b/website/ikfreunde.com_files/c54c8a64fe535bf7249d676fc7cb69cd6f27c3d7-kobimoprojekteimage.jpg similarity index 100% rename from ikfreunde.com_files/c54c8a64fe535bf7249d676fc7cb69cd6f27c3d7-kobimoprojekteimage.jpg rename to website/ikfreunde.com_files/c54c8a64fe535bf7249d676fc7cb69cd6f27c3d7-kobimoprojekteimage.jpg diff --git a/ikfreunde.com_files/detektorfm@2x.png b/website/ikfreunde.com_files/detektorfm@2x.png similarity index 100% rename from ikfreunde.com_files/detektorfm@2x.png rename to website/ikfreunde.com_files/detektorfm@2x.png diff --git a/ikfreunde.com_files/dpok@2.png b/website/ikfreunde.com_files/dpok@2.png similarity index 100% rename from ikfreunde.com_files/dpok@2.png rename to website/ikfreunde.com_files/dpok@2.png diff --git a/ikfreunde.com_files/dt_land@2.png b/website/ikfreunde.com_files/dt_land@2.png similarity index 100% rename from ikfreunde.com_files/dt_land@2.png rename to website/ikfreunde.com_files/dt_land@2.png diff --git a/ikfreunde.com_files/e679b01b355748edfb67d2d16f52570f63266e6c-kobimoprojekteimage.jpg b/website/ikfreunde.com_files/e679b01b355748edfb67d2d16f52570f63266e6c-kobimoprojekteimage.jpg similarity index 100% rename from ikfreunde.com_files/e679b01b355748edfb67d2d16f52570f63266e6c-kobimoprojekteimage.jpg rename to website/ikfreunde.com_files/e679b01b355748edfb67d2d16f52570f63266e6c-kobimoprojekteimage.jpg diff --git a/ikfreunde.com_files/ee792949df0da81967291f5675ce6b3b.css b/website/ikfreunde.com_files/ee792949df0da81967291f5675ce6b3b.css similarity index 100% rename from ikfreunde.com_files/ee792949df0da81967291f5675ce6b3b.css rename to website/ikfreunde.com_files/ee792949df0da81967291f5675ce6b3b.css diff --git a/ikfreunde.com_files/f73f70e70b0ac5f1d474abd842fb4b24.js b/website/ikfreunde.com_files/f73f70e70b0ac5f1d474abd842fb4b24.js similarity index 100% rename from ikfreunde.com_files/f73f70e70b0ac5f1d474abd842fb4b24.js rename to website/ikfreunde.com_files/f73f70e70b0ac5f1d474abd842fb4b24.js diff --git a/ikfreunde.com_files/gdv@2x.png b/website/ikfreunde.com_files/gdv@2x.png similarity index 100% rename from ikfreunde.com_files/gdv@2x.png rename to website/ikfreunde.com_files/gdv@2x.png diff --git a/ikfreunde.com_files/google-analytics_analytics.js b/website/ikfreunde.com_files/google-analytics_analytics.js similarity index 100% rename from ikfreunde.com_files/google-analytics_analytics.js rename to website/ikfreunde.com_files/google-analytics_analytics.js diff --git a/ikfreunde.com_files/google@2x.png b/website/ikfreunde.com_files/google@2x.png similarity index 100% rename from ikfreunde.com_files/google@2x.png rename to website/ikfreunde.com_files/google@2x.png diff --git a/ikfreunde.com_files/grimmeonline@2.png b/website/ikfreunde.com_files/grimmeonline@2.png similarity index 100% rename from ikfreunde.com_files/grimmeonline@2.png rename to website/ikfreunde.com_files/grimmeonline@2.png diff --git a/ikfreunde.com_files/ic_bildung_1_brown.svg b/website/ikfreunde.com_files/ic_bildung_1_brown.svg similarity index 100% rename from ikfreunde.com_files/ic_bildung_1_brown.svg rename to website/ikfreunde.com_files/ic_bildung_1_brown.svg diff --git a/ikfreunde.com_files/ic_coins_brown.svg b/website/ikfreunde.com_files/ic_coins_brown.svg similarity index 100% rename from ikfreunde.com_files/ic_coins_brown.svg rename to website/ikfreunde.com_files/ic_coins_brown.svg diff --git a/ikfreunde.com_files/ic_fire.svg b/website/ikfreunde.com_files/ic_fire.svg similarity index 100% rename from ikfreunde.com_files/ic_fire.svg rename to website/ikfreunde.com_files/ic_fire.svg diff --git a/ikfreunde.com_files/ic_mic_brown.svg b/website/ikfreunde.com_files/ic_mic_brown.svg similarity index 100% rename from ikfreunde.com_files/ic_mic_brown.svg rename to website/ikfreunde.com_files/ic_mic_brown.svg diff --git a/ikfreunde.com_files/ic_mobility_brown.svg b/website/ikfreunde.com_files/ic_mobility_brown.svg similarity index 100% rename from ikfreunde.com_files/ic_mobility_brown.svg rename to website/ikfreunde.com_files/ic_mobility_brown.svg diff --git a/ikfreunde.com_files/ic_monitoring_1_brown.svg b/website/ikfreunde.com_files/ic_monitoring_1_brown.svg similarity index 100% rename from ikfreunde.com_files/ic_monitoring_1_brown.svg rename to website/ikfreunde.com_files/ic_monitoring_1_brown.svg diff --git a/ikfreunde.com_files/ic_pokal.svg b/website/ikfreunde.com_files/ic_pokal.svg similarity index 100% rename from ikfreunde.com_files/ic_pokal.svg rename to website/ikfreunde.com_files/ic_pokal.svg diff --git a/ikfreunde.com_files/ic_smiley.svg b/website/ikfreunde.com_files/ic_smiley.svg similarity index 100% rename from ikfreunde.com_files/ic_smiley.svg rename to website/ikfreunde.com_files/ic_smiley.svg diff --git a/ikfreunde.com_files/ic_team_2_brown.svg b/website/ikfreunde.com_files/ic_team_2_brown.svg similarity index 100% rename from ikfreunde.com_files/ic_team_2_brown.svg rename to website/ikfreunde.com_files/ic_team_2_brown.svg diff --git a/ikfreunde.com_files/ic_wasser_1_brown.svg b/website/ikfreunde.com_files/ic_wasser_1_brown.svg similarity index 100% rename from ikfreunde.com_files/ic_wasser_1_brown.svg rename to website/ikfreunde.com_files/ic_wasser_1_brown.svg diff --git a/ikfreunde.com_files/leadawards.png b/website/ikfreunde.com_files/leadawards.png similarity index 100% rename from ikfreunde.com_files/leadawards.png rename to website/ikfreunde.com_files/leadawards.png diff --git a/ikfreunde.com_files/logo-df.svg b/website/ikfreunde.com_files/logo-df.svg similarity index 100% rename from ikfreunde.com_files/logo-df.svg rename to website/ikfreunde.com_files/logo-df.svg diff --git a/ikfreunde.com_files/ndr@2x.png b/website/ikfreunde.com_files/ndr@2x.png similarity index 100% rename from ikfreunde.com_files/ndr@2x.png rename to website/ikfreunde.com_files/ndr@2x.png diff --git a/ikfreunde.com_files/prixeuropa@2.png b/website/ikfreunde.com_files/prixeuropa@2.png similarity index 100% rename from ikfreunde.com_files/prixeuropa@2.png rename to website/ikfreunde.com_files/prixeuropa@2.png diff --git a/ikfreunde.com_files/shz@2x.png b/website/ikfreunde.com_files/shz@2x.png similarity index 100% rename from ikfreunde.com_files/shz@2x.png rename to website/ikfreunde.com_files/shz@2x.png diff --git a/ikfreunde.com_files/spon@2x.png b/website/ikfreunde.com_files/spon@2x.png similarity index 100% rename from ikfreunde.com_files/spon@2x.png rename to website/ikfreunde.com_files/spon@2x.png diff --git a/ikfreunde.com_files/stifterverband@2x.png b/website/ikfreunde.com_files/stifterverband@2x.png similarity index 100% rename from ikfreunde.com_files/stifterverband@2x.png rename to website/ikfreunde.com_files/stifterverband@2x.png diff --git a/ikfreunde.com_files/tagesschau@2.png b/website/ikfreunde.com_files/tagesschau@2.png similarity index 100% rename from ikfreunde.com_files/tagesschau@2.png rename to website/ikfreunde.com_files/tagesschau@2.png diff --git a/ikfreunde.com_files/telefonica@2x.png b/website/ikfreunde.com_files/telefonica@2x.png similarity index 100% rename from ikfreunde.com_files/telefonica@2x.png rename to website/ikfreunde.com_files/telefonica@2x.png diff --git a/ikfreunde.com_files/tide@2x.png b/website/ikfreunde.com_files/tide@2x.png similarity index 100% rename from ikfreunde.com_files/tide@2x.png rename to website/ikfreunde.com_files/tide@2x.png diff --git a/ikfreunde.com_files/zdf@2x.png b/website/ikfreunde.com_files/zdf@2x.png similarity index 100% rename from ikfreunde.com_files/zdf@2x.png rename to website/ikfreunde.com_files/zdf@2x.png