erpnext-nix/flake.nix
2023-05-30 20:06:34 +02:00

97 lines
3.9 KiB
Nix

{
description = "Dev Setup";
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
inputs.flake-utils.url = "github:numtide/flake-utils";
inputs.pip2nix = {
url = "github:nix-community/pip2nix";
flake = false;
# inputs.nixpkgs.follows = "nixpkgs"; # inputs.flake-utils.follows = "flake-utils";
};
outputs = {nixpkgs, flake-utils, pip2nix, ...}:
flake-utils.lib.eachDefaultSystem (system:
let
pkgs = import nixpkgs { inherit system;
config.allowBroken = true;
};
#attrsets = pkgs.lib.attrsets;
#overrideFiles = (attrsets.filterAttrs (f: type: type == "regular") (builtins.readDir ./python));
#overridePackageNames = attrsets.mapAttrsToList (f: _: builtins.replaceStrings [".nix"] [""] f) overrideFiles;
py = pkgs.callPackage ./python.nix { inherit pkgs; };
# packageOverrides = pself: psuper:
# attrsets.genAttrs overridePackageNames (o: pself.callPackage ./python/${o}.nix {});
#});
#newversion = python3.pkgs.newversion.overrideAttrs(old: {
# propagatedBuildInputs = old.propagatedBuildInputs ++ [python3.pkgs.setuptools];
#});
assets = pkgs.callPackage ./node/frappe-assets.nix {};
# Source: https://github.com/frappe/frappe_docker/blob/main/resources/nginx-template.conf
nginx-conf = pkgs.callPackage ./nginx-erpnext-conf.nix {inherit pkgs;};
penv = py.buildEnv.override {
extraLibs = [ py.pkgs.frappe py.pkgs.erpnext ];
};
erpnextSrc = pkgs.callPackage ./srcs/erpnext.nix {};
frappeModules = pkgs.callPackage ./node/frappe-modules.nix {};
runErpNext = pkgs.writeShellScriptBin "runErpNext" ''
export PYTHON_PATH=${penv}/${py.sitePackages}
# The upstream installer bench CLI wants mysql in its PATH
export PATH=${pkgs.mariadb-client}/bin:''$PATH
hostname=localhost
tmp=/tmp/erpnext
mkdir -p $tmp/apps $tmp/sites $tmp/config/pids $tmp/logs/nginx $tmp/env/bin
for f in ${assets}/share/sites/*; do
ln -s "$f" "$tmp/sites/$(basename $f)"
done
cat >$tmp/sites/common_site_config.json <<EOF
{
"db_host": "localhost",
"db_port": 3306,
"db_name": "erpnext" ,
"db_password": "erpnext" ,
"redis_cache": "redis://localhost:6379?db=0",
"redis_queue": "redis://localhost:6379?db=1",
"redis_socketio": "redis://localhost:6379?db=2",
"socketio_port": 3000
}
EOF
# The upstream bench CLI installer expects this file
echo -e "erpnext\nfrappe\n" > $tmp/sites/apps.txt
ln -s ${erpnextSrc} $tmp/apps/erpnext
ln -s ${frappeModules}/libexec/frappe-framework/deps/frappe-framework $tmp/apps/frappe
ln -s ${penv} $tmp/env
ln -sf ${nginx-conf} $tmp/nginx-erpnext.conf
cd $tmp
# Upstream initializes the DB with this command
${py.pkgs.bench}/bin/bench new-site localhost --mariadb-root-password password --admin-password admin
${py.pkgs.bench}/bin/bench --site localhost install-app erpnext
echo "Workdir: $tmp"
${pkgs.nodejs}/bin/node $tmp/apps/frappe/socketio.js &
${penv}/bin/gunicorn --chdir="$tmp/sites" --bind=0.0.0.0:9090 --threads=4 --workers=2 --worker-class=gthread --worker-tmp-dir=/dev/shm --timeout=120 --preload frappe.app:application
'';
in rec {
packages = {
devEnv = pkgs.buildEnv {
name = "erpnext-nix-dev-env";
paths = [
pkgs.dasel
];
};
inherit pkgs runErpNext assets;
pip2nix = import "${pip2nix}/default.nix" { inherit pkgs; pythonPackages = "python310Packages"; };
erpnext = py.pkgs.erpnext;
bench = py.pkgs.bench;
pythonPkgs = py.pkgs;
};
});
}