feat: Configure workshop VM with bash and Abra utilities

This commit is contained in:
2025-08-16 16:10:38 +02:00
parent 94b1ec68a5
commit bf18468eee

View File

@@ -25,7 +25,7 @@ isoConfig // {
services.getty.autologinUser = "workshop"; services.getty.autologinUser = "workshop";
users.users.workshop = { users.users.workshop = {
isNormalUser = true; isNormalUser = true;
shell = pkgs.zsh; shell = pkgs.bash; # Simple bash instead of zsh
extraGroups = [ "networkmanager" "wheel" "docker" ]; extraGroups = [ "networkmanager" "wheel" "docker" ];
password = ""; password = "";
}; };
@@ -84,158 +84,156 @@ isoConfig // {
}; };
}; };
programs.zsh = { # Simple bash configuration with custom functions
enable = true; programs.bash = {
interactiveShellInit = '' interactiveShellInit = ''
echo "CODE CRISPIES Workshop Environment" # Workshop welcome and command definitions
echo "Mode: Local Development + Cloud Access" echo "CODE CRISPIES Workshop Environment"
echo "" echo "Mode: Local Development + Cloud Access"
echo "🏠 Local Development:" echo ""
echo " recipes - Show available app recipes" echo "🏠 Local Development:"
echo " deploy <recipe> - Deploy app locally (e.g., deploy wordpress)" echo " recipes - Show available app recipes"
echo " setup-traefik - Setup local Traefik (required first!)" echo " deploy <recipe> - Deploy app locally (e.g., deploy wordpress)"
echo " browser - Launch Firefox" echo " setup-traefik - Setup local Traefik (required first!)"
echo " desktop - Start GUI session" echo " browser - Launch Firefox"
echo "" echo " desktop - Start GUI session"
echo " Cloud Access:" echo ""
echo " Available servers:" echo " Cloud Access:"
${builtins.concatStringsSep "\n" (map (name: echo " Available servers:"
"echo \" - ${name}.codecrispi.es\"" ${builtins.concatStringsSep "\n" (map (name:
) cloudServerNames)} "echo \" - ${name}.codecrispi.es\""
echo " connect <name> - SSH to cloud server" ) cloudServerNames)}
echo "" echo " connect <name> - SSH to cloud server"
echo "📚 Commands: setup-traefik | recipes | deploy | connect | browser | desktop | help" echo ""
echo "📚 Commands: setup-traefik | recipes | deploy | connect | browser | desktop | help"
# Ensure abra is in PATH # Ensure abra is in PATH
export PATH="$HOME/.local/bin:$PATH" export PATH="$HOME/.local/bin:$PATH"
setup-traefik() { setup-traefik() {
echo "🔧 Setting up local Traefik proxy..." echo "🔧 Setting up local Traefik proxy..."
if ! command -v abra &> /dev/null; then if ! command -v abra &> /dev/null; then
echo " Abra not found. Run 'sudo systemctl restart workshop-abra-setup'" echo " Abra not found. Run 'sudo systemctl restart workshop-abra-setup'"
return 1 return 1
fi fi
abra app new traefik -S --domain=traefik.workshop.local abra app new traefik -S --domain=traefik.workshop.local
abra app deploy traefik.workshop.local abra app deploy traefik.workshop.local
echo " Traefik deployed! Dashboard: http://traefik.workshop.local" echo " Traefik deployed! Dashboard: http://traefik.workshop.local"
echo "🚀 Now you can deploy apps with 'deploy <recipe>'" echo "🚀 Now you can deploy apps with 'deploy <recipe>'"
} }
deploy() { deploy() {
if [ -z "$1" ]; then if [ -z "$1" ]; then
echo "Usage: deploy <recipe>" echo "Usage: deploy <recipe>"
echo "Example: deploy wordpress" echo "Example: deploy wordpress"
echo "Run 'recipes' to see available options" echo "Run 'recipes' to see available options"
return 1 return 1
fi fi
local recipe="$1" local recipe="$1"
local domain="$recipe.workshop.local" local domain="$recipe.workshop.local"
echo "🚀 Deploying $recipe locally..." echo "🚀 Deploying $recipe locally..."
echo "Domain: $domain" echo "Domain: $domain"
if ! command -v abra &> /dev/null; then if ! command -v abra &> /dev/null; then
echo " Abra not found. Run 'sudo systemctl restart workshop-abra-setup'" echo " Abra not found. Run 'sudo systemctl restart workshop-abra-setup'"
return 1 return 1
fi fi
abra app new "$recipe" -S --domain="$domain" abra app new "$recipe" -S --domain="$domain"
abra app deploy "$domain" abra app deploy "$domain"
echo " Deployed! Access at: http://$domain" echo " Deployed! Access at: http://$domain"
echo "🌐 Open browser with: browser" echo "🌐 Open browser with: browser"
} }
connect() { connect() {
[ -z "$1" ] && { echo "Usage: connect <name>"; return 1; } [ -z "$1" ] && { echo "Usage: connect <name>"; return 1; }
echo "Connecting to $1.codecrispi.es..." echo "Connecting to $1.codecrispi.es..."
ssh -o StrictHostKeyChecking=no workshop@$1.codecrispi.es ssh -o StrictHostKeyChecking=no workshop@$1.codecrispi.es
} }
recipes() { recipes() {
echo "Available Co-op Cloud Recipes:" echo "Available Co-op Cloud Recipes:"
echo "" echo ""
echo "📝 Content Management:" echo "📝 Content Management:"
echo " wordpress ghost hedgedoc dokuwiki mediawiki" echo " wordpress ghost hedgedoc dokuwiki mediawiki"
echo "" echo ""
echo "📁 File & Collaboration:" echo "📁 File & Collaboration:"
echo " nextcloud seafile collabora onlyoffice" echo " nextcloud seafile collabora onlyoffice"
echo "" echo ""
echo "💬 Communication:" echo "💬 Communication:"
echo " jitsi-meet matrix-synapse rocketchat mattermost" echo " jitsi-meet matrix-synapse rocketchat mattermost"
echo "" echo ""
echo "🛒 E-commerce & Business:" echo "🛒 E-commerce & Business:"
echo " prestashop invoiceninja kimai pretix" echo " prestashop invoiceninja kimai pretix"
echo "" echo ""
echo " Development & Tools:" echo " Development & Tools:"
echo " gitea drone n8n gitlab jupyter-lab" echo " gitea drone n8n gitlab jupyter-lab"
echo "" echo ""
echo "📊 Analytics & Monitoring:" echo "📊 Analytics & Monitoring:"
echo " plausible matomo uptime-kuma grafana" echo " plausible matomo uptime-kuma grafana"
echo "" echo ""
echo "🎵 Media & Social:" echo "🎵 Media & Social:"
echo " peertube funkwhale mastodon pixelfed jellyfin" echo " peertube funkwhale mastodon pixelfed jellyfin"
echo "" echo ""
echo "🚀 Local Deploy: deploy <recipe>" echo "🚀 Local Deploy: deploy <recipe>"
echo " Cloud Deploy: connect <server> then use abra commands" echo " Cloud Deploy: connect <server> then use abra commands"
echo "📖 Browse all: https://recipes.coopcloud.tech" echo "📖 Browse all: https://recipes.coopcloud.tech"
} }
browser() { browser() {
echo "🌐 Starting Firefox..." echo "🌐 Starting Firefox..."
if [ -n "$DISPLAY" ]; then if [ -n "$DISPLAY" ]; then
firefox & firefox &
else else
echo " No GUI session. Run 'desktop' first" echo " No GUI session. Run 'desktop' first"
fi fi
} }
desktop() { desktop() {
echo "🖥 Starting GUI session..." echo "🖥 Starting GUI session..."
if [ -z "$DISPLAY" ]; then if [ -z "$DISPLAY" ]; then
startx & startx &
export DISPLAY=:0 export DISPLAY=:0
sleep 3 sleep 3
echo " GUI started. Run 'browser' to open Firefox" echo " GUI started. Run 'browser' to open Firefox"
else else
echo " GUI already running" echo " GUI already running"
fi fi
} }
help() { help() {
echo "CODE CRISPIES Workshop Commands:" echo "CODE CRISPIES Workshop Commands:"
echo "" echo ""
echo "🏠 Local Development:" echo "🏠 Local Development:"
echo " setup-traefik - Setup local Traefik proxy (required first!)" echo " setup-traefik - Setup local Traefik proxy (required first!)"
echo " recipes - Show all available app recipes" echo " recipes - Show all available app recipes"
echo " deploy <recipe> - Deploy app locally (e.g., deploy wordpress)" echo " deploy <recipe> - Deploy app locally (e.g., deploy wordpress)"
echo " browser - Launch Firefox browser" echo " browser - Launch Firefox browser"
echo " desktop - Start GUI desktop session" echo " desktop - Start GUI desktop session"
echo "" echo ""
echo " Cloud Access:" echo " Cloud Access:"
echo " connect <name> - SSH to cloud server (e.g., connect hopper)" echo " connect <name> - SSH to cloud server (e.g., connect hopper)"
echo "" echo ""
echo "Available servers: ${builtins.concatStringsSep " " cloudServerNames}" echo "Available servers: ${builtins.concatStringsSep " " cloudServerNames}"
echo "" echo ""
echo "📚 Learning Flow:" echo "📚 Learning Flow:"
echo " 1. First time: setup-traefik" echo " 1. First time: setup-traefik"
echo " 2. Try local: recipes deploy wordpress browser" echo " 2. Try local: recipes deploy wordpress browser"
echo " 3. Try cloud: connect hopper same abra commands" echo " 3. Try cloud: connect hopper same abra commands"
} }
'';
export -f setup-traefik deploy connect recipes browser desktop help
'';
}; };
services.xserver = { services.xserver = {
enable = true; enable = true;
desktopManager.xfce.enable = true; desktopManager.xfce.enable = true;
displayManager.lightdm.enable = true; displayManager.lightdm.enable = true;
# Don't set autoLogin here - it conflicts with the VM config
}; };
# Don't auto-start GUI, let user choose # Don't auto-start GUI, let user choose