]> git.immae.eu Git - perso/Immae/Config/Nix.git/blame - nixops/modules/websites/tools/mediagoblin/mediagoblin.nix
Cleanup e-mails from immae.eu domains
[perso/Immae/Config/Nix.git] / nixops / modules / websites / tools / mediagoblin / mediagoblin.nix
CommitLineData
587b9e34 1{ env, makeWrapper, stdenv, writeText, fetchurl, buildBowerComponents, fetchedGit, fetchedGithub, which, python36, pkgs, automake, autoconf, nodejs, nodePackages, git, cacert }:
56eba416
IB
2let
3 plugins = {
4 basicsearch = stdenv.mkDerivation (fetchedGithub ./mediagoblin-plugin-basicsearch.json // rec {
5 phases = "unpackPhase installPhase";
6 installPhase = ''
7 cp -R . $out
8 '';
9 });
10 };
11 overridePython = let
12 packageOverrides = self: super: {
13 celery = super.celery.overridePythonAttrs(old: rec {
14 version = "3.1.26.post2";
15 src = self.fetchPypi {
16 inherit version;
17 inherit (old) pname;
18 sha256 = "5493e172ae817b81ba7d09443ada114886765a8ce02f16a56e6fac68d953a9b2";
19 };
20 patches = [];
21 doCheck = false;
22 });
23 billiard = super.billiard.overridePythonAttrs(old: rec {
24 version = "3.3.0.23";
25 src = self.fetchPypi {
26 inherit version;
27 inherit (old) pname;
28 sha256 = "02wxsc6bhqvzh8j6w758kvgqbnj14l796mvmrcms8fgfamd2lak9";
29 };
30 });
31 amqp = super.amqp.overridePythonAttrs(old: rec {
32 version = "1.4.9";
33 src = self.fetchPypi {
34 inherit version;
35 inherit (old) pname;
36 sha256 = "2dea4d16d073c902c3b89d9b96620fb6729ac0f7a923bbc777cb4ad827c0c61a";
37 };
38 });
39 kombu = super.kombu.overridePythonAttrs(old: rec {
40 version = "3.0.37";
41 src = self.fetchPypi {
42 inherit version;
43 inherit (old) pname;
44 sha256 = "e064a00c66b4d1058cd2b0523fb8d98c82c18450244177b6c0f7913016642650";
45 };
46 propagatedBuildInputs = old.propagatedBuildInputs ++ [ self.anyjson ];
47 doCheck = false;
48 });
49 sqlalchemy = super.sqlalchemy.overridePythonAttrs(old: rec {
50 version = "1.1.18";
51 src = self.fetchPypi {
52 inherit version;
53 inherit (old) pname;
54 sha256 = "8b0ec71af9291191ba83a91c03d157b19ab3e7119e27da97932a4773a3f664a9";
55 };
56 });
57 tempita_5_3_dev = super.buildPythonPackage (fetchedGithub ./tempita.json // rec {
58 buildInputs = with self; [ nose ];
59 disabled = false;
60 });
61 sqlalchemy_migrate = super.sqlalchemy_migrate.overridePythonAttrs(old: rec {
62 propagatedBuildInputs = with self; [ pbr tempita_5_3_dev decorator sqlalchemy six sqlparse ];
63 });
64 pasteScript = super.pasteScript.overridePythonAttrs(old: rec {
65 version = "2.0.2";
66 name = "PasteScript-${version}";
67 src = fetchurl {
68 url = "mirror://pypi/P/PasteScript/${name}.tar.gz";
69 sha256 = "1h3nnhn45kf4pbcv669ik4faw04j58k8vbj1hwrc532k0nc28gy0";
70 };
587b9e34 71 propagatedBuildInputs = with self; [ six paste PasteDeploy ];
56eba416
IB
72 });
73 };
74 in
587b9e34 75 python36.override { inherit packageOverrides; };
56eba416
IB
76 pythonEnv = python-pkgs: with python-pkgs; [
77 waitress alembic dateutil wtforms pybcrypt
78 pytest pytest_xdist werkzeug celery
79 kombu jinja2 Babel webtest configobj markdown
80 sqlalchemy itsdangerous pytz sphinx six
81 oauthlib unidecode jsonschema PasteDeploy
82 requests PyLD exifread
587b9e34 83 typing pasteScript lxml
56eba416
IB
84 # For images plugin
85 pillow
86 # For video plugin
87 gst-python
88 # migrations
89 sqlalchemy_migrate
90 # authentication
91 ldap3
92 redis
93 psycopg2
94 ];
95 python = overridePython.withPackages pythonEnv;
96 gmg = writeText "gmg" ''
97 #!${python}/bin/python
98 __requires__ = 'mediagoblin'
99 import sys
100 from pkg_resources import load_entry_point
101
102 if __name__ == '__main__':
103 sys.exit(
104 load_entry_point('mediagoblin', 'console_scripts', 'gmg')()
105 )
106 '';
107in
108 rec {
109 socketsDir = "/run/mediagoblin";
110 varDir = "/var/lib/mediagoblin";
bb3210df
IB
111 bowerComponents = buildBowerComponents {
112 name = "mediagoblin-bower-components";
113 generated = ./bower-packages.nix;
114 src = (fetchedGit ./mediagoblin.json).src;
115 };
56eba416
IB
116 mediagoblin = stdenv.mkDerivation (fetchedGit ./mediagoblin.json // rec {
117 preConfigure = ''
118 # ./bootstrap.sh
119 aclocal -I m4 --install
120 autoreconf -fvi
121 # end
122 export GIT_SSL_CAINFO=${cacert}/etc/ssl/certs/ca-bundle.crt
123 export SSL_CERT_FILE=${cacert}/etc/ssl/certs/ca-bundle.crt
124 export HOME=$PWD
125 '';
126 configureFlags = [ "--with-python3" "--without-virtualenv" ];
127 postBuild = ''
bb3210df
IB
128 cp -a ${bowerComponents}/bower_components/* extlib
129 chmod -R u+w extlib
56eba416
IB
130 make extlib
131 '';
132 installPhase = ''
133 sed -i "s/registry.has_key(current_theme_name)/current_theme_name in registry/" mediagoblin/tools/theme.py
134 sed -i -e "s@\[DEFAULT\]@[DEFAULT]\nhere = $out@" mediagoblin/config_spec.ini
135 cp ${./ldap_fix.py} mediagoblin/plugins/ldap/tools.py
136 ln -s ${plugins.basicsearch}/basicsearch mediagoblin/plugins/basicsearch
137 find . -name '*.pyc' -delete
138 find . -type f -exec sed -i "s|$PWD|$out|g" {} \;
139 python setup.py build
140 cp -a . $out
141 mkdir $out/bin
142 cp ${gmg} $out/bin/gmg
143 chmod a+x $out/bin/gmg
144 '';
145 buildInputs = [ makeWrapper git cacert automake autoconf which nodePackages.bower nodejs python ];
146 propagatedBuildInputs = [ python ];
147 });
148 paste_local = writeText "paste_local.ini" ''
149 [DEFAULT]
150 debug = false
151
152 [pipeline:main]
153 pipeline = mediagoblin
154
155 [app:mediagoblin]
156 use = egg:mediagoblin#app
157 config = %(here)s/mediagoblin_local.ini %(here)s/mediagoblin.ini
158 /mgoblin_static = %(here)s/mediagoblin/static
159
160 [loggers]
161 keys = root
162
163 [handlers]
164 keys = console
165
166 [formatters]
167 keys = generic
168
169 [logger_root]
170 level = INFO
171 handlers = console
172
173 [handler_console]
174 class = StreamHandler
175 args = (sys.stderr,)
176 level = NOTSET
177 formatter = generic
178
179 [formatter_generic]
180 format = %(levelname)-7.7s [%(name)s] %(message)s
181
182 [filter:errors]
183 use = egg:mediagoblin#errors
184 debug = false
185
186 [server:main]
187 use = egg:waitress#main
188 unix_socket = ${socketsDir}/mediagoblin.sock
189 unix_socket_perms = 777
190 url_scheme = https
191 '';
192
9d90e7e2 193 mediagoblin_local = writeText "mediagoblin_local.ini" ''
56eba416
IB
194 [DEFAULT]
195 data_basedir = "${varDir}"
196
197 [mediagoblin]
198 direct_remote_path = /mgoblin_static/
0f466f6d 199 email_sender_address = "mediagoblin@tools.immae.eu"
56eba416
IB
200
201 #sql_engine = sqlite:///%(data_basedir)s/mediagoblin.db
9d90e7e2 202 sql_engine = ${env.psql_url}
56eba416
IB
203
204 email_debug_mode = false
205 allow_registration = false
206 allow_reporting = true
207
208 theme = airymodified
209
210 user_privilege_scheme = "uploader,commenter,reporter"
211
212 # We need to redefine them here since we override data_basedir
213 # cf /usr/share/webapps/mediagoblin/mediagoblin/config_spec.ini
214 workbench_path = %(data_basedir)s/media/workbench
215 crypto_path = %(data_basedir)s/crypto
216 theme_install_dir = %(data_basedir)s/themes/
217 theme_linked_assets_dir = %(data_basedir)s/theme_static/
218 plugin_linked_assets_dir = %(data_basedir)s/plugin_static/
219
220 [storage:queuestore]
221 base_dir = %(data_basedir)s/media/queue
222
223 [storage:publicstore]
224 base_dir = %(data_basedir)s/media/public
225 base_url = /mgoblin_media/
226
227 [celery]
b0781dbc
IB
228 CELERY_RESULT_DBURI = ${env.redis_url}
229 BROKER_URL = ${env.redis_url}
56eba416
IB
230 CELERYD_CONCURRENCY = 1
231
232 [plugins]
233 [[mediagoblin.plugins.geolocation]]
234 [[mediagoblin.plugins.ldap]]
235 [[[immae.eu]]]
236 LDAP_SERVER_URI = 'ldaps://ldap.immae.eu:636'
237 LDAP_SEARCH_BASE = 'dc=immae,dc=eu'
238 LDAP_BIND_DN = 'cn=mediagoblin,ou=services,dc=immae,dc=eu'
9d90e7e2 239 LDAP_BIND_PW = '${env.ldap.password}'
56eba416
IB
240 LDAP_SEARCH_FILTER = '(&(memberOf=cn=users,cn=mediagoblin,ou=services,dc=immae,dc=eu)(uid={username}))'
241 EMAIL_SEARCH_FIELD = 'mail'
242 [[mediagoblin.plugins.basicsearch]]
243 [[mediagoblin.plugins.piwigo]]
244 [[mediagoblin.plugins.processing_info]]
245 [[mediagoblin.media_types.image]]
246 [[mediagoblin.media_types.video]]
247 '';
248 pythonRoot =
249 with pkgs.gst_all_1;
250 stdenv.mkDerivation {
251 name = "mediagoblin_immae";
252 inherit mediagoblin;
253 buildInputs= [ makeWrapper ];
254 propagatedBuildInputs = [ gst-libav gst-plugins-good gst-plugins-bad gst-plugins-ugly gstreamer ];
255 builder = let
256 libpaths = [
257 python
258 gstreamer
259 gst-plugins-base
260 gst-libav
261 gst-plugins-good
262 gst-plugins-bad
263 gst-plugins-ugly
264 ];
265 plugin_paths = builtins.concatStringsSep ":" (map (x: "${x}/lib") libpaths);
266 typelib_paths = "${gstreamer}/lib/girepository-1.0:${gst-plugins-base}/lib/girepository-1.0";
267 in writeText "build_mediagoblin_immae" ''
268 source $stdenv/setup
269 cp -a $mediagoblin $out
270 cd $out
271 chmod -R u+rwX .
272 sed -i -e "/from gi.repository import GstPbutils/s/^/gi.require_version('GstPbutils', '1.0')\n/" mediagoblin/media_types/video/transcoders.py
273 wrapProgram bin/gmg --prefix PYTHONPATH : "$out:$PYTHONPATH" \
274 --prefix GST_PLUGIN_SYSTEM_PATH : ${plugin_paths} \
275 --prefix GI_TYPELIB_PATH : ${typelib_paths}
276 makeWrapper ${python}/bin/paster bin/paster --prefix PYTHONPATH : "$out:$PYTHONPATH" \
277 --prefix GST_PLUGIN_SYSTEM_PATH : ${plugin_paths} \
278 --prefix GI_TYPELIB_PATH : ${typelib_paths}
279 makeWrapper ${python}/bin/celery bin/celery --prefix PYTHONPATH : "$out:$PYTHONPATH" \
280 --prefix GST_PLUGIN_SYSTEM_PATH : ${plugin_paths} \
281 --prefix GI_TYPELIB_PATH : ${typelib_paths}
282 find . -type f -exec sed -i "s|$mediagoblin|$out|g" {} \;
283 ln -s ${paste_local} ./paste_local.ini
284 ln -s ${mediagoblin_local} ./mediagoblin_local.ini
3c8d7f87 285 ln -sf ${varDir} ./user_dev
56eba416
IB
286 '';
287 };
288 }