add abra to vm containers
This commit is contained in:
105
flake.nix
105
flake.nix
@@ -36,23 +36,61 @@
|
|||||||
security.pam.services.login.allowNullPassword = true;
|
security.pam.services.login.allowNullPassword = true;
|
||||||
security.sudo.wheelNeedsPassword = false;
|
security.sudo.wheelNeedsPassword = false;
|
||||||
|
|
||||||
# CORRECTED GUI setup
|
# GUI setup
|
||||||
services.xserver = {
|
services.xserver = {
|
||||||
enable = true;
|
enable = true;
|
||||||
desktopManager.xfce.enable = true;
|
desktopManager.xfce.enable = true;
|
||||||
displayManager = {
|
displayManager.lightdm.enable = true;
|
||||||
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'" &
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
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; [
|
environment.systemPackages = with pkgs; [
|
||||||
firefox curl git jq nano tree nixos-container
|
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 <container-name>"
|
||||||
|
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 = {
|
networking = {
|
||||||
@@ -65,13 +103,7 @@
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
programs.bash.shellAliases = {
|
# Container configurations with automated abra installation
|
||||||
containers = "nixos-container list";
|
|
||||||
hopper = "ssh root@192.168.100.11";
|
|
||||||
curie = "ssh root@192.168.100.12";
|
|
||||||
};
|
|
||||||
|
|
||||||
# Container configs (same as before)
|
|
||||||
containers = builtins.listToAttrs (builtins.genList (i:
|
containers = builtins.listToAttrs (builtins.genList (i:
|
||||||
let
|
let
|
||||||
name = builtins.elemAt participantNames i;
|
name = builtins.elemAt participantNames i;
|
||||||
@@ -112,9 +144,10 @@
|
|||||||
virtualisation.docker.enable = true;
|
virtualisation.docker.enable = true;
|
||||||
|
|
||||||
environment.systemPackages = with pkgs; [
|
environment.systemPackages = with pkgs; [
|
||||||
docker curl git wget jq
|
docker curl git wget jq bash
|
||||||
];
|
];
|
||||||
|
|
||||||
|
# Automated abra installation service
|
||||||
systemd.services.workshop-setup = {
|
systemd.services.workshop-setup = {
|
||||||
wantedBy = [ "multi-user.target" ];
|
wantedBy = [ "multi-user.target" ];
|
||||||
after = [ "network-online.target" "docker.service" ];
|
after = [ "network-online.target" "docker.service" ];
|
||||||
@@ -122,8 +155,9 @@
|
|||||||
script = ''
|
script = ''
|
||||||
echo "🍪 Setting up ${name} container..."
|
echo "🍪 Setting up ${name} container..."
|
||||||
|
|
||||||
|
# Wait for network
|
||||||
for i in {1..10}; do
|
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"
|
echo "✅ Network ready"
|
||||||
break
|
break
|
||||||
fi
|
fi
|
||||||
@@ -131,16 +165,49 @@
|
|||||||
sleep 2
|
sleep 2
|
||||||
done
|
done
|
||||||
|
|
||||||
|
# Initialize Docker Swarm
|
||||||
${pkgs.docker}/bin/docker swarm init --advertise-addr ${ip} || true
|
${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 "✅ ${name} container ready!"
|
||||||
echo "SSH: ssh root@${ip} (password: root)"
|
echo "SSH: ssh root@${ip} (password: root)"
|
||||||
|
echo "Abra: Available via 'abra' command"
|
||||||
'';
|
'';
|
||||||
serviceConfig = {
|
serviceConfig = {
|
||||||
Type = "oneshot";
|
Type = "oneshot";
|
||||||
RemainAfterExit = true;
|
RemainAfterExit = true;
|
||||||
|
StandardOutput = "journal";
|
||||||
|
StandardError = "journal";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# Ensure abra is in PATH for all sessions
|
||||||
|
environment.sessionVariables = {
|
||||||
|
PATH = [ "/root/.local/bin" ];
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
27
local/flake.lock
generated
27
local/flake.lock
generated
@@ -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
|
|
||||||
}
|
|
||||||
189
local/flake.nix
189
local/flake.nix
@@ -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 <recipe> -S --domain=myapp.${participant}.local"
|
|
||||||
echo "Browse all 100+ recipes: https://recipes.coopcloud.tech"
|
|
||||||
}
|
|
||||||
|
|
||||||
help() {
|
|
||||||
echo "🍪 CODE CRISPIES Workshop Commands:"
|
|
||||||
echo ""
|
|
||||||
echo "connect <name> - SSH to cloud server"
|
|
||||||
echo "recipes - Show available app recipes"
|
|
||||||
echo "abra app new <recipe> -S --domain=<name>.${participant}.local"
|
|
||||||
echo "abra app deploy <domain>"
|
|
||||||
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://<name>.${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);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user