3.1 KiB
3.1 KiB
web4beginners WYSIWYG Multi-Route Deploy
This project runs a local-content WYSIWYG editor behind Traefik and supports multiple route instances on one domain.
Examples:
https://mydomain.de/webpage1/https://mydomain.de/webpage2/https://mydomain.de/webpage3/
Files
docker-compose.traefik-routes.yml: Traefik-ready multi-service compose filescripts/add-webpage.sh: auto-generate newwebpageNroute + compose servicescripts/editor_server.php: local API + static server (/api/content,/api/save)- See Brute-Force Protection for auth hardening details
Requirements
- Docker + Docker Compose
- Traefik with external network named
proxy
First deploy
docker compose -f docker-compose.traefik-routes.yml up -d --build
Add a new route (autogenerator)
./scripts/add-webpage.sh webpage4 mydomain.de
What it does:
- Creates route data folder:
/srv/web4beginners/webpage4/ - Seeds files if missing:
/srv/web4beginners/webpage4/web4beginners.com.html/srv/web4beginners/webpage4/site-content.de.json
- Injects
webpage4service intodocker-compose.traefik-routes.yml
Then redeploy:
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
.bakbackups. - 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=1to run first-time onboarding. - First onboarding claim uses
email + passwordand 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_urlwith token. - Open that URL, set new password, then login again.
Security note:
content/.editor-credentials.jsonandcontent/.editor-reset.jsonare 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_globalreset_request_account,reset_request_globalreset_confirm_account,reset_confirm_global
- Rate-limit state is stored in:
content/.editor-rate-limit.json
Optional env overrides
ROOT_BASE(default:/srv/web4beginners)COMPOSE_FILE(default:docker-compose.traefik-routes.yml)
Example:
ROOT_BASE=/data/pages COMPOSE_FILE=docker-compose.traefik-routes.yml ./scripts/add-webpage.sh webpage5 mydomain.de