homelab infrastructure services
at fix-docker-install 183 lines 5.5 kB view raw
1#!/bin/bash 2 3# Setup rootless Docker for tinsnip user 4 5set -euo pipefail 6 7log() { 8 echo "[Docker Setup] $*" 9} 10 11install_docker_rootless() { 12 local username="tinsnip" 13 14 log "Installing rootless Docker for $username..." 15 16 # Check if Docker is already installed for the user 17 if sudo -u "$username" -i bash -c "command -v docker &>/dev/null"; then 18 log "Docker already installed for $username" 19 return 0 20 fi 21 22 # Install dependencies 23 log "Installing Docker dependencies..." 24 sudo apt-get update -qq 25 sudo apt-get install -y \ 26 uidmap \ 27 dbus-user-session \ 28 systemd-container \ 29 fuse-overlayfs \ 30 slirp4netns 31 32 # Install Docker rootless as tinsnip user 33 log "Installing Docker rootless mode..." 34 sudo -u "$username" -i bash << 'EOF' 35# Set up environment 36export XDG_RUNTIME_DIR=/run/user/$(id -u) 37 38# Download and run rootless installer 39curl -fsSL https://get.docker.com/rootless | sh 40 41# Add Docker binaries to PATH and set up environment 42echo 'export PATH=$HOME/bin:$PATH' >> ~/.bashrc 43echo 'export DOCKER_HOST=unix:///run/user/$(id -u)/docker.sock' >> ~/.bashrc 44echo 'export XDG_RUNTIME_DIR=/run/user/$(id -u)' >> ~/.bashrc 45 46# Also create a systemd environment file 47mkdir -p ~/.config/systemd/user 48cat > ~/.config/systemd/user/docker.conf << 'ENVEOF' 49[Manager] 50DefaultEnvironment="PATH=/home/tinsnip/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" 51DefaultEnvironment="DOCKER_HOST=unix:///run/user/1010/docker.sock" 52DefaultEnvironment="XDG_RUNTIME_DIR=/run/user/1010" 53ENVEOF 54 55# Source the new PATH 56source ~/.bashrc 57 58# Ensure systemd user session is running 59if ! systemctl --user status >/dev/null 2>&1; then 60 echo "Starting systemd user session..." 61 # This creates the user session if it doesn't exist 62 loginctl enable-linger tinsnip 63fi 64 65# Enable Docker service 66systemctl --user enable docker.service 67systemctl --user start docker.service 68 69# Wait for Docker to start 70sleep 5 71 72# Test Docker 73if docker version &>/dev/null; then 74 echo "Docker rootless installation successful" 75else 76 echo "Docker installation may have issues" 77 exit 1 78fi 79EOF 80 81 if [[ $? -eq 0 ]]; then 82 log "Docker rootless installation completed successfully" 83 else 84 log "Warning: Docker installation may have issues" 85 fi 86} 87 88configure_docker() { 89 local username="tinsnip" 90 91 log "Configuring Docker for $username..." 92 93 # Check if Docker service exists first 94 if ! sudo -u "$username" -i bash -c 'export XDG_RUNTIME_DIR=/run/user/$(id -u); systemctl --user list-unit-files | grep -q docker.service'; then 95 log "Docker service not found for $username, skipping configuration" 96 return 0 97 fi 98 99 # Create Docker config directory 100 sudo -u "$username" mkdir -p /home/"$username"/.docker 101 102 # Create daemon.json with useful defaults 103 sudo -u "$username" tee /home/"$username"/.docker/daemon.json > /dev/null << 'EOF' 104{ 105 "log-driver": "json-file", 106 "log-opts": { 107 "max-size": "10m", 108 "max-file": "3" 109 }, 110 "storage-driver": "overlay2" 111} 112EOF 113 114 # Restart Docker to apply config if service exists 115 log "Restarting Docker service to apply configuration..." 116 sudo -u "$username" -i bash -c 'export XDG_RUNTIME_DIR=/run/user/$(id -u); systemctl --user restart docker.service' 117 118 log "Docker configuration complete" 119} 120 121enable_privileged_ports() { 122 local username="tinsnip" 123 124 log "Enabling privileged port binding for rootless Docker..." 125 126 # Find rootlesskit binary 127 local rootlesskit_path 128 rootlesskit_path=$(sudo -u "$username" -i bash -c 'which rootlesskit 2>/dev/null') 129 130 if [[ -z "$rootlesskit_path" ]]; then 131 log "WARNING: rootlesskit not found, skipping privileged port configuration" 132 return 0 133 fi 134 135 # Set capability to allow binding to privileged ports 136 log "Setting CAP_NET_BIND_SERVICE on rootlesskit..." 137 sudo setcap cap_net_bind_service=ep "$rootlesskit_path" 138 139 if [[ $? -eq 0 ]]; then 140 log "Privileged port binding enabled for rootless Docker" 141 log "Restarting Docker to apply changes..." 142 sudo -u "$username" -i bash -c 'export XDG_RUNTIME_DIR=/run/user/$(id -u); systemctl --user restart docker.service' 143 else 144 log "WARNING: Failed to set capability on rootlesskit" 145 fi 146} 147 148main() { 149 log "Setting up rootless Docker for tinsnip..." 150 151 # Check if tinsnip user exists 152 if ! id "tinsnip" &>/dev/null; then 153 log "ERROR: tinsnip user does not exist. Run create_tinsnip_user.sh first." 154 exit 1 155 fi 156 157 install_docker_rootless 158 159 # Verify Docker installation before configuring 160 log "Verifying Docker installation..." 161 if sudo -u "tinsnip" -i bash -c 'command -v docker &>/dev/null'; then 162 log "Docker binary found, proceeding with configuration..." 163 configure_docker 164 enable_privileged_ports 165 else 166 log "ERROR: Docker binary not found for tinsnip user" 167 exit 1 168 fi 169 170 # Final verification 171 log "Performing final Docker verification..." 172 if sudo -u "tinsnip" -i bash -c 'docker version &>/dev/null'; then 173 log "Rootless Docker setup complete!" 174 log "" 175 log "Docker is now running for user 'tinsnip'" 176 log "To verify: sudo -u tinsnip docker version" 177 else 178 log "WARNING: Docker may not be working correctly" 179 log "Try: sudo -u tinsnip docker version" 180 fi 181} 182 183main "$@"