190 lines
8.8 KiB
Nix
190 lines
8.8 KiB
Nix
{
|
||
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);
|
||
};
|
||
}
|
||
];
|
||
};
|
||
};
|
||
}
|