Packaged teslamate

- Need to provide RELEASE_COOKIE environment variable when running the
  app (https://github.com/NixOS/nixpkgs/issues/166229)

- Deploy script has an output directory hardcoded that doesn't play nice
  with nix. I made change and generated a patch file with `git diff` in
  my local copy of the repo. I also had to make sure to change the
  filepaths in the patchfile to remove the `assets/` prefix. The
  contents of the this directory must be moved to `priv/static/assets`.

- Have to manually install the phoenix node dependencies (these aren't
  fetched from npm, but from the repo itself).
This commit is contained in:
Alejandro Angulo 2023-12-17 17:31:06 -08:00
parent 370f46be16
commit ea351a8a38
Signed by: alejandro-angulo
GPG key ID: 75579581C74554B6
3 changed files with 937 additions and 0 deletions

View file

@ -0,0 +1,93 @@
{
lib,
callPackage,
beamPackages,
buildNpmPackage,
fetchFromGitHub,
nodejs,
breakpointHook,
...
}: let
pname = "teslamate";
version = "1.28.2";
src = fetchFromGitHub {
owner = "teslamate-org";
repo = "teslamate";
rev = "v${version}";
hash = "sha256-CH3u6ijzvVdjfTVu06UcyW4NhVQKeUKtC/j+UeDELNc=";
};
mixNixDeps = import ./mix.nix {
inherit beamPackages lib;
overrides = (
final: prev:
(lib.mapAttrs
(_: value:
value.override {
appConfigPath = src + "/config";
})
prev)
// {
ex_cldr = prev.ex_cldr.overrideAttrs (old: rec {
# Copied from https://github.com/NixOS/nixpkgs/blob/d8fd23629b3910e8bdbd313e29532d3e33dd73d5/pkgs/servers/mobilizon/default.nix#L34-L47
version = "2.37.5";
# We have to use the GitHub sources, as it otherwise tries to download
# the locales at build time.
src = fetchFromGitHub {
owner = "elixir-cldr";
repo = "cldr";
rev = "v${version}";
sha256 = "sha256-T5Qvuo+xPwpgBsqHNZYnTCA4loToeBn1LKTMsDcCdYs=";
};
postInstall = ''
cp $src/priv/cldr/locales/* $out/lib/erlang/lib/ex_cldr-${old.version}/priv/cldr/locales/
'';
});
}
);
};
assets = buildNpmPackage {
pname = "${pname}-assets";
inherit version;
src = "${src}/assets";
npmDepsHash = "sha256-h92i/cRf4I0c4vUc6oBt5T4yvM0JNQMkoDy2YHcVWS4=";
patches = [./deploy_output.patch];
dontNpmBuild = true;
installPhase = ''
runHook preinstall
rm ./node_modules/phoenix
cp -r ${mixNixDeps.phoenix}/src ./node_modules/phoenix
rm ./node_modules/phoenix_live_view
cp -r ${mixNixDeps.phoenix_live_view}/src ./node_modules/phoenix_live_view
rm ./node_modules/phoenix_html
cp -r ${mixNixDeps.phoenix_html}/src ./node_modules/phoenix_html
npm run deploy
cp -r . "$out"
runHook postInstall
'';
};
in
beamPackages.mixRelease {
inherit pname version src mixNixDeps;
nativeBuildInputs = [nodejs];
preBuild = ''
mkdir -p priv/static/assets
# assets patched to write to scripts/deploy_output
cp -r ${assets}/scripts/deploy_output ./priv/static/assets
'';
postBuild = ''
# for external task you need a workaround for the no deps check flag
# https://github.com/phoenixframework/phoenix/issues/2690
mix do deps.loadpaths --no-deps-check phx.digest, release --overwrite
'';
}

View file

@ -0,0 +1,13 @@
diff --git a/scripts/build.js b/scripts/build.js
index 86a42678..569702b1 100644
--- a/scripts/build.js
+++ b/scripts/build.js
@@ -4,7 +4,7 @@ const { sassPlugin } = require("esbuild-sass-plugin");
const esbuild = require("esbuild");
const ENTRY_FILE = "app.js";
-const OUTPUT_DIR = path.resolve(__dirname, "../../priv/static/assets");
+const OUTPUT_DIR = path.resolve(__dirname, "deploy_output");
const OUTPUT_FILE = "app.js";
const MODE = process.env["NODE_ENV"] || "production";
const TARGET = "es2017";

831
packages/teslamate/mix.nix Normal file
View file

@ -0,0 +1,831 @@
{ lib, beamPackages, overrides ? (x: y: {}) }:
let
buildRebar3 = lib.makeOverridable beamPackages.buildRebar3;
buildMix = lib.makeOverridable beamPackages.buildMix;
buildErlangMk = lib.makeOverridable beamPackages.buildErlangMk;
self = packages // (overrides self packages);
packages = with beamPackages; with self; {
bunt = buildMix rec {
name = "bunt";
version = "0.2.1";
src = fetchHex {
pkg = "bunt";
version = "${version}";
sha256 = "a330bfb4245239787b15005e66ae6845c9cd524a288f0d141c148b02603777a5";
};
beamDeps = [];
};
castore = buildMix rec {
name = "castore";
version = "1.0.4";
src = fetchHex {
pkg = "castore";
version = "${version}";
sha256 = "9418c1b8144e11656f0be99943db4caf04612e3eaecefb5dae9a2a87565584f8";
};
beamDeps = [];
};
certifi = buildRebar3 rec {
name = "certifi";
version = "2.12.0";
src = fetchHex {
pkg = "certifi";
version = "${version}";
sha256 = "ee68d85df22e554040cdb4be100f33873ac6051387baf6a8f6ce82272340ff1c";
};
beamDeps = [];
};
cldr_utils = buildMix rec {
name = "cldr_utils";
version = "2.24.2";
src = fetchHex {
pkg = "cldr_utils";
version = "${version}";
sha256 = "3362b838836a9f0fa309de09a7127e36e67310e797d556db92f71b548832c7cf";
};
beamDeps = [ castore certifi decimal ];
};
cloak = buildMix rec {
name = "cloak";
version = "1.1.2";
src = fetchHex {
pkg = "cloak";
version = "${version}";
sha256 = "940d5ac4fcd51b252930fd112e319ea5ae6ab540b722f3ca60a85666759b9585";
};
beamDeps = [ jason ];
};
cloak_ecto = buildMix rec {
name = "cloak_ecto";
version = "1.2.0";
src = fetchHex {
pkg = "cloak_ecto";
version = "${version}";
sha256 = "8bcc677185c813fe64b786618bd6689b1707b35cd95acaae0834557b15a0c62f";
};
beamDeps = [ cloak ecto ];
};
combine = buildMix rec {
name = "combine";
version = "0.10.0";
src = fetchHex {
pkg = "combine";
version = "${version}";
sha256 = "1b1dbc1790073076580d0d1d64e42eae2366583e7aecd455d1215b0d16f2451b";
};
beamDeps = [];
};
cowboy = buildErlangMk rec {
name = "cowboy";
version = "2.10.0";
src = fetchHex {
pkg = "cowboy";
version = "${version}";
sha256 = "3afdccb7183cc6f143cb14d3cf51fa00e53db9ec80cdcd525482f5e99bc41d6b";
};
beamDeps = [ cowlib ranch ];
};
cowboy_telemetry = buildRebar3 rec {
name = "cowboy_telemetry";
version = "0.4.0";
src = fetchHex {
pkg = "cowboy_telemetry";
version = "${version}";
sha256 = "7d98bac1ee4565d31b62d59f8823dfd8356a169e7fcbb83831b8a5397404c9de";
};
beamDeps = [ cowboy telemetry ];
};
cowlib = buildRebar3 rec {
name = "cowlib";
version = "2.12.1";
src = fetchHex {
pkg = "cowlib";
version = "${version}";
sha256 = "163b73f6367a7341b33c794c4e88e7dbfe6498ac42dcd69ef44c5bc5507c8db0";
};
beamDeps = [];
};
credo = buildMix rec {
name = "credo";
version = "1.7.1";
src = fetchHex {
pkg = "credo";
version = "${version}";
sha256 = "e9871c6095a4c0381c89b6aa98bc6260a8ba6addccf7f6a53da8849c748a58a2";
};
beamDeps = [ bunt file_system jason ];
};
db_connection = buildMix rec {
name = "db_connection";
version = "2.6.0";
src = fetchHex {
pkg = "db_connection";
version = "${version}";
sha256 = "c2f992d15725e721ec7fbc1189d4ecdb8afef76648c746a8e1cad35e3b8a35f3";
};
beamDeps = [ telemetry ];
};
decimal = buildMix rec {
name = "decimal";
version = "2.1.1";
src = fetchHex {
pkg = "decimal";
version = "${version}";
sha256 = "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc";
};
beamDeps = [];
};
dialyxir = buildMix rec {
name = "dialyxir";
version = "1.4.2";
src = fetchHex {
pkg = "dialyxir";
version = "${version}";
sha256 = "516603d8067b2fd585319e4b13d3674ad4f314a5902ba8130cd97dc902ce6bbd";
};
beamDeps = [ erlex ];
};
ecto = buildMix rec {
name = "ecto";
version = "3.10.3";
src = fetchHex {
pkg = "ecto";
version = "${version}";
sha256 = "44bec74e2364d491d70f7e42cd0d690922659d329f6465e89feb8a34e8cd3433";
};
beamDeps = [ decimal jason telemetry ];
};
ecto_sql = buildMix rec {
name = "ecto_sql";
version = "3.10.2";
src = fetchHex {
pkg = "ecto_sql";
version = "${version}";
sha256 = "68c018debca57cb9235e3889affdaec7a10616a4e3a80c99fa1d01fdafaa9007";
};
beamDeps = [ db_connection ecto postgrex telemetry ];
};
erlex = buildMix rec {
name = "erlex";
version = "0.2.6";
src = fetchHex {
pkg = "erlex";
version = "${version}";
sha256 = "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75";
};
beamDeps = [];
};
ex_cldr = buildMix rec {
name = "ex_cldr";
version = "2.37.5";
src = fetchHex {
pkg = "ex_cldr";
version = "${version}";
sha256 = "74ad5ddff791112ce4156382e171a5f5d3766af9d5c4675e0571f081fe136479";
};
beamDeps = [ cldr_utils decimal gettext jason ];
};
ex_cldr_plugs = buildMix rec {
name = "ex_cldr_plugs";
version = "1.3.1";
src = fetchHex {
pkg = "ex_cldr_plugs";
version = "${version}";
sha256 = "4f7b4a5fe061734cef7b62ff29118ed6ac72698cdd7bcfc97495db73611fe0fe";
};
beamDeps = [ ex_cldr gettext jason plug ];
};
excoveralls = buildMix rec {
name = "excoveralls";
version = "0.18.0";
src = fetchHex {
pkg = "excoveralls";
version = "${version}";
sha256 = "1109bb911f3cb583401760be49c02cbbd16aed66ea9509fc5479335d284da60b";
};
beamDeps = [ castore jason ];
};
expo = buildMix rec {
name = "expo";
version = "0.4.1";
src = fetchHex {
pkg = "expo";
version = "${version}";
sha256 = "2ff7ba7a798c8c543c12550fa0e2cbc81b95d4974c65855d8d15ba7b37a1ce47";
};
beamDeps = [];
};
file_system = buildMix rec {
name = "file_system";
version = "0.2.10";
src = fetchHex {
pkg = "file_system";
version = "${version}";
sha256 = "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc";
};
beamDeps = [];
};
finch = buildMix rec {
name = "finch";
version = "0.16.0";
src = fetchHex {
pkg = "finch";
version = "${version}";
sha256 = "f660174c4d519e5fec629016054d60edd822cdfe2b7270836739ac2f97735ec5";
};
beamDeps = [ castore mime mint nimble_options nimble_pool telemetry ];
};
floki = buildMix rec {
name = "floki";
version = "0.35.2";
src = fetchHex {
pkg = "floki";
version = "${version}";
sha256 = "6b05289a8e9eac475f644f09c2e4ba7e19201fd002b89c28c1293e7bd16773d9";
};
beamDeps = [];
};
fuse = buildRebar3 rec {
name = "fuse";
version = "2.5.0";
src = fetchHex {
pkg = "fuse";
version = "${version}";
sha256 = "7f52a1c84571731ad3c91d569e03131cc220ebaa7e2a11034405f0bac46a4fef";
};
beamDeps = [];
};
gen_state_machine = buildMix rec {
name = "gen_state_machine";
version = "3.0.0";
src = fetchHex {
pkg = "gen_state_machine";
version = "${version}";
sha256 = "0a59652574bebceb7309f6b749d2a41b45fdeda8dbb4da0791e355dd19f0ed15";
};
beamDeps = [];
};
gettext = buildMix rec {
name = "gettext";
version = "0.23.1";
src = fetchHex {
pkg = "gettext";
version = "${version}";
sha256 = "19d744a36b809d810d610b57c27b934425859d158ebd56561bc41f7eeb8795db";
};
beamDeps = [ expo ];
};
hackney = buildRebar3 rec {
name = "hackney";
version = "1.20.1";
src = fetchHex {
pkg = "hackney";
version = "${version}";
sha256 = "fe9094e5f1a2a2c0a7d10918fee36bfec0ec2a979994cff8cfe8058cd9af38e3";
};
beamDeps = [ certifi idna metrics mimerl parse_trans ssl_verify_fun unicode_util_compat ];
};
hpax = buildMix rec {
name = "hpax";
version = "0.1.2";
src = fetchHex {
pkg = "hpax";
version = "${version}";
sha256 = "2c87843d5a23f5f16748ebe77969880e29809580efdaccd615cd3bed628a8c13";
};
beamDeps = [];
};
idna = buildRebar3 rec {
name = "idna";
version = "6.1.1";
src = fetchHex {
pkg = "idna";
version = "${version}";
sha256 = "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea";
};
beamDeps = [ unicode_util_compat ];
};
jason = buildMix rec {
name = "jason";
version = "1.4.1";
src = fetchHex {
pkg = "jason";
version = "${version}";
sha256 = "fbb01ecdfd565b56261302f7e1fcc27c4fb8f32d56eab74db621fc154604a7a1";
};
beamDeps = [ decimal ];
};
meck = buildRebar3 rec {
name = "meck";
version = "0.9.2";
src = fetchHex {
pkg = "meck";
version = "${version}";
sha256 = "81344f561357dc40a8344afa53767c32669153355b626ea9fcbc8da6b3045826";
};
beamDeps = [];
};
metrics = buildRebar3 rec {
name = "metrics";
version = "1.0.1";
src = fetchHex {
pkg = "metrics";
version = "${version}";
sha256 = "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16";
};
beamDeps = [];
};
mime = buildMix rec {
name = "mime";
version = "2.0.5";
src = fetchHex {
pkg = "mime";
version = "${version}";
sha256 = "da0d64a365c45bc9935cc5c8a7fc5e49a0e0f9932a761c55d6c52b142780a05c";
};
beamDeps = [];
};
mimerl = buildRebar3 rec {
name = "mimerl";
version = "1.2.0";
src = fetchHex {
pkg = "mimerl";
version = "${version}";
sha256 = "f278585650aa581986264638ebf698f8bb19df297f66ad91b18910dfc6e19323";
};
beamDeps = [];
};
mint = buildMix rec {
name = "mint";
version = "1.5.1";
src = fetchHex {
pkg = "mint";
version = "${version}";
sha256 = "4a63e1e76a7c3956abd2c72f370a0d0aecddc3976dea5c27eccbecfa5e7d5b1e";
};
beamDeps = [ castore hpax ];
};
mock = buildMix rec {
name = "mock";
version = "0.3.8";
src = fetchHex {
pkg = "mock";
version = "${version}";
sha256 = "7fa82364c97617d79bb7d15571193fc0c4fe5afd0c932cef09426b3ee6fe2022";
};
beamDeps = [ meck ];
};
nimble_csv = buildMix rec {
name = "nimble_csv";
version = "1.2.0";
src = fetchHex {
pkg = "nimble_csv";
version = "${version}";
sha256 = "d0628117fcc2148178b034044c55359b26966c6eaa8e2ce15777be3bbc91b12a";
};
beamDeps = [];
};
nimble_options = buildMix rec {
name = "nimble_options";
version = "1.0.2";
src = fetchHex {
pkg = "nimble_options";
version = "${version}";
sha256 = "fd12a8db2021036ce12a309f26f564ec367373265b53e25403f0ee697380f1b8";
};
beamDeps = [];
};
nimble_pool = buildMix rec {
name = "nimble_pool";
version = "1.0.0";
src = fetchHex {
pkg = "nimble_pool";
version = "${version}";
sha256 = "80be3b882d2d351882256087078e1b1952a28bf98d0a287be87e4a24a710b67a";
};
beamDeps = [];
};
parse_trans = buildRebar3 rec {
name = "parse_trans";
version = "3.4.1";
src = fetchHex {
pkg = "parse_trans";
version = "${version}";
sha256 = "620a406ce75dada827b82e453c19cf06776be266f5a67cff34e1ef2cbb60e49a";
};
beamDeps = [];
};
phoenix = buildMix rec {
name = "phoenix";
version = "1.6.16";
src = fetchHex {
pkg = "phoenix";
version = "${version}";
sha256 = "e15989ff34f670a96b95ef6d1d25bad0d9c50df5df40b671d8f4a669e050ac39";
};
beamDeps = [ castore jason phoenix_pubsub phoenix_view plug plug_cowboy plug_crypto telemetry ];
};
phoenix_ecto = buildMix rec {
name = "phoenix_ecto";
version = "4.4.3";
src = fetchHex {
pkg = "phoenix_ecto";
version = "${version}";
sha256 = "d36c401206f3011fefd63d04e8ef626ec8791975d9d107f9a0817d426f61ac07";
};
beamDeps = [ ecto phoenix_html plug ];
};
phoenix_html = buildMix rec {
name = "phoenix_html";
version = "3.3.3";
src = fetchHex {
pkg = "phoenix_html";
version = "${version}";
sha256 = "923ebe6fec6e2e3b3e569dfbdc6560de932cd54b000ada0208b5f45024bdd76c";
};
beamDeps = [ plug ];
};
phoenix_live_reload = buildMix rec {
name = "phoenix_live_reload";
version = "1.4.1";
src = fetchHex {
pkg = "phoenix_live_reload";
version = "${version}";
sha256 = "9bffb834e7ddf08467fe54ae58b5785507aaba6255568ae22b4d46e2bb3615ab";
};
beamDeps = [ file_system phoenix ];
};
phoenix_live_view = buildMix rec {
name = "phoenix_live_view";
version = "0.17.14";
src = fetchHex {
pkg = "phoenix_live_view";
version = "${version}";
sha256 = "afeb6ba43ce329a6f7fc1c9acdfc6d3039995345f025febb7f409a92f6faebd3";
};
beamDeps = [ jason phoenix phoenix_html telemetry ];
};
phoenix_pubsub = buildMix rec {
name = "phoenix_pubsub";
version = "2.1.3";
src = fetchHex {
pkg = "phoenix_pubsub";
version = "${version}";
sha256 = "bba06bc1dcfd8cb086759f0edc94a8ba2bc8896d5331a1e2c2902bf8e36ee502";
};
beamDeps = [];
};
phoenix_template = buildMix rec {
name = "phoenix_template";
version = "1.0.3";
src = fetchHex {
pkg = "phoenix_template";
version = "${version}";
sha256 = "16f4b6588a4152f3cc057b9d0c0ba7e82ee23afa65543da535313ad8d25d8e2c";
};
beamDeps = [ phoenix_html ];
};
phoenix_view = buildMix rec {
name = "phoenix_view";
version = "2.0.3";
src = fetchHex {
pkg = "phoenix_view";
version = "${version}";
sha256 = "cd34049af41be2c627df99cd4eaa71fc52a328c0c3d8e7d4aa28f880c30e7f64";
};
beamDeps = [ phoenix_html phoenix_template ];
};
plug = buildMix rec {
name = "plug";
version = "1.15.1";
src = fetchHex {
pkg = "plug";
version = "${version}";
sha256 = "459497bd94d041d98d948054ec6c0b76feacd28eec38b219ca04c0de13c79d30";
};
beamDeps = [ mime plug_crypto telemetry ];
};
plug_cowboy = buildMix rec {
name = "plug_cowboy";
version = "2.6.1";
src = fetchHex {
pkg = "plug_cowboy";
version = "${version}";
sha256 = "de36e1a21f451a18b790f37765db198075c25875c64834bcc82d90b309eb6613";
};
beamDeps = [ cowboy cowboy_telemetry plug ];
};
plug_crypto = buildMix rec {
name = "plug_crypto";
version = "1.2.5";
src = fetchHex {
pkg = "plug_crypto";
version = "${version}";
sha256 = "26549a1d6345e2172eb1c233866756ae44a9609bd33ee6f99147ab3fd87fd842";
};
beamDeps = [];
};
postgrex = buildMix rec {
name = "postgrex";
version = "0.17.3";
src = fetchHex {
pkg = "postgrex";
version = "${version}";
sha256 = "946cf46935a4fdca7a81448be76ba3503cff082df42c6ec1ff16a4bdfbfb098d";
};
beamDeps = [ db_connection decimal jason ];
};
ranch = buildRebar3 rec {
name = "ranch";
version = "1.8.0";
src = fetchHex {
pkg = "ranch";
version = "${version}";
sha256 = "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5";
};
beamDeps = [];
};
srtm = buildMix rec {
name = "srtm";
version = "0.8.0";
src = fetchHex {
pkg = "srtm";
version = "${version}";
sha256 = "7ec2a2ced7c3c0c1bdcfca67ce4d466d77e66cf52589f546c91b96b4c79b6923";
};
beamDeps = [ castore ];
};
ssl_verify_fun = buildRebar3 rec {
name = "ssl_verify_fun";
version = "1.1.7";
src = fetchHex {
pkg = "ssl_verify_fun";
version = "${version}";
sha256 = "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8";
};
beamDeps = [];
};
telemetry = buildRebar3 rec {
name = "telemetry";
version = "1.2.1";
src = fetchHex {
pkg = "telemetry";
version = "${version}";
sha256 = "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5";
};
beamDeps = [];
};
tesla = buildMix rec {
name = "tesla";
version = "1.8.0";
src = fetchHex {
pkg = "tesla";
version = "${version}";
sha256 = "10501f360cd926a309501287470372af1a6e1cbed0f43949203a4c13300bc79f";
};
beamDeps = [ castore finch fuse hackney jason mime mint telemetry ];
};
timex = buildMix rec {
name = "timex";
version = "3.7.11";
src = fetchHex {
pkg = "timex";
version = "${version}";
sha256 = "8b9024f7efbabaf9bd7aa04f65cf8dcd7c9818ca5737677c7b76acbc6a94d1aa";
};
beamDeps = [ combine gettext tzdata ];
};
tortoise = buildMix rec {
name = "tortoise";
version = "0.10.0";
src = fetchHex {
pkg = "tortoise";
version = "${version}";
sha256 = "926d97b03cd0d2f6e0e1ebf06c1efa50101de96d0317dea5604c1c9e43e66735";
};
beamDeps = [ gen_state_machine ];
};
tzdata = buildMix rec {
name = "tzdata";
version = "1.1.1";
src = fetchHex {
pkg = "tzdata";
version = "${version}";
sha256 = "a69cec8352eafcd2e198dea28a34113b60fdc6cb57eb5ad65c10292a6ba89787";
};
beamDeps = [ hackney ];
};
unicode_util_compat = buildRebar3 rec {
name = "unicode_util_compat";
version = "0.7.0";
src = fetchHex {
pkg = "unicode_util_compat";
version = "${version}";
sha256 = "25eee6d67df61960cf6a794239566599b09e17e668d3700247bc498638152521";
};
beamDeps = [];
};
websockex = buildMix rec {
name = "websockex";
version = "0.4.3";
src = fetchHex {
pkg = "websockex";
version = "${version}";
sha256 = "95f2e7072b85a3a4cc385602d42115b73ce0b74a9121d0d6dbbf557645ac53e4";
};
beamDeps = [];
};
};
in self