We're currently developing a website (TYPO3 under Apache) for a customer that is supported by a node.js/socket.io application that provides realtime updates to the content served from the CMS.
As this is our first node.js project I don't have any best practices to go by when it comes to 'the perfect setup' so I've spent some time researching deployment techniques.
A couple of questions remain for me to achieve a good setup which:
Is easy for the customer to deploy. This is very important because our website will be integrated in their 'live' TYPO3 installation which serves an abundance of websites and is running on servers which aren't managed by the customer but another (centralized) organization which makes support calls and server changes a slow process.
Should be easy to update. As mentioned requesting restarts and making server changes is a slow process, so idealy the node installation should restart / update when it receives changes that are pushed onto the live installion using
git
.
Deployment
The general consensus seems to be to use forever
when it comes to deploying node applications to keep them running. I've tested forever
, and it seems to work fine when installed by npm install forever -g
(global). This would require external assistance to globally install on the live environment though, so I'd prefer to have it running from the application's node_modules
directory, but I haven't been able to create a solid wrapper to do so.
Additionally, forever
works fine, but it has to be started manually. What would be the best approach to ensure that it gets started on server boot and keeps running?
- A simple
init.d
script? - Writing a watchdog wrapper?
- A TYPO3 scheduler task that checks
forever
status?
Rapid development / Restart on update
We're currently still in the development stage of the project and every time I make changes to the node.js application I manually restart node
or forever
. This works, but is far from ideal.
There are several smaller npm
modules that check for file modifications and restart node
upon detected changes, like:
- Nodemon
- Node.js Supervisor
- Bounce
- Nodules (which doesn't require restarting node, so might be easier to combine with
forever
) - Up
Does anyone have experience with any of these?
Update: Why don't you just use Cluster?
The Cluster module provides similar functionality through the reload mechanism, but doesn't work with Node 0.5+. The core Cluster module (Node 0.6+) that replaced it doesn't have all these features but only provides clustering. Which in turn doesn't play well with socket.io. At least not without using Redis (which is a problem for us, because we can't force another prereq service to the customer).
--
Obviously I'm trying to find the most stable solution that combines an update-restarter with forever
before handing over the project to the customer and I'm really hoping anyone has produced a proven combination of techniques.