init: ulogger
This commit is contained in:
		
							parent
							
								
									669bf7f423
								
							
						
					
					
						commit
						042c8dcec9
					
				
							
								
								
									
										117
									
								
								hosts/profiles/ulogger-server/default.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								hosts/profiles/ulogger-server/default.nix
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,117 @@ | |||
| { self, pkgs, config, lib, ... }: | ||||
| 
 | ||||
| { | ||||
|   services.postgresql = { | ||||
|     ensureDatabases = [ "ulogger" ]; | ||||
|     ensureUsers = [{ | ||||
|       name = "ulogger"; | ||||
|       ensurePermissions = { | ||||
|         "DATABASE ulogger" = "ALL PRIVILEGES"; | ||||
|       }; | ||||
|     }]; | ||||
|   }; | ||||
| 
 | ||||
|   services.ulogger = { | ||||
|     enable = true; | ||||
|     hostName = "tracks.mossnet.lan"; | ||||
|     conf = '' | ||||
|       <?php | ||||
|       /* μlogger | ||||
|        * | ||||
|        * Copyright(C) 2017 Bartek Fabiszewski (www.fabiszewski.net) | ||||
|        * | ||||
|        * This is free software; you can redistribute it and/or modify it under | ||||
|        * the terms of the GNU General Public License as published by | ||||
|        * the Free Software Foundation; either version 3 of the License, or | ||||
|        * (at your option) any later version. | ||||
|        * | ||||
|        * This program is distributed in the hope that it will be useful, but | ||||
|        * WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|        * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|        * General Public License for more details. | ||||
|        * | ||||
|        * You should have received a copy of the GNU General Public License | ||||
|        * along with this program; if not, see <http://www.gnu.org/licenses/>. | ||||
|        */ | ||||
| 
 | ||||
|       // This is default configuration file. | ||||
|       // Copy it to config.php and customize | ||||
| 
 | ||||
|       // default map drawing framework | ||||
|       // (gmaps = google maps, openlayers = openlayers/osm) | ||||
|       //$mapapi = "gmaps"; | ||||
|       $mapapi = "openlayers"; | ||||
| 
 | ||||
|       // openlayers additional map layers | ||||
|       // OpenCycleMap (0 = no, 1 = yes) | ||||
|       $layer_ocm = 1; | ||||
|       // MapQuest-OSM (0 = no, 1 = yes) | ||||
|       $layer_mq = 1; | ||||
|       // osmapa.pl (0 = no, 1 = yes) | ||||
|       $layer_osmapa = 1; | ||||
|       // UMP (0 = no, 1 = yes) | ||||
|       $layer_ump = 1; | ||||
| 
 | ||||
|       // default coordinates for initial map | ||||
|       $init_latitude = 52.23; | ||||
|       $init_longitude = 21.01; | ||||
| 
 | ||||
|       // you may set your google maps api key | ||||
|       // this is not obligatory by now | ||||
|       //$gkey = ""; | ||||
| 
 | ||||
|       // MySQL config | ||||
|       $dbhost = "localhost"; // mysql host, eg. localhost | ||||
|       $dbuser = "ulogger"; // database user | ||||
|       $dbpass = ""; // database pass | ||||
|       $dbname = "ulogger"; // database name | ||||
|       $dbprefix = ""; // optional table names prefix, eg. "ulogger_" | ||||
| 
 | ||||
|       // other | ||||
|       // require login/password authentication | ||||
|       // (0 = no, 1 = yes) | ||||
|       $require_authentication = 0; | ||||
| 
 | ||||
|       // all users tracks are visible to authenticated user | ||||
|       // (0 = no, 1 = yes) | ||||
|       $public_tracks = 0; | ||||
| 
 | ||||
|       // admin user, who | ||||
|       // - can add new users | ||||
|       // - can edit all tracks, users | ||||
|       // - has access to all users locations | ||||
|       // none if empty | ||||
|       $admin_user = "admin"; | ||||
| 
 | ||||
|       // miniumum required length of user password | ||||
|       $pass_lenmin = 12; | ||||
| 
 | ||||
|       // required strength of user password | ||||
|       //   0 = no requirements, | ||||
|       //   1 = require mixed case letters (lower and upper), | ||||
|       //   2 = require mixed case and numbers, | ||||
|       //   3 = require mixed case, numbers and non-alphanumeric characters | ||||
|       $pass_strength = 0; | ||||
| 
 | ||||
|       // Default interval in seconds for live auto reload | ||||
|       $interval = 10; | ||||
| 
 | ||||
|       // Default language | ||||
|       // (en, pl, de, hu) | ||||
|       $lang = "en"; | ||||
|       //$lang = "pl"; | ||||
|       //$lang = "de"; | ||||
|       //$lang = "hu"; | ||||
|       //$lang = "fr"; | ||||
|       //$lang = "it"; | ||||
| 
 | ||||
|       // units | ||||
|       // (metric, imperial) | ||||
|       $units = "metric"; | ||||
|       //$units = "imperial"; | ||||
| 
 | ||||
|       ?> | ||||
| 
 | ||||
|     ''; | ||||
|   }; | ||||
| } | ||||
							
								
								
									
										282
									
								
								modules/nixos/ulogger.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										282
									
								
								modules/nixos/ulogger.nix
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,282 @@ | |||
| { config, options, lib, pkgs, ... }: | ||||
| 
 | ||||
| with lib; | ||||
| let | ||||
|   cfg = config.services.ulogger; | ||||
| 
 | ||||
|   poolName = "ulogger"; | ||||
| 
 | ||||
|   configFile = pkgs.writeTextFile { | ||||
|     name = "ulogger-config"; | ||||
|     text = cfg.conf; | ||||
|     destination = "config.php"; | ||||
|   }; | ||||
| 
 | ||||
|   appDir = pkgs.buildEnv { | ||||
|     name = "ulogger-app-dir"; | ||||
|     ignoreCollisions = true; | ||||
|     checkCollisionContents = false; | ||||
|     paths = [ configFile "${cfg.package}/app" ]; | ||||
|   }; | ||||
| 
 | ||||
| in | ||||
| { | ||||
|   options = { | ||||
|     services.ulogger = { | ||||
|       enable = mkEnableOption "ulogger"; | ||||
|       user = mkOption { | ||||
|         type = types.str; | ||||
|         default = "nginx"; | ||||
|         description = '' | ||||
|           User account under which both the update daemon and the web-application run. | ||||
|         ''; | ||||
|       }; | ||||
|       dataDir = mkOption { | ||||
|         type = types.path; | ||||
|         default = "/var/lib/ulogger"; | ||||
|         description = '' | ||||
|           Data directory. | ||||
|         ''; | ||||
|       }; | ||||
| 
 | ||||
|       package = mkOption { | ||||
|         type = types.package; | ||||
|         default = pkgs.ulogger-server; | ||||
|         description = '' | ||||
|           ulogger-server package to use. | ||||
|         ''; | ||||
|       }; | ||||
| 
 | ||||
|       hostName = mkOption { | ||||
|         type = types.str; | ||||
|         description = '' | ||||
|           Name of the nginx virtualhost to use and setup. | ||||
|         ''; | ||||
|       }; | ||||
| 
 | ||||
|       poolConfig = mkOption { | ||||
|         type = types.lines; | ||||
|         default = '' | ||||
|           pm = dynamic | ||||
|           pm.max_children = 75 | ||||
|           pm.start_servers = 1 | ||||
|           pm.min_spare_servers = 1 | ||||
|           pm.max_spare_servers = 20 | ||||
|           pm.max_requests = 500 | ||||
|           catch_workers_output = 1 | ||||
|         ''; | ||||
|         description = '' | ||||
|           Options for uloggers's PHP pool. See the documentation on <literal>php-fpm.conf</literal> for details on configuration directives. | ||||
|         ''; | ||||
|       }; | ||||
| 
 | ||||
|       conf = mkOption { | ||||
|         type = types.str; | ||||
|         default = '' | ||||
|           <?php | ||||
|           /* μlogger | ||||
|            * | ||||
|            * Copyright(C) 2017 Bartek Fabiszewski (www.fabiszewski.net) | ||||
|            * | ||||
|            * This is free software; you can redistribute it and/or modify it under | ||||
|            * the terms of the GNU General Public License as published by | ||||
|            * the Free Software Foundation; either version 3 of the License, or | ||||
|            * (at your option) any later version. | ||||
|            * | ||||
|            * This program is distributed in the hope that it will be useful, but | ||||
|            * WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|            * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|            * General Public License for more details. | ||||
|            * | ||||
|            * You should have received a copy of the GNU General Public License | ||||
|            * along with this program; if not, see <http://www.gnu.org/licenses/>. | ||||
|            */ | ||||
| 
 | ||||
|           // This is default configuration file. | ||||
|           // Copy it to config.php and customize | ||||
| 
 | ||||
|           // default map drawing framework | ||||
|           // (gmaps = google maps, openlayers = openlayers/osm) | ||||
|           //$mapapi = "gmaps"; | ||||
|           $mapapi = "openlayers"; | ||||
| 
 | ||||
|           // openlayers additional map layers | ||||
|           // OpenCycleMap (0 = no, 1 = yes) | ||||
|           $layer_ocm = 1; | ||||
|           // MapQuest-OSM (0 = no, 1 = yes) | ||||
|           $layer_mq = 1; | ||||
|           // osmapa.pl (0 = no, 1 = yes) | ||||
|           $layer_osmapa = 1; | ||||
|           // UMP (0 = no, 1 = yes) | ||||
|           $layer_ump = 1; | ||||
| 
 | ||||
|           // default coordinates for initial map | ||||
|           $init_latitude = 52.23; | ||||
|           $init_longitude = 21.01; | ||||
| 
 | ||||
|           // you may set your google maps api key | ||||
|           // this is not obligatory by now | ||||
|           //$gkey = ""; | ||||
| 
 | ||||
|           // MySQL config | ||||
|           $dbhost = ""; // mysql host, eg. localhost | ||||
|           $dbuser = ""; // database user | ||||
|           $dbpass = ""; // database pass | ||||
|           $dbname = ""; // database name | ||||
|           $dbprefix = ""; // optional table names prefix, eg. "ulogger_" | ||||
| 
 | ||||
|           // other | ||||
|           // require login/password authentication | ||||
|           // (0 = no, 1 = yes) | ||||
|           $require_authentication = 1; | ||||
| 
 | ||||
|           // all users tracks are visible to authenticated user | ||||
|           // (0 = no, 1 = yes) | ||||
|           $public_tracks = 0; | ||||
| 
 | ||||
|           // admin user, who | ||||
|           // - can add new users | ||||
|           // - can edit all tracks, users | ||||
|           // - has access to all users locations | ||||
|           // none if empty | ||||
|           $admin_user = ""; | ||||
| 
 | ||||
|           // miniumum required length of user password | ||||
|           $pass_lenmin = 12; | ||||
| 
 | ||||
|           // required strength of user password | ||||
|           //   0 = no requirements, | ||||
|           //   1 = require mixed case letters (lower and upper), | ||||
|           //   2 = require mixed case and numbers, | ||||
|           //   3 = require mixed case, numbers and non-alphanumeric characters | ||||
|           $pass_strength = 2; | ||||
| 
 | ||||
|           // Default interval in seconds for live auto reload | ||||
|           $interval = 10; | ||||
| 
 | ||||
|           // Default language | ||||
|           // (en, pl, de, hu) | ||||
|           $lang = "en"; | ||||
|           //$lang = "pl"; | ||||
|           //$lang = "de"; | ||||
|           //$lang = "hu"; | ||||
|           //$lang = "fr"; | ||||
|           //$lang = "it"; | ||||
| 
 | ||||
|           // units | ||||
|           // (metric, imperial) | ||||
|           $units = "metric"; | ||||
|           //$units = "imperial"; | ||||
| 
 | ||||
|           ?> | ||||
|         ''; | ||||
|         description = '' | ||||
|           Contents of the ulogger configuration file (config.php) | ||||
|         ''; | ||||
|       }; | ||||
|     }; | ||||
|   }; | ||||
| 
 | ||||
| 
 | ||||
|   config = mkIf cfg.enable { | ||||
|     services.phpfpm.pools."${poolName}" = { | ||||
|       user = "${cfg.user}"; | ||||
|       group = "nginx"; | ||||
|       phpPackage = pkgs.php; | ||||
|       settings = { | ||||
|         "listen.owner" = "nginx"; | ||||
|         "listen.group" = "nginx"; | ||||
|         "listen.mode" = "0600"; | ||||
|         "user" = "${cfg.user}"; | ||||
|         "group" = "nginx"; | ||||
|         "pm" = "dynamic"; | ||||
|         "pm.max_children" = "75"; | ||||
|         "pm.min_spare_servers" = "5"; | ||||
|         "pm.max_spare_servers" = "20"; | ||||
|         "pm.max_requests" = "10"; | ||||
|         "catch_workers_output" = "1"; | ||||
|         "php_admin_value[error_log]" = "/var/log/nginx/${poolName}-phpfpm-error.log"; | ||||
|       }; | ||||
|     }; | ||||
|     services.phpfpm.phpOptions = '' | ||||
|       max_execution_time = 120 | ||||
|     ''; | ||||
| 
 | ||||
|     services.nginx.enable = mkDefault true; | ||||
| 
 | ||||
|     services.nginx.virtualHosts."${cfg.hostName}" = { | ||||
|       enableACME = false; | ||||
|       forceSSL = false; | ||||
|       root = "${cfg.package}"; | ||||
| 
 | ||||
|       extraConfig = '' | ||||
|         add_header X-Frame-Options SAMEORIGIN; | ||||
|         add_header X-Content-Type-Options nosniff; | ||||
|         add_header X-XSS-Protection "1; mode=block"; | ||||
|       ''; | ||||
| 
 | ||||
|       locations."/" = { | ||||
|         extraConfig = '' | ||||
|         ''; | ||||
|       }; | ||||
| 
 | ||||
|       locations."~ ^/app\\.php(/|$)" = { | ||||
|         extraConfig = '' | ||||
|           fastcgi_pass unix:${config.services.phpfpm.pools."${poolName}".socket}; | ||||
|           include ${pkgs.nginx}/conf/fastcgi_params; | ||||
|           include ${pkgs.nginx}/conf/fastcgi.conf; | ||||
|           fastcgi_index ${conf.pkg}/index.php; | ||||
|         ''; | ||||
|       }; | ||||
| 
 | ||||
|       systemd.services.ulogger-install = { | ||||
|         description = "ulogger install service"; | ||||
|         wantedBy = [ "multi-user.target" ]; | ||||
|         before = [ "phpfpm-ulogger.service" ]; | ||||
|         after = [ "mysql.service" "postgresql.service" ]; | ||||
|         path = with pkgs; [ coreutils php phpPackages.composer ]; | ||||
| 
 | ||||
|         serviceConfig = { | ||||
|           User = cfg.user; | ||||
|           Type = "oneshot"; | ||||
|           RemainAfterExit = "yes"; | ||||
|           PermissionsStartOnly = true; | ||||
|         }; | ||||
| 
 | ||||
|         preStart = '' | ||||
|           mkdir -p "${cfg.dataDir}" | ||||
|           mkdir -p "${cfg.dataDir}/uploads" | ||||
|           chown ${cfg.user}:nginx "${cfg.dataDir}" | ||||
|         ''; | ||||
| 
 | ||||
|         environment = { | ||||
|           ULOGGER_ADMIN_USER = "admin"; | ||||
|           ULOGGER_ADMIN_PASSWORD = "admin"; | ||||
|         }; | ||||
| 
 | ||||
|         script = '' | ||||
|           echo "Setting up wallabag files in ${cfg.dataDir} ..." | ||||
|           cd "${cfg.dataDir}" | ||||
| 
 | ||||
|           rm -rf var/cache/* | ||||
|           rm -f app | ||||
|           ln -sf ${appDir} app | ||||
|           ln -sf ${cfg.package}/composer.{json,lock} . | ||||
| 
 | ||||
|           if [ ! -f installed ]; then | ||||
|             echo "Install file not found, installing ..." | ||||
|             # TODO, taken from https://github.com/bfabiszewski/ulogger-server/blob/master/.docker/init.sh | ||||
|             su postgres -c "psql -U ulogger < ${appDir}/scripts/ulogger.pgsql" | ||||
|             su postgres -c "psql -d ulogger -c \"INSERT INTO users (login, password, admin) VALUES ('$ULOGGER_ADMIN_USER', '$ULOGGER_ADMIN_PASSWORD', TRUE)\"" | ||||
|             touch installed | ||||
|           fi | ||||
|         ''; | ||||
|       }; | ||||
|     }; | ||||
| 
 | ||||
|     meta = with stdenv.lib; { | ||||
|       maintainers = with maintainers; [ nadrieril ]; | ||||
|     }; | ||||
| 
 | ||||
|   }; | ||||
| } | ||||
							
								
								
									
										26
									
								
								pkgs/ulogger.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								pkgs/ulogger.nix
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,26 @@ | |||
| { lib, stdenv, fetchurl, fetchpatch }: | ||||
| 
 | ||||
| let | ||||
|   pname = "ulogger-server"; | ||||
|   version = "1.1"; | ||||
| in | ||||
| stdenv.mkDerivation { | ||||
|   inherit pname version; | ||||
| 
 | ||||
|   # Release tarball includes vendored files | ||||
|   src = fetchurl { | ||||
|     url = "https://github.com/bfabiszewski/ulogger-server/archive/refs/tags/v${version}.tar.gz"; | ||||
|     hash = ""; | ||||
|   }; | ||||
| 
 | ||||
|   dontBuild = true; | ||||
| 
 | ||||
|   installPhase = '' | ||||
|     runHook preInstall | ||||
|     rm -R .docker | ||||
|     rm -R .tests | ||||
|     mkdir $out | ||||
|     cp -R * $out/ | ||||
|     runHook postInstall | ||||
|   ''; | ||||
| } | ||||
		Loading…
	
		Reference in a new issue