Skip to content

Commit b4eb57a

Browse files
committed
feat(nginx): move letsencrypt to its own file, add ssl renew command
refs #190 - adds ssl-renew command
1 parent 049f351 commit b4eb57a

File tree

3 files changed

+45
-12
lines changed

3 files changed

+45
-12
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
'use strict';
2+
const cli = require('../../../lib');
3+
const letsencrypt = require('../letsencrypt');
4+
5+
class SslRenewCommand extends cli.Command {
6+
run() {
7+
let instance = this.system.getInstance();
8+
9+
if (!instance.cliConfig.has('extension.sslemail')) {
10+
return Promise.reject(new cli.errors.SystemError('No saved email found, skipping automatic letsencrypt renewal'));
11+
}
12+
13+
let email = instance.cliConfig.get('extension.sslemail');
14+
return this.ui.run(letsencrypt(instance, email, false), 'Renewing SSL certificate')
15+
.catch((error) => Promise.reject(new cli.errors.ProcessError(error)));
16+
}
17+
}
18+
19+
SslRenewCommand.description = 'Renew an SSL certificate for a Ghost installation';
20+
21+
module.exports = SslRenewCommand;
22+

extensions/nginx/index.js

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,6 @@ const NginxConfFile = require('nginx-conf').NginxConfFile;
1212

1313
const cli = require('../../lib');
1414

15-
const LIVE_URL = 'https://acme-v01.api.letsencrypt.org/directory';
16-
const STAGING_URL = 'https://acme-staging.api.letsencrypt.org/directory';
17-
1815
class NginxExtension extends cli.Extension {
1916
setup(cmd, argv) {
2017
// ghost setup --local, skip
@@ -106,6 +103,7 @@ class NginxExtension extends cli.Extension {
106103
}
107104

108105
let rootPath = path.resolve(ctx.instance.dir, 'system', 'nginx-root');
106+
const letsencrypt = require('./letsencrypt');
109107

110108
return this.ui.listr([{
111109
title: 'Checking DNS resolution',
@@ -155,15 +153,8 @@ class NginxExtension extends cli.Extension {
155153
}, {
156154
title: 'Getting SSL Certificate',
157155
task: () => {
158-
let letsencryptFolder = path.join(ctx.instance.dir, 'system', 'letsencrypt');
159-
let sslGenArgs = `certonly --agree-tos --email ${argv.sslemail} --webroot --webroot-path ${rootPath}` +
160-
` --config-dir ${letsencryptFolder} --domains ${parsedUrl.hostname} --server ${argv.sslStaging ? STAGING_URL : LIVE_URL}`;
161-
162-
return execa('greenlock', sslGenArgs.split(' '), {
163-
stdio: 'ignore',
164-
preferLocal: true,
165-
localDir: __dirname
166-
}).catch((error) => Promise.reject(new cli.errors.ProcessError(error)));
156+
return letsencrypt(ctx.instance, argv.sslemail, argv.sslstaging)
157+
.catch((error) => Promise.reject(new cli.errors.ProcessError(error)));
167158
}
168159
}, {
169160
title: 'Generating Encryption Key (may take a few minutes)',

extensions/nginx/letsencrypt.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
'use strict';
2+
const url = require('url');
3+
const path = require('path');
4+
const execa = require('execa');
5+
6+
const LIVE_URL = 'https://acme-v01.api.letsencrypt.org/directory';
7+
const STAGING_URL = 'https://acme-staging.api.letsencrypt.org/directory';
8+
9+
module.exports = function letsencrypt(instance, email, staging) {
10+
let hostname = url.parse(instance.config.get('url')).hostname;
11+
let rootPath = path.resolve(instance.dir, 'system', 'nginx-root');
12+
let letsencryptFolder = path.join(instance.dir, 'system', 'letsencrypt');
13+
let sslGenArgs = `certonly --agree-tos --email ${email} --webroot --webroot-path ${rootPath}` +
14+
` --config-dir ${letsencryptFolder} --domains ${hostname} --server ${staging ? STAGING_URL : LIVE_URL}`;
15+
16+
return execa('greenlock', sslGenArgs.split(' '), {
17+
preferLocal: true,
18+
localDir: __dirname
19+
});
20+
};

0 commit comments

Comments
 (0)