Puppet Class: pm2::create_app

Defined in:
manifests/create_app.pp

Overview

Class: pm2::create_app

install a nodejs app and run in pm2

Parameters:

  • name (Any) (defaults to: '')
  • app (Any) (defaults to: $name)
  • appversion (Any) (defaults to: 'latest')
  • path (Any) (defaults to: "/opt/nodejs/${name}")
  • script (Any) (defaults to: 'lib/app.js')
  • args (Any) (defaults to: [])
  • env (Any) (defaults to: '')
  • install_root (Any) (defaults to: '/opt')
  • install_dir (Any) (defaults to: 'nodejs')
  • deamon_user (Any) (defaults to: 'nodejs')


5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'manifests/create_app.pp', line 5

class pm2::create_app(
  $name            = '',
  $app             = $name,
  $appversion      = 'latest',
  $path            = "/opt/nodejs/${name}",
  $script          = 'lib/app.js',
  $args            = [],
  $env             = '',
  $install_root    = '/opt',
  $install_dir     = 'nodejs',
  $deamon_user     = 'nodejs')
{

  $install_path = "${install_root}/${install_dir}"


  file { $path:
    ensure => directory,
    owner  => $deamon_user,
    group  => $deamon_user,
    mode   => '0750'
  }

  file { "${path}/${appversion}":
    ensure  => directory,
    owner   => $deamon_user,
    group   => $deamon_user,
    mode    => '0750',
    require => File[$path]
  }
  
  exec { "npm install ${app}":
    command => "npm install ${app}@${appversion}",
    path    => $::path,
    timeout => 0,
    cwd     => "${path}/${appversion}",
    require => File["${path}/${appversion}"]
  }
  
  exec {  "fixup ${app}":
    command => "chown -Rf ${deamon_user}:${deamon_user} '${path}/${appversion}'",
    timeout => 0,
    cwd     => "${path}/${appversion}",
    require => Exec["npm install ${app}"]
  }

  file { "${path}/pm2.json":
    ensure  => present,
    owner   => $deamon_user,
    group   => $deamon_user,
    mode    => '0444',
    content => template('pm2/pm2.json.erb'),
    require => Exec["fixup ${app}"],
  }

  file { "/var/log/pm2/${name}":
    ensure  => directory,
    owner   => $deamon_user,
    group   => $deamon_user,
    mode    => '0755',
    require => File["${path}/pm2.json"]
  }

  file { "${path}/logs":
    ensure  => 'link',
    target  => "/var/log/pm2/${name}",
    owner   => $deamon_user,
    group   => $deamon_user,
    mode    => '0755',
    require => File["/var/log/pm2/${name}"]
  }

  file { "${path}/pids":
    ensure  => 'link',
    target  => '/var/run/pm2',
    owner   => $deamon_user,
    group   => $deamon_user,
    require => File["${path}/logs"]
  }
  
  # HACK: `pm2 reload` does NOT reload changes to the pm2.json file
  #       the only way to process changes in the pm2.json file is to delete and
  #       then start the app
  # BUG: bug in PM2 means have to set HOME variable for user 
  
  exec {  "pm2 delete ${name}":
    command     => "pm2 delete ${name}",
    timeout     => 0,
    path        => $::path,
    user        => $deamon_user,
    group       => $deamon_user,
    environment => ["HOME=${install_root}/${install_dir}"],
    cwd         => "${path}/current",
    onlyif      => "pm2 -m list | grep '\-\-\- ${name}'",
    require     => File["${path}/pids"]
  }

  file { "${path}/current":
    ensure  => 'link',
    target  => "${path}/${appversion}",
    owner   => $deamon_user,
    group   => $deamon_user,
    require => Exec["pm2 delete ${name}"]
  }
  

  # now tell pm2 to startup using a cluster with as many nodes as CPUs
  # BUG: bug in PM2 means have to set HOME variable for user   
  exec {  "pm2 start '${path}/pm2.json' --name '${name}'":
    command     => "pm2 start '${path}/pm2.json' --name '${name}'",
    timeout     => 0,
    path        => $::path,
    user        => $deamon_user,
    environment => ["HOME=${install_root}/${install_dir}"],
    group       => $deamon_user,
    cwd         => "${path}/current",
    require     => File["${path}/current"]
  }

}