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