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