Browse Source

Configure SSL certs

pull/4/head
Chris Smith 8 years ago
parent
commit
337e4cd322
3 changed files with 16 additions and 3 deletions
  1. 6
    0
      README.md
  2. 7
    3
      generate.py
  3. 3
    0
      nginx.tpl

+ 6
- 0
README.md View File

@@ -38,3 +38,9 @@ Then run this container. It takes the same arguments as `service-reporter`:
38 38
   --name (default: unknown) name of the host running docker
39 39
 ```
40 40
 
41
+And some additional arguments:
42
+
43
+```
44
+  --cert-path (default: /letsencrypt/certs/%s/fullchain.pem) path to the SSL cert. Use '%s' for the primary vhost.
45
+  --cert-key-path (default: /letsencrypt/certs/%s/privkey.pem) path to the SSL cert's private key. Use '%s' for the primary vhost.
46
+```

+ 7
- 3
generate.py View File

@@ -11,6 +11,8 @@ parser.add_argument('--name', help='Name of the docker host to request certifica
11 11
 parser.add_argument('--etcd-port', type=int, help='Port to connect to etcd on', default=2379)
12 12
 parser.add_argument('--etcd-host', help='Host to connect to etcd on', default='etcd')
13 13
 parser.add_argument('--etcd-prefix', help='Prefix to use when retrieving keys from etcd', default='/docker')
14
+parser.add_argument('--cert-path', help='Path to use for certificates. Use "%s" for hostname', default='/letsencrypt/certs/%s/fullchain.pem')
15
+parser.add_argument('--cert-key-path', help='Path to use for certificate private keys. Use "%s" for hostname', default='/letsencrypt/certs/%s/privkey.pem')
14 16
 args = parser.parse_args()
15 17
 
16 18
 jinja_env = jinja2.Environment(loader=jinja2.FileSystemLoader('/'))
@@ -19,15 +21,17 @@ fetcher = etcdlib.Connection(args.etcd_host, args.etcd_port, args.etcd_prefix)
19 21
 
20 22
 while True:
21 23
   services = []
22
-  domains = fetcher.get_label('com.chameth.vhost')
24
+  domains = {k: v.split(',') for k, v in fetcher.get_label('com.chameth.vhost').items()}
23 25
   protocols = fetcher.get_label('com.chameth.proxy.protocol')
24 26
   for container, values in fetcher.get_label('com.chameth.proxy').items():
25 27
     networks = fetcher.get_networks(container)
26 28
     services.append({
27 29
       'protocol': protocols[container] if container in protocols else 'http',
28
-      'vhosts': domains[container].split(','),
30
+      'vhosts': domains[container],
29 31
       'host': next(iter(networks.values())), # TODO: Pick a bridge sensibly?
30
-      'port': values      
32
+      'port': values,
33
+      'certificate': args.cert_path % domains[container][0],
34
+      'certificate_key': args.cert_key_path % domains[container][0]
31 35
     })
32 36
 
33 37
   print(template.render(services=services)) # TODO: Actually write it out

+ 3
- 0
nginx.tpl View File

@@ -3,6 +3,9 @@ server {
3 3
     server_name {{ ' '.join(service.vhosts) }};
4 4
     listen [::]:443 ssl http2;
5 5
 
6
+    ssl_certificate {{ service.certificate }};
7
+    ssl_certificate_key {{ service.certificate_key }};
8
+
6 9
     location / {
7 10
         proxy_pass {{ service.protocol }}://{{ service.host }}:{{ service.port }};
8 11
     }

Loading…
Cancel
Save