portal/flake.nix

140 lines
4.1 KiB
Nix
Raw Normal View History

{
description = "CentralCloud unified portal (Elixir/Phoenix umbrella)";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11";
flake-utils.url = "github:numtide/flake-utils";
nix2container = {
url = "github:nlewo/nix2container";
inputs.nixpkgs.follows = "nixpkgs";
};
};
nixConfig = {
extra-substituters = [
"https://cache.centralcloud.com/default"
];
extra-trusted-public-keys = [
"default:ywfU21WX06iOn2Ec2lae1jYh4w8LO4IQkmp06vJzsk8="
];
};
outputs = { self, nixpkgs, flake-utils, nix2container }:
flake-utils.lib.eachDefaultSystem (system:
let
pkgs = nixpkgs.legacyPackages.${system};
beam = pkgs.beam.packages.erlang_28.extend (_self: super: {
elixir = super.elixir_1_19.overrideAttrs (_old: {
version = "1.20.0-rc.4";
src = pkgs.fetchFromGitHub {
owner = "elixir-lang";
repo = "elixir";
rev = "v1.20.0-rc.4";
hash = "sha256-sboB+GW3T+t9gEcOGtd6NllmIlyWio1+cgWyyxE+484=";
};
});
});
n2c = nix2container.packages.${system}.nix2container;
src = ./.;
staffRelease = beam.mixRelease rec {
pname = "centralcloud-staff";
version = "0.2.1";
inherit src;
mixFodDeps = beam.fetchMixDeps {
pname = "centralcloud-staff-deps";
inherit src version;
hash = "sha256-MJGIZPdeK5aVHSJ8ZTPRoxqHKyTA4WYR+uFdmJCpFy4=";
};
INCLUDE_ERTS = "false";
nativeBuildInputs = [
pkgs.tailwindcss
];
preBuild = ''
mkdir -p apps/centralcloud_staff/priv/static/assets
${pkgs.tailwindcss}/bin/tailwindcss \
--config apps/centralcloud_staff/assets/tailwind.config.js \
--input apps/centralcloud_staff/assets/css/app.css \
--output apps/centralcloud_staff/priv/static/assets/app.css \
--minify
'';
mixReleaseName = "centralcloud_staff";
postInstall = ''
chmod +x "$out"/bin/* || true
'';
};
staffImageRoot = pkgs.buildEnv {
name = "centralcloud-staff-image-root";
paths = [
staffRelease
pkgs.beam.packages.erlang_28.erlang
pkgs.cacert
pkgs.bash
pkgs.coreutils
];
pathsToLink = [
"/bin"
"/etc"
];
};
staffContainer = n2c.buildImage {
name = "registry.infra.centralcloud.com/centralcloud/centralcloud-staff";
tag = staffRelease.version;
copyToRoot = [
staffImageRoot
];
maxLayers = 32;
config = {
Cmd = ["/bin/centralcloud_staff" "start"];
Env = [
"HOME=/tmp"
"PHX_SERVER=true"
"ELIXIR_ERL_OPTIONS=+fnu"
"LANG=C.UTF-8"
"LC_ALL=C.UTF-8"
"SSL_CERT_FILE=/etc/ssl/certs/ca-bundle.crt"
];
ExposedPorts = {
"4000/tcp" = {};
};
Labels = {
"org.opencontainers.image.title" = "CentralCloud Staff";
"org.opencontainers.image.source" = "https://git.infra.centralcloud.com/centralcloud/portal";
};
};
};
elixir_1_20_rc4 = beam.elixir;
in {
packages.centralcloud-staff = staffRelease;
packages.container-staff = staffContainer;
packages.default = staffRelease;
devShells.default = pkgs.mkShell {
buildInputs = with pkgs; [
elixir_1_20_rc4
pkgs.beam.packages.erlang_28.erlang
nodejs_22
inotify-tools
];
shellHook = ''
export MIX_HOME=$HOME/.mix
export HEX_HOME=$HOME/.hex
export PATH=$MIX_HOME/bin:$HEX_HOME/bin:$PATH
echo "Elixir $(elixir --version | head -1)"
echo "Mix $(mix --version)"
'';
};
});
}