2015-08-29 2 views
0

Как скрипт установки SystemD, созданный sbt debian:packageBin, устанавливает разрешения для webapp для записи в PID /var/run или в подкаталог?.deb для SystemD, созданный с debian: packageBin for Play 2.4.2 Приложение не имеет Permisison для создания журнала

Только root имеет разрешение на создание файла pid в /var/run или для создания каталога, такого как /var/run/myWebApp/, который содержит файл pid. Задача debian:packageBin заставляет webapp запускаться как специальный user:group, созданный с именем webapp. Если каталог создается как /var/run/myWebApp, группе myWebApp требуется разрешение на запись, но я не вижу способа сделать это автоматически. Я что-то упускаю?

Вот некоторые из моих конфигурационных файлов:

dist/conf/application.ini:

-Dpidfile.path=/var/run/webapp2/webapp2.pid 

conf/application.conf:

# This seems redundant ... should it be removed? 
pidfile.path = /var/run/webapp2/pid 
pidfile.path = ${?pidfile.path} 

debian.sbt:

import com.typesafe.sbt.packager.archetypes.ServerLoader.{Systemd, SystemV, Upstart} 
import com.typesafe.sbt.SbtNativePackager.autoImport._ 

lazy val root = (project in file(".")).enablePlugins(PlayScala, DebianPlugin) 

enablePlugins(JavaAppPackaging) 
enablePlugins(JDebPackaging) 
enablePlugins(JavaServerAppPackaging) 

serverLoading in Debian := Systemd 

maintainer in Linux  := "Mike Slinn <[email protected]>" 
packageSummary in Linux := "myWebApp blah blah" 
packageDescription  := "myWebApp blah blah" 
daemonUser in Linux  := normalizedName.value  // user which will execute the application, resolves to "myWebApp" 
daemonGroup in Linux  := (daemonUser in Linux).value // group which will execute the application, resolves to "myWebApp" 

Дополнение:

Play manages its own pid.. Я не смог получить ${{app_name}} для расширения, поэтому вместо этого я закодировал myWebApp.

sbt-native-packager docs говорят, что pid должен быть помещен в /var/run/myWebApp и журналы в /var/log/myWebApp.

/var/run имеет разрешение 777 имеет символическое обозначение /run с разрешением 775; оба принадлежат root:root. Таким образом, единственный способ для не-root-процесса можно записать в /var/run для создания каталога под /var/run с соответствующими разрешениями. Например, postgres:postgres имеет разрешение на запись /var/run/postgres:

$ ls -adlF /var/run/postgresql 
drwxrwsr-x 3 postgres postgres 120 Aug 28 01:17 /var/run/postgresql/ 

Это как Плэй документы показывают размещения ИДП в /var/run должны работать, однако это не работает для меня.

+0

Это должно быть сделано автоматически, вы пробовали настроить? – kardapoltsev

+0

Да, я пробовал, и это не сработало, как описано –

+0

-Dpidfile.path =/var/run/webapp2/pid, а ваше имя приложения - myWebApp? Не могли бы вы вывести вывод ls -l/var/run/myWebApp? – kardapoltsev

ответ

0

Вот решение, помещенное в debian.sbt:

linuxPackageMappings += packageTemplateMapping(s"/var/run/${name.value}/")() withUser name.value withGroup name.value 

Там не было никакой необходимости в дополнительных записях в conf/application.conf.

+0

Play приложение создает pid-файл и пытается создать его в каталоге запуска, который является/usr/share/appName и не доступен для записи. Итак, для игрового приложения вам нужны дополнительные настройки для файла pid. – kardapoltsev

+0

Возможно, вы не заметили, что я хотел создать файл PID в/var/run/myWebApp /, как стандартная служба Linux. Это должно было быть совершенно ясно. Ваше предложение этого не делает. Мое решение проверено и работает. Я также не ценю нисходящее движение. –

+0

Файл pid будет создан в/var/run/appName при запуске системы. И сама программа воспроизведения попытается создать еще один в рабочем каталоге, который не доступен для записи для daemonUser. Также этот каталог добавляется в linuxPackageMappings с помощью JavaServerAppPackaging. Я удалю downvote, если вас беспокоит, no prob (: – kardapoltsev