letsencrypt to greenlock
This commit is contained in:
		
							parent
							
								
									9ed5b0e3a8
								
							
						
					
					
						commit
						53953328fe
					
				
							
								
								
									
										38
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										38
									
								
								README.md
									
									
									
									
									
								
							@ -15,12 +15,12 @@ Tired of serving the Empire? Come join the Rebel Alliance:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[](https://gitter.im/Daplie/letsencrypt-express?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
 | 
					[](https://gitter.im/Daplie/letsencrypt-express?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| [letsencrypt (lib)](https://git.daplie.com/Daplie/node-greenlock)
 | 
					| [greenlock (lib)](https://git.daplie.com/Daplie/node-greenlock)
 | 
				
			||||||
| [letsencrypt-cli](https://git.daplie.com/Daplie/greenlock-cli)
 | 
					| [greenlock-cli](https://git.daplie.com/Daplie/greenlock-cli)
 | 
				
			||||||
| [letsencrypt-express](https://git.daplie.com/Daplie/greenlock-express)
 | 
					| [greenlock-express](https://git.daplie.com/Daplie/greenlock-express)
 | 
				
			||||||
| **letsencrypt-cluster**
 | 
					| **greenlock-cluster**
 | 
				
			||||||
| [letsencrypt-koa](https://git.daplie.com/Daplie/greenlock-koa)
 | 
					| [greenlock-koa](https://git.daplie.com/Daplie/greenlock-koa)
 | 
				
			||||||
| [letsencrypt-hapi](https://git.daplie.com/Daplie/greenlock-hapi)
 | 
					| [greenlock-hapi](https://git.daplie.com/Daplie/greenlock-hapi)
 | 
				
			||||||
|
 | 
					|
 | 
				
			||||||
 | 
					
 | 
				
			||||||
greenlock-cluster (letsencrypt-cluster)
 | 
					greenlock-cluster (letsencrypt-cluster)
 | 
				
			||||||
@ -37,7 +37,7 @@ Install
 | 
				
			|||||||
=======
 | 
					=======
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```bash
 | 
					```bash
 | 
				
			||||||
npm install --save letsencrypt-cluster@2.x
 | 
					npm install --save greenlock-cluster@2.x
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Usage
 | 
					Usage
 | 
				
			||||||
@ -81,14 +81,14 @@ main.init(sharedOptions);
 | 
				
			|||||||
Master
 | 
					Master
 | 
				
			||||||
------
 | 
					------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
We think it makes the most sense to load letsencrypt in master.
 | 
					We think it makes the most sense to load greenlock in master.
 | 
				
			||||||
This can prevent race conditions (see [node-letsencrypt#45](https://github.com/Daplie/node-letsencrypt/issues/45))
 | 
					This can prevent race conditions (see [node-letsencrypt#45](https://github.com/Daplie/node-letsencrypt/issues/45))
 | 
				
			||||||
as only one process is writing the to file system or database at a time.
 | 
					as only one process is writing the to file system or database at a time.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The main implementation detail here is `approveDomains(options, certs, cb)` for new domain certificates
 | 
					The main implementation detail here is `approveDomains(options, certs, cb)` for new domain certificates
 | 
				
			||||||
and potentially `agreeToTerms(opts, cb)` for new accounts.
 | 
					and potentially `agreeToTerms(opts, cb)` for new accounts.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The master takes **the same arguments** as `node-letsencrypt` (`challenge`, `store`, etc),
 | 
					The master takes **the same arguments** as `node-greenlock` (`challenge`, `store`, etc),
 | 
				
			||||||
plus a few extra (`approveDomains`... okay, just one extra):
 | 
					plus a few extra (`approveDomains`... okay, just one extra):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
`master.js`:
 | 
					`master.js`:
 | 
				
			||||||
@ -99,7 +99,7 @@ var cluster = require('cluster');
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
module.exports.init = function (sharedOpts) {
 | 
					module.exports.init = function (sharedOpts) {
 | 
				
			||||||
  var cores = require('os').cpus();
 | 
					  var cores = require('os').cpus();
 | 
				
			||||||
  var leMaster = require('letsencrypt-cluster/master').create({
 | 
					  var leMaster = require('greenlock-cluster/master').create({
 | 
				
			||||||
    debug: sharedOpts.debug
 | 
					    debug: sharedOpts.debug
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  , server: 'staging'                                                       // CHANGE TO PRODUCTION
 | 
					  , server: 'staging'                                                       // CHANGE TO PRODUCTION
 | 
				
			||||||
@ -128,18 +128,18 @@ module.exports.init = function (sharedOpts) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
### API
 | 
					### API
 | 
				
			||||||
 | 
					
 | 
				
			||||||
All options are passed directly to `node-letsencrypt`
 | 
					All options are passed directly to `node-greenlock`
 | 
				
			||||||
(in other works, `leMaster` is a `letsencrypt` instance),
 | 
					(in other works, `leMaster` is a `greenlock` instance),
 | 
				
			||||||
but a few are only actually used by `letsencrypt-cluster`.
 | 
					but a few are only actually used by `greenlock-cluster`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* `leOptions.approveDomains(options, certs, cb)` is special for `letsencrypt-cluster`, but will probably be included in `node-letsencrypt` in the future (no API change).
 | 
					* `leOptions.approveDomains(options, certs, cb)` is special for `greenlock-cluster`, but will probably be included in `node-greenlock` in the future (no API change).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* `leMaster.addWorker(worker)` is added by `letsencrypt-cluster` and **must be called** for each new worker.
 | 
					* `leMaster.addWorker(worker)` is added by `greenlock-cluster` and **must be called** for each new worker.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Worker
 | 
					Worker
 | 
				
			||||||
------
 | 
					------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The worker takes *similar* arguments to `node-letsencrypt`,
 | 
					The worker takes *similar* arguments to `node-greenlock`,
 | 
				
			||||||
but only ones that are useful for determining certificate
 | 
					but only ones that are useful for determining certificate
 | 
				
			||||||
renewal and for `le.challenge.get`.
 | 
					renewal and for `le.challenge.get`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -150,7 +150,7 @@ If you want to  a non-default `le.challenge`
 | 
				
			|||||||
'use strict';
 | 
					'use strict';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module.exports.init = function (sharedOpts) {
 | 
					module.exports.init = function (sharedOpts) {
 | 
				
			||||||
  var leWorker = require('letsencrypt-cluster/worker').create({
 | 
					  var leWorker = require('greenlock-cluster/worker').create({
 | 
				
			||||||
    debug: sharedOpts.debug
 | 
					    debug: sharedOpts.debug
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  , renewWithin: sharedOpts.renewWithin
 | 
					  , renewWithin: sharedOpts.renewWithin
 | 
				
			||||||
@ -206,12 +206,12 @@ module.exports.init = function (sharedOpts) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
### API
 | 
					### API
 | 
				
			||||||
 | 
					
 | 
				
			||||||
`node-letsencrypt` is **not used** directly by the worker,
 | 
					`node-greenlock` is **not used** directly by the worker,
 | 
				
			||||||
but certain options are shared because certain logic is duplicated.
 | 
					but certain options are shared because certain logic is duplicated.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* `leOptions.renewWithin` is shared so that the worker knows how earlier to request a new cert
 | 
					* `leOptions.renewWithin` is shared so that the worker knows how earlier to request a new cert
 | 
				
			||||||
* `leOptions.renewBy` is passed to `le-sni-auto` so that it staggers renewals between `renewWithin` (latest) and `renewBy` (earlier)
 | 
					* `leOptions.renewBy` is passed to `le-sni-auto` so that it staggers renewals between `renewWithin` (latest) and `renewBy` (earlier)
 | 
				
			||||||
* `leWorker.middleware(nextApp)` uses `letsencrypt/middleware` for GET-ing `http-01`, hence `sharedOptions.webrootPath`
 | 
					* `leWorker.middleware(nextApp)` uses `greenlock/middleware` for GET-ing `http-01`, hence `sharedOptions.webrootPath`
 | 
				
			||||||
* `leWorker.httpsOptions` has a default localhost certificate and the `SNICallback`.
 | 
					* `leWorker.httpsOptions` has a default localhost certificate and the `SNICallback`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
There are a few options that aren't shown in these examples, so if you need to change something
 | 
					There are a few options that aren't shown in these examples, so if you need to change something
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,4 @@
 | 
				
			|||||||
letsencrypt cluster examples
 | 
					greenlock cluster examples
 | 
				
			||||||
-------------------
 | 
					-------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
First you need to change the email address in `examples/worker.js`.
 | 
					First you need to change the email address in `examples/worker.js`.
 | 
				
			||||||
 | 
				
			|||||||
@ -18,7 +18,7 @@ else {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// this is nothing letsencrypt-cluster specific
 | 
					// this is nothing greenlock-cluster specific
 | 
				
			||||||
// I'm just arbitrarily choosing to share some configuration
 | 
					// I'm just arbitrarily choosing to share some configuration
 | 
				
			||||||
// that I know I'm going to use in both places
 | 
					// that I know I'm going to use in both places
 | 
				
			||||||
main.init({
 | 
					main.init({
 | 
				
			||||||
@ -28,6 +28,6 @@ main.init({
 | 
				
			|||||||
  // using using le-challenge-fs (as you'll see), I'm only sharing the webrootPath
 | 
					  // using using le-challenge-fs (as you'll see), I'm only sharing the webrootPath
 | 
				
			||||||
  webrootPath: require('os').tmpdir() + require('path').sep + 'acme-challenge'
 | 
					  webrootPath: require('os').tmpdir() + require('path').sep + 'acme-challenge'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // this is used both by node-letsencrypt (master) and le-sni-auto (worker)
 | 
					  // this is used both by node-greenlock (master) and le-sni-auto (worker)
 | 
				
			||||||
, renewWithin: 15 * 24 * 60 * 60 * 1000
 | 
					, renewWithin: 15 * 24 * 60 * 60 * 1000
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										6
									
								
								index.js
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								index.js
									
									
									
									
									
								
							@ -1,11 +1,11 @@
 | 
				
			|||||||
'use strict';
 | 
					'use strict';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
console.error("");
 | 
					console.error("");
 | 
				
			||||||
console.error("One does not simply require('letsencrypt-cluster');");
 | 
					console.error("One does not simply require('greenlock-cluster');");
 | 
				
			||||||
console.error("");
 | 
					console.error("");
 | 
				
			||||||
console.error("Usage:");
 | 
					console.error("Usage:");
 | 
				
			||||||
console.error("\trequire('letsencrypt-cluster/master').create({ ... });");
 | 
					console.error("\trequire('greenlock-cluster/master').create({ ... });");
 | 
				
			||||||
console.error("\trequire('letsencrypt-cluster/worker').create({ ... });");
 | 
					console.error("\trequire('greenlock-cluster/worker').create({ ... });");
 | 
				
			||||||
console.error("");
 | 
					console.error("");
 | 
				
			||||||
console.error("");
 | 
					console.error("");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -6,7 +6,7 @@ module.exports.create = function (opts) {
 | 
				
			|||||||
  opts = opts || { };
 | 
					  opts = opts || { };
 | 
				
			||||||
  opts._workers = [];
 | 
					  opts._workers = [];
 | 
				
			||||||
  opts.webrootPath = opts.webrootPath || require('os').tmpdir() + require('path').sep + 'acme-challenge';
 | 
					  opts.webrootPath = opts.webrootPath || require('os').tmpdir() + require('path').sep + 'acme-challenge';
 | 
				
			||||||
  if (!opts.letsencrypt) { opts.letsencrypt = require('letsencrypt').create(opts); }
 | 
					  if (!opts.greenlock) { opts.greenlock = require('greenlock').create(opts); }
 | 
				
			||||||
  if ('function' !== typeof opts.approveDomains) {
 | 
					  if ('function' !== typeof opts.approveDomains) {
 | 
				
			||||||
    throw new Error("You must provide opts.approveDomains(domain, certs, callback) to approve certificates");
 | 
					    throw new Error("You must provide opts.approveDomains(domain, certs, callback) to approve certificates");
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@ -67,10 +67,10 @@ module.exports.create = function (opts) {
 | 
				
			|||||||
        // */
 | 
					        // */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (results.certs) {
 | 
					        if (results.certs) {
 | 
				
			||||||
          promise = opts.letsencrypt.renew(results.options, results.certs);
 | 
					          promise = opts.greenlock.renew(results.options, results.certs);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        else {
 | 
					        else {
 | 
				
			||||||
          promise = opts.letsencrypt.register(results.options);
 | 
					          promise = opts.greenlock.register(results.options);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        promise.then(function (certs) {
 | 
					        promise.then(function (certs) {
 | 
				
			||||||
 | 
				
			|||||||
@ -79,7 +79,7 @@ module.exports.create = function (opts) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // opts.challenge.get, opts.acmeChallengePrefix
 | 
					  // opts.challenge.get, opts.acmeChallengePrefix
 | 
				
			||||||
  opts.middleware = require('letsencrypt/lib/middleware').create(opts);
 | 
					  opts.middleware = require('greenlock/lib/middleware').create(opts);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user