lol
1{
2 stdenvNoCC,
3 lib,
4 nixosTests,
5 fetchFromGitHub,
6 applyPatches,
7 bundlerEnv,
8 callPackage,
9 procps,
10 ruby,
11 postgresql,
12 jq,
13 moreutils,
14 nodejs,
15 pnpm_9,
16 cacert,
17 valkey,
18 dataDir ? "/var/lib/zammad",
19}:
20
21let
22 pname = "zammad";
23 version = "6.5.2";
24
25 src = applyPatches {
26 src = fetchFromGitHub (lib.importJSON ./source.json);
27 patches = [
28 ./fix-sendmail-location.diff
29 ];
30
31 postPatch = ''
32 sed -i -e "s|ruby '3.2.[0-9]\+'|ruby '${ruby.version}'|" Gemfile
33 sed -i -e "s|ruby 3.2.[0-9]\+p[0-9]\+|ruby ${ruby.version}|" Gemfile.lock
34 sed -i -e "s|3.2.[0-9]\+|${ruby.version}|" .ruby-version
35 ${jq}/bin/jq '. += {name: "Zammad", version: "${version}"}' package.json | ${moreutils}/bin/sponge package.json
36 '';
37 };
38
39 rubyEnv = bundlerEnv {
40 name = "zammad-gems-${version}";
41 inherit version;
42
43 # Which ruby version to select:
44 # https://docs.zammad.org/en/latest/prerequisites/software.html#ruby-programming-language
45 inherit ruby;
46
47 gemdir = src;
48 gemset = ./gemset.nix;
49 groups = [
50 "assets"
51 "unicorn" # server
52 "test"
53 "mysql"
54 "puma"
55 "development"
56 "postgres" # database
57 ];
58 };
59
60in
61stdenvNoCC.mkDerivation {
62 inherit pname version src;
63
64 buildInputs = [
65 rubyEnv
66 rubyEnv.wrappedRuby
67 rubyEnv.bundler
68 ];
69
70 nativeBuildInputs = [
71 valkey
72 postgresql
73 pnpm_9.configHook
74 nodejs
75 procps
76 cacert
77 ];
78
79 env.RAILS_ENV = "production";
80
81 pnpmDeps = pnpm_9.fetchDeps {
82 inherit pname src;
83
84 fetcherVersion = 1;
85 hash = "sha256-mfdzb/LXQYL8kaQpWi9wD3OOroOOonDlJrhy9Dwl1no";
86 };
87
88 buildPhase = ''
89 mkdir redis-work
90 pushd redis-work
91 redis-server &
92 REDIS_PID=$!
93 popd
94
95 mkdir postgres-work
96 initdb -D postgres-work --encoding=utf8
97 pg_ctl start -D postgres-work -o "-k $PWD/postgres-work -h '''"
98 createuser -h $PWD/postgres-work zammad -R -S
99 createdb -h $PWD/postgres-work --encoding=utf8 --owner=zammad zammad
100
101 rake DATABASE_URL="postgresql:///zammad?host=$PWD/postgres-work" assets:precompile
102
103 kill $REDIS_PID
104 pg_ctl stop -D postgres-work -m immediate
105 rm -r redis-work postgres-work
106 '';
107
108 installPhase = ''
109 cp -R . $out
110 rm -rf $out/config/database.yml $out/config/secrets.yml $out/tmp $out/log
111 # dataDir will be set in the module, and the package gets overriden there
112 ln -s ${dataDir}/config/database.yml $out/config/database.yml
113 ln -s ${dataDir}/config/secrets.yml $out/config/secrets.yml
114 ln -s ${dataDir}/tmp $out/tmp
115 ln -s ${dataDir}/log $out/log
116 '';
117
118 passthru = {
119 inherit rubyEnv;
120 updateScript = [
121 "${callPackage ./update.nix { }}/bin/update.sh"
122 pname
123 (toString ./.)
124 ];
125 tests = {
126 inherit (nixosTests) zammad;
127 };
128 };
129
130 meta = {
131 description = "Web-based, open source user support/ticketing solution";
132 homepage = "https://zammad.org";
133 license = lib.licenses.agpl3Plus;
134 platforms = [
135 "x86_64-linux"
136 "aarch64-linux"
137 ];
138 maintainers = with lib.maintainers; [
139 taeer
140 netali
141 ];
142 };
143}