Запуск приложения Java / Clojure в качестве демона в Linux раньше был сложным, но с Ubuntu Upstart ( docs ) это довольно просто . Короткая история:
- Создайте универсальный uberjar с помощью «производственного кольца lein с профилем uberjar» (с помощью плагина lein-ring ; простого приложения lein uberjar будет достаточно для приложения с
main-
методом) - Создайте файл upstart <имя службы> .conf в / etc / init /
- Запустите sudo start / stop / status <имя службы>
И, конечно, это работает и с Puppet.
Пример /etc/init/mongodiffer.conf
Пример файла конфигурации Upstart для службы mongodiffer:
## Upstart config file (use 'start mongodiffer', 'stop mongodiffer') ## Note: Stdout and stderr will be captured in /var/log/upstart/mongodiffer.log ## (aside of the native log in /var/log/mongodiffer.log) author "Jakub Holy" description "Start the MongoDiffer webapp on its default port (80)" start on (local-filesystems and net-device-up IFACE!=lo) # Note: "start on runlevel [2345]" would also do but I want to be explicit that # running it w/o network is meaningless # Must run as root to be able to run on port 80; ugly but quick #setuid mongodiffer #setgid mongodiffer exec java -jar /srv/mongodiffer/clj-analytics-mongodiffer-standalone.jar ## TODO: Consider enabling respawning # respawn ## Try to restart up to 10 times within 5 min: # respawn limit 10 300
Единственными необходимыми « строфами » являются « start on » и « exec » (см. Также Upstart для приложений Java ). Мы также могли бы включить респаун (оба раздела), чтобы Upstart попытался снова запустить сервис в случае сбоя. (Конечно, сервис Clojure никогда не вылетает )
логирование
Я использую tools.logging с logback (ch.qos.logback / logback-classic) и его RollingFileAppender с SizeAndTimeBasedFNATP, чтобы сохранить журналы до разумного размера:
<configuration> <appender name="FILE"> <file>/var/log/mongodiffer/mongodiffer.log</file> <rollingPolicy> <!-- rollover daily --> <fileNamePattern>/var/log/mongodiffer/mongodiffer-%d{yyyy-MM}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy> <!-- or whenever the file size reaches the size --> <maxFileSize>10MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <appender name="STDOUT"> <encoder> <pattern>%msg%n</pattern> </encoder> </appender> <root level="info"> <appender-ref ref="FILE" /> <appender-ref ref="STDOUT" /> <!-- Useful when running locally/dev --> </root> </configuration>
Stdout и stderr службы автоматически записываются в /var/log/upstart/mongodiffer.log через раздел журнала консоли по умолчанию . Я не смог выяснить, что делать, чтобы убедиться, что он не будет расти бесконечно.
Обслуживание статических ресурсов из Ring uberjar
- Поместите ресурсы в каталог ресурсов, например. ресурсы / статические / (=> например ресурсы / статические / js / zepto / zepto.min.js)
- Сконфигурируйте промежуточное ПО кольца wrap-resource: «(wrap-resource« static »)»
- Обратитесь к ресурсам, используя путь после статического (например, «/js/zepto/zepto.min.js»)