{ config, lib, pkgs, ... }: with lib; let cfg = config.services.wallabag; poolName = "wallabag"; phpfpmSocketName = "/var/run/phpfpm/${poolName}.sock"; configFile = pkgs.writeTextFile { name = "wallabag-config"; text = cfg.conf; destination = "/config/parameters.yml"; }; appDir = pkgs.buildEnv { name = "wallabag-app-dir"; ignoreCollisions = true; checkCollisionContents = false; paths = [ configFile "${cfg.package}/app" ]; }; in { options = { services.wallabag = { enable = mkEnableOption "wallabag"; 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/www/wallabag"; description = '' Data directory. ''; }; package = mkOption { type = types.package; default = pkgs.wallabag; description = '' Wallabag 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 wallabag's PHP pool. See the documentation on php-fpm.conf for details on configuration directives. ''; }; conf = mkOption { type = types.str; default = '' parameters: database_driver: pdo_pgsql database_driver_class: Wallabag\CoreBundle\Doctrine\DBAL\Driver\CustomPostgreSQLDriver database_host: 127.0.0.1 database_port: ~ database_name: wallabag database_user: wallabag database_password: ~ # For SQLite, database_path should be "%kernel.project_dir%/data/db/wallabag.sqlite" database_path: null database_table_prefix: wallabag_ database_socket: null # with PostgreSQL and SQLite, you must set "utf8" database_charset: utf8 domain_name: http://192.168.1.6:8080 mailer_transport: smtp mailer_user: ~ mailer_password: ~ mailer_host: 127.0.0.1 mailer_port: false mailer_encryption: ~ mailer_auth_mode: ~ locale: en # A secret key that's used to generate certain security-related tokens secret: sateofg893964crfSTNFG"*(&@$091 twofactor_auth: true twofactor_sender: no-reply@wallabag.org fosuser_registration: true fosuser_confirmation: true fos_oauth_server_access_token_lifetime: 3600 fos_oauth_server_refresh_token_lifetime: 1209600 from_email: no-reply@wallabag.org rss_limit: 50 rabbitmq_host: localhost rabbitmq_port: 5672 rabbitmq_user: ~ rabbitmq_password: ~ rabbitmq_prefetch_count: 0 redis_scheme: tcp redis_host: localhost redis_port: 6379 redis_path: ~ redis_password: ~ sentry_dsn: ~ ''; description = '' Contents of the wallabag configuration file (parameters.yml) ''; }; }; }; config = mkIf cfg.enable { services.phpfpm.pools."${poolName}" = { user = "${cfg.user}"; group = "nginx"; settings = { "listen" = "${phpfpmSocketName}"; "listen.owner" = "nginx"; "listen.group" = "nginx"; "listen.mode" = "0600"; "env[WALLABAG_DATA]" = "${cfg.dataDir}"; "pm" = "dynamic"; "pm.max_children" = "75"; "pm.min_spare_servers" = "5"; "pm.max_spare_servers" = "20"; "pm.max_requests" = "10"; "catch_workers_output" = "1"; }; }; services.phpfpm.phpOptions = '' max_execution_time = 120 ''; services.nginx.enable = mkDefault true; services.nginx.virtualHosts."${cfg.hostName}" = { root = "${cfg.package}/web"; listen = [ { addr = "192.168.1.6"; port = 8080; } ]; extraConfig = '' add_header X-Frame-Options SAMEORIGIN; add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection "1; mode=block"; ''; locations."/" = { extraConfig = '' try_files $uri /app.php$is_args$args; ''; }; locations."/assets".root = "${cfg.dataDir}/web"; locations."~ ^/app\\.php(/|$)" = { extraConfig = '' fastcgi_pass unix:${phpfpmSocketName}; fastcgi_split_path_info ^(.+\.php)(/.*)$; include ${pkgs.nginx}/conf/fastcgi_params; fastcgi_param SCRIPT_FILENAME ${cfg.package}/web/$fastcgi_script_name; fastcgi_param DOCUMENT_ROOT ${cfg.package}/web; fastcgi_read_timeout 120; internal; ''; }; locations."~ /(?!app)\\.php$" = { extraConfig = '' return 404; ''; }; }; services.postgresql = { enable = true; # Ensure the database, user, and permissions always exist ensureDatabases = [ "wallabag" "wallabag_user" ]; authentication = lib.mkForce '' # Generated file; do not edit! # TYPE DATABASE USER ADDRESS METHOD local all all trust host all wallabag 127.0.0.1/32 trust ''; ensureUsers = [ { name = "wallabag"; ensurePermissions."DATABASE wallabag" = "ALL PRIVILEGES"; ensurePermissions."DATABASE wallabag_user" = "ALL PRIVILEGES"; } ]; }; systemd.services.wallabag-install = { description = "Wallabag install service"; wantedBy = [ "multi-user.target" ]; before = [ "phpfpm-wallabag.service" ]; after = [ "mysql.service" "postgresql.service" ]; path = with pkgs; [ coreutils php72 php72Packages.composer ]; serviceConfig = { User = cfg.user; Type = "oneshot"; RemainAfterExit = "yes"; PermissionsStartOnly = true; }; preStart = '' mkdir -p "${cfg.dataDir}" chown ${cfg.user}:nginx "${cfg.dataDir}" ''; 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} . export WALLABAG_DATA="${cfg.dataDir}" if [ ! -f installed ]; then php ${cfg.package}/bin/console --env=prod doctrine:database:create --if-not-exists --no-interaction #php ${cfg.package}/bin/console --env=prod doctrine:migrations:migrate --no-interaction # Until https://github.com/wallabag/wallabag/issues/3662 is fixed yes no | php ${cfg.package}/bin/console --env=prod wallabag:install touch installed else php ${cfg.package}/bin/console --env=prod doctrine:migrations:migrate --no-interaction fi php ${cfg.package}/bin/console --env=prod cache:clear ''; }; }; meta = with stdenv.lib; { maintainers = with maintainers; [ chickensoupwithrice ]; }; }