@zappinginc/zm2 6.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/.claude/settings.local.json +8 -0
  2. package/.gitattributes +4 -0
  3. package/.mocharc.js +14 -0
  4. package/CHANGELOG.md +2416 -0
  5. package/CLAUDE.md +84 -0
  6. package/CONTRIBUTING.md +124 -0
  7. package/GNU-AGPL-3.0.txt +665 -0
  8. package/LICENSE +1 -0
  9. package/README.md +248 -0
  10. package/bin/zm2 +3 -0
  11. package/bin/zm2-dev +3 -0
  12. package/bin/zm2-docker +3 -0
  13. package/bin/zm2-runtime +3 -0
  14. package/bin/zm2-windows +3 -0
  15. package/bin/zm2.ps1 +3 -0
  16. package/bun.lock +421 -0
  17. package/constants.js +114 -0
  18. package/index.js +13 -0
  19. package/lib/API/Configuration.js +212 -0
  20. package/lib/API/Containerizer.js +335 -0
  21. package/lib/API/Dashboard.js +459 -0
  22. package/lib/API/Deploy.js +117 -0
  23. package/lib/API/Extra.js +775 -0
  24. package/lib/API/ExtraMgmt/Docker.js +30 -0
  25. package/lib/API/Log.js +315 -0
  26. package/lib/API/LogManagement.js +371 -0
  27. package/lib/API/Modules/LOCAL.js +122 -0
  28. package/lib/API/Modules/Modularizer.js +148 -0
  29. package/lib/API/Modules/NPM.js +445 -0
  30. package/lib/API/Modules/TAR.js +362 -0
  31. package/lib/API/Modules/flagExt.js +46 -0
  32. package/lib/API/Modules/index.js +120 -0
  33. package/lib/API/Monit.js +247 -0
  34. package/lib/API/Serve.js +343 -0
  35. package/lib/API/Startup.js +629 -0
  36. package/lib/API/UX/helpers.js +213 -0
  37. package/lib/API/UX/index.js +9 -0
  38. package/lib/API/UX/pm2-describe.js +193 -0
  39. package/lib/API/UX/pm2-ls-minimal.js +31 -0
  40. package/lib/API/UX/pm2-ls.js +483 -0
  41. package/lib/API/Version.js +382 -0
  42. package/lib/API/interpreter.json +12 -0
  43. package/lib/API/pm2-plus/PM2IO.js +372 -0
  44. package/lib/API/pm2-plus/auth-strategies/CliAuth.js +288 -0
  45. package/lib/API/pm2-plus/auth-strategies/WebAuth.js +187 -0
  46. package/lib/API/pm2-plus/helpers.js +97 -0
  47. package/lib/API/pm2-plus/link.js +126 -0
  48. package/lib/API/pm2-plus/pres/motd +16 -0
  49. package/lib/API/pm2-plus/pres/motd.update +26 -0
  50. package/lib/API/pm2-plus/pres/welcome +28 -0
  51. package/lib/API/pm2-plus/process-selector.js +52 -0
  52. package/lib/API/schema.json +379 -0
  53. package/lib/API.js +1931 -0
  54. package/lib/Client.js +776 -0
  55. package/lib/Common.js +911 -0
  56. package/lib/Configuration.js +304 -0
  57. package/lib/Daemon.js +456 -0
  58. package/lib/Event.js +37 -0
  59. package/lib/God/ActionMethods.js +909 -0
  60. package/lib/God/ClusterMode.js +97 -0
  61. package/lib/God/ForkMode.js +297 -0
  62. package/lib/God/Methods.js +265 -0
  63. package/lib/God/Reload.js +240 -0
  64. package/lib/God.js +632 -0
  65. package/lib/HttpInterface.js +76 -0
  66. package/lib/ProcessContainer.js +305 -0
  67. package/lib/ProcessContainerBun.js +360 -0
  68. package/lib/ProcessContainerFork.js +42 -0
  69. package/lib/ProcessContainerForkBun.js +33 -0
  70. package/lib/ProcessUtils.js +55 -0
  71. package/lib/TreeKill.js +118 -0
  72. package/lib/Utility.js +430 -0
  73. package/lib/VersionCheck.js +46 -0
  74. package/lib/Watcher.js +117 -0
  75. package/lib/Worker.js +169 -0
  76. package/lib/binaries/CLI.js +1041 -0
  77. package/lib/binaries/DevCLI.js +183 -0
  78. package/lib/binaries/Runtime.js +101 -0
  79. package/lib/binaries/Runtime4Docker.js +192 -0
  80. package/lib/completion.js +229 -0
  81. package/lib/completion.sh +40 -0
  82. package/lib/motd +36 -0
  83. package/lib/templates/Dockerfiles/Dockerfile-java.tpl +7 -0
  84. package/lib/templates/Dockerfiles/Dockerfile-nodejs.tpl +8 -0
  85. package/lib/templates/Dockerfiles/Dockerfile-ruby.tpl +7 -0
  86. package/lib/templates/ecosystem-es.tpl +24 -0
  87. package/lib/templates/ecosystem-simple-es.tpl +8 -0
  88. package/lib/templates/ecosystem-simple.tpl +6 -0
  89. package/lib/templates/ecosystem.tpl +22 -0
  90. package/lib/templates/init-scripts/launchd.tpl +35 -0
  91. package/lib/templates/init-scripts/openrc.tpl +52 -0
  92. package/lib/templates/init-scripts/pm2-init-amazon.sh +86 -0
  93. package/lib/templates/init-scripts/rcd-openbsd.tpl +41 -0
  94. package/lib/templates/init-scripts/rcd.tpl +44 -0
  95. package/lib/templates/init-scripts/smf.tpl +43 -0
  96. package/lib/templates/init-scripts/systemd-online.tpl +22 -0
  97. package/lib/templates/init-scripts/systemd.tpl +22 -0
  98. package/lib/templates/init-scripts/upstart.tpl +103 -0
  99. package/lib/templates/logrotate.d/pm2 +10 -0
  100. package/lib/templates/sample-apps/http-server/README.md +14 -0
  101. package/lib/templates/sample-apps/http-server/api.js +9 -0
  102. package/lib/templates/sample-apps/http-server/ecosystem.config.js +14 -0
  103. package/lib/templates/sample-apps/http-server/package.json +11 -0
  104. package/lib/templates/sample-apps/pm2-plus-metrics-actions/README.md +45 -0
  105. package/lib/templates/sample-apps/pm2-plus-metrics-actions/custom-metrics.js +66 -0
  106. package/lib/templates/sample-apps/pm2-plus-metrics-actions/ecosystem.config.js +12 -0
  107. package/lib/templates/sample-apps/pm2-plus-metrics-actions/package.json +11 -0
  108. package/lib/templates/sample-apps/python-app/README.md +4 -0
  109. package/lib/templates/sample-apps/python-app/echo.py +7 -0
  110. package/lib/templates/sample-apps/python-app/ecosystem.config.js +12 -0
  111. package/lib/templates/sample-apps/python-app/package.json +11 -0
  112. package/lib/tools/Config.js +248 -0
  113. package/lib/tools/IsAbsolute.js +20 -0
  114. package/lib/tools/copydirSync.js +101 -0
  115. package/lib/tools/deleteFolderRecursive.js +19 -0
  116. package/lib/tools/find-package-json.js +74 -0
  117. package/lib/tools/fmt.js +72 -0
  118. package/lib/tools/isbinaryfile.js +94 -0
  119. package/lib/tools/json5.js +752 -0
  120. package/lib/tools/open.js +63 -0
  121. package/lib/tools/passwd.js +58 -0
  122. package/lib/tools/promise.min.js +1 -0
  123. package/lib/tools/sexec.js +55 -0
  124. package/lib/tools/treeify.js +113 -0
  125. package/lib/tools/which.js +120 -0
  126. package/lib/tools/xdg-open +861 -0
  127. package/package.json +219 -0
  128. package/paths.js +93 -0
  129. package/pm2 +11 -0
  130. package/preinstall.js +24 -0
  131. package/run.sh +9 -0
  132. package/types/index.d.ts +722 -0
  133. package/types/tsconfig.json +14 -0
@@ -0,0 +1,40 @@
1
+ ###-begin-pm2-completion-###
2
+ ### credits to npm for the completion file model
3
+ #
4
+ # Installation: pm2 completion >> ~/.bashrc (or ~/.zshrc)
5
+ #
6
+
7
+ COMP_WORDBREAKS=${COMP_WORDBREAKS/=/}
8
+ COMP_WORDBREAKS=${COMP_WORDBREAKS/@/}
9
+ export COMP_WORDBREAKS
10
+
11
+ if type complete &>/dev/null; then
12
+ _pm2_completion () {
13
+ local si="$IFS"
14
+ IFS=$'\n' COMPREPLY=($(COMP_CWORD="$COMP_CWORD" \
15
+ COMP_LINE="$COMP_LINE" \
16
+ COMP_POINT="$COMP_POINT" \
17
+ pm2 completion -- "${COMP_WORDS[@]}" \
18
+ 2>/dev/null)) || return $?
19
+ IFS="$si"
20
+ }
21
+ complete -o default -F _pm2_completion pm2
22
+ elif type compctl &>/dev/null; then
23
+ _pm2_completion () {
24
+ local cword line point words si
25
+ read -Ac words
26
+ read -cn cword
27
+ let cword-=1
28
+ read -l line
29
+ read -ln point
30
+ si="$IFS"
31
+ IFS=$'\n' reply=($(COMP_CWORD="$cword" \
32
+ COMP_LINE="$line" \
33
+ COMP_POINT="$point" \
34
+ pm2 completion -- "${words[@]}" \
35
+ 2>/dev/null)) || return $?
36
+ IFS="$si"
37
+ }
38
+ compctl -K _pm2_completion + -f + pm2
39
+ fi
40
+ ###-end-pm2-completion-###
package/lib/motd ADDED
@@ -0,0 +1,36 @@
1
+
2
+ -------------
3
+
4
+ __/\\\\\\\\\\\\\____/\\\\____________/\\\\____/\\\\\\\\\_____
5
+ _\/\\\/////////\\\_\/\\\\\\________/\\\\\\__/\\\///////\\\___
6
+ _\/\\\_______\/\\\_\/\\\//\\\____/\\\//\\\_\///______\//\\\__
7
+ _\/\\\\\\\\\\\\\/__\/\\\\///\\\/\\\/_\/\\\___________/\\\/___
8
+ _\/\\\/////////____\/\\\__\///\\\/___\/\\\________/\\\//_____
9
+ _\/\\\_____________\/\\\____\///_____\/\\\_____/\\\//________
10
+ _\/\\\_____________\/\\\_____________\/\\\___/\\\/___________
11
+ _\/\\\_____________\/\\\_____________\/\\\__/\\\\\\\\\\\\\\\_
12
+ _\///______________\///______________\///__\///////////////__
13
+
14
+
15
+ Runtime Edition
16
+
17
+ ZM2 is a Production Process Manager for Node.js applications
18
+ with a built-in Load Balancer.
19
+
20
+ Start and Daemonize any application:
21
+ $ zm2 start app.js
22
+
23
+ Load Balance 4 instances of api.js:
24
+ $ zm2 start api.js -i 4
25
+
26
+ Monitor in production:
27
+ $ zm2 monitor
28
+
29
+ Make zm2 auto-boot at server restart:
30
+ $ zm2 startup
31
+
32
+ To go further checkout:
33
+ http://pm2.io/
34
+
35
+
36
+ -------------
@@ -0,0 +1,7 @@
1
+ FROM anapsix/alpine-java:latest
2
+
3
+ RUN apk update && apk add git && rm -rf /var/cache/apk/*
4
+ RUN npm install pm2@next -g
5
+ RUN mkdir -p /var/app
6
+
7
+ WORKDIR /var/app
@@ -0,0 +1,8 @@
1
+ FROM keymetrics/pm2:latest
2
+
3
+ RUN mkdir -p /var/app
4
+
5
+ WORKDIR /var/app
6
+
7
+ COPY ./package.json /var/app
8
+ RUN npm install
@@ -0,0 +1,7 @@
1
+ FROM anapsix/alpine-ruby:latest
2
+
3
+ RUN apk update && apk add git && rm -rf /var/cache/apk/*
4
+ RUN npm install pm2@next -g
5
+ RUN mkdir -p /var/app
6
+
7
+ WORKDIR /var/app
@@ -0,0 +1,24 @@
1
+ const config = {
2
+ apps : [{
3
+ script: 'index.js',
4
+ watch: '.'
5
+ }, {
6
+ script: './service-worker/',
7
+ watch: ['./service-worker']
8
+ }],
9
+
10
+ deploy : {
11
+ production : {
12
+ user : 'SSH_USERNAME',
13
+ host : 'SSH_HOSTMACHINE',
14
+ ref : 'origin/master',
15
+ repo : 'GIT_REPOSITORY',
16
+ path : 'DESTINATION_PATH',
17
+ 'pre-deploy-local': '',
18
+ 'post-deploy' : 'npm install && pm2 reload ecosystem.config.js --env production',
19
+ 'pre-setup': ''
20
+ }
21
+ }
22
+ };
23
+
24
+ export default config;
@@ -0,0 +1,8 @@
1
+ const config = {
2
+ apps : [{
3
+ name : "app1",
4
+ script : "./app.js"
5
+ }]
6
+ }
7
+
8
+ export default config;
@@ -0,0 +1,6 @@
1
+ module.exports = {
2
+ apps : [{
3
+ name : "app1",
4
+ script : "./app.js"
5
+ }]
6
+ }
@@ -0,0 +1,22 @@
1
+ module.exports = {
2
+ apps : [{
3
+ script: 'index.js',
4
+ watch: '.'
5
+ }, {
6
+ script: './service-worker/',
7
+ watch: ['./service-worker']
8
+ }],
9
+
10
+ deploy : {
11
+ production : {
12
+ user : 'SSH_USERNAME',
13
+ host : 'SSH_HOSTMACHINE',
14
+ ref : 'origin/master',
15
+ repo : 'GIT_REPOSITORY',
16
+ path : 'DESTINATION_PATH',
17
+ 'pre-deploy-local': '',
18
+ 'post-deploy' : 'npm install && zm2 reload ecosystem.config.js --env production',
19
+ 'pre-setup': ''
20
+ }
21
+ }
22
+ };
@@ -0,0 +1,35 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>Label</key>
6
+ <string>com.ZM2</string>
7
+ <key>UserName</key>
8
+ <string>%USER%</string>
9
+ <key>KeepAlive</key>
10
+ <true/>
11
+ <key>ProgramArguments</key>
12
+ <array>
13
+ <string>/bin/sh</string>
14
+ <string>-c</string>
15
+ <string>%PM2_PATH% resurrect</string>
16
+ </array>
17
+ <key>RunAtLoad</key>
18
+ <true/>
19
+ <key>OnDemand</key>
20
+ <false/>
21
+ <key>LaunchOnlyOnce</key>
22
+ <true/>
23
+ <key>EnvironmentVariables</key>
24
+ <dict>
25
+ <key>PATH</key>
26
+ <string>%NODE_PATH%</string>
27
+ <key>PM2_HOME</key>
28
+ <string>%HOME_PATH%</string>
29
+ </dict>
30
+ <key>StandardErrorPath</key>
31
+ <string>/tmp/com.ZM2.err</string>
32
+ <key>StandardOutPath</key>
33
+ <string>/tmp/com.ZM2.out</string>
34
+ </dict>
35
+ </plist>
@@ -0,0 +1,52 @@
1
+ #!/sbin/openrc-run
2
+ # Copyright 2013-2022 the ZM2 project authors. All rights reserved.
3
+ # Init script automatically generated by zm2 startup
4
+
5
+ description="Production process manager for Node.js apps with a built-in load balancer."
6
+
7
+ extra_started_commands="reload"
8
+
9
+ PM2="%PM2_PATH%"
10
+ user=${PM2_USER:-%USER%}
11
+ export PM2_HOME=$(eval echo ~${user})"/.pm2/"
12
+ # Options for start-stop-daemon (default start function)
13
+ command=${PM2}
14
+ command_user=${user}
15
+ command_args="resurrect"
16
+ pidfile=${PM2_HOME}/zm2.pid
17
+
18
+ run_pm2_as_user() {
19
+ einfo "${PM2} $@"
20
+ eval su -l ${user} -c \'${PM2} $@\'
21
+ }
22
+
23
+ depend() {
24
+ need net
25
+ need localmount
26
+ after bootmisc
27
+ }
28
+
29
+ start_post() {
30
+ if [ "${user}" == "root" ]; then
31
+ ewarn "ZM2: Better run this daemon as a non root user. To set this user create"
32
+ ewarn "ZM2: /etc/conf.d/zm2 file and define 'PM2_USER=user' there."
33
+ ewarn "ZM2: Note user MUST have home directory for ZM2 logs/state/etc..."
34
+ fi
35
+ einfo "ZM2: Process Manager started. To start services run:"
36
+ einfo "ZM2: # su -l ${user} -c '$PM2 start /path/to/app'"
37
+ }
38
+
39
+ stop() {
40
+ ebegin "Stopping ZM2 process manager..."
41
+ run_pm2_as_user dump
42
+ run_pm2_as_user kill
43
+ eend $?
44
+ }
45
+
46
+ reload() {
47
+ ebegin "Reloading zm2"
48
+ run_pm2_as_user reload all
49
+ eend $?
50
+ }
51
+
52
+ # vim: ts=4
@@ -0,0 +1,86 @@
1
+ #!/bin/bash
2
+ #
3
+ # zm2 Process manager for NodeJS
4
+ #
5
+ # chkconfig: 345 80 20
6
+ #
7
+ # description: ZM2 next gen process manager for Node.js
8
+ # processname: zm2
9
+ #
10
+ ### BEGIN INIT INFO
11
+ # Provides: zm2
12
+ # Required-Start: $local_fs $remote_fs
13
+ # Required-Stop: $local_fs $remote_fs
14
+ # Should-Start: $network
15
+ # Should-Stop: $network
16
+ # Default-Start: 2 3 4 5
17
+ # Default-Stop: 0 1 6
18
+ # Short-Description: ZM2 init script
19
+ # Description: ZM2 is the next gen process manager for Node.js
20
+ ### END INIT INFO
21
+
22
+ NAME=zm2
23
+ PM2=%PM2_PATH%
24
+ USER=%USER%
25
+
26
+ export PATH=%NODE_PATH%:$PATH
27
+ export PM2_HOME="%HOME_PATH%"
28
+
29
+ lockfile="/var/lock/subsys/zm2-init.sh"
30
+
31
+ super() {
32
+ su - $USER -c "PATH=$PATH; PM2_HOME=$PM2_HOME $*"
33
+ }
34
+
35
+ start() {
36
+ echo "Starting $NAME"
37
+ super $PM2 resurrect
38
+ retval=$?
39
+ [ $retval -eq 0 ] && touch $lockfile
40
+ }
41
+
42
+ stop() {
43
+ echo "Stopping $NAME"
44
+ super $PM2 kill
45
+ rm -f $lockfile
46
+ }
47
+
48
+ restart() {
49
+ echo "Restarting $NAME"
50
+ stop
51
+ start
52
+ }
53
+
54
+ reload() {
55
+ echo "Reloading $NAME"
56
+ super $PM2 reload all
57
+ }
58
+
59
+ status() {
60
+ echo "Status for $NAME:"
61
+ super $PM2 list
62
+ RETVAL=$?
63
+ }
64
+
65
+ case "$1" in
66
+ start)
67
+ start
68
+ ;;
69
+ stop)
70
+ stop
71
+ ;;
72
+ status)
73
+ status
74
+ ;;
75
+ restart)
76
+ restart
77
+ ;;
78
+ reload)
79
+ reload
80
+ ;;
81
+ *)
82
+ echo "Usage: {start|stop|status|restart|reload}"
83
+ exit 1
84
+ ;;
85
+ esac
86
+ exit $RETVAL
@@ -0,0 +1,41 @@
1
+ #!/bin/sh
2
+ #
3
+ # from /usr/ports/infrastructure/templates/rc.template
4
+
5
+ daemon="/usr/local/bin/zm2"
6
+ #daemon_flags=
7
+ #daemon_rtable=0
8
+ #daemon_timeout="30"
9
+ daemon_user="%USER%"
10
+
11
+ . /etc/rc.d/rc.subr
12
+
13
+ pexp="node: ZM2.*God Daemon.*"
14
+ #rc_bg= # (undefined)
15
+ #rc_reload= # (undefined)
16
+ #rc_usercheck=YES
17
+
18
+ #rc_pre() {
19
+ #}
20
+
21
+ rc_start() {
22
+ ${rcexec} "${daemon} ${daemon_flags} resurrect"
23
+ }
24
+
25
+ #rc_check() {
26
+ # pgrep -T "${daemon_rtable}" -q -xf "${pexp}"
27
+ #}
28
+
29
+ rc_reload() {
30
+ ${rcexec} "${daemon} reload all"
31
+ #pkill -HUP -T "${daemon_rtable}" -xf "${pexp}"
32
+ }
33
+
34
+ #rc_stop() {
35
+ # pkill -T "${daemon_rtable}" -xf "${pexp}"
36
+ #}
37
+
38
+ #rc_post() {
39
+ #}
40
+
41
+ rc_cmd $1
@@ -0,0 +1,44 @@
1
+ #!/bin/sh
2
+
3
+ # PROVIDE: zm2
4
+ # REQUIRE: LOGIN
5
+ # KEYWORD: shutdown
6
+
7
+ . /etc/rc.subr
8
+
9
+ name="%SERVICE_NAME%"
10
+ rcvar="%SERVICE_NAME%_enable"
11
+
12
+ start_cmd="zm2_start"
13
+ stop_cmd="zm2_stop"
14
+ reload_cmd="zm2_reload"
15
+ status_cmd="zm2_status"
16
+ extra_commands="reload status"
17
+
18
+ zm2()
19
+ {
20
+ env PATH="$PATH:%NODE_PATH%" PM2_HOME="%HOME_PATH%" su -m "%USER%" -c "%PM2_PATH% $*"
21
+ }
22
+
23
+ zm2_start()
24
+ {
25
+ zm2 resurrect
26
+ }
27
+
28
+ zm2_stop()
29
+ {
30
+ zm2 kill
31
+ }
32
+
33
+ zm2_reload()
34
+ {
35
+ zm2 reload all
36
+ }
37
+
38
+ zm2_status()
39
+ {
40
+ zm2 list
41
+ }
42
+
43
+ load_rc_config $name
44
+ run_rc_command "$1"
@@ -0,0 +1,43 @@
1
+ <?xml version="1.0"?>
2
+ <!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
3
+ <service_bundle type="manifest" name="%SERVICE_NAME%">
4
+ <service name="application/%SERVICE_NAME%" type="service" version="1">
5
+ <create_default_instance enabled="false"/>
6
+ <single_instance/>
7
+
8
+ <dependency name="network" grouping="require_all" restart_on="error" type="service">
9
+ <service_fmri value="svc:/milestone/network:default"/>
10
+ </dependency>
11
+
12
+ <dependency name="filesystem" grouping="require_all" restart_on="error" type="service">
13
+ <service_fmri value="svc:/system/filesystem/local"/>
14
+ </dependency>
15
+
16
+ <method_context>
17
+ <method_environment>
18
+ <envvar name='PATH' value="%NODE_PATH%:/usr/local/sbin:/usr/local/bin:/opt/local/sbin:/opt/local/bin:/usr/sbin:/usr/bin:/sbin"/>
19
+ <envvar name='PM2_HOME' value="%HOME_PATH%"/>
20
+ </method_environment>
21
+ </method_context>
22
+
23
+ <exec_method type="method" name="start" exec="%PM2_PATH% resurrect" timeout_seconds="60"/>
24
+ <exec_method type="method" name="refresh" exec="%PM2_PATH% reload all" timeout_seconds="60"/>
25
+ <exec_method type="method" name="stop" exec="%PM2_PATH% kill" timeout_seconds="60"/>
26
+
27
+ <property_group name="startd" type="framework">
28
+ <propval name="duration" type="astring" value="contract"/>
29
+ <propval name="ignore_error" type="astring" value="core,signal"/>
30
+ </property_group>
31
+
32
+ <property_group name="application" type="application"></property_group>
33
+ <stability value="Evolving"/>
34
+
35
+ <template>
36
+ <common_name>
37
+ <loctext xml:lang="C">
38
+ ZM2 process manager
39
+ </loctext>
40
+ </common_name>
41
+ </template>
42
+ </service>
43
+ </service_bundle>
@@ -0,0 +1,22 @@
1
+ [Unit]
2
+ Description=ZM2 process manager
3
+ Documentation=https://pm2.keymetrics.io/
4
+ After=network-online.target
5
+ Restart=on-failure
6
+
7
+ [Service]
8
+ Type=forking
9
+ User=%USER%
10
+ LimitNOFILE=infinity
11
+ LimitNPROC=infinity
12
+ LimitCORE=infinity
13
+ Environment=PATH=%NODE_PATH%:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
14
+ Environment=PM2_HOME=%HOME_PATH%
15
+ PIDFile=%HOME_PATH%/zm2.pid
16
+
17
+ ExecStart=%PM2_PATH% resurrect
18
+ ExecReload=%PM2_PATH% reload all
19
+ ExecStop=%PM2_PATH% kill
20
+
21
+ [Install]
22
+ WantedBy=network-online.target
@@ -0,0 +1,22 @@
1
+ [Unit]
2
+ Description=ZM2 process manager
3
+ Documentation=https://pm2.keymetrics.io/
4
+ After=network.target
5
+
6
+ [Service]
7
+ Type=forking
8
+ User=%USER%
9
+ LimitNOFILE=infinity
10
+ LimitNPROC=infinity
11
+ LimitCORE=infinity
12
+ Environment=PATH=%NODE_PATH%:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
13
+ Environment=PM2_HOME=%HOME_PATH%
14
+ PIDFile=%HOME_PATH%/zm2.pid
15
+ Restart=on-failure
16
+
17
+ ExecStart=%PM2_PATH% resurrect
18
+ ExecReload=%PM2_PATH% reload all
19
+ ExecStop=%PM2_PATH% kill
20
+
21
+ [Install]
22
+ WantedBy=multi-user.target
@@ -0,0 +1,103 @@
1
+ #!/bin/bash
2
+ ### BEGIN INIT INFO
3
+ # Provides: zm2
4
+ # Required-Start: $local_fs $remote_fs $network
5
+ # Required-Stop: $local_fs $remote_fs $network
6
+ # Default-Start: 2 3 4 5
7
+ # Default-Stop: 0 1 6
8
+ # Short-Description: ZM2 Init script
9
+ # Description: ZM2 process manager
10
+ ### END INIT INFO
11
+
12
+ NAME=zm2
13
+ PM2=%PM2_PATH%
14
+ USER=%USER%
15
+ DEFAULT=/etc/default/$NAME
16
+
17
+ export PATH=%NODE_PATH%:$PATH
18
+ export PM2_HOME="%HOME_PATH%"
19
+
20
+ # The following variables can be overwritten in $DEFAULT
21
+
22
+ # maximum number of open files
23
+ MAX_OPEN_FILES=
24
+
25
+ # overwrite settings from default file
26
+ if [ -f "$DEFAULT" ]; then
27
+ . "$DEFAULT"
28
+ fi
29
+
30
+ # set maximum open files if set
31
+ if [ -n "$MAX_OPEN_FILES" ]; then
32
+ ulimit -n $MAX_OPEN_FILES
33
+ fi
34
+
35
+ get_user_shell() {
36
+ local shell
37
+ shell=$(getent passwd "${1:-$(whoami)}" | cut -d: -f7 | sed -e 's/[[:space:]]*$//')
38
+
39
+ if [[ $shell == *"/sbin/nologin" ]] || [[ $shell == "/bin/false" ]] || [[ -z "$shell" ]];
40
+ then
41
+ shell="/bin/bash"
42
+ fi
43
+
44
+ echo "$shell"
45
+ }
46
+
47
+ super() {
48
+ local shell
49
+ shell=$(get_user_shell $USER)
50
+ su - "$USER" -s "$shell" -c "PATH=$PATH; PM2_HOME=$PM2_HOME $*"
51
+ }
52
+
53
+ start() {
54
+ echo "Starting $NAME"
55
+ super $PM2 resurrect
56
+ }
57
+
58
+ stop() {
59
+ super $PM2 kill
60
+ }
61
+
62
+ restart() {
63
+ echo "Restarting $NAME"
64
+ stop
65
+ start
66
+ }
67
+
68
+ reload() {
69
+ echo "Reloading $NAME"
70
+ super $PM2 reload all
71
+ }
72
+
73
+ status() {
74
+ echo "Status for $NAME:"
75
+ super $PM2 list
76
+ RETVAL=$?
77
+ }
78
+
79
+ case "$1" in
80
+ start)
81
+ start
82
+ ;;
83
+ stop)
84
+ stop
85
+ ;;
86
+ status)
87
+ status
88
+ ;;
89
+ restart)
90
+ restart
91
+ ;;
92
+ reload)
93
+ reload
94
+ ;;
95
+ force-reload)
96
+ reload
97
+ ;;
98
+ *)
99
+ echo "Usage: {start|stop|status|restart|reload|force-reload}"
100
+ exit 1
101
+ ;;
102
+ esac
103
+ exit $RETVAL
@@ -0,0 +1,10 @@
1
+ %HOME_PATH%/zm2.log %HOME_PATH%/logs/*.log {
2
+ rotate 12
3
+ weekly
4
+ missingok
5
+ notifempty
6
+ compress
7
+ delaycompress
8
+ copytruncate
9
+ create 0640 %USER% %USER%
10
+ }
@@ -0,0 +1,14 @@
1
+
2
+ # Basic HTTP Server and Cluster mode
3
+
4
+ In this boilerplate it will start an http server in cluster mode.
5
+
6
+ You can check the content of the ecosystem.config.js on how to start mutliple instances of the same HTTP application in order to get the most from your working system.
7
+
8
+ ## Via CLI
9
+
10
+ Via CLI you can start any HTTP/TCP application in cluster mode with:
11
+
12
+ ```bash
13
+ $ pm2 start api.js -i max
14
+ ```
@@ -0,0 +1,9 @@
1
+
2
+ var http = require('http');
3
+
4
+ var server = http.createServer(function(req, res) {
5
+ res.writeHead(200);
6
+ res.end('hey');
7
+ }).listen(process.env.PORT || 8000, function() {
8
+ console.log('App listening on port %d', server.address().port);
9
+ });
@@ -0,0 +1,14 @@
1
+ module.exports = {
2
+ apps : [{
3
+ name: 'API',
4
+ script: 'api.js',
5
+ instances: 4,
6
+ max_memory_restart: '1G',
7
+ env: {
8
+ NODE_ENV: 'development'
9
+ },
10
+ env_production: {
11
+ NODE_ENV: 'production'
12
+ }
13
+ }]
14
+ };