528 lines
12 KiB
Bash
528 lines
12 KiB
Bash
#!/bin/sh
|
|
|
|
# ============================================================
|
|
# Alpine Linux + labwc Desktop Installer
|
|
# Wayland / labwc / seatd / greetd / NetworkManager / PipeWire
|
|
# ============================================================
|
|
|
|
echo "=============================================="
|
|
echo " Alpine Linux -> labwc Desktop"
|
|
echo "=============================================="
|
|
echo
|
|
|
|
# ------------------------------------------------------------
|
|
# Check root
|
|
# ------------------------------------------------------------
|
|
|
|
if [ "$(id -u)" != "0" ]; then
|
|
echo "ERROR: run this script as root."
|
|
exit 1
|
|
fi
|
|
|
|
# ------------------------------------------------------------
|
|
# Check Alpine
|
|
# ------------------------------------------------------------
|
|
|
|
if [ ! -f /etc/alpine-release ]; then
|
|
echo "ERROR: this script is intended for Alpine Linux."
|
|
exit 1
|
|
fi
|
|
|
|
ALPINE_VERSION="$(cut -d'.' -f1,2 /etc/alpine-release)"
|
|
|
|
echo "Alpine version: $ALPINE_VERSION"
|
|
echo
|
|
|
|
# ------------------------------------------------------------
|
|
# Repositories
|
|
# ------------------------------------------------------------
|
|
|
|
echo "➜ Configure Alpine repositories"
|
|
|
|
cat > /etc/apk/repositories << EOF
|
|
https://dl-cdn.alpinelinux.org/alpine/v${ALPINE_VERSION}/main
|
|
https://dl-cdn.alpinelinux.org/alpine/v${ALPINE_VERSION}/community
|
|
EOF
|
|
|
|
apk update
|
|
|
|
# ------------------------------------------------------------
|
|
# Desktop user
|
|
# ------------------------------------------------------------
|
|
|
|
USER="user"
|
|
|
|
echo "➜ Create desktop user: $USER"
|
|
|
|
if ! id "$USER" >/dev/null 2>&1; then
|
|
adduser -D "$USER"
|
|
fi
|
|
|
|
# sudo
|
|
apk add sudo
|
|
|
|
cat > "/etc/sudoers.d/$USER" << EOF
|
|
$USER ALL=(ALL) NOPASSWD: ALL
|
|
EOF
|
|
|
|
chmod 0440 "/etc/sudoers.d/$USER"
|
|
|
|
echo "✓ User $USER created"
|
|
echo
|
|
|
|
# ------------------------------------------------------------
|
|
# Basic desktop infrastructure
|
|
# ------------------------------------------------------------
|
|
|
|
echo "➜ Install desktop infrastructure"
|
|
|
|
apk add \
|
|
dbus \
|
|
dbus-x11 \
|
|
eudev \
|
|
seatd \
|
|
seatd-openrc \
|
|
polkit \
|
|
polkit-elogind \
|
|
font-dejavu \
|
|
font-noto \
|
|
font-noto-cjk
|
|
|
|
# ------------------------------------------------------------
|
|
# User groups
|
|
# ------------------------------------------------------------
|
|
|
|
echo "➜ Configure user groups"
|
|
|
|
addgroup "$USER" seat 2>/dev/null || true
|
|
addgroup "$USER" audio 2>/dev/null || true
|
|
addgroup "$USER" video 2>/dev/null || true
|
|
addgroup "$USER" input 2>/dev/null || true
|
|
|
|
# ------------------------------------------------------------
|
|
# Wayland / labwc
|
|
# ------------------------------------------------------------
|
|
|
|
echo "★ Install labwc"
|
|
|
|
apk add \
|
|
labwc \
|
|
xwayland
|
|
|
|
# ------------------------------------------------------------
|
|
# Useful Wayland desktop applications
|
|
# ------------------------------------------------------------
|
|
|
|
echo "➜ Install Wayland utilities"
|
|
|
|
apk add \
|
|
foot \
|
|
rofi \
|
|
swaybg \
|
|
swayidle \
|
|
swaylock \
|
|
waybar \
|
|
wl-clipboard \
|
|
grim \
|
|
slurp
|
|
|
|
# ------------------------------------------------------------
|
|
# File manager / removable devices
|
|
# ------------------------------------------------------------
|
|
|
|
echo "➜ Install filesystem / removable device support"
|
|
|
|
apk add \
|
|
gvfs \
|
|
gvfs-fuse \
|
|
gvfs-smb \
|
|
udisks2 \
|
|
udisks2-openrc \
|
|
fuse-openrc
|
|
|
|
# ------------------------------------------------------------
|
|
# NetworkManager
|
|
# ------------------------------------------------------------
|
|
|
|
echo "➜ Install NetworkManager"
|
|
|
|
apk add \
|
|
networkmanager \
|
|
networkmanager-openrc \
|
|
networkmanager-tui
|
|
|
|
rc-update add networkmanager default
|
|
|
|
# ------------------------------------------------------------
|
|
# Seat management
|
|
# ------------------------------------------------------------
|
|
|
|
echo "➜ Configure seatd"
|
|
|
|
rc-update add seatd default
|
|
|
|
# ------------------------------------------------------------
|
|
# D-Bus
|
|
# ------------------------------------------------------------
|
|
|
|
echo "➜ Configure D-Bus"
|
|
|
|
rc-update add dbus default
|
|
|
|
# ------------------------------------------------------------
|
|
# PipeWire
|
|
# ------------------------------------------------------------
|
|
|
|
echo "★ Install PipeWire audio"
|
|
|
|
apk add \
|
|
pipewire \
|
|
pipewire-pulse \
|
|
pipewire-alsa \
|
|
pipewire-tools \
|
|
pipewire-spa-bluez \
|
|
pipewire-pulse-openrc \
|
|
wireplumber \
|
|
wireplumber-openrc
|
|
|
|
# ------------------------------------------------------------
|
|
# ALSA
|
|
# ------------------------------------------------------------
|
|
|
|
echo "➜ Install ALSA utilities"
|
|
|
|
apk add \
|
|
alsa-utils \
|
|
alsaconf \
|
|
alsa-lib
|
|
|
|
addgroup "$USER" audio 2>/dev/null || true
|
|
|
|
# ------------------------------------------------------------
|
|
# Bluetooth
|
|
# ------------------------------------------------------------
|
|
|
|
echo "➜ Install Bluetooth support"
|
|
|
|
apk add \
|
|
bluez \
|
|
bluez-openrc \
|
|
blueman
|
|
|
|
rc-update add bluetooth default
|
|
|
|
# ------------------------------------------------------------
|
|
# Login manager
|
|
# ------------------------------------------------------------
|
|
|
|
echo "★ Install greetd"
|
|
|
|
apk add \
|
|
greetd \
|
|
greetd-openrc \
|
|
greetd-agreety
|
|
|
|
# ------------------------------------------------------------
|
|
# greetd configuration
|
|
# ------------------------------------------------------------
|
|
|
|
echo "➜ Configure greetd"
|
|
|
|
mkdir -p /etc/greetd
|
|
|
|
cat > /etc/greetd/config.toml << EOF
|
|
[terminal]
|
|
vt = 7
|
|
|
|
[default_session]
|
|
command = "agreety --cmd labwc"
|
|
user = "greetd"
|
|
EOF
|
|
|
|
# greetd needs access to seatd
|
|
addgroup greetd seat 2>/dev/null || true
|
|
|
|
# Make greetd wait for seatd
|
|
if [ -f /etc/conf.d/greetd ]; then
|
|
if ! grep -q '^rc_need=".*seatd' /etc/conf.d/greetd 2>/dev/null; then
|
|
echo 'rc_need="seatd"' >> /etc/conf.d/greetd
|
|
fi
|
|
fi
|
|
|
|
rc-update add greetd default
|
|
|
|
# ------------------------------------------------------------
|
|
# XDG user directories
|
|
# ------------------------------------------------------------
|
|
|
|
echo "➜ Create XDG user directories"
|
|
|
|
apk add xdg-user-dirs
|
|
|
|
su - "$USER" -c "xdg-user-dirs-update" 2>/dev/null || true
|
|
|
|
# ------------------------------------------------------------
|
|
# labwc configuration
|
|
# ------------------------------------------------------------
|
|
|
|
echo "➜ Create labwc configuration"
|
|
|
|
mkdir -p "/home/$USER/.config/labwc"
|
|
|
|
cat > "/home/$USER/.config/labwc/autostart" << 'EOF'
|
|
#!/bin/sh
|
|
|
|
# D-Bus user session
|
|
if command -v dbus-update-activation-environment >/dev/null 2>&1; then
|
|
dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP
|
|
fi
|
|
|
|
# Wallpaper
|
|
if command -v swaybg >/dev/null 2>&1; then
|
|
swaybg -c 202020 &
|
|
fi
|
|
|
|
# Panel
|
|
if command -v waybar >/dev/null 2>&1; then
|
|
waybar &
|
|
fi
|
|
|
|
# NetworkManager tray
|
|
if command -v nm-applet >/dev/null 2>&1; then
|
|
nm-applet &
|
|
fi
|
|
|
|
# Bluetooth tray
|
|
if command -v blueman-applet >/dev/null 2>&1; then
|
|
blueman-applet &
|
|
fi
|
|
EOF
|
|
|
|
chmod +x "/home/$USER/.config/labwc/autostart"
|
|
|
|
# ------------------------------------------------------------
|
|
# Basic labwc menu
|
|
# ------------------------------------------------------------
|
|
|
|
cat > "/home/$USER/.config/labwc/menu.xml" << 'EOF'
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
|
|
<openbox_menu>
|
|
<menu id="root-menu" label="labwc">
|
|
<item label="Terminal">
|
|
<action name="Execute">
|
|
<command>foot</command>
|
|
</action>
|
|
</item>
|
|
|
|
<item label="Application launcher">
|
|
<action name="Execute">
|
|
<command>rofi -show drun</command>
|
|
</action>
|
|
</item>
|
|
|
|
<separator />
|
|
|
|
<item label="Reload labwc">
|
|
<action name="Reconfigure"/>
|
|
</item>
|
|
|
|
<item label="Exit">
|
|
<action name="Exit"/>
|
|
</item>
|
|
</menu>
|
|
</openbox_menu>
|
|
EOF
|
|
|
|
# ------------------------------------------------------------
|
|
# Basic keyboard shortcuts
|
|
# ------------------------------------------------------------
|
|
|
|
cat > "/home/$USER/.config/labwc/rc.xml" << 'EOF'
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
|
|
<labwc_config>
|
|
|
|
<keyboard>
|
|
<default />
|
|
|
|
<keybind key="W-Return">
|
|
<action name="Execute">
|
|
<command>foot</command>
|
|
</action>
|
|
</keybind>
|
|
|
|
<keybind key="W-d">
|
|
<action name="Execute">
|
|
<command>rofi -show drun</command>
|
|
</action>
|
|
</keybind>
|
|
|
|
<keybind key="W-l">
|
|
<action name="Execute">
|
|
<command>swaylock</command>
|
|
</action>
|
|
</keybind>
|
|
|
|
<keybind key="W-q">
|
|
<action name="Close"/>
|
|
</keybind>
|
|
|
|
</keyboard>
|
|
|
|
</labwc_config>
|
|
EOF
|
|
|
|
# ------------------------------------------------------------
|
|
# Waybar configuration
|
|
# ------------------------------------------------------------
|
|
|
|
mkdir -p "/home/$USER/.config/waybar"
|
|
|
|
cat > "/home/$USER/.config/waybar/config" << 'EOF'
|
|
[
|
|
{
|
|
"layer": "top",
|
|
"position": "top",
|
|
"modules-left": [
|
|
"wlr/workspaces"
|
|
],
|
|
"modules-center": [
|
|
"clock"
|
|
],
|
|
"modules-right": [
|
|
"network",
|
|
"pulseaudio",
|
|
"battery"
|
|
]
|
|
}
|
|
]
|
|
EOF
|
|
|
|
cat > "/home/$USER/.config/waybar/style.css" << 'EOF'
|
|
* {
|
|
border: none;
|
|
border-radius: 0;
|
|
font-family: sans-serif;
|
|
font-size: 13px;
|
|
}
|
|
|
|
window#waybar {
|
|
background: rgba(30, 30, 30, 0.95);
|
|
color: #ffffff;
|
|
}
|
|
|
|
#workspaces button {
|
|
padding: 0 8px;
|
|
color: #aaaaaa;
|
|
}
|
|
|
|
#workspaces button.active {
|
|
color: #ffffff;
|
|
background: #444444;
|
|
}
|
|
|
|
#clock,
|
|
#network,
|
|
#pulseaudio,
|
|
#battery {
|
|
padding: 0 10px;
|
|
}
|
|
EOF
|
|
|
|
# ------------------------------------------------------------
|
|
# Permissions
|
|
# ------------------------------------------------------------
|
|
|
|
echo "➜ Fix user permissions"
|
|
|
|
chown -R "$USER:$USER" "/home/$USER/.config"
|
|
|
|
# ------------------------------------------------------------
|
|
# Useful software
|
|
# ------------------------------------------------------------
|
|
|
|
echo "★ Install basic software"
|
|
|
|
apk add \
|
|
htop \
|
|
neofetch \
|
|
curl \
|
|
wget \
|
|
git \
|
|
nano \
|
|
less \
|
|
file \
|
|
unzip \
|
|
zip
|
|
|
|
# ------------------------------------------------------------
|
|
# Optional browser
|
|
# ------------------------------------------------------------
|
|
|
|
# Uncomment if required:
|
|
#
|
|
# apk add firefox
|
|
#
|
|
# or:
|
|
#
|
|
# apk add chromium
|
|
|
|
# ------------------------------------------------------------
|
|
# Enable services
|
|
# ------------------------------------------------------------
|
|
|
|
echo "➜ Enable desktop services"
|
|
|
|
rc-update add dbus default
|
|
rc-update add seatd default
|
|
rc-update add networkmanager default
|
|
rc-update add bluetooth default
|
|
rc-update add greetd default
|
|
|
|
# ------------------------------------------------------------
|
|
# Start services when possible
|
|
# ------------------------------------------------------------
|
|
|
|
echo "➜ Start services"
|
|
|
|
rc-service dbus start 2>/dev/null || true
|
|
rc-service seatd start 2>/dev/null || true
|
|
rc-service networkmanager start 2>/dev/null || true
|
|
rc-service bluetooth start 2>/dev/null || true
|
|
|
|
# Do NOT start greetd here.
|
|
# It will start automatically after reboot.
|
|
|
|
# ------------------------------------------------------------
|
|
# Final information
|
|
# ------------------------------------------------------------
|
|
|
|
echo
|
|
echo "=============================================="
|
|
echo " ★★★ Alpine + labwc installation complete ★★★"
|
|
echo "=============================================="
|
|
echo
|
|
echo "Desktop user: $USER"
|
|
echo
|
|
echo "IMPORTANT:"
|
|
echo
|
|
echo "Set a password for the desktop user:"
|
|
echo
|
|
echo " passwd $USER"
|
|
echo
|
|
echo "Then reboot:"
|
|
echo
|
|
echo " reboot"
|
|
echo
|
|
echo "After reboot:"
|
|
echo
|
|
echo " greetd -> labwc"
|
|
echo
|
|
echo "Wayland compositor : labwc"
|
|
echo "Seat manager : seatd"
|
|
echo "Login manager : greetd"
|
|
echo "Audio : PipeWire + WirePlumber"
|
|
echo "Network : NetworkManager"
|
|
echo
|
|
echo "==============================================" |