all messages for Guix-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* [PATCH] gnu: services: Add nginx-service.
@ 2015-08-03  3:31 David Thompson
  2015-08-04  1:48 ` Thompson, David
  0 siblings, 1 reply; 6+ messages in thread
From: David Thompson @ 2015-08-03  3:31 UTC (permalink / raw)
  To: guix-devel

[-- Attachment #1: Type: text/plain, Size: 120 bytes --]

Here's a basic nginx service.  There are more actions that could be
added in the future, but this does the essentials.


[-- Attachment #2: 0001-gnu-services-Add-nginx-service.patch --]
[-- Type: text/x-patch, Size: 5257 bytes --]

From 4bd0c36545258d028a74e2fc7144a4037ec1148f Mon Sep 17 00:00:00 2001
From: David Thompson <dthompson2@worcester.edu>
Date: Sun, 2 Aug 2015 23:29:53 -0400
Subject: [PATCH] gnu: services: Add nginx-service.

* gnu/services/web.scm: New file.
* gnu-system.am (GNU_SYSTEM_MODULES): Add it.
---
 gnu-system.am        |   1 +
 gnu/services/web.scm | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 106 insertions(+)
 create mode 100644 gnu/services/web.scm

diff --git a/gnu-system.am b/gnu-system.am
index 87924fe..5a28c4b 100644
--- a/gnu-system.am
+++ b/gnu-system.am
@@ -345,6 +345,7 @@ GNU_SYSTEM_MODULES =				\
   gnu/services/lirc.scm				\
   gnu/services/networking.scm			\
   gnu/services/ssh.scm				\
+  gnu/services/web.scm				\
   gnu/services/xorg.scm				\
 						\
   gnu/system.scm				\
diff --git a/gnu/services/web.scm b/gnu/services/web.scm
new file mode 100644
index 0000000..85c6e07
--- /dev/null
+++ b/gnu/services/web.scm
@@ -0,0 +1,105 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2015 David Thompson <davet@gnu.org>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix 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.
+;;;
+;;; GNU Guix 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 GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu services web)
+  #:use-module (gnu services)
+  #:use-module (gnu system shadow)
+  #:use-module (gnu packages admin)
+  #:use-module (gnu packages web)
+  #:use-module (guix records)
+  #:use-module (guix monads)
+  #:use-module (guix store)
+  #:use-module (guix gexp)
+  #:export (nginx-service))
+
+;;; Commentary:
+;;;
+;;; Web services.
+;;;
+;;; Code:
+
+(define %default-nginx-config
+  (text-file* "nginx.conf"
+              "user nginx nginx;\n"
+              "pid /var/run/nginx/pid;\n"
+              "error_log /var/log/nginx/error.log info;\n"
+              "http {\n"
+              "    access_log /var/log/nginx/access.log;\n"
+              "    root /var/www;\n"
+              "    server {}\n"
+              "}\n"
+              "events {}\n"))
+
+(define* (nginx-service #:key (nginx nginx)
+                        (config-file %default-nginx-config)
+                        (log-directory "/var/log/nginx")
+                        (run-directory "/var/run/nginx"))
+  "Return a service that runs NGINX, the nginx web server.
+
+The nginx daemon loads its runtime configuration from CONFIG-FIGLE, stores log
+files in LOG-DIRECTORY, and stores temporary runtime files in RUN-DIRECTORY."
+  (define nginx* #~(string-append #$nginx "/sbin/nginx"))
+
+  (define start-script
+    (mlet %store-monad ((config-file config-file))
+      (gexp->script "start-nginx"
+                    #~(system* #$nginx* "-c" #$config-file
+                               "-p" #$run-directory))))
+
+  (define stop-script
+    (mlet %store-monad ((config-file config-file))
+      (gexp->script "stop-nginx"
+                    #~(system* #$nginx* "-c" #$config-file
+                               "-p" #$run-directory "-s" "stop"))))
+
+  (define activate
+    (mlet %store-monad ((config-file config-file))
+      (return
+       #~(begin
+           (use-modules (guix build utils))
+           (format #t "creating nginx log directory '~a'~%" #$log-directory)
+           (mkdir-p #$log-directory)
+           (format #t "creating nginx run directory '~a'~%" #$run-directory)
+           (mkdir-p #$run-directory)
+           ;; Check configuration file syntax.
+           (system* #$nginx* "-c" #$config-file "-t")))))
+
+  (mlet %store-monad ((start-script start-script)
+                      (stop-script  stop-script)
+                      (activate     activate))
+    (return
+     (service
+      (provision '(nginx))
+      (documentation "Run the nginx daemon.")
+      (requirement '(user-processes loopback))
+      (start #~(lambda _
+                 (zero? (status:exit-val (system* #$start-script)))))
+      (stop #~(lambda _
+                (zero? (status:exit-val (system* #$stop-script)))))
+      (activate activate)
+      (user-groups (list (user-group
+                          (name "nginx")
+                          (system? #t))))
+      (user-accounts (list (user-account
+                            (name "nginx")
+                            (group "nginx")
+                            (system? #t)
+                            (comment "nginx server user")
+                            (home-directory "/var/empty")
+                            (shell
+                             #~(string-append #$shadow "/sbin/nologin")))))))))
-- 
2.4.3


[-- Attachment #3: Type: text/plain, Size: 38 bytes --]


-- 
David Thompson
GPG Key: 0FF1D807

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH] gnu: services: Add nginx-service.
  2015-08-03  3:31 [PATCH] gnu: services: Add nginx-service David Thompson
@ 2015-08-04  1:48 ` Thompson, David
  2015-08-18 15:58   ` Ludovic Courtès
  0 siblings, 1 reply; 6+ messages in thread
From: Thompson, David @ 2015-08-04  1:48 UTC (permalink / raw)
  To: guix-devel

[-- Attachment #1: Type: text/plain, Size: 277 bytes --]

On Sun, Aug 2, 2015 at 11:31 PM, David Thompson
<dthompson2@worcester.edu> wrote:
> Here's a basic nginx service.  There are more actions that could be
> added in the future, but this does the essentials.

Mark pointed out some issues on IRC, so here's a better patch!

- Dave

[-- Attachment #2: 0001-gnu-services-Add-nginx-service.patch --]
[-- Type: text/x-patch, Size: 4875 bytes --]

From c2da6c04eb1a12d0ee2f56a3954673f3bddc122b Mon Sep 17 00:00:00 2001
From: David Thompson <dthompson2@worcester.edu>
Date: Sun, 2 Aug 2015 23:29:53 -0400
Subject: [PATCH] gnu: services: Add nginx-service.

* gnu/services/web.scm: New file.
* gnu-system.am (GNU_SYSTEM_MODULES): Add it.
---
 gnu-system.am        |   1 +
 gnu/services/web.scm | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 102 insertions(+)
 create mode 100644 gnu/services/web.scm

diff --git a/gnu-system.am b/gnu-system.am
index 4b1486e..fd53da4 100644
--- a/gnu-system.am
+++ b/gnu-system.am
@@ -345,6 +345,7 @@ GNU_SYSTEM_MODULES =				\
   gnu/services/lirc.scm				\
   gnu/services/networking.scm			\
   gnu/services/ssh.scm				\
+  gnu/services/web.scm				\
   gnu/services/xorg.scm				\
 						\
   gnu/system.scm				\
diff --git a/gnu/services/web.scm b/gnu/services/web.scm
new file mode 100644
index 0000000..c63813b
--- /dev/null
+++ b/gnu/services/web.scm
@@ -0,0 +1,101 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2015 David Thompson <davet@gnu.org>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix 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.
+;;;
+;;; GNU Guix 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 GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu services web)
+  #:use-module (gnu services)
+  #:use-module (gnu system shadow)
+  #:use-module (gnu packages admin)
+  #:use-module (gnu packages web)
+  #:use-module (guix records)
+  #:use-module (guix monads)
+  #:use-module (guix store)
+  #:use-module (guix gexp)
+  #:export (nginx-service))
+
+;;; Commentary:
+;;;
+;;; Web services.
+;;;
+;;; Code:
+
+(define (default-nginx-config log-directory run-directory)
+  (text-file* "nginx.conf"
+              "user nginx nginx;\n"
+              "pid " run-directory "/pid;\n"
+              "error_log " log-directory "/error.log info;\n"
+              "http {\n"
+              "    access_log " log-directory "/access.log;\n"
+              "    root /var/www;\n"
+              "    server {}\n"
+              "}\n"
+              "events {}\n"))
+
+(define* (nginx-service #:key (nginx nginx)
+                        (log-directory "/var/log/nginx")
+                        (run-directory "/var/run/nginx")
+                        (config-file
+                         (default-nginx-config log-directory run-directory)))
+  "Return a service that runs NGINX, the nginx web server.
+
+The nginx daemon loads its runtime configuration from CONFIG-FIGLE, stores log
+files in LOG-DIRECTORY, and stores temporary runtime files in RUN-DIRECTORY."
+  (define nginx-binary
+    #~(string-append #$nginx "/sbin/nginx"))
+
+  (define (nginx-action . args)
+    (mlet %store-monad ((config-file config-file))
+      (return
+       #~(lambda _
+           (zero?
+            (system* #$nginx-binary "-c" #$config-file #$@args))))))
+
+  (define activate
+    (mlet %store-monad ((config-file config-file))
+      (return
+       #~(begin
+           (use-modules (guix build utils))
+           (format #t "creating nginx log directory '~a'~%" #$log-directory)
+           (mkdir-p #$log-directory)
+           (format #t "creating nginx run directory '~a'~%" #$run-directory)
+           (mkdir-p #$run-directory)
+           ;; Check configuration file syntax.
+           (system* #$nginx-binary "-c" #$config-file "-t")))))
+
+  ;; TODO: Add 'reload' action.
+  (mlet %store-monad ((start    (nginx-action "-p" run-directory))
+                      (stop     (nginx-action "-s" "stop"))
+                      (activate activate))
+    (return
+     (service
+      (provision '(nginx))
+      (documentation "Run the nginx daemon.")
+      (requirement '(user-processes loopback))
+      (start start)
+      (stop stop)
+      (activate activate)
+      (user-groups (list (user-group
+                          (name "nginx")
+                          (system? #t))))
+      (user-accounts (list (user-account
+                            (name "nginx")
+                            (group "nginx")
+                            (system? #t)
+                            (comment "nginx server user")
+                            (home-directory "/var/empty")
+                            (shell
+                             #~(string-append #$shadow "/sbin/nologin")))))))))
-- 
2.4.3


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH] gnu: services: Add nginx-service.
  2015-08-04  1:48 ` Thompson, David
@ 2015-08-18 15:58   ` Ludovic Courtès
  2015-08-19  0:23     ` Thompson, David
  0 siblings, 1 reply; 6+ messages in thread
From: Ludovic Courtès @ 2015-08-18 15:58 UTC (permalink / raw)
  To: Thompson, David; +Cc: guix-devel

"Thompson, David" <dthompson2@worcester.edu> skribis:

> From c2da6c04eb1a12d0ee2f56a3954673f3bddc122b Mon Sep 17 00:00:00 2001
> From: David Thompson <dthompson2@worcester.edu>
> Date: Sun, 2 Aug 2015 23:29:53 -0400
> Subject: [PATCH] gnu: services: Add nginx-service.
>
> * gnu/services/web.scm: New file.
> * gnu-system.am (GNU_SYSTEM_MODULES): Add it.

[...]

> +(define (default-nginx-config log-directory run-directory)
> +  (text-file* "nginx.conf"
> +              "user nginx nginx;\n"
> +              "pid " run-directory "/pid;\n"
> +              "error_log " log-directory "/error.log info;\n"
> +              "http {\n"
> +              "    access_log " log-directory "/access.log;\n"
> +              "    root /var/www;\n"
> +              "    server {}\n"
> +              "}\n"
> +              "events {}\n"))
> +
> +(define* (nginx-service #:key (nginx nginx)
> +                        (log-directory "/var/log/nginx")
> +                        (run-directory "/var/run/nginx")
> +                        (config-file
> +                         (default-nginx-config log-directory run-directory)))

There’s this annoying thing that here ‘config-file’ is a monadic value
when we’d instead prefer a “file-like object.”

To work around it you could use ‘plain-file’ and make the default config
file independent of the parameters.  The obvious issue is that if the
user specifies LOG-DIRECTORY or RUN-DIRECTORY different from the
default, yet use the default config files, things will break.  But maybe
that’s an acceptable drawback?

Lastly, could you add a “Web Services” section under “Services” in the
manual?

Thanks!

Ludo’.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] gnu: services: Add nginx-service.
  2015-08-18 15:58   ` Ludovic Courtès
@ 2015-08-19  0:23     ` Thompson, David
  2015-08-25 21:35       ` Ludovic Courtès
  0 siblings, 1 reply; 6+ messages in thread
From: Thompson, David @ 2015-08-19  0:23 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: guix-devel

On Tue, Aug 18, 2015 at 11:58 AM, Ludovic Courtès <ludo@gnu.org> wrote:
> "Thompson, David" <dthompson2@worcester.edu> skribis:
>
>> From c2da6c04eb1a12d0ee2f56a3954673f3bddc122b Mon Sep 17 00:00:00 2001
>> From: David Thompson <dthompson2@worcester.edu>
>> Date: Sun, 2 Aug 2015 23:29:53 -0400
>> Subject: [PATCH] gnu: services: Add nginx-service.
>>
>> * gnu/services/web.scm: New file.
>> * gnu-system.am (GNU_SYSTEM_MODULES): Add it.
>
> [...]
>
>> +(define (default-nginx-config log-directory run-directory)
>> +  (text-file* "nginx.conf"
>> +              "user nginx nginx;\n"
>> +              "pid " run-directory "/pid;\n"
>> +              "error_log " log-directory "/error.log info;\n"
>> +              "http {\n"
>> +              "    access_log " log-directory "/access.log;\n"
>> +              "    root /var/www;\n"
>> +              "    server {}\n"
>> +              "}\n"
>> +              "events {}\n"))
>> +
>> +(define* (nginx-service #:key (nginx nginx)
>> +                        (log-directory "/var/log/nginx")
>> +                        (run-directory "/var/run/nginx")
>> +                        (config-file
>> +                         (default-nginx-config log-directory run-directory)))
>
> There’s this annoying thing that here ‘config-file’ is a monadic value
> when we’d instead prefer a “file-like object.”
>
> To work around it you could use ‘plain-file’ and make the default config
> file independent of the parameters.  The obvious issue is that if the
> user specifies LOG-DIRECTORY or RUN-DIRECTORY different from the
> default, yet use the default config files, things will break.  But maybe
> that’s an acceptable drawback?

Yeah, I'm not sure which way to go here, and I feel like this will be
an issue in many services to come.  Services often have to know some
details about the configuration to create directories and files that
the daemon won't just create on its own.  For context, I chose the
current implementation because Mark told me that he didn't like the
idea of the default configuration file being independent of the
#:log-directory and #:run-directory arguments, and I agreed it was not
good.

> Lastly, could you add a “Web Services” section under “Services” in the
> manual?

Yes, I can do that.

- Dave

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] gnu: services: Add nginx-service.
  2015-08-19  0:23     ` Thompson, David
@ 2015-08-25 21:35       ` Ludovic Courtès
  2015-08-28  2:12         ` Thompson, David
  0 siblings, 1 reply; 6+ messages in thread
From: Ludovic Courtès @ 2015-08-25 21:35 UTC (permalink / raw)
  To: Thompson, David; +Cc: guix-devel

"Thompson, David" <dthompson2@worcester.edu> skribis:

> On Tue, Aug 18, 2015 at 11:58 AM, Ludovic Courtès <ludo@gnu.org> wrote:
>> "Thompson, David" <dthompson2@worcester.edu> skribis:
>>
>>> From c2da6c04eb1a12d0ee2f56a3954673f3bddc122b Mon Sep 17 00:00:00 2001
>>> From: David Thompson <dthompson2@worcester.edu>
>>> Date: Sun, 2 Aug 2015 23:29:53 -0400
>>> Subject: [PATCH] gnu: services: Add nginx-service.
>>>
>>> * gnu/services/web.scm: New file.
>>> * gnu-system.am (GNU_SYSTEM_MODULES): Add it.
>>
>> [...]
>>
>>> +(define (default-nginx-config log-directory run-directory)
>>> +  (text-file* "nginx.conf"
>>> +              "user nginx nginx;\n"
>>> +              "pid " run-directory "/pid;\n"
>>> +              "error_log " log-directory "/error.log info;\n"
>>> +              "http {\n"
>>> +              "    access_log " log-directory "/access.log;\n"
>>> +              "    root /var/www;\n"
>>> +              "    server {}\n"
>>> +              "}\n"
>>> +              "events {}\n"))
>>> +
>>> +(define* (nginx-service #:key (nginx nginx)
>>> +                        (log-directory "/var/log/nginx")
>>> +                        (run-directory "/var/run/nginx")
>>> +                        (config-file
>>> +                         (default-nginx-config log-directory run-directory)))
>>
>> There’s this annoying thing that here ‘config-file’ is a monadic value
>> when we’d instead prefer a “file-like object.”

But it just occurred to me that you could write:

  (define (default-nginx-config log-directory run-directory)
    (plain-file "nginx.conf"
                (string-append ...)))

Problem solved!

(‘text-file*’ is more advanced: Instead of returning a file in the
store, it returns a *derivation* that builds a file possibly containing
references to store items.  But here, the default config file does not
refer to any store item, so ‘plain-file’ is enough.)

WDYT?

Thanks,
Ludo’.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] gnu: services: Add nginx-service.
  2015-08-25 21:35       ` Ludovic Courtès
@ 2015-08-28  2:12         ` Thompson, David
  0 siblings, 0 replies; 6+ messages in thread
From: Thompson, David @ 2015-08-28  2:12 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: guix-devel

On Tue, Aug 25, 2015 at 5:35 PM, Ludovic Courtès <ludo@gnu.org> wrote:
> "Thompson, David" <dthompson2@worcester.edu> skribis:
>
>> On Tue, Aug 18, 2015 at 11:58 AM, Ludovic Courtès <ludo@gnu.org> wrote:
>>> "Thompson, David" <dthompson2@worcester.edu> skribis:
>>>
>>>> From c2da6c04eb1a12d0ee2f56a3954673f3bddc122b Mon Sep 17 00:00:00 2001
>>>> From: David Thompson <dthompson2@worcester.edu>
>>>> Date: Sun, 2 Aug 2015 23:29:53 -0400
>>>> Subject: [PATCH] gnu: services: Add nginx-service.
>>>>
>>>> * gnu/services/web.scm: New file.
>>>> * gnu-system.am (GNU_SYSTEM_MODULES): Add it.
>>>
>>> [...]
>>>
>>>> +(define (default-nginx-config log-directory run-directory)
>>>> +  (text-file* "nginx.conf"
>>>> +              "user nginx nginx;\n"
>>>> +              "pid " run-directory "/pid;\n"
>>>> +              "error_log " log-directory "/error.log info;\n"
>>>> +              "http {\n"
>>>> +              "    access_log " log-directory "/access.log;\n"
>>>> +              "    root /var/www;\n"
>>>> +              "    server {}\n"
>>>> +              "}\n"
>>>> +              "events {}\n"))
>>>> +
>>>> +(define* (nginx-service #:key (nginx nginx)
>>>> +                        (log-directory "/var/log/nginx")
>>>> +                        (run-directory "/var/run/nginx")
>>>> +                        (config-file
>>>> +                         (default-nginx-config log-directory run-directory)))
>>>
>>> There’s this annoying thing that here ‘config-file’ is a monadic value
>>> when we’d instead prefer a “file-like object.”
>
> But it just occurred to me that you could write:
>
>   (define (default-nginx-config log-directory run-directory)
>     (plain-file "nginx.conf"
>                 (string-append ...)))
>
> Problem solved!

Good idea, thanks!  I made this change, added a new section to the
docs, and pushed.

- Dave

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2015-08-28  2:12 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-08-03  3:31 [PATCH] gnu: services: Add nginx-service David Thompson
2015-08-04  1:48 ` Thompson, David
2015-08-18 15:58   ` Ludovic Courtès
2015-08-19  0:23     ` Thompson, David
2015-08-25 21:35       ` Ludovic Courtès
2015-08-28  2:12         ` Thompson, David

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/guix.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.