first commit

This commit is contained in:
Stefan Hacker 2026-02-10 12:21:19 +01:00
commit 68b524268a
10 changed files with 422 additions and 0 deletions

53
Dockerfile Normal file
View File

@ -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"]

180
README.md Normal file
View File

@ -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)
```

9
config/autostart.sh Normal file
View File

@ -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}" &

21
config/menu.xml Normal file
View File

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<openbox_menu xmlns="http://openbox.org/3.4/menu">
<menu id="root-menu" label="Openbox">
<item label="Firefox">
<action name="Execute">
<execute>bash -c 'firefox --url "$FIREFOX_HOMEPAGE"'</execute>
</action>
</item>
<separator />
<item label="Neustarten">
<action name="Execute">
<execute>openbox --restart</execute>
</action>
</item>
<item label="Herunterfahren">
<action name="Execute">
<execute>openbox --exit</execute>
</action>
</item>
</menu>
</openbox_menu>

45
config/rc.xml Normal file
View File

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<openbox_config xmlns="http://openbox.org/3.4/rc">
<theme>
<name>Clearlooks</name>
<titleLayout>NLIMC</titleLayout>
<font place="ActiveWindow"><name>Noto Sans</name><size>10</size></font>
<font place="InactiveWindow"><name>Noto Sans</name><size>10</size></font>
<font place="MenuHeader"><name>Noto Sans</name><size>10</size></font>
<font place="MenuItem"><name>Noto Sans</name><size>10</size></font>
</theme>
<desktops>
<number>1</number>
</desktops>
<keyboard>
<keybind key="A-F4">
<action name="Close"/>
</keybind>
<keybind key="A-Tab">
<action name="NextWindow"/>
</keybind>
</keyboard>
<mouse>
<context name="Root">
<mousebind button="Right" action="Press">
<action name="ShowMenu"><menu>root-menu</menu></action>
</mousebind>
</context>
<context name="Titlebar">
<mousebind button="Left" action="Drag">
<action name="Move"/>
</mousebind>
<mousebind button="Left" action="DoubleClick">
<action name="ToggleMaximize"/>
</mousebind>
</context>
<context name="Frame">
<mousebind button="A-Left" action="Drag">
<action name="Move"/>
</mousebind>
<mousebind button="A-Right" action="Drag">
<action name="Resize"/>
</mousebind>
</context>
</mouse>
</openbox_config>

24
config/supervisord.conf Normal file
View File

@ -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

42
config/xrdp.ini Normal file
View File

@ -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

13
docker-compose.yml Normal file
View File

@ -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

5
scripts/set-password.sh Normal file
View File

@ -0,0 +1,5 @@
#!/bin/bash
if [ -n "${RDP_PASSWORD}" ]; then
echo "openbox:${RDP_PASSWORD}" | chpasswd
fi

30
scripts/start.sh Normal file
View File

@ -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