From 221cbf0588188c5827a88828b4e687b6568401da Mon Sep 17 00:00:00 2001 From: Harivansh Rathi Date: Fri, 10 Apr 2026 00:00:46 +0000 Subject: [PATCH] feat: replace openbox with XFCE4 + Plank desktop stack --- Dockerfile | 46 ++++++++++- defaults/.bashrc | 1 - defaults/.zshrc | 1 - desktop/assets/wallpaper.png | Bin 0 -> 26770 bytes .../plank/dock1/launchers/chromium.dockitem | 2 + desktop/plank/dock1/launchers/thunar.dockitem | 2 + .../dock1/launchers/xfce4-terminal.dockitem | 2 + desktop/plank/dock1/settings | 21 +++++ desktop/scripts/apply-desktop-profile.sh | 28 +++++++ desktop/xfce/terminal/terminalrc | 3 + .../xfce-perchannel-xml/xfce4-desktop.xml | 24 ++++++ .../xfce-perchannel-xml/xfce4-panel.xml | 6 ++ .../xfce/xfconf/xfce-perchannel-xml/xfwm4.xml | 9 +++ .../xfconf/xfce-perchannel-xml/xsettings.xml | 27 +++++++ microagent-desktop-session.sh | 73 ++++++++++++------ microagent-init.sh | 5 ++ sshd_config | 1 + 17 files changed, 224 insertions(+), 27 deletions(-) create mode 100644 desktop/assets/wallpaper.png create mode 100644 desktop/plank/dock1/launchers/chromium.dockitem create mode 100644 desktop/plank/dock1/launchers/thunar.dockitem create mode 100644 desktop/plank/dock1/launchers/xfce4-terminal.dockitem create mode 100644 desktop/plank/dock1/settings create mode 100644 desktop/scripts/apply-desktop-profile.sh create mode 100644 desktop/xfce/terminal/terminalrc create mode 100644 desktop/xfce/xfconf/xfce-perchannel-xml/xfce4-desktop.xml create mode 100644 desktop/xfce/xfconf/xfce-perchannel-xml/xfce4-panel.xml create mode 100644 desktop/xfce/xfconf/xfce-perchannel-xml/xfwm4.xml create mode 100644 desktop/xfce/xfconf/xfce-perchannel-xml/xsettings.xml diff --git a/Dockerfile b/Dockerfile index 1a03b08..50b68dd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,7 +4,11 @@ SHELL ["/bin/bash", "-o", "pipefail", "-c"] ENV DEBIAN_FRONTEND=noninteractive ENV EDITOR=nvim \ - VISUAL=nvim + VISUAL=nvim \ + XDG_CONFIG_HOME=/home/node/.config \ + XDG_CACHE_HOME=/home/node/.cache \ + XDG_DATA_HOME=/home/node/.local/share \ + XDG_STATE_HOME=/home/node/.local/state RUN apt-get update && apt-get install -y --no-install-recommends \ ca-certificates \ @@ -42,7 +46,6 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ neovim \ nodejs \ novnc \ - openbox \ openssh-server \ pipx \ procps \ @@ -67,8 +70,39 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ x11-xserver-utils \ x11vnc \ xauth \ - xterm \ xvfb \ + xfce4-session \ + xfwm4 \ + xfdesktop4 \ + xfce4-settings \ + xfce4-terminal \ + thunar \ + plank \ + autocutsel \ + greybird-gtk-theme \ + elementary-xfce-icon-theme \ + fonts-noto-core \ + fonts-noto-color-emoji \ + dbus-user-session \ + xclip \ + && rm -rf /var/lib/apt/lists/* + +# Chromium: Ubuntu 24.04 only ships a snap stub, so pull the real .deb from +# the Debian Sid repo (pinned low so it only satisfies chromium itself). +RUN printf '%s\n' \ + "deb [arch=amd64] http://deb.debian.org/debian sid main" \ + >/etc/apt/sources.list.d/debian-sid.list \ + && printf '%s\n' \ + "Package: *" \ + "Pin: release a=unstable" \ + "Pin-Priority: 10" \ + "" \ + "Package: chromium chromium-common chromium-sandbox" \ + "Pin: release a=unstable" \ + "Pin-Priority: 500" \ + >/etc/apt/preferences.d/chromium \ + && apt-get update \ + && apt-get install -y --no-install-recommends chromium \ && rm -rf /var/lib/apt/lists/* RUN useradd --create-home --shell /bin/bash node \ @@ -84,6 +118,11 @@ RUN useradd --create-home --shell /bin/bash node \ && ln -sf /usr/bin/nvim /usr/local/bin/vim \ && ln -sf /usr/bin/nvim /usr/local/bin/vi +COPY desktop/assets /opt/desktop/assets +COPY desktop/xfce /opt/desktop/xfce +COPY desktop/plank /opt/desktop/plank +COPY desktop/scripts /opt/desktop/scripts + COPY sshd_config /etc/ssh/sshd_config COPY microagent-init.sh /usr/local/bin/microagent-init COPY microagent-desktop-session.sh /usr/local/bin/microagent-desktop-session @@ -95,6 +134,7 @@ COPY terminfo/xterm-ghostty.terminfo /tmp/xterm-ghostty.terminfo COPY terminfo/xterm-kitty.terminfo /tmp/xterm-kitty.terminfo RUN chmod 755 /usr/local/bin/microagent-init /usr/local/bin/microagent-desktop-session /usr/local/bin/microagent-network-up \ + && chmod 755 /opt/desktop/scripts/apply-desktop-profile.sh \ && chown node:node /home/node/.zshrc /home/node/.bashrc /home/node/.profile \ && usermod -s /usr/bin/zsh node \ && install -d /opt/zsh/pure \ diff --git a/defaults/.bashrc b/defaults/.bashrc index 3b2c3aa..e6b6ced 100644 --- a/defaults/.bashrc +++ b/defaults/.bashrc @@ -27,7 +27,6 @@ computer_prompt_name() { export EDITOR="${EDITOR:-nvim}" export VISUAL="${VISUAL:-nvim}" alias vim='nvim' -alias vi='nvim' alias ls='eza --group-directories-first --icons=auto' alias la='eza -a --group-directories-first --icons=auto' alias ll='eza -lah --git --group-directories-first --icons=auto' diff --git a/defaults/.zshrc b/defaults/.zshrc index 88e6ee2..abe6926 100644 --- a/defaults/.zshrc +++ b/defaults/.zshrc @@ -48,7 +48,6 @@ fi export EDITOR="${EDITOR:-nvim}" export VISUAL="${VISUAL:-nvim}" alias vim='nvim' -alias vi='nvim' alias ls='eza --group-directories-first --icons=auto' alias la='eza -a --group-directories-first --icons=auto' alias ll='eza -lah --git --group-directories-first --icons=auto' diff --git a/desktop/assets/wallpaper.png b/desktop/assets/wallpaper.png new file mode 100644 index 0000000000000000000000000000000000000000..8e07274bcae916791ced1c2c7f26bb72575db452 GIT binary patch literal 26770 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

bH2{Gy)vHq=Py5h7(CB@ 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 V;%aDFumC*5>*?y}vd$@?2>{aKh}-}G literal 0 HcmV?d00001 diff --git a/desktop/plank/dock1/launchers/chromium.dockitem b/desktop/plank/dock1/launchers/chromium.dockitem new file mode 100644 index 0000000..2884b73 --- /dev/null +++ b/desktop/plank/dock1/launchers/chromium.dockitem @@ -0,0 +1,2 @@ +[PlankDockItemPreferences] +Launcher=file:///usr/share/applications/chromium.desktop diff --git a/desktop/plank/dock1/launchers/thunar.dockitem b/desktop/plank/dock1/launchers/thunar.dockitem new file mode 100644 index 0000000..1bfd173 --- /dev/null +++ b/desktop/plank/dock1/launchers/thunar.dockitem @@ -0,0 +1,2 @@ +[PlankDockItemPreferences] +Launcher=file:///usr/share/applications/thunar.desktop diff --git a/desktop/plank/dock1/launchers/xfce4-terminal.dockitem b/desktop/plank/dock1/launchers/xfce4-terminal.dockitem new file mode 100644 index 0000000..2fc64b3 --- /dev/null +++ b/desktop/plank/dock1/launchers/xfce4-terminal.dockitem @@ -0,0 +1,2 @@ +[PlankDockItemPreferences] +Launcher=file:///usr/share/applications/xfce4-terminal.desktop diff --git a/desktop/plank/dock1/settings b/desktop/plank/dock1/settings new file mode 100644 index 0000000..4f4fa1a --- /dev/null +++ b/desktop/plank/dock1/settings @@ -0,0 +1,21 @@ +[PlankDockPreferences] +Alignment=3 +AutoPinning=true +CurrentWorkspaceOnly=false +DockItems=xfce4-terminal.dockitem;;thunar.dockitem;;chromium.dockitem +HideDelay=0 +HideMode=3 +IconSize=48 +ItemsAlignment=3 +LockItems=true +Monitor= +Offset=0 +PinnedOnly=false +Position=3 +PressureReveal=false +ShowDockItem=false +Theme=Transparent +TooltipsEnabled=true +UnhideDelay=0 +ZoomEnabled=true +ZoomPercent=150 diff --git a/desktop/scripts/apply-desktop-profile.sh b/desktop/scripts/apply-desktop-profile.sh new file mode 100644 index 0000000..1fb84a1 --- /dev/null +++ b/desktop/scripts/apply-desktop-profile.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash +set -euo pipefail + +: "${HOME:=/home/node}" +: "${XDG_CONFIG_HOME:=$HOME/.config}" +: "${XDG_STATE_HOME:=$HOME/.local/state}" + +PROFILE_VERSION="v1" +PROFILE_ROOT="/opt/desktop" +MARKER_DIR="$XDG_STATE_HOME/microagent/desktop" +MARKER_FILE="$MARKER_DIR/desktop-${PROFILE_VERSION}.seeded" + +if [ -f "$MARKER_FILE" ]; then + exit 0 +fi + +mkdir -p "$MARKER_DIR" "$XDG_CONFIG_HOME" + +# XFCE config +rm -rf "$XDG_CONFIG_HOME/xfce4" +cp -R "$PROFILE_ROOT/xfce" "$XDG_CONFIG_HOME/xfce4" + +# Plank config +mkdir -p "$XDG_CONFIG_HOME/plank" +cp -R "$PROFILE_ROOT/plank/." "$XDG_CONFIG_HOME/plank/" + +touch "$MARKER_FILE" +echo "Applied desktop profile: ${PROFILE_VERSION}" diff --git a/desktop/xfce/terminal/terminalrc b/desktop/xfce/terminal/terminalrc new file mode 100644 index 0000000..a1fbcaf --- /dev/null +++ b/desktop/xfce/terminal/terminalrc @@ -0,0 +1,3 @@ +[Configuration] +FontName=DejaVu Sans Mono 11 +FontUseSystem=FALSE diff --git a/desktop/xfce/xfconf/xfce-perchannel-xml/xfce4-desktop.xml b/desktop/xfce/xfconf/xfce-perchannel-xml/xfce4-desktop.xml new file mode 100644 index 0000000..de5fe63 --- /dev/null +++ b/desktop/xfce/xfconf/xfce-perchannel-xml/xfce4-desktop.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/desktop/xfce/xfconf/xfce-perchannel-xml/xfce4-panel.xml b/desktop/xfce/xfconf/xfce-perchannel-xml/xfce4-panel.xml new file mode 100644 index 0000000..60e3c23 --- /dev/null +++ b/desktop/xfce/xfconf/xfce-perchannel-xml/xfce4-panel.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/desktop/xfce/xfconf/xfce-perchannel-xml/xfwm4.xml b/desktop/xfce/xfconf/xfce-perchannel-xml/xfwm4.xml new file mode 100644 index 0000000..d685c45 --- /dev/null +++ b/desktop/xfce/xfconf/xfce-perchannel-xml/xfwm4.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/desktop/xfce/xfconf/xfce-perchannel-xml/xsettings.xml b/desktop/xfce/xfconf/xfce-perchannel-xml/xsettings.xml new file mode 100644 index 0000000..3ee9248 --- /dev/null +++ b/desktop/xfce/xfconf/xfce-perchannel-xml/xsettings.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/microagent-desktop-session.sh b/microagent-desktop-session.sh index 992450c..2bb1aa5 100644 --- a/microagent-desktop-session.sh +++ b/microagent-desktop-session.sh @@ -2,6 +2,10 @@ set -uo pipefail export DISPLAY=:0 +export DESKTOP_SESSION=xfce +export XDG_CURRENT_DESKTOP=XFCE +export XDG_SESSION_DESKTOP=xfce +export XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-/home/node/.config}" log() { printf '[microagent-desktop] %s\n' "$*" >&2 @@ -23,31 +27,38 @@ cleanup() { trap - INT TERM [ -n "${websockify_pid:-}" ] && kill "$websockify_pid" >/dev/null 2>&1 || true [ -n "${x11vnc_pid:-}" ] && kill "$x11vnc_pid" >/dev/null 2>&1 || true - [ -n "${xterm_pid:-}" ] && kill "$xterm_pid" >/dev/null 2>&1 || true - [ -n "${openbox_pid:-}" ] && kill "$openbox_pid" >/dev/null 2>&1 || true + [ -n "${plank_pid:-}" ] && kill "$plank_pid" >/dev/null 2>&1 || true + [ -n "${xfce_pid:-}" ] && kill "$xfce_pid" >/dev/null 2>&1 || true [ -n "${xvfb_pid:-}" ] && kill "$xvfb_pid" >/dev/null 2>&1 || true wait >/dev/null 2>&1 || true exit 0 } -start_openbox() { - reap_if_needed "${openbox_pid:-}" - log "starting openbox" - runuser -u node -- env DISPLAY="$DISPLAY" openbox >>/tmp/openbox.log 2>&1 & - openbox_pid=$! +start_xfce() { + reap_if_needed "${xfce_pid:-}" + log "starting xfce4-session" + runuser -u node -- env \ + DISPLAY="$DISPLAY" \ + DESKTOP_SESSION="$DESKTOP_SESSION" \ + XDG_CURRENT_DESKTOP="$XDG_CURRENT_DESKTOP" \ + XDG_SESSION_DESKTOP="$XDG_SESSION_DESKTOP" \ + XDG_CONFIG_HOME="$XDG_CONFIG_HOME" \ + dbus-launch --exit-with-session xfce4-session >>/tmp/xfce.log 2>&1 & + xfce_pid=$! } -start_xterm() { - reap_if_needed "${xterm_pid:-}" - log "starting xterm" - runuser -u node -- env DISPLAY="$DISPLAY" xterm -fa Monospace -fs 12 >>/tmp/xterm.log 2>&1 & - xterm_pid=$! +start_plank() { + reap_if_needed "${plank_pid:-}" + log "starting plank" + runuser -u node -- env DISPLAY="$DISPLAY" XDG_CONFIG_HOME="$XDG_CONFIG_HOME" \ + plank >>/tmp/plank.log 2>&1 & + plank_pid=$! } start_x11vnc() { reap_if_needed "${x11vnc_pid:-}" log "starting x11vnc" - x11vnc -display "$DISPLAY" -rfbport 5900 -forever -shared -nopw >>/tmp/x11vnc.log 2>&1 & + x11vnc -display "$DISPLAY" -rfbport 5900 -forever -shared -nopw -quiet >>/tmp/x11vnc.log 2>&1 & x11vnc_pid=$! } @@ -60,8 +71,13 @@ start_websockify() { trap cleanup INT TERM +# Apply desktop profile on first boot +log "applying desktop profile" +runuser -u node -- /opt/desktop/scripts/apply-desktop-profile.sh 2>&1 || true + +# Start Xvfb log "starting Xvfb" -Xvfb "$DISPLAY" -screen 0 1280x800x24 >/tmp/xvfb.log 2>&1 & +Xvfb "$DISPLAY" -screen 0 1280x800x24 -ac >/tmp/xvfb.log 2>&1 & xvfb_pid=$! ready=0 @@ -83,24 +99,37 @@ if [ "$ready" -ne 1 ]; then exit 1 fi -start_openbox -start_xterm +# Disable screensaver/DPMS +xset -display "$DISPLAY" -dpms s off s noblank >/dev/null 2>&1 || true + +# Start desktop stack +start_xfce +sleep 2 +start_plank start_x11vnc start_websockify +# Clipboard sync +if command -v autocutsel >/dev/null 2>&1; then + runuser -u node -- env DISPLAY="$DISPLAY" autocutsel -selection CLIPBOARD -fork >>/tmp/autocutsel.log 2>&1 || true + runuser -u node -- env DISPLAY="$DISPLAY" autocutsel -selection PRIMARY -fork >>/tmp/autocutsel.log 2>&1 || true +fi + +# Monitor and restart dead processes while true; do if ! pid_running "$xvfb_pid"; then log "Xvfb exited; stopping desktop session" wait "$xvfb_pid" >/dev/null 2>&1 || true exit 1 fi - if ! pid_running "${openbox_pid:-}"; then - log "openbox exited; restarting" - start_openbox + if ! pid_running "${xfce_pid:-}"; then + log "xfce4-session exited; restarting" + start_xfce + sleep 2 fi - if ! pid_running "${xterm_pid:-}"; then - log "xterm exited; restarting" - start_xterm + if ! pid_running "${plank_pid:-}"; then + log "plank exited; restarting" + start_plank fi if ! pid_running "${x11vnc_pid:-}"; then log "x11vnc exited; restarting" diff --git a/microagent-init.sh b/microagent-init.sh index 284a43e..bd3e164 100644 --- a/microagent-init.sh +++ b/microagent-init.sh @@ -96,6 +96,11 @@ if [ -f /etc/microagent/authorized_keys ]; then install -m 0600 -o node -g node /etc/microagent/authorized_keys /home/node/.ssh/authorized_keys fi +if [ -f /etc/microagent/trusted_user_ca_keys ]; then + log "using injected trusted user CA keys" + chmod 0644 /etc/microagent/trusted_user_ca_keys +fi + if command -v jitterentropy-rngd >/dev/null 2>&1; then log "starting jitterentropy-rngd" jitterentropy-rngd -v >/var/log/jitterentropy.log 2>&1 & diff --git a/sshd_config b/sshd_config index 27a7e83..caebe74 100644 --- a/sshd_config +++ b/sshd_config @@ -10,6 +10,7 @@ PasswordAuthentication no KbdInteractiveAuthentication no UsePAM no AuthorizedKeysFile .ssh/authorized_keys +TrustedUserCAKeys /etc/microagent/trusted_user_ca_keys StrictModes no SyslogFacility AUTH