Modules
Modules are open-source addons built and maintained thanks to the community. A PM2 module is just a Node.js process run by PM2 and can be pulled directly with PM2.
Modules are great to monitor external databases for example. The module process collects metrics with database calls and reports them into the dashboard with the @pm2/io library.
Anyone can create and publish a module. Leave us an email at contact@pm2.io if you want us to add your module to this list.
Use a module
Module are designed to be easy to use and to refine your configuration according to your needs.
Available modules
Module Name | Description |
---|---|
pm2-server-monit | Monitor your server machine (maintained by us) |
pm2-logrotate | Split your logs into multiple files (maintained by us) |
pm2-elasticsearch | Monitor your Elastic Search |
pm2-redis | Monitor your Redis |
pm2-mysql | Monitor your MYSQL |
pm2-rabbitmq | Monitoring module for RabbitMQ |
pm2-mongodb | Monitor your Mongo DB |
pm2-postgres | Monitor your PostgreSQL |
pm2-memcached | Monitor your Memcached |
pm2-couchdb | Monitor your CouchDB |
pm2-php-fpm | Monitor your PHP server |
Installation
pm2 install <module-name>
# Install a module from GitHub (username/repository)
pm2 install pm2-hive/pm2-docker
# Install a module in dev mode from local folder
pm2 install .
Configuration
Module sometimes offers the possibility to setup some option values. They are generally specified in the README or in the package.json in their github repository.
Set a value with:
pm2 set module_name:option_name <new_value>
The variables are saved in ~/.pm2/module_conf.json
. Configuration variables can be displayed with pm2 conf [your-module-name]
. No restart is needed, the module is automatically restarted.
Manage a module
# List all modules
pm2 ls
# Uninstall a module
pm2 uninstall <module-name>
Create a module
If you don’t find a module that suits your needs, don’t wait and create one.
Module Boilerplate
Generate a boilerplate:
pm2 module:generate <your-module-name>
Install and start the module:
cd <your-module-name>
pm2 install .
If you edit the source, PM2 automatically restarts the module (watch option is activated)
Display module logs with:
pm2 logs <your-module-name>
Module Configuration
Module configuration can be added into the package.json
file.
The config
attribute gathers parameters that will be accessible in the module in the callback of io.initModule()
.
The apps
attribute contains the same configuration as the ecosystem file. Don’t forget that a module is a process like any other ones.
{
"name": "your-module-name", // Used as the module name
"version": "1.0.0", // Used as the module version
"description": "My awesome module", // Used as the module comment
// Default configuration values
// These values can be overriden with `pm2 set <module-name>:<attr> <val>`
"config": {
"days_interval" : 7,
"max_size" : 5242880
},
// Module behavior options
"apps": [{
"script": "index.js",
"merge_logs": true,
"max_memory_restart": "200M"
}]
}
Module entry point
In your main module entry point, io.initModule()
is called to initialize the module:
const io = require('@pm2/io')
const conf = io.initModule({
// Override PID to be monitored
pid: io.resolvePidPaths(['/var/run/redis.pid']),
}, (err, conf) => {
// Now the module is initialized
require('./business_logic.js')(conf)
})
Installation Display
Once the module is installed, you can change the behavior to display a table containing the content you want. Edit the package.json and add an env section with pm2_EXTRA_DISPLAY: true
:
{
[...]
"apps" : [{
"script" : "index.js",
"env" : {
"pm2_EXTRA_DISPLAY" : "true"
}
}],
[...]
}
Then in your code:
const io = require('@pm2/io')
io.configureModule({
human_info: [
['Status', 'Module ready'],
['Comment', 'This is a superb comment the user should see'],
['IP', 'my machine ip!']
]
})
Publish Your Module
Inside the module folder, deploy your module with:
pm2 publish
This increments the minor version of the module, runs git add . ; git commit -m "VERSION"; git push origin master
then runs npm publish
.
Next Steps
Thanks for finishing this guide.
You can now take a look at the @pm2/io reference to master all the capabilities of PM2 Plus.