1{
2 lib,
3 python313,
4 fetchFromGitLab,
5 fetchPypi,
6 callPackage,
7 stdenv,
8 makeWrapper,
9 nixosTests,
10}:
11
12let
13 python = python313.override {
14 self = python;
15 packageOverrides = final: prev: {
16 django = final.django_5_2;
17 django-csp = prev.django-csp.overridePythonAttrs rec {
18 version = "4.0";
19 src = fetchPypi {
20 inherit version;
21 pname = "django_csp";
22 hash = "sha256-snAQu3Ausgo9rTKReN8rYaK4LTOLcPvcE8OjvShxKDM=";
23 };
24 };
25 django-ninja-cursor-pagination = prev.django-ninja-cursor-pagination.overridePythonAttrs {
26 # checks are failing with django 5
27 doCheck = false;
28 };
29 };
30 };
31
32 pythonPackages =
33 with python.pkgs;
34 [
35 aiohttp
36 anonymizeip
37 boto3
38 brotli
39 celery
40 celery-batches
41 cxxfilt
42 django
43 django-allauth
44 django-anymail
45 django-cors-headers
46 django-csp
47 django-environ
48 django-extensions
49 django-import-export
50 django-ipware
51 django-ninja
52 django-ninja-cursor-pagination
53 django-organizations
54 django-postgres-partition
55 django-prometheus
56 django-redis
57 django-storages
58 google-cloud-logging
59 gunicorn
60 orjson
61 psycopg
62 pydantic
63 # undocumented on django-allauth side
64 # https://codeberg.org/allauth/django-allauth/issues/4493
65 pyyaml
66 sentry-sdk
67 symbolic
68 user-agents
69 uvicorn
70 uwsgi-chunked
71 whitenoise
72 ]
73 ++ celery.optional-dependencies.redis
74 ++ django-allauth.optional-dependencies.mfa
75 ++ django-allauth.optional-dependencies.socialaccount
76 ++ django-redis.optional-dependencies.hiredis
77 ++ django-storages.optional-dependencies.boto3
78 ++ django-storages.optional-dependencies.azure
79 ++ django-storages.optional-dependencies.google
80 ++ psycopg.optional-dependencies.c
81 ++ psycopg.optional-dependencies.pool
82 ++ pydantic.optional-dependencies.email;
83
84 frontend = callPackage ./frontend.nix { };
85in
86
87stdenv.mkDerivation (finalAttrs: {
88 pname = "glitchtip";
89 version = "5.0.9";
90 pyproject = true;
91
92 src = fetchFromGitLab {
93 owner = "glitchtip";
94 repo = "glitchtip-backend";
95 tag = "v${finalAttrs.version}";
96 hash = "sha256-yRXrcwE5DDJpDiX4XB18ezrLn62AV4w/ASvrOoKD6p4=";
97 };
98
99 propagatedBuildInputs = pythonPackages;
100
101 nativeBuildInputs = [
102 makeWrapper
103 python
104 ];
105
106 buildPhase = ''
107 runHook preBuild
108
109 export DEBUG=0
110 export DEBUG_TOOLBAR=0
111
112 ln -s ${finalAttrs.passthru.frontend} dist
113 python3 manage.py collectstatic
114
115 runHook postBuild
116 '';
117
118 installPhase = ''
119 runHook preInstall
120
121 mkdir -p $out/lib
122 cp -r . $out/lib/glitchtip
123 chmod +x $out/lib/glitchtip/manage.py
124 makeWrapper $out/lib/glitchtip/manage.py $out/bin/glitchtip-manage \
125 --prefix PYTHONPATH : "$PYTHONPATH"
126
127 runHook postInstall
128 '';
129
130 passthru = {
131 inherit frontend python;
132 tests = { inherit (nixosTests) glitchtip; };
133 updateScript = ./update.sh;
134 };
135
136 meta = {
137 description = "Open source Sentry API compatible error tracking platform";
138 homepage = "https://glitchtip.com";
139 changelog = "https://gitlab.com/glitchtip/glitchtip-backend/-/blob/v${finalAttrs.version}/CHANGELOG";
140 license = lib.licenses.mit;
141 maintainers = with lib.maintainers; [
142 defelo
143 felbinger
144 ];
145 mainProgram = "glitchtip-manage";
146 };
147})