1{ lib, ... }:
2
3let
4 db-pass = "Test2Test2";
5 app-key = "TestTestTestTestTestTestTestTest";
6in
7{
8 name = "firefly-iii";
9 meta = {
10 maintainers = [ lib.maintainers.savyajha ];
11 platforms = lib.platforms.linux;
12 };
13
14 nodes.fireflySqlite =
15 { config, ... }:
16 {
17 environment.etc = {
18 "firefly-iii-appkey".text = app-key;
19 };
20 services.firefly-iii = {
21 enable = true;
22 enableNginx = true;
23 settings = {
24 APP_KEY_FILE = "/etc/firefly-iii-appkey";
25 LOG_CHANNEL = "stdout";
26 SITE_OWNER = "mail@example.com";
27 };
28 };
29 };
30
31 nodes.fireflyPostgresql =
32 { config, pkgs, ... }:
33 {
34 environment.etc = {
35 "firefly-iii-appkey".text = app-key;
36 "postgres-pass".text = db-pass;
37 };
38 services.firefly-iii = {
39 enable = true;
40 enableNginx = true;
41 settings = {
42 APP_KEY_FILE = "/etc/firefly-iii-appkey";
43 LOG_CHANNEL = "stdout";
44 SITE_OWNER = "mail@example.com";
45 DB_CONNECTION = "pgsql";
46 DB_DATABASE = "firefly";
47 DB_USERNAME = "firefly";
48 DB_PASSWORD_FILE = "/etc/postgres-pass";
49 PGSQL_SCHEMA = "firefly";
50 };
51 };
52
53 services.postgresql = {
54 enable = true;
55 package = pkgs.postgresql_16;
56 authentication = ''
57 local all postgres peer
58 local firefly firefly password
59 '';
60 initialScript = pkgs.writeText "firefly-init.sql" ''
61 CREATE USER "firefly" WITH LOGIN PASSWORD '${db-pass}';
62 CREATE DATABASE "firefly" WITH OWNER "firefly";
63 \c firefly
64 CREATE SCHEMA AUTHORIZATION firefly;
65 '';
66 };
67 };
68
69 nodes.fireflyMysql =
70 { config, pkgs, ... }:
71 {
72 environment.etc = {
73 "firefly-iii-appkey".text = app-key;
74 "mysql-pass".text = db-pass;
75 };
76 services.firefly-iii = {
77 enable = true;
78 enableNginx = true;
79 settings = {
80 APP_KEY_FILE = "/etc/firefly-iii-appkey";
81 LOG_CHANNEL = "stdout";
82 SITE_OWNER = "mail@example.com";
83 DB_CONNECTION = "mysql";
84 DB_DATABASE = "firefly";
85 DB_USERNAME = "firefly";
86 DB_PASSWORD_FILE = "/etc/mysql-pass";
87 DB_SOCKET = "/run/mysqld/mysqld.sock";
88 };
89 };
90
91 services.mysql = {
92 enable = true;
93 package = pkgs.mariadb;
94 initialScript = pkgs.writeText "firefly-init.sql" ''
95 create database firefly DEFAULT CHARACTER SET utf8mb4;
96 create user 'firefly'@'localhost' identified by '${db-pass}';
97 grant all on firefly.* to 'firefly'@'localhost';
98 '';
99 settings.mysqld.character-set-server = "utf8mb4";
100 };
101 };
102
103 testScript = ''
104 fireflySqlite.wait_for_unit("phpfpm-firefly-iii.service")
105 fireflySqlite.wait_for_unit("nginx.service")
106 fireflySqlite.succeed("curl -fvvv -Ls http://localhost/ | grep 'Firefly III'")
107 fireflySqlite.succeed("curl -fvvv -Ls http://localhost/v1/js/app.js")
108 fireflySqlite.succeed("systemctl start firefly-iii-cron.service")
109 fireflyPostgresql.wait_for_unit("phpfpm-firefly-iii.service")
110 fireflyPostgresql.wait_for_unit("nginx.service")
111 fireflyPostgresql.wait_for_unit("postgresql.target")
112 fireflyPostgresql.succeed("curl -fvvv -Ls http://localhost/ | grep 'Firefly III'")
113 fireflyPostgresql.succeed("systemctl start firefly-iii-cron.service")
114 fireflyMysql.wait_for_unit("phpfpm-firefly-iii.service")
115 fireflyMysql.wait_for_unit("nginx.service")
116 fireflyMysql.wait_for_unit("mysql.service")
117 fireflyMysql.succeed("curl -fvvv -Ls http://localhost/ | grep 'Firefly III'")
118 fireflyMysql.succeed("systemctl start firefly-iii-cron.service")
119 '';
120}