diff options
Diffstat (limited to 'nixops/modules/websites/tools/mastodon/mastodon.nix')
-rw-r--r-- | nixops/modules/websites/tools/mastodon/mastodon.nix | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/nixops/modules/websites/tools/mastodon/mastodon.nix b/nixops/modules/websites/tools/mastodon/mastodon.nix new file mode 100644 index 0000000..770aa2c --- /dev/null +++ b/nixops/modules/websites/tools/mastodon/mastodon.nix | |||
@@ -0,0 +1,129 @@ | |||
1 | { env, ruby_2_5, bundlerEnv, defaultGemConfig, fetchedGithub, stdenv, writeText, pkgs }: | ||
2 | let | ||
3 | varDir = "/var/lib/mastodon_immae"; | ||
4 | socketsDir = "/run/mastodon"; | ||
5 | gems = bundlerEnv { | ||
6 | name = "mastodon-env"; | ||
7 | ruby = ruby_2_5; | ||
8 | gemset = ./gemset.nix; | ||
9 | gemdir = (fetchedGithub ./mastodon.json).src; | ||
10 | groups = [ "default" "production" "test" "development" ]; | ||
11 | gemConfig = defaultGemConfig // { | ||
12 | cld3 = attrs: { | ||
13 | buildInputs = with pkgs; [ protobuf protobufc pkgconfig ]; | ||
14 | }; | ||
15 | idn-ruby = attrs: { | ||
16 | buildInputs = with pkgs; [ libidn ]; | ||
17 | }; | ||
18 | rpam2 = attrs: { | ||
19 | buildInputs = with pkgs; [ pam ]; | ||
20 | }; | ||
21 | }; | ||
22 | }; | ||
23 | yarnModules = let | ||
24 | info = fetchedGithub ./mastodon.json; | ||
25 | in | ||
26 | pkgs.yarn2nix.mkYarnModules { | ||
27 | name = "mastodon-yarn-modules"; | ||
28 | packageJSON = "${info.src}/package.json"; | ||
29 | yarnLock = "${info.src}/yarn.lock"; | ||
30 | yarnNix = ./yarn-packages.nix; | ||
31 | pkgConfig = { | ||
32 | uws = { | ||
33 | postInstall = '' | ||
34 | node-gyp rebuild > build_log.txt 2>&1 || true | ||
35 | ''; | ||
36 | buildInputs = with pkgs; [ nodePackages.node-gyp ]; | ||
37 | }; | ||
38 | node-zopfli = { | ||
39 | postInstall = '' | ||
40 | node-pre-gyp install --fallback-to-build | ||
41 | ''; | ||
42 | buildInputs = with pkgs; [ nodePackages.node-pre-gyp ]; | ||
43 | }; | ||
44 | node-sass = { | ||
45 | buildInputs = with pkgs; [ binutils libsass python ]; | ||
46 | postInstall = let | ||
47 | nodeHeaders = pkgs.fetchurl { | ||
48 | url = "https://nodejs.org/download/release/v${pkgs.nodejs.version}/node-v${pkgs.nodejs.version}-headers.tar.gz"; | ||
49 | sha256 = "12zzsf8my43b8qnlacp871ih5vqafl2vlpqp51xp6h3gckn2frwy"; | ||
50 | }; | ||
51 | in | ||
52 | '' | ||
53 | export AR=${pkgs.binutils.bintools}/bin/ar | ||
54 | node scripts/build.js --tarball=${nodeHeaders} | ||
55 | ''; | ||
56 | }; | ||
57 | }; | ||
58 | }; | ||
59 | mastodon = stdenv.mkDerivation (fetchedGithub ./mastodon.json // rec { | ||
60 | installPhase = '' | ||
61 | cp -a . $out | ||
62 | cp -a ${yarnModules}/node_modules $out | ||
63 | ''; | ||
64 | buildInputs = [ yarnModules gems ]; | ||
65 | }); | ||
66 | config = writeText "mastodon_environment" '' | ||
67 | REDIS_HOST=${env.redis.host} | ||
68 | REDIS_PORT=${env.redis.port} | ||
69 | REDIS_DB=${env.redis.db} | ||
70 | DB_HOST=${env.postgresql.socket} | ||
71 | DB_USER=${env.postgresql.user} | ||
72 | DB_NAME=${env.postgresql.database} | ||
73 | DB_PASS=${env.postgresql.password} | ||
74 | DB_PORT=${env.postgresql.port} | ||
75 | |||
76 | LOCAL_DOMAIN=mastodon.immae.eu | ||
77 | LOCAL_HTTPS=true | ||
78 | ALTERNATE_DOMAINS=immae.eu | ||
79 | |||
80 | PAPERCLIP_SECRET=${env.paperclip_secret} | ||
81 | SECRET_KEY_BASE=${env.secret_key_base} | ||
82 | OTP_SECRET=${env.otp_secret} | ||
83 | |||
84 | VAPID_PRIVATE_KEY=${env.vapid.private} | ||
85 | VAPID_PUBLIC_KEY=${env.vapid.public} | ||
86 | |||
87 | SMTP_SERVER=mail.immae.eu | ||
88 | SMTP_PORT=587 | ||
89 | SMTP_FROM_ADDRESS=notifications@mastodon.immae.eu | ||
90 | SMTP_DELIVERY_METHOD=smtp | ||
91 | PAPERCLIP_ROOT_PATH=${varDir} | ||
92 | |||
93 | STREAMING_CLUSTER_NUM=1 | ||
94 | |||
95 | # LDAP authentication (optional) | ||
96 | LDAP_ENABLED=true | ||
97 | LDAP_HOST=ldap.immae.eu | ||
98 | LDAP_PORT=636 | ||
99 | LDAP_METHOD=simple_tls | ||
100 | LDAP_BASE="dc=immae,dc=eu" | ||
101 | LDAP_BIND_DN="cn=mastodon,ou=services,dc=immae,dc=eu" | ||
102 | LDAP_PASSWORD="${env.ldap.password}" | ||
103 | LDAP_UID="uid" | ||
104 | LDAP_SEARCH_FILTER="(&(%{uid}=%{email})(memberOf=cn=users,cn=mastodon,ou=services,dc=immae,dc=eu))" | ||
105 | ''; | ||
106 | |||
107 | railsRoot = stdenv.mkDerivation { | ||
108 | name = "mastodon_immae"; | ||
109 | inherit config mastodon; | ||
110 | builder = writeText "build_mastodon_immae" '' | ||
111 | source $stdenv/setup | ||
112 | set -a | ||
113 | source $config | ||
114 | set +a | ||
115 | cp -a $mastodon $out | ||
116 | cd $out | ||
117 | chmod u+rwX . public | ||
118 | RAILS_ENV=production ${gems}/bin/rails assets:precompile | ||
119 | rm -rf tmp/cache | ||
120 | ln -sf ../../../../../../../${varDir}/tmp/cache tmp | ||
121 | ''; | ||
122 | buildInputs = [ gems gems.ruby pkgs.nodejs pkgs.yarn ]; | ||
123 | }; | ||
124 | in | ||
125 | { | ||
126 | inherit railsRoot config varDir socketsDir gems; | ||
127 | nodeSocket = "${socketsDir}/live_immae_node.sock"; | ||
128 | railsSocket = "${socketsDir}/live_immae_puma.sock"; | ||
129 | } | ||