{ description = "GMW — Bete Discord Moderation Bot (Nix build)"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; flake-utils.url = "github:numtide/flake-utils"; }; outputs = { self, nixpkgs, flake-utils }: flake-utils.lib.eachDefaultSystem (system: let pkgs = import nixpkgs { inherit system; }; # ---- Shared build tools ---- nodejs = pkgs.nodejs_22; pnpm = pkgs.pnpm.override { nodejs = nodejs; }; pnpmInstall = '' export HOME=$TMPDIR/home export npm_config_cache=$TMPDIR/npm-cache mkdir -p $npm_config_cache # SSL/TLS certs (Nix sandbox doesn't have system CA bundle) export SSL_CERT_FILE=${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt export NODE_EXTRA_CA_CERTS=${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt export GIT_SSL_CAINFO=${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt export NIX_SSL_CERT_FILE=${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt # pnpm uses node-gyp for native addons — provide build tools export npm_config_build_from_source=true export CPPFLAGS="-I${pkgs.lib.getDev pkgs.openssl}/include" export LDFLAGS="-L${pkgs.lib.getLib pkgs.openssl}/lib" pnpm install --no-frozen-lockfile --ignore-scripts 2>&1 # Build native addons that need compilation pnpm rebuild 2>&1 || true ''; # ---- Backend ---- backend = pkgs.stdenv.mkDerivation { pname = "gmw-backend"; version = "1.0.0"; src = ./services/backend; nativeBuildInputs = [ nodejs pnpm pkgs.python3 pkgs.gnumake pkgs.gcc pkgs.cacert ]; buildPhase = pnpmInstall + '' echo "=== Compiling TypeScript ===" npx tsc 2>&1 ''; installPhase = '' mkdir -p $out/lib/gmw-backend cp -r dist node_modules package.json tsconfig.json $out/lib/gmw-backend/ mkdir -p $out/bin cat > $out/bin/gmw-backend <&1 ''; installPhase = '' mkdir -p $out/lib/gmw-discord-gateway cp -r dist node_modules package.json tsconfig.json $out/lib/gmw-discord-gateway/ # Also include drizzle migrations if they exist cp -r drizzle $out/lib/gmw-discord-gateway/ 2>/dev/null || true mkdir -p $out/bin cat > $out/bin/gmw-discord-gateway <&1 ''; installPhase = '' mkdir -p $out/share/gmw-frontend cp -r out $out/share/gmw-frontend/out 2>/dev/null || \ cp -r dist $out/share/gmw-frontend/dist 2>/dev/null || \ cp -r .next $out/share/gmw-frontend/.next 2>/dev/null || true # Copy node_modules for standalone mode if it exists cp -r node_modules $out/share/gmw-frontend/ 2>/dev/null || true ''; meta = { description = "GMW Frontend — Next.js static dashboard"; platforms = pkgs.lib.platforms.linux; }; }; # ---- Proxy (nginx serving frontend) ---- proxy = pkgs.stdenv.mkDerivation { pname = "gmw-proxy"; version = "1.0.0"; src = ./infra/docker; buildInputs = [ pkgs.nginx ]; phases = [ "installPhase" ]; installPhase = '' mkdir -p $out/bin $out/etc $out/share # Copy nginx config cp nginx/nginx.conf $out/etc/nginx.conf 2>/dev/null || cat > $out/etc/nginx.conf < $out/bin/gmw-proxy <