diff --git a/flake.nix b/flake.nix index 4afb27a..30fb5cb 100644 --- a/flake.nix +++ b/flake.nix @@ -44,9 +44,24 @@ ./machines ./routers ./inventories + ./overlays + ./tests ./modules/clan/flake-module.nix ./modules/nixos/flake-module.nix ]; + perSystem = + { pkgs, system, ... }: + { + _module.args.pkgs = import inputs.nixpkgs { + inherit system; + overlays = [ + inputs.self.overlays.packagesOverlay + ]; + config = { }; + }; + packages.think = pkgs.think-gtcm; + packages.think-be = pkgs.think-backend-gtcm; + }; } ); } diff --git a/inventories/default.nix b/inventories/default.nix index 1493635..2c28fcf 100644 --- a/inventories/default.nix +++ b/inventories/default.nix @@ -87,63 +87,54 @@ name = "pocket-id"; input = "self"; }; - roles.default.machines.b4l = { }; }; nextcloud = { module = { name = "nextcloud"; input = "self"; }; - roles.default.machines.b4l = { }; }; stirling-pdf = { module = { name = "stirling-pdf"; input = "self"; }; - roles.default.machines.b4l = { }; }; actual-budget = { module = { name = "actual-budget"; input = "self"; }; - roles.default.machines.b4l = { }; }; victoriametrics = { module = { name = "victoriametrics"; input = "self"; }; - roles.default.machines.b4l = { }; }; vikunja = { module = { name = "vikunja"; input = "self"; }; - roles.default.machines.b4l = { }; }; grafana = { module = { name = "grafana"; input = "self"; }; - roles.default.machines.b4l = { }; }; pingvin = { module = { name = "pingvin"; input = "self"; }; - roles.default.machines.b4l = { }; }; paperless = { module = { name = "paperless"; input = "self"; }; - roles.default.machines.b4l = { }; }; }; }; diff --git a/modules/nixos/flake-module.nix b/modules/nixos/flake-module.nix index b8a1ffc..f0a8017 100644 --- a/modules/nixos/flake-module.nix +++ b/modules/nixos/flake-module.nix @@ -3,5 +3,11 @@ common = { imports = [ ./common.nix ]; }; + think-gtcm = { + imports = [ ./think-gtcm.nix ]; + }; + think-backend-gtcm = { + imports = [ ./think-backend-gtcm.nix ]; + }; }; } diff --git a/modules/nixos/think-backend-gtcm.nix b/modules/nixos/think-backend-gtcm.nix new file mode 100644 index 0000000..79a69a3 --- /dev/null +++ b/modules/nixos/think-backend-gtcm.nix @@ -0,0 +1,280 @@ +{ + config, + pkgs, + lib, + ... +}: +let + cfg = config.services.think-backend-greaterchiangmai; + think-backend-gtcm = pkgs.think-backend-gtcm.override { dataDir = cfg.dataDir; }; + defaultUser = "gtcm"; + defaultGroup = "gtcm"; + + php = pkgs.php83; + + artisan-be = pkgs.writeScriptBin "gtcm-be" '' + #! ${pkgs.runtimeShell} + cd ${think-backend-gtcm} + sudo() { + if [[ "$USER" != ${cfg.user} ]]; then + exec /run/wrappers/bin/sudo -u ${cfg.user} "$@" + else + exec "$@" + fi + } + sudo ${lib.getExe php} artisan "$@" + ''; + +in +{ + options.services.think-backend-greaterchiangmai = { + enable = lib.mkEnableOption "To enable think.greaterchiangmai.com"; + + dataDir = lib.mkOption { + type = lib.types.path; + default = "/var/lib/think-backend.greaterchiangmai.com"; + description = ''A place where to store states''; + }; + + user = lib.mkOption { + type = lib.types.str; + default = defaultUser; + description = "User account under which this runs."; + }; + + group = lib.mkOption { + type = lib.types.str; + default = defaultGroup; + defaultText = "${defaultGroup}"; + description = '' + Group under which the website runs. + ''; + }; + + package = lib.mkPackageOption pkgs "think-backend-gtcm" { }; + + domain = lib.mkOption { + type = lib.types.str; + default = "think-backend.greaterchiangmai.com"; + example = "forum.example.com"; + description = "Domain to serve on."; + }; + + settings = lib.mkOption { + type = + with lib.types; + attrsOf ( + nullOr ( + either + (oneOf [ + bool + int + port + path + str + ]) + (submodule { + options = { + _secret = mkOption { + type = nullOr str; + description = '' + The path to a file containing the value the + option should be set to in the final + configuration file. + ''; + }; + }; + }) + ) + ); + default = { }; + description = '' + Options for settings environment variables + ''; + example = lib.literalExpression '' + { + APP_NAME = "Laravel"; + APP_ENV = "local"; + APP_KEY = "key"; + APP_DEBUG = true; + APP_URL = "http://localhost"; + + LOG_CHANNEL = "stack"; + LOG_DEPRECATIONS_CHANNEL = "null"; + LOG_LEVEL = "debug"; + + DB_CONNECTION = "mysql"; + DB_HOST = "127.0.0.1"; + DB_PORT = "3306"; + DB_DATABASE = "laravel"; + DB_USERNAME = "root"; + DB_PASSWORD = ""; + } + ''; + }; + + }; + config = lib.mkIf cfg.enable { + users.users.${cfg.user} = { + isSystemUser = true; + home = cfg.dataDir; + createHome = true; + homeMode = "755"; + group = cfg.group; + }; + users.groups.${cfg.group} = { }; + + services.phpfpm.pools.think-backend-gtcm = { + inherit (cfg) user group; + phpPackage = php; + settings = { + "listen.owner" = config.services.nginx.user; + "listen.group" = config.services.nginx.group; + "listen.mode" = "0600"; + "pm" = lib.mkDefault "dynamic"; + "pm.max_children" = lib.mkDefault 10; + "pm.max_requests" = lib.mkDefault 500; + "pm.start_servers" = lib.mkDefault 2; + "pm.min_spare_servers" = lib.mkDefault 1; + "pm.max_spare_servers" = lib.mkDefault 3; + }; + phpOptions = '' + error_log = syslog + log_errors = on + ''; + }; + + environment.systemPackages = [ + artisan-be + ]; + + systemd.services.think-backend-gtcm-setup = { + description = "think-backend.greaterchiangmai installation"; + requiredBy = [ "phpfpm-think-backend-gtcm.service" ]; + before = [ "phpfpm-think-backend-gtcm.service" ]; + requires = [ "mysql.service" ]; + after = [ "mysql.service" ]; + serviceConfig = { + type = "oneshot"; + RemainAfterExit = true; + User = cfg.user; + UMask = 77; + WorkingDirectory = "${think-backend-gtcm}"; + RuntimeDirectory = "think-backend-gtcm/cache"; + RuntimeDirectoryMode = 700; + }; + path = [ pkgs.replace-secret ]; + script = + let + isSecret = v: lib.isAttrs v && v ? _secret && lib.isString v._secret; + gtcmEnvVars = lib.generators.toKeyValue { + mkKeyValue = lib.flip lib.generators.mkKeyValueDefault "=" { + mkValueString = + v: + with builtins; + if isInt v then + toString v + else if isString v then + v + else if true == v then + "true" + else if false == v then + "false" + else if isSecret v then + hashString "sha256" v._secret + else + throw "unsupported type ${typeOf v}: ${(lib.generators.toPretty { }) v}"; + }; + }; + secretPaths = lib.mapAttrsToList (_: v: v._secret) (lib.filterAttrs (_: isSecret) cfg.settings); + mkSecretReplacement = file: '' + replace-secret ${ + lib.escapeShellArgs [ + (builtins.hashString "sha256" file) + file + "${cfg.dataDir}/.env" + ] + } + ''; + secretReplacements = lib.concatMapStrings mkSecretReplacement secretPaths; + filteredConfig = lib.converge (lib.filterAttrsRecursive ( + _: v: + !lib.elem v [ + { } + null + ] + )) cfg.settings; + gtcmEnv = pkgs.writeText "gtcm-be.env" (gtcmEnvVars filteredConfig); + in + '' + # error handling + set -euo pipefail + + # create .env file + install -T -m 0600 -o ${cfg.user} ${gtcmEnv} "${cfg.dataDir}/.env" + ${secretReplacements} + if ! grep 'APP_KEY=base64:' "${cfg.dataDir}/.env" >/dev/null; then + sed -i 's/APP_KEY=/APP_KEY=base64:/' "${cfg.dataDir}/.env" + fi + + # migrate & seed db + ${lib.getExe php} artisan key:generate --force + ${lib.getExe php} artisan migrate --force + ${lib.getExe php} artisan config:cache + ''; + }; + + systemd.tmpfiles.rules = [ + "d ${cfg.dataDir} 0710 ${cfg.user} ${cfg.group} - -" + "d ${cfg.dataDir}/public 0750 ${cfg.user} ${cfg.group} - -" + "d ${cfg.dataDir}/public/uploads 0750 ${cfg.user} ${cfg.group} - -" + "d ${cfg.dataDir}/storage 0700 ${cfg.user} ${cfg.group} - -" + "d ${cfg.dataDir}/storage/app 0700 ${cfg.user} ${cfg.group} - -" + "d ${cfg.dataDir}/storage/fonts 0700 ${cfg.user} ${cfg.group} - -" + "d ${cfg.dataDir}/storage/framework 0700 ${cfg.user} ${cfg.group} - -" + "d ${cfg.dataDir}/storage/framework/cache 0700 ${cfg.user} ${cfg.group} - -" + "d ${cfg.dataDir}/storage/framework/sessions 0700 ${cfg.user} ${cfg.group} - -" + "d ${cfg.dataDir}/storage/framework/views 0700 ${cfg.user} ${cfg.group} - -" + "d ${cfg.dataDir}/storage/logs 0700 ${cfg.user} ${cfg.group} - -" + "d ${cfg.dataDir}/storage/uploads 0700 ${cfg.user} ${cfg.group} - -" + ]; + + services.nginx = { + enable = true; + recommendedTlsSettings = true; + recommendedOptimisation = true; + recommendedGzipSettings = true; + recommendedBrotliSettings = true; + recommendedProxySettings = true; + virtualHosts."${cfg.domain}" = { + root = "${think-backend-gtcm}/public"; + locations = { + "/" = { + index = "index.php"; + tryFiles = "$uri $uri/ /index.php?$query_string"; + }; + "~ \\.php$".extraConfig = '' + fastcgi_pass unix:${config.services.phpfpm.pools."think-backend-gtcm".socket}; + ''; + "~ \\.(js|css|gif|png|ico|jpg|jpeg)$" = { + extraConfig = "expires 365d;"; + }; + }; + }; + }; + + services.mysql = { + enable = true; + package = pkgs.mariadb; + ensureDatabases = [ cfg.settings.DB_DATABASE ]; + ensureUsers = [ + { + name = cfg.settings.DB_USERNAME; + ensurePermissions = { + "${cfg.settings.DB_DATABASE}.*" = "ALL PRIVILEGES"; + }; + } + ]; + }; + }; +} diff --git a/modules/nixos/think-gtcm.nix b/modules/nixos/think-gtcm.nix new file mode 100644 index 0000000..46b555f --- /dev/null +++ b/modules/nixos/think-gtcm.nix @@ -0,0 +1,304 @@ +{ + config, + pkgs, + lib, + ... +}: +let + cfg = config.services.think-greaterchiangmai; + think-gtcm = pkgs.think-gtcm.override { dataDir = cfg.dataDir; }; + think-backend-gtcm = pkgs.think-backend-gtcm.override { dataDir = cfg.dataDir; }; + defaultUser = "gtcm"; + defaultGroup = "gtcm"; + + php = pkgs.php83; + + artisan = pkgs.writeScriptBin "gtcm" '' + #! ${pkgs.runtimeShell} + cd ${think-gtcm} + sudo() { + if [[ "$USER" != ${cfg.user} ]]; then + exec /run/wrappers/bin/sudo -u ${cfg.user} "$@" + else + exec "$@" + fi + } + sudo ${lib.getExe php} artisan "$@" + ''; + artisan-be = pkgs.writeScriptBin "gtcm-be" '' + #! ${pkgs.runtimeShell} + cd ${think-backend-gtcm} + sudo() { + if [[ "$USER" != ${cfg.user} ]]; then + exec /run/wrappers/bin/sudo -u ${cfg.user} "$@" + else + exec "$@" + fi + } + sudo ${lib.getExe php} artisan "$@" + ''; + +in +{ + options.services.think-greaterchiangmai = { + enable = lib.mkEnableOption "To enable think.greaterchiangmai.com"; + + dataDir = lib.mkOption { + type = lib.types.path; + default = "/var/lib/think.greaterchiangmai.com"; + description = ''A place where to store states''; + }; + + user = lib.mkOption { + type = lib.types.str; + default = defaultUser; + description = "User account under which this runs."; + }; + + group = lib.mkOption { + type = lib.types.str; + default = defaultGroup; + defaultText = "${defaultGroup}"; + description = '' + Group under which the website runs. + ''; + }; + + package = lib.mkPackageOption pkgs "think-gtcm" { }; + + packageBackend = lib.mkPackageOption pkgs "think-backend-gtcm" { }; + + domain = lib.mkOption { + type = lib.types.str; + default = "think.greaterchiangmai.com"; + example = "forum.example.com"; + description = "Domain to serve on."; + }; + + backendDomain = lib.mkOption { + type = lib.types.str; + default = "think-backend.greaterchiangmai.com"; + example = "forum.example.com"; + description = "Backend Domain to serve on."; + }; + + settings = lib.mkOption { + type = + with lib.types; + attrsOf ( + nullOr ( + either + (oneOf [ + bool + int + port + path + str + ]) + (submodule { + options = { + _secret = mkOption { + type = nullOr str; + description = '' + The path to a file containing the value the + option should be set to in the final + configuration file. + ''; + }; + }; + }) + ) + ); + default = { }; + description = '' + Options for settings environment variables + ''; + example = lib.literalExpression '' + { + APP_NAME = "Laravel"; + APP_ENV = "local"; + APP_KEY = "key"; + APP_DEBUG = true; + APP_URL = "http://localhost"; + + LOG_CHANNEL = "stack"; + LOG_DEPRECATIONS_CHANNEL = "null"; + LOG_LEVEL = "debug"; + + DB_CONNECTION = "mysql"; + DB_HOST = "127.0.0.1"; + DB_PORT = "3306"; + DB_DATABASE = "laravel"; + DB_USERNAME = "root"; + DB_PASSWORD = ""; + } + ''; + }; + + }; + config = lib.mkIf cfg.enable { + users.users.${cfg.user} = { + isSystemUser = true; + home = cfg.dataDir; + createHome = true; + homeMode = "755"; + group = cfg.group; + }; + users.groups.${cfg.group} = { }; + + services.phpfpm.pools.think-gtcm = { + inherit (cfg) user group; + phpPackage = php; + settings = { + "listen.owner" = config.services.nginx.user; + "listen.group" = config.services.nginx.group; + "listen.mode" = "0600"; + "pm" = lib.mkDefault "dynamic"; + "pm.max_children" = lib.mkDefault 10; + "pm.max_requests" = lib.mkDefault 500; + "pm.start_servers" = lib.mkDefault 2; + "pm.min_spare_servers" = lib.mkDefault 1; + "pm.max_spare_servers" = lib.mkDefault 3; + }; + phpOptions = '' + error_log = syslog + log_errors = on + ''; + }; + + environment.systemPackages = [ + artisan + artisan-be + ]; + + systemd.services.think-gtcm-setup = { + description = "think.greaterchiangmai installation"; + requiredBy = [ "phpfpm-think-gtcm.service" ]; + before = [ "phpfpm-think-gtcm.service" ]; + requires = [ "mysql.service" ]; + after = [ "mysql.service" ]; + serviceConfig = { + type = "oneshot"; + RemainAfterExit = true; + User = cfg.user; + UMask = 77; + WorkingDirectory = "${think-gtcm}"; + RuntimeDirectory = "think-gtcm/cache"; + RuntimeDirectoryMode = 700; + }; + path = [ pkgs.replace-secret ]; + script = + let + isSecret = v: lib.isAttrs v && v ? _secret && lib.isString v._secret; + gtcmEnvVars = lib.generators.toKeyValue { + mkKeyValue = lib.flip lib.generators.mkKeyValueDefault "=" { + mkValueString = + v: + with builtins; + if isInt v then + toString v + else if isString v then + v + else if true == v then + "true" + else if false == v then + "false" + else if isSecret v then + hashString "sha256" v._secret + else + throw "unsupported type ${typeOf v}: ${(lib.generators.toPretty { }) v}"; + }; + }; + secretPaths = lib.mapAttrsToList (_: v: v._secret) (lib.filterAttrs (_: isSecret) cfg.settings); + mkSecretReplacement = file: '' + replace-secret ${ + lib.escapeShellArgs [ + (builtins.hashString "sha256" file) + file + "${cfg.dataDir}/.env" + ] + } + ''; + secretReplacements = lib.concatMapStrings mkSecretReplacement secretPaths; + filteredConfig = lib.converge (lib.filterAttrsRecursive ( + _: v: + !lib.elem v [ + { } + null + ] + )) cfg.settings; + gtcmEnv = pkgs.writeText "gtcm.env" (gtcmEnvVars filteredConfig); + in + '' + # error handling + set -euo pipefail + + # create .env file + install -T -m 0600 -o ${cfg.user} ${gtcmEnv} "${cfg.dataDir}/.env" + ${secretReplacements} + if ! grep 'APP_KEY=base64:' "${cfg.dataDir}/.env" >/dev/null; then + sed -i 's/APP_KEY=/APP_KEY=base64:/' "${cfg.dataDir}/.env" + fi + + # migrate & seed db + ${lib.getExe php} artisan key:generate --force + ${lib.getExe php} artisan migrate --force + ${lib.getExe php} artisan config:cache + ''; + }; + + systemd.tmpfiles.rules = [ + "d ${cfg.dataDir} 0710 ${cfg.user} ${cfg.group} - -" + "d ${cfg.dataDir}/public 0750 ${cfg.user} ${cfg.group} - -" + "d ${cfg.dataDir}/public/uploads 0750 ${cfg.user} ${cfg.group} - -" + "d ${cfg.dataDir}/storage 0700 ${cfg.user} ${cfg.group} - -" + "d ${cfg.dataDir}/storage/app 0700 ${cfg.user} ${cfg.group} - -" + "d ${cfg.dataDir}/storage/fonts 0700 ${cfg.user} ${cfg.group} - -" + "d ${cfg.dataDir}/storage/framework 0700 ${cfg.user} ${cfg.group} - -" + "d ${cfg.dataDir}/storage/framework/cache 0700 ${cfg.user} ${cfg.group} - -" + "d ${cfg.dataDir}/storage/framework/sessions 0700 ${cfg.user} ${cfg.group} - -" + "d ${cfg.dataDir}/storage/framework/views 0700 ${cfg.user} ${cfg.group} - -" + "d ${cfg.dataDir}/storage/logs 0700 ${cfg.user} ${cfg.group} - -" + "d ${cfg.dataDir}/storage/uploads 0700 ${cfg.user} ${cfg.group} - -" + ]; + + services.nginx = { + enable = true; + recommendedTlsSettings = true; + recommendedOptimisation = true; + recommendedGzipSettings = true; + recommendedBrotliSettings = true; + recommendedProxySettings = true; + virtualHosts."${cfg.domain}" = { + root = "${think-gtcm}/public"; + locations = { + "/" = { + index = "index.php"; + tryFiles = "$uri $uri/ /index.php?$query_string"; + }; + + "~ \\.php$".extraConfig = '' + fastcgi_pass unix:${config.services.phpfpm.pools."think-gtcm".socket}; + ''; + "~ \\.(js|css|gif|png|ico|jpg|jpeg)$" = { + extraConfig = "expires 365d;"; + }; + }; + }; + }; + + services.mysql = { + enable = true; + package = pkgs.mariadb; + ensureDatabases = [ cfg.settings.DB_DATABASE ]; + ensureUsers = [ + { + name = cfg.settings.DB_USERNAME; + ensurePermissions = { + "${cfg.settings.DB_DATABASE}.*" = "ALL PRIVILEGES"; + }; + } + ]; + }; + }; +} diff --git a/overlays/default.nix b/overlays/default.nix new file mode 100644 index 0000000..583c8e9 --- /dev/null +++ b/overlays/default.nix @@ -0,0 +1,6 @@ +{ ... }: +{ + flake.overlays = { + packagesOverlay = import ../pkgs/overlay.nix; + }; +} diff --git a/pkgs/overlay.nix b/pkgs/overlay.nix new file mode 100644 index 0000000..d327dd3 --- /dev/null +++ b/pkgs/overlay.nix @@ -0,0 +1,4 @@ +final: prev: { + think-gtcm = final.callPackage ./think-gtcm.nix { }; + think-backend-gtcm = final.callPackage ./think-backend-gtcm.nix { php = final.php83; }; +} diff --git a/pkgs/think-backend-gtcm.nix b/pkgs/think-backend-gtcm.nix new file mode 100644 index 0000000..bc08098 --- /dev/null +++ b/pkgs/think-backend-gtcm.nix @@ -0,0 +1,32 @@ +{ + fetchgit, + php, + dataDir ? "/var/lib/think-backend-gtcm", +}: +let + repoSrc = fetchgit { + url = "https://git.b4l.co.th/newedge/think-greaterchiangmai"; + rev = "7c17aa78436538241c09fc7d633904d3c063011e"; + hash = "sha256-GDx0+PmuCXC+UPtsvsocCZQiTPcnOZEzJI17sxrVv7Q="; + }; + src = "${repoSrc}/think-backend.greaterchiangmai.com"; +in +php.buildComposerProject2 (finalAttrs: { + pname = "think-backend-gtcm"; + version = "1.0.0"; + + inherit src; + + installPhase = '' + runHook preInstall + mkdir -p $out + cp -R * $out + rm -rf $out/storage + ln -s ${dataDir}/.env $out/.env + ln -s ${dataDir}/storage $out/storage + runHook postInstall + ''; + + composerStrictValidation = false; + vendorHash = "sha256-eXm1x3E9KHWojaT2RU4inMdZqQVcWdLCKlvzhOlIZrc="; +}) diff --git a/pkgs/think-gtcm.nix b/pkgs/think-gtcm.nix new file mode 100644 index 0000000..0af8b9a --- /dev/null +++ b/pkgs/think-gtcm.nix @@ -0,0 +1,32 @@ +{ + fetchgit, + php, + dataDir ? "/var/lib/think-gtcm", +}: +let + repoSrc = fetchgit { + url = "https://git.b4l.co.th/newedge/think-greaterchiangmai"; + rev = "7c17aa78436538241c09fc7d633904d3c063011e"; + hash = "sha256-GDx0+PmuCXC+UPtsvsocCZQiTPcnOZEzJI17sxrVv7Q="; + }; + src = "${repoSrc}/think.greaterchiangmai.com"; +in +php.buildComposerProject2 (finalAttrs: { + pname = "think-gtcm"; + version = "1.0.0"; + + inherit src; + + installPhase = '' + runHook preInstall + mkdir -p $out + cp -R * $out + rm -rf $out/storage + ln -s ${dataDir}/.env $out/.env + ln -s ${dataDir}/storage $out/storage + runHook postInstall + ''; + + composerStrictValidation = false; + vendorHash = "sha256-QV3hR3U3GwCqrCRxfkazmJwDpO1vFyMfA6YqUb4bjMI="; +}) diff --git a/routers/default.nix b/routers/default.nix index 0c5d3c5..cb37001 100644 --- a/routers/default.nix +++ b/routers/default.nix @@ -1,4 +1,4 @@ -{ inputs, ... }: +{ inputs, pkgs, ... }: { flake.legacyPackages = { whitehouse-router = import "${inputs.liminix}/default.nix" { diff --git a/tests/default.nix b/tests/default.nix new file mode 100644 index 0000000..8770e48 --- /dev/null +++ b/tests/default.nix @@ -0,0 +1,16 @@ +{ self, ... }: +{ + perSystem = + { pkgs, ... }: + { + checks = + let + checkArgs = { + inherit pkgs self; + }; + in + { + think-gtcm = import ./tests/think-gtcm.nix checkArgs; + }; + }; +} diff --git a/tests/lib.nix b/tests/lib.nix new file mode 100644 index 0000000..08b33c9 --- /dev/null +++ b/tests/lib.nix @@ -0,0 +1,18 @@ +test: +# These arguments are provided by `flake.nix` on import, see checkArgs +{ pkgs, self }: +let + inherit (pkgs) lib; + # this imports the nixos library that contains our testing framework + nixos-lib = import (pkgs.path + "/nixos/lib") { }; +in +(nixos-lib.runTest { + hostPkgs = pkgs; + # This speeds up the evaluation by skipping evaluating documentation (optional) + defaults.documentation.enable = lib.mkDefault false; + # This makes `self` available in the NixOS configuration of our virtual machines. + # This is useful for referencing modules or packages from your own flake + # as well as importing from other flakes. + node.specialArgs = { inherit self; }; + imports = [ test ]; +}).config.result diff --git a/tests/tests/think-gtcm.nix b/tests/tests/think-gtcm.nix new file mode 100644 index 0000000..18d7c20 --- /dev/null +++ b/tests/tests/think-gtcm.nix @@ -0,0 +1,102 @@ +(import ../lib.nix) { + name = "think-gtcm"; + nodes = + let + settings = { + + DB_CONNECTION = "mysql"; + DB_HOST = "localhost"; + DB_PORT = 3306; + DB_DATABASE = "thinkgtcm"; + DB_USERNAME = "gtcm"; + DB_PASSWORD = ""; + + APP_NAME = "Laravel"; + APP_ENV = "local"; + APP_DEBUG = "false"; + APP_URL = "http://localhost"; + + LOG_CHANNEL = "stack"; + LOG_LEVEL = "debug"; + + BROADCAST_DRIVER = "log"; + CACHE_DRIVER = "file"; + FILESYSTEM_DISK = "local"; + QUEUE_CONNECTION = "sync"; + SESSION_DRIVER = "file"; + SESSION_LIFETIME = "120"; + + MEMCACHED_HOST = "127.0.0.1"; + + REDIS_HOST = "127.0.0.1"; + REDIS_PASSWORD = "null"; + REDIS_PORT = "6379"; + + MAIL_MAILER = "smtp"; + MAIL_HOST = "mailpit"; + MAIL_PORT = "1025"; + MAIL_USERNAME = "null"; + MAIL_PASSWORD = "null"; + MAIL_ENCRYPTION = "null"; + MAIL_FROM_ADDRESS = "hello@example.com"; + + AWS_DEFAULT_REGION = "us-east-1"; + AWS_USE_PATH_STYLE_ENDPOINT = "false"; + + PUSHER_PORT = 443; + PUSHER_SCHEME = "https"; + PUSHER_APP_CLUSTER = "mt1"; + + UPLOAD_MAX_FILESIZE = "5000M"; + POST_MAX_SIZE = "5000M"; + + TEST_LOCAL = "false"; + }; + in + { + gtcm1 = + { self, pkgs, ... }: + { + nixpkgs.overlays = [ self.overlays.packagesOverlay ]; + imports = [ self.nixosModules.think-gtcm ]; + services.think-greaterchiangmai = { + enable = true; + settings = settings // { + APP_SERVICES_CACHE = "/run/think-gtcm/cache/services.php"; + APP_PACKAGES_CACHE = "/run/think-gtcm/cache/packages.php"; + APP_CONFIG_CACHE = "/run/think-gtcm/cache/config.php"; + APP_ROUTES_CACHE = "/run/think-gtcm/cache/routes-v7.php"; + APP_EVENTS_CACHE = "/run/think-gtcm/cache/events.php"; + }; + }; + }; + backend1 = + { self, pkgs, ... }: + { + nixpkgs.overlays = [ self.overlays.packagesOverlay ]; + imports = [ self.nixosModules.think-backend-gtcm ]; + services.think-backend-greaterchiangmai = { + enable = true; + settings = settings // { + APP_SERVICES_CACHE = "/run/think-backend-gtcm/cache/services.php"; + APP_PACKAGES_CACHE = "/run/think-backend-gtcm/cache/packages.php"; + APP_CONFIG_CACHE = "/run/think-backend-gtcm/cache/config.php"; + APP_ROUTES_CACHE = "/run/think-backend-gtcm/cache/routes-v7.php"; + APP_EVENTS_CACHE = "/run/think-backend-gtcm/cache/events.php"; + }; + }; + }; + }; + # This is the test code that will check if our service is running correctly: + testScript = '' + start_all() + + gtcm1.wait_for_unit("phpfpm-think-gtcm") + gtcm1.wait_for_open_port(80) + output = gtcm1.succeed("curl localhost") + + backend1.wait_for_unit("phpfpm-think-backend-gtcm") + backend1.wait_for_open_port(80) + output = backend1.succeed("curl localhost") + ''; +}