commit 68b524268a535c8b514eb8c45ed505f982ba2523 Author: Stefan Hacker Date: Tue Feb 10 12:21:19 2026 +0100 first commit diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..efde545 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,53 @@ +FROM alpine:3.21 + +ENV FIREFOX_HOMEPAGE="https://www.google.com" \ + RDP_PASSWORD="changeme" + +# Install packages +RUN apk add --no-cache \ + openbox \ + xrdp \ + mesa-dri-gallium \ + mesa-gl \ + font-noto \ + font-noto-emoji \ + dbus \ + firefox \ + bash \ + supervisor \ + xterm \ + x11vnc \ + xset \ + xvfb + +# Create user +RUN adduser -D -s /bin/bash openbox && \ + echo "openbox:${RDP_PASSWORD}" | chpasswd + +# Configure XRDP - proxy mode to existing VNC session +COPY config/xrdp.ini /etc/xrdp/xrdp.ini +RUN mkdir -p /run/xrdp && \ + chmod 0755 /run/xrdp + +# OpenBox config +RUN mkdir -p /home/openbox/.config/openbox + +COPY config/menu.xml /home/openbox/.config/openbox/menu.xml +COPY config/autostart.sh /home/openbox/.config/openbox/autostart +COPY config/rc.xml /home/openbox/.config/openbox/rc.xml + +# Startup scripts +COPY scripts/start.sh /usr/local/bin/start.sh +COPY scripts/set-password.sh /usr/local/bin/set-password.sh + +RUN chmod +x /home/openbox/.config/openbox/autostart && \ + chmod +x /usr/local/bin/start.sh && \ + chmod +x /usr/local/bin/set-password.sh && \ + chown -R openbox:openbox /home/openbox + +# Supervisor config +COPY config/supervisord.conf /etc/supervisord.conf + +EXPOSE 3389 5900 + +CMD ["/usr/local/bin/start.sh"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..ac40b7a --- /dev/null +++ b/README.md @@ -0,0 +1,180 @@ +# OpenBox Browser Container (RDP & VNC) + +Alpine-basierter Docker-Container mit OpenBox Window Manager, Firefox Browser und Fernzugriff via RDP und VNC. + +## Schnellstart + +1. `.env`-Datei anpassen: + +```env +FIREFOX_HOMEPAGE=https://www.google.com +RDP_PASSWORD=dein-sicheres-passwort +``` + +2. Container starten: + +```bash +docker compose up -d --build +``` + +3. Verbinden: + +| Protokoll | Port | Passwort | +|-----------|------|----------| +| RDP | 3389 | `RDP_PASSWORD` aus `.env` | +| VNC | 5900 | `RDP_PASSWORD` aus `.env` | + +- **RDP**: Windows Remotedesktop, Remmina, etc. (Benutzername wird ignoriert) +- **VNC**: TigerVNC Viewer, RealVNC, Remmina, etc. + +Beide Protokolle zeigen die gleiche Session. + +## Environment-Variablen + +| Variable | Beschreibung | Standard | +|----------|-------------|----------| +| `FIREFOX_HOMEPAGE` | Firefox-Startseite | `https://www.google.com` | +| `RDP_PASSWORD` | Passwort fuer RDP- und VNC-Zugang | `changeme` | + +## Persistenz + +Firefox-Daten (Lesezeichen, Verlauf, Einstellungen, Cookies, etc.) werden im Ordner `firefox-data/` gespeichert und bleiben beim Neustart des Containers erhalten. + +## OpenBox-Menu + +Rechtsklick auf den Desktop oeffnet das Kontextmenue: + +- **Firefox** - Startet Firefox mit der konfigurierten Startseite +- **Neustarten** - Startet die OpenBox-Session neu +- **Herunterfahren** - Beendet die OpenBox-Session + +## Tastenkuerzel + +| Kuerzel | Aktion | +|---------|--------| +| `Alt+F4` | Fenster schliessen | +| `Alt+Tab` | Fenster wechseln | +| `Alt+Linksklick` (Ziehen) | Fenster verschieben | +| `Alt+Rechtsklick` (Ziehen) | Fenster skalieren | +| Doppelklick Titelleiste | Fenster maximieren/wiederherstellen | + +## Neubauen ohne Cache + +```bash +docker compose down && docker compose build --no-cache && docker compose up -d +``` + +--- + +## Projektstruktur + +``` +. +├── .env # Environment-Variablen (Passwort, Startseite) +├── Dockerfile # Container-Image Definition +├── docker-compose.yml # Service-Konfiguration +├── config/ +│ ├── autostart.sh # OpenBox Autostart-Skript +│ ├── menu.xml # OpenBox Rechtsklick-Menue +│ ├── rc.xml # OpenBox Fenster-/Tastatur-/Maus-Konfiguration +│ ├── supervisord.conf # Prozess-Management (Startreihenfolge) +│ └── xrdp.ini # XRDP-Server Konfiguration +├── scripts/ +│ ├── start.sh # Container-Einstiegspunkt +│ └── set-password.sh # Setzt Benutzerpasswort aus ENV +└── firefox-data/ # Persistente Firefox-Daten (Volume) +``` + +## Konfigurationsdateien im Detail + +### config/supervisord.conf + +Verwaltet alle Dienste im Container ueber Supervisor. Die Dienste starten in dieser Reihenfolge: + +| Prioritaet | Dienst | Beschreibung | +|------------|--------|-------------| +| 5 | **Xvfb** | Virtueller Framebuffer (Display `:10`, 1920x1080, 24bit). Stellt den X11-Server bereit, ohne physische Grafikkarte. | +| 10 | **OpenBox** | Window Manager. Startet nach 2s auf Display `:10` als Benutzer `openbox`. Laedt `.bashrc` fuer Umgebungsvariablen. | +| 20 | **x11vnc** | VNC-Server. Startet nach 3s, verbindet sich mit Display `:10`. Passwortgeschuetzt, Port 5900, Shared-Modus. | +| 30 | **XRDP** | RDP-Server. Startet nach 4s, fungiert als RDP-zu-VNC Proxy auf Port 3389. | + +Alle Dienste haben `autorestart=true` und werden bei Absturz automatisch neu gestartet. Die `sleep`-Verzoegerungen stellen sicher, dass jeder Dienst erst startet, wenn seine Abhaengigkeiten bereit sind. + +### config/xrdp.ini + +XRDP-Server Konfiguration. Arbeitet im **Proxy-Modus** - leitet RDP-Verbindungen an den lokalen x11vnc-Server weiter. + +Wichtige Einstellungen: + +| Einstellung | Wert | Beschreibung | +|-------------|------|-------------| +| `port` | 3389 | Standard-RDP Port | +| `security_layer` | rdp | RDP-Verschluesselung | +| `crypt_level` | high | Hohe Verschluesselungsstufe | +| `max_bpp` | 32 | Maximale Farbtiefe | +| `lib` | libvnc.so | VNC-Protokoll als Backend | +| `ip` | 127.0.0.1 | Verbindet zu lokalem VNC | +| `port` (Session) | 5900 | VNC-Port von x11vnc | + +Channels wie Clipboard (`cliprdr`), Sound (`rdpsnd`) und Laufwerks-Umleitung (`rdpdr`) sind aktiviert. + +### config/autostart.sh + +Wird von OpenBox automatisch beim Sessionstart ausgefuehrt. Aufgaben: + +1. **Energiesparmodus deaktivieren**: + - `xset s off` - Bildschirmschoner aus + - `xset s noblank` - Kein Bildschirm-Blanking + - `xset -dpms` - Display Power Management aus (kein Standby/Suspend/Off) + +2. **Firefox starten** mit der Startseite aus `FIREFOX_HOMEPAGE` + +### config/menu.xml + +Definiert das OpenBox-Rechtsklick-Kontextmenue mit vier Eintraegen: +- **Firefox** - Startet Firefox mit `--url "${FIREFOX_HOMEPAGE}"` +- **Terminal** - Oeffnet xterm +- **Neustarten** - `openbox --restart` (laedt OpenBox-Konfiguration neu) +- **Herunterfahren** - `openbox --exit` (beendet die Session) + +### config/rc.xml + +OpenBox Window Manager Konfiguration: +- **Theme**: Clearlooks mit Noto Sans Schriftart (Groesse 10) +- **Desktops**: 1 virtueller Desktop +- **Titelleiste**: NLIMC-Layout (Minimize, Maximize, Close Buttons) +- **Tastenkuerzel**: Alt+F4 (Schliessen), Alt+Tab (Wechseln) +- **Maus**: Rechtsklick auf Desktop oeffnet Menue, Titelleiste ziehbar, Doppelklick maximiert + +### scripts/start.sh + +Container-Einstiegspunkt. Fuehrt beim Start folgende Schritte aus: +1. Setzt das Benutzerpasswort aus `RDP_PASSWORD` +2. Erstellt VNC-Passwortdatei (gleiche wie RDP) +3. Schreibt `FIREFOX_HOMEPAGE` in `.bashrc` fuer die OpenBox-Session +4. Stellt korrekte Berechtigungen fuer Firefox-Daten sicher +5. Erstellt X11-Socket-Verzeichnis `/tmp/.X11-unix` +6. Generiert XRDP RSA-Schluessel (falls nicht vorhanden) +7. Startet Supervisor mit allen Diensten + +### scripts/set-password.sh + +Setzt das Passwort des Benutzers `openbox` aus der Environment-Variable `RDP_PASSWORD` via `chpasswd`. + +## Architektur + +``` + ┌──────────────────────────────────┐ + │ Docker Container │ + │ │ + RDP :3389 ──────> │ XRDP ──> x11vnc ──> Xvfb :10 │ + │ │ │ + VNC :5900 ──────> │ x11vnc ─────────> Xvfb :10 │ + │ │ │ + │ OpenBox │ + │ │ │ + │ Firefox │ + └──────────────────────────────────┘ + │ + ./firefox-data (Volume) +``` diff --git a/config/autostart.sh b/config/autostart.sh new file mode 100644 index 0000000..708c11d --- /dev/null +++ b/config/autostart.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +# Disable screen saver and power saving +xset s off +xset s noblank +xset -dpms + +# Start Firefox with configured homepage +firefox --url "${FIREFOX_HOMEPAGE}" & diff --git a/config/menu.xml b/config/menu.xml new file mode 100644 index 0000000..2ff2a0d --- /dev/null +++ b/config/menu.xml @@ -0,0 +1,21 @@ + + + + + + bash -c 'firefox --url "$FIREFOX_HOMEPAGE"' + + + + + + openbox --restart + + + + + openbox --exit + + + + diff --git a/config/rc.xml b/config/rc.xml new file mode 100644 index 0000000..d228832 --- /dev/null +++ b/config/rc.xml @@ -0,0 +1,45 @@ + + + + Clearlooks + NLIMC + Noto Sans10 + Noto Sans10 + Noto Sans10 + Noto Sans10 + + + 1 + + + + + + + + + + + + + root-menu + + + + + + + + + + + + + + + + + + + + diff --git a/config/supervisord.conf b/config/supervisord.conf new file mode 100644 index 0000000..47b8dca --- /dev/null +++ b/config/supervisord.conf @@ -0,0 +1,24 @@ +[supervisord] +nodaemon=true +logfile=/var/log/supervisord.log +pidfile=/var/run/supervisord.pid + +[program:xvfb] +command=/usr/bin/Xvfb :10 -screen 0 1920x1080x24 +autorestart=true +priority=5 + +[program:openbox] +command=/bin/bash -c "sleep 2 && DISPLAY=:10 su -c 'source ~/.bashrc && openbox-session' openbox" +autorestart=true +priority=10 + +[program:x11vnc] +command=/bin/bash -c "sleep 3 && x11vnc -display :10 -rfbauth /home/openbox/.vnc/passwd -rfbport 5900 -forever -shared -noxdamage" +autorestart=true +priority=20 + +[program:xrdp] +command=/bin/bash -c "sleep 4 && /usr/sbin/xrdp --nodaemon" +autorestart=true +priority=30 diff --git a/config/xrdp.ini b/config/xrdp.ini new file mode 100644 index 0000000..7d53eef --- /dev/null +++ b/config/xrdp.ini @@ -0,0 +1,42 @@ +[Globals] +ini_version=1 +fork=true +port=3389 +use_vsock=false +tcp_nodelay=true +tcp_keepalive=true +security_layer=rdp +crypt_level=high +certificate= +key_file= +ssl_protocols=TLSv1.2, TLSv1.3 +autorun= +allow_channels=true +allow_multimon=true +bitmap_cache=true +bitmap_compression=true +bulk_compression=true +max_bpp=32 +new_cursors=true + +[Logging] +LogFile=xrdp.log +LogLevel=INFO +EnableSyslog=true + +[Channels] +rdpdr=true +rdpsnd=true +drdynvc=true +cliprdr=true +rail=false +xrdpvr=true +tcutils=true + +[xrdp1] +name=Openbox Session +lib=libvnc.so +username=na +password=ask +ip=127.0.0.1 +port=5900 diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..ab6f648 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,13 @@ +services: + openbox-rdp: + build: . + container_name: openbox-rdp + ports: + - "3389:3389" + - "5900:5900" + environment: + - FIREFOX_HOMEPAGE=${FIREFOX_HOMEPAGE} + - RDP_PASSWORD=${RDP_PASSWORD} + volumes: + - ./firefox-data:/home/openbox/.mozilla + restart: unless-stopped diff --git a/scripts/set-password.sh b/scripts/set-password.sh new file mode 100644 index 0000000..b0934e6 --- /dev/null +++ b/scripts/set-password.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +if [ -n "${RDP_PASSWORD}" ]; then + echo "openbox:${RDP_PASSWORD}" | chpasswd +fi diff --git a/scripts/start.sh b/scripts/start.sh new file mode 100644 index 0000000..87955cc --- /dev/null +++ b/scripts/start.sh @@ -0,0 +1,30 @@ +#!/bin/bash +set -e + +# Set user password from environment variable +/usr/local/bin/set-password.sh + +# Store VNC password +mkdir -p /home/openbox/.vnc +x11vnc -storepasswd "${RDP_PASSWORD}" /home/openbox/.vnc/passwd +chown -R openbox:openbox /home/openbox/.vnc + +# Pass environment variables to the openbox user session +echo "export FIREFOX_HOMEPAGE=\"${FIREFOX_HOMEPAGE}\"" > /home/openbox/.bashrc +chown openbox:openbox /home/openbox/.bashrc + +# Ensure Firefox profile directory exists and has correct ownership +mkdir -p /home/openbox/.mozilla +chown -R openbox:openbox /home/openbox/.mozilla + +# Prepare X11 socket directory +mkdir -p /tmp/.X11-unix +chmod 1777 /tmp/.X11-unix + +# Generate XRDP RSA key if missing +if [ ! -f /etc/xrdp/rsakeys.ini ]; then + xrdp-keygen xrdp auto +fi + +# Start services via supervisor +exec /usr/bin/supervisord -c /etc/supervisord.conf