From c3bd77ce7c7e7b81a681d858e125146b7cc60f2e Mon Sep 17 00:00:00 2001 From: Michael Czechowski Date: Tue, 12 Aug 2025 23:44:12 +0200 Subject: [PATCH] add abra to vm containers --- flake.nix | 105 +++++++++++++++++++++----- local/flake.lock | 27 ------- local/flake.nix | 189 ----------------------------------------------- 3 files changed, 86 insertions(+), 235 deletions(-) delete mode 100644 local/flake.lock delete mode 100644 local/flake.nix diff --git a/flake.nix b/flake.nix index 022e2c1..a9c4fed 100644 --- a/flake.nix +++ b/flake.nix @@ -36,23 +36,61 @@ security.pam.services.login.allowNullPassword = true; security.sudo.wheelNeedsPassword = false; - # CORRECTED GUI setup + # GUI setup services.xserver = { enable = true; desktopManager.xfce.enable = true; - displayManager = { - lightdm.enable = true; - autoLogin.enable = true; - autoLogin.user = "workshop"; - sessionCommands = '' - ${pkgs.xfce.xfce4-terminal}/bin/xfce4-terminal --title="Workshop Terminal" \ - --command="bash -c 'echo \"🍪 Workshop VM Ready!\"; echo \"\"; echo \"SSH into containers:\"; echo \" ssh root@192.168.100.11 # hopper\"; echo \" ssh root@192.168.100.12 # curie\"; echo \"\"; bash'" & - ''; - }; + displayManager.lightdm.enable = true; }; + services.displayManager = { + autoLogin.enable = true; + autoLogin.user = "workshop"; + }; + + # Auto-open terminal with helper commands + services.xserver.displayManager.sessionCommands = '' + ${pkgs.xfce.xfce4-terminal}/bin/xfce4-terminal --title="🍪 Workshop Terminal" \ + --command="bash -c ' + echo \"🍪 Workshop VM Ready!\"; + echo \"\"; + echo \"🔌 SSH into containers:\"; + echo \" sudo connect hopper # Container login\"; + echo \" sudo connect curie # Container login\"; + echo \" ssh root@192.168.100.11 # Direct SSH to hopper\"; + echo \" ssh root@192.168.100.12 # Direct SSH to curie\"; + echo \"\"; + echo \"📦 Container management:\"; + echo \" sudo containers # List all containers\"; + echo \" sudo logs # Show setup logs\"; + echo \"\"; + echo \"✨ Abra is pre-installed in containers!\"; + echo \"\"; + bash + '" & + ''; + + # System packages including helper scripts environment.systemPackages = with pkgs; [ firefox curl git jq nano tree nixos-container + # Custom helper scripts that work with sudo + (pkgs.writeScriptBin "connect" '' + #!/bin/bash + if [ -z "$1" ]; then + echo "Usage: connect " + echo "Available: hopper curie" + exit 1 + fi + exec nixos-container root-login "$1" + '') + (pkgs.writeScriptBin "containers" '' + #!/bin/bash + exec nixos-container list + '') + (pkgs.writeScriptBin "logs" '' + #!/bin/bash + exec journalctl -u container@hopper -u container@curie -f + '') ]; networking = { @@ -64,14 +102,8 @@ externalInterface = "eth0"; }; }; - - programs.bash.shellAliases = { - containers = "nixos-container list"; - hopper = "ssh root@192.168.100.11"; - curie = "ssh root@192.168.100.12"; - }; - # Container configs (same as before) + # Container configurations with automated abra installation containers = builtins.listToAttrs (builtins.genList (i: let name = builtins.elemAt participantNames i; @@ -112,9 +144,10 @@ virtualisation.docker.enable = true; environment.systemPackages = with pkgs; [ - docker curl git wget jq + docker curl git wget jq bash ]; + # Automated abra installation service systemd.services.workshop-setup = { wantedBy = [ "multi-user.target" ]; after = [ "network-online.target" "docker.service" ]; @@ -122,8 +155,9 @@ script = '' echo "🍪 Setting up ${name} container..." + # Wait for network for i in {1..10}; do - if curl -s --max-time 5 google.com >/dev/null 2>&1; then + if ${pkgs.curl}/bin/curl -s --max-time 5 google.com >/dev/null 2>&1; then echo "✅ Network ready" break fi @@ -131,16 +165,49 @@ sleep 2 done + # Initialize Docker Swarm ${pkgs.docker}/bin/docker swarm init --advertise-addr ${ip} || true + # Install abra for root user + export HOME=/root + if [ ! -f /root/.local/bin/abra ]; then + echo "📦 Installing abra..." + ${pkgs.curl}/bin/curl -fsSL https://install.abra.coopcloud.tech | ${pkgs.bash}/bin/bash + echo "✅ Abra installed" + fi + + # Make abra available globally + if ! grep -q "/.local/bin" /root/.bashrc 2>/dev/null; then + echo 'export PATH="$HOME/.local/bin:$PATH"' >> /root/.bashrc + fi + + # Create symlink for immediate availability + if [ -f /root/.local/bin/abra ]; then + ln -sf /root/.local/bin/abra /usr/local/bin/abra 2>/dev/null || true + fi + + # Add server + if [ -f /root/.local/bin/abra ]; then + export PATH="/root/.local/bin:$PATH" + /root/.local/bin/abra server add ${name}.local 2>/dev/null || true + fi + echo "✅ ${name} container ready!" echo "SSH: ssh root@${ip} (password: root)" + echo "Abra: Available via 'abra' command" ''; serviceConfig = { Type = "oneshot"; RemainAfterExit = true; + StandardOutput = "journal"; + StandardError = "journal"; }; }; + + # Ensure abra is in PATH for all sessions + environment.sessionVariables = { + PATH = [ "/root/.local/bin" ]; + }; }; }; } diff --git a/local/flake.lock b/local/flake.lock deleted file mode 100644 index 7469d87..0000000 --- a/local/flake.lock +++ /dev/null @@ -1,27 +0,0 @@ -{ - "nodes": { - "nixpkgs": { - "locked": { - "lastModified": 1754725699, - "narHash": "sha256-iAcj9T/Y+3DBy2J0N+yF9XQQQ8IEb5swLFzs23CdP88=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "85dbfc7aaf52ecb755f87e577ddbe6dbbdbc1054", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "root": { - "inputs": { - "nixpkgs": "nixpkgs" - } - } - }, - "root": "root", - "version": 7 -} diff --git a/local/flake.nix b/local/flake.nix deleted file mode 100644 index 2724ed6..0000000 --- a/local/flake.nix +++ /dev/null @@ -1,189 +0,0 @@ -{ - description = "Local Co-op Cloud Testing"; - - inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; - - outputs = { self, nixpkgs }: { - nixosConfigurations.workshop-local = nixpkgs.lib.nixosSystem { - system = "x86_64-linux"; - modules = [ - { - containers = builtins.listToAttrs (map (i: - let participant = builtins.elemAt [ - "hopper" "curie" "lovelace" "noether" "hamilton" - "franklin" "johnson" "clarke" "goldberg" "liskov" - "wing" "rosen" "shaw" "karp" "rich" - ] (i - 1); - in { - name = "participant${toString i}"; - value = { - autoStart = true; - privateNetwork = true; - hostAddress = "192.168.100.1"; - localAddress = "192.168.100.${toString (10 + i)}"; - - config = { pkgs, ... }: { - virtualisation.docker = { - enable = true; - extraOptions = "--experimental"; - }; - - environment.systemPackages = with pkgs; [ - docker git curl wget tar jq - ]; - - # Helper script for workshop commands - environment.etc."workshop-helpers.sh" = { - text = '' - #!/bin/bash - - connect() { - case "$1" in - hopper|curie|lovelace|noether|hamilton|franklin|johnson|clarke|goldberg|liskov|wing|rosen|shaw|karp|rich) - echo "🔗 Connecting to $1.codecrispi.es..." - ssh -o StrictHostKeyChecking=no workshop@$1.codecrispi.es - ;; - *) - echo "Available servers:" - echo " hopper curie lovelace noether hamilton franklin johnson" - echo " clarke goldberg liskov wing rosen shaw karp rich" - ;; - esac - } - - recipes() { - echo "🍪 Available Co-op Cloud Recipes:" - echo "" - echo "📝 Content Management:" - echo " wordpress - Blog/CMS platform" - echo " ghost - Publishing platform" - echo " hedgedoc - Collaborative markdown editor" - echo " dokuwiki - Simple textfile based wiki" - echo " mediawiki - The wiki software that runs Wikipedia" - echo "" - echo "☁️ File & Collaboration:" - echo " nextcloud - File sync & collaboration" - echo " seafile - File hosting platform" - echo " collabora - Online Office suite" - echo " onlyoffice - Online office suite" - echo "" - echo "💬 Communication:" - echo " jitsi-meet - Video conferencing" - echo " matrix-synapse - Chat server" - echo " rocketchat - Team communication" - echo " mattermost - Team collaboration platform" - echo "" - echo "🛒 E-commerce & Business:" - echo " prestashop - E-commerce platform" - echo " invoiceninja - Invoice & billing" - echo " kimai - Time tracking" - echo " pretix - Event ticketing" - echo "" - echo "🔧 Development & Tools:" - echo " gitea - Git repository hosting" - echo " drone - CI/CD platform" - echo " n8n - Workflow automation" - echo " gitlab - DevOps platform" - echo " jupyter-lab - Interactive computing" - echo "" - echo "📊 Analytics & Monitoring:" - echo " plausible - Privacy-friendly analytics" - echo " matomo - Web analytics" - echo " uptime-kuma - Status monitoring" - echo " grafana - Observability platform" - echo "" - echo "🎵 Media & Social:" - echo " peertube - Video platform" - echo " funkwhale - Music platform" - echo " mastodon - Social networking" - echo " pixelfed - Photo sharing" - echo " jellyfin - Media system" - echo "" - echo "Usage: abra app new -S --domain=myapp.${participant}.local" - echo "Browse all 100+ recipes: https://recipes.coopcloud.tech" - } - - help() { - echo "🍪 CODE CRISPIES Workshop Commands:" - echo "" - echo "connect - SSH to cloud server" - echo "recipes - Show available app recipes" - echo "abra app new -S --domain=.${participant}.local" - echo "abra app deploy " - echo "abra app ls - List your apps" - echo "" - echo "Examples:" - echo " connect hopper" - echo " abra app new wordpress -S --domain=blog.${participant}.local" - echo " abra app deploy blog.${participant}.local" - echo "" - echo "Server: ${participant}.local" - echo "Your apps will be available at: https://.${participant}.local" - } - - export -f connect recipes help - ''; - mode = "0755"; - }; - - systemd.services.workshop-setup = { - wantedBy = [ "multi-user.target" ]; - after = [ "docker.service" "network-online.target" ]; - wants = [ "network-online.target" ]; - script = '' - # Wait for network interface - until ip addr show | grep -q "192.168.100.${toString (10 + i)}"; do - sleep 1 - done - - # Install abra - export HOME=/root - ${pkgs.curl}/bin/curl -fsSL https://install.abra.coopcloud.tech | ${pkgs.bash}/bin/bash - - # Docker swarm setup - ${pkgs.docker}/bin/docker swarm init --advertise-addr 192.168.100.${toString (10 + i)} || true - ${pkgs.docker}/bin/docker network create -d overlay proxy || true - - # Abra server setup - mkdir -p /root/.abra/servers - /root/.local/bin/abra server add ${participant}.local - - # Setup helper commands in bash profile - echo "source /etc/workshop-helpers.sh" >> /root/.bashrc - ''; - serviceConfig = { - Type = "oneshot"; - RemainAfterExit = true; - }; - }; - - services.openssh.enable = true; - networking = { - firewall.allowedTCPPorts = [ 22 80 443 ]; - hostName = "${participant}.local"; - }; - }; - }; - } - ) (nixpkgs.lib.range 1 15)); - - # Wildcard DNS for all participant subdomains - services.dnsmasq = { - enable = true; - settings.address = builtins.concatMap (i: - let participant = builtins.elemAt [ - "hopper" "curie" "lovelace" "noether" "hamilton" - "franklin" "johnson" "clarke" "goldberg" "liskov" - "wing" "rosen" "shaw" "karp" "rich" - ] (i - 1); - in [ - "/${participant}.local/192.168.100.${toString (10 + i)}" - "/.${participant}.local/192.168.100.${toString (10 + i)}" - ] - ) (nixpkgs.lib.range 1 15); - }; - } - ]; - }; - }; -}