211 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			211 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| { config, lib, pkgs, ... }:
 | |
| 
 | |
| with lib;
 | |
| 
 | |
| let
 | |
|   cfg = config.services.couchdb;
 | |
|   useVersion2 = strings.versionAtLeast (strings.getVersion cfg.package) "2.0";
 | |
|   configFile = pkgs.writeText "couchdb.ini" (
 | |
|     ''
 | |
|       [couchdb]
 | |
|       database_dir = ${cfg.databaseDir}
 | |
|       uri_file = ${cfg.uriFile}
 | |
|       view_index_dir = ${cfg.viewIndexDir}
 | |
|     '' + (if useVersion2 then
 | |
|     ''
 | |
|       [chttpd]
 | |
|     '' else
 | |
|     ''
 | |
|       [httpd]
 | |
|     '') +
 | |
|     ''
 | |
|       port = ${toString cfg.port}
 | |
|       bind_address = ${cfg.bindAddress}
 | |
| 
 | |
|       [log]
 | |
|       file = ${cfg.logFile}
 | |
|     '');
 | |
|   executable = if useVersion2 then "${cfg.package}/bin/couchdb"
 | |
|     else ''${cfg.package}/bin/couchdb -a ${configFile} -a ${pkgs.writeText "couchdb-extra.ini" cfg.extraConfig} -a ${cfg.configFile}'';
 | |
| 
 | |
| in {
 | |
| 
 | |
|   ###### interface
 | |
| 
 | |
|   options = {
 | |
| 
 | |
|     services.couchdb = {
 | |
| 
 | |
|       enable = mkOption {
 | |
|         type = types.bool;
 | |
|         default = false;
 | |
|         description = ''
 | |
|           Whether to run CouchDB Server.
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|       package = mkOption {
 | |
|         type = types.package;
 | |
|         default = pkgs.couchdb;
 | |
|         defaultText = "pkgs.couchdb";
 | |
|         example = literalExample "pkgs.couchdb";
 | |
|         description = ''
 | |
|           CouchDB package to use.
 | |
|         '';
 | |
|       };
 | |
| 
 | |
| 
 | |
|       user = mkOption {
 | |
|         type = types.string;
 | |
|         default = "couchdb";
 | |
|         description = ''
 | |
|           User account under which couchdb runs.
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|       group = mkOption {
 | |
|         type = types.string;
 | |
|         default = "couchdb";
 | |
|         description = ''
 | |
|           Group account under which couchdb runs.
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|       # couchdb options: http://docs.couchdb.org/en/latest/config/index.html
 | |
| 
 | |
|       databaseDir = mkOption {
 | |
|         type = types.path;
 | |
|         default = "/var/lib/couchdb";
 | |
|         description = ''
 | |
|           Specifies location of CouchDB database files (*.couch named). This
 | |
|           location should be writable and readable for the user the CouchDB
 | |
|           service runs as (couchdb by default).
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|       uriFile = mkOption {
 | |
|         type = types.path;
 | |
|         default = "/var/run/couchdb/couchdb.uri";
 | |
|         description = ''
 | |
|           This file contains the full URI that can be used to access this
 | |
|           instance of CouchDB. It is used to help discover the port CouchDB is
 | |
|           running on (if it was set to 0 (e.g. automatically assigned any free
 | |
|           one). This file should be writable and readable for the user that
 | |
|           runs the CouchDB service (couchdb by default).
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|       viewIndexDir = mkOption {
 | |
|         type = types.path;
 | |
|         default = "/var/lib/couchdb";
 | |
|         description = ''
 | |
|           Specifies location of CouchDB view index files. This location should
 | |
|           be writable and readable for the user that runs the CouchDB service
 | |
|           (couchdb by default).
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|       bindAddress = mkOption {
 | |
|         type = types.string;
 | |
|         default = "127.0.0.1";
 | |
|         description = ''
 | |
|           Defines the IP address by which CouchDB will be accessible.
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|       port = mkOption {
 | |
|         type = types.int;
 | |
|         default = 5984;
 | |
|         description = ''
 | |
|           Defined the port number to listen.
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|       logFile = mkOption {
 | |
|         type = types.path;
 | |
|         default = "/var/log/couchdb.log";
 | |
|         description = ''
 | |
|           Specifies the location of file for logging output.
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|       extraConfig = mkOption {
 | |
|         type = types.lines;
 | |
|         default = "";
 | |
|         description = ''
 | |
|           Extra configuration. Overrides any other cofiguration.
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|       configFile = mkOption {
 | |
|         type = types.string;
 | |
|         description = ''
 | |
|           Configuration file for persisting runtime changes. File
 | |
|           needs to be readable and writable from couchdb user/group.
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|     };
 | |
| 
 | |
|   };
 | |
| 
 | |
|   ###### implementation
 | |
| 
 | |
|   config = mkIf config.services.couchdb.enable {
 | |
| 
 | |
|     environment.systemPackages = [ cfg.package ];
 | |
| 
 | |
|     services.couchdb.configFile = mkDefault
 | |
|       (if useVersion2 then "/var/lib/couchdb/local.ini" else "/var/lib/couchdb/couchdb.ini");
 | |
| 
 | |
|     systemd.services.couchdb = {
 | |
|       description = "CouchDB Server";
 | |
|       wantedBy = [ "multi-user.target" ];
 | |
| 
 | |
|       preStart =
 | |
|         ''
 | |
|         mkdir -p `dirname ${cfg.uriFile}`;
 | |
|         mkdir -p `dirname ${cfg.logFile}`;
 | |
|         mkdir -p ${cfg.databaseDir};
 | |
|         mkdir -p ${cfg.viewIndexDir};
 | |
|         touch ${cfg.configFile}
 | |
|         touch -a ${cfg.logFile}
 | |
| 
 | |
|         if [ "$(id -u)" = 0 ]; then
 | |
|           chown ${cfg.user}:${cfg.group} `dirname ${cfg.uriFile}`;
 | |
|           (test -f ${cfg.uriFile} && chown ${cfg.user}:${cfg.group} ${cfg.uriFile}) || true
 | |
|           chown ${cfg.user}:${cfg.group} ${cfg.databaseDir}
 | |
|           chown ${cfg.user}:${cfg.group} ${cfg.viewIndexDir}
 | |
|           chown ${cfg.user}:${cfg.group} ${cfg.configFile}
 | |
|           chown ${cfg.user}:${cfg.group} ${cfg.logFile}
 | |
|         fi
 | |
|         '';
 | |
| 
 | |
|       environment = mkIf useVersion2 {
 | |
|         # we are actually specifying 4 configuration files:
 | |
|         # 1. the preinstalled default.ini
 | |
|         # 2. the module configuration
 | |
|         # 3. the extraConfig from the module options
 | |
|         # 4. the locally writable config file, which couchdb itself writes to
 | |
|         ERL_FLAGS= ''-couch_ini ${cfg.package}/etc/default.ini ${configFile} ${pkgs.writeText "couchdb-extra.ini" cfg.extraConfig} ${cfg.configFile}'';
 | |
|       };
 | |
| 
 | |
|       serviceConfig = {
 | |
|         PermissionsStartOnly = true;
 | |
|         User = cfg.user;
 | |
|         Group = cfg.group;
 | |
|         ExecStart = executable;
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     users.users.couchdb = {
 | |
|       description = "CouchDB Server user";
 | |
|       group = "couchdb";
 | |
|       uid = config.ids.uids.couchdb;
 | |
|     };
 | |
| 
 | |
|     users.groups.couchdb.gid = config.ids.gids.couchdb;
 | |
| 
 | |
|   };
 | |
| }
 | 
