> I have no idea it this is the cause, but the immediate difference I see
> between the terminal (working) and shepherd service (not working) is the
> current working directory. In the former case it would be ~hass, in the
> latter case it would be /. Guix shell defaults to making CWD available
> in the container, so it in the service case (I am guessing) mounts /
> onto / of the containers which might mess up some permissions.
> 
> You might try setting #:directory if you need the $HOME accessible, or
> pass --no-cwd if you do not.


excellent tips Tomas, thank you!

i think the essential part was specifying #:directory "/srv/hass".

FTR, this is what i ended up with:

(simple-service
 'home-assistant
 shepherd-root-service-type
 (list
  (shepherd-service
   (requirement '(file-systems networking guix-daemon))
   (provision '(home-assistant))
   (documentation "")
   ;; TODO herd stop doesn't work. it leaves the process
   ;; running without any errors.
   (start
    #~(lambda _
        (fork+exec-command
         (list #$(file-append guix "/bin/guix")
               "shell"
               "--manifest=/srv/hass/manifest.scm"
               "--container"
               "--emulate-fhs"
               "--network"
               "--share=/srv/hass"
               "--no-cwd"
               "--expose=/gnu"
               "--expose=/run/current-system"
               "--"
               #$(file-append bash "/bin/bash")
               "-c" "cd /srv/hass && source bin/activate && 
LD_LIBRARY_PATH=/lib:/lib64 hass --config=/srv/hass/config")
         #:log-file "/var/log/home-assistant.log"
         #:user  '#$(user-account-name  *hass-user*)
         #:group '#$(user-account-group *hass-user*)
         #:directory "/srv/hass"
         #:supplementary-groups
         '#$(user-account-supplementary-groups *hass-user*)
         #:environment-variables
         (list (string-append "HOME=/home/"
                              #$(user-account-name *hass-user*)))))))))

notice that --expose=/gnu was needed, and possibly 
--expose=/run/current-system, too, but i didn't double check every change.

this way the `guix shell` call will get the versions from the hass user's pull 
state; i.e. i can independently decide when to upgrade the guix environment of 
the hass user and process.

it's a relatively painless escape hatch to run even a non-trivial service 
without packaging the app and writing the necessary service code.

-- 
• attila lendvai
• PGP: 963F 5D5F 45C7 DFCD 0A39
--
“An extreme optimist is a man who believes that humanity will probably survive 
even if it doesn't take his advice.”
        — John McCarthy (1927–2011), father of Lisp


Reply via email to