118 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			118 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from shlex import quote
 | |
| 
 | |
| 
 | |
| defaults = {
 | |
|     'apt': {
 | |
|         'packages': {
 | |
|             'nginx': {},
 | |
|             'apache2': {
 | |
|                 'installed': False,
 | |
|             },
 | |
|         },
 | |
|     },
 | |
|     'nftables': {
 | |
|         'input': {
 | |
|             'tcp dport {80, 443} accept',
 | |
|         },
 | |
|     },
 | |
|     'nginx': {
 | |
|         'vhosts': {},
 | |
|         'modules': set(),
 | |
|         'has_websockets': False,
 | |
|     },
 | |
|     'systemd': {
 | |
|         'units': {
 | |
|             'nginx.service.d/override.conf': {
 | |
|                 'Unit': {
 | |
|                     'After': {'network-online.target'},
 | |
|                     'Wants': {'network-online.target'},
 | |
|                 },
 | |
|             },
 | |
|         },
 | |
|     },
 | |
| }
 | |
| 
 | |
| 
 | |
| @metadata_reactor.provides(
 | |
|     'nginx/vhosts',
 | |
| )
 | |
| def vhosts(metadata):
 | |
|     vhosts = {}
 | |
| 
 | |
|     for name, config in metadata.get('nginx/vhosts').items():
 | |
|         vhosts[name] = {
 | |
|             'server_name': name,
 | |
|             'listen': [
 | |
|                 '443 ssl http2',
 | |
|                 '[::]:443 ssl http2',
 | |
|             ],
 | |
|             'ssl_certificate': f'/var/lib/dehydrated/certs/{name}/fullchain.pem',
 | |
|             'ssl_certificate_key': f'/var/lib/dehydrated/certs/{name}/privkey.pem',
 | |
|             'location /.well-known/acme-challenge/': {
 | |
|                 'alias': '/var/lib/dehydrated/acme-challenges/',
 | |
|             },
 | |
|         }
 | |
| 
 | |
|     return {
 | |
|         'nginx': {
 | |
|             'vhosts': vhosts,
 | |
|         }
 | |
|     }
 | |
| 
 | |
| 
 | |
| @metadata_reactor.provides(
 | |
|     'dns',
 | |
| )
 | |
| def dns(metadata):
 | |
|     return {
 | |
|         'dns': {
 | |
|             domain: repo.libs.ip.get_a_records(metadata, internal=config.get('internal_dns', True))
 | |
|                 for domain, config in metadata.get('nginx/vhosts').items()
 | |
|         },
 | |
|     }
 | |
| 
 | |
| 
 | |
| @metadata_reactor.provides(
 | |
|     'letsencrypt/domains',
 | |
| )
 | |
| def letsencrypt(metadata):
 | |
|     return {
 | |
|         'letsencrypt': {
 | |
|             'domains': {
 | |
|                 domain: {
 | |
|                     'reload': {'nginx'},
 | |
|                 }
 | |
|                     for domain in metadata.get('nginx/vhosts').keys()
 | |
|             },
 | |
|         },
 | |
|     }
 | |
| 
 | |
| 
 | |
| @metadata_reactor.provides(
 | |
|     'monitoring/services',
 | |
| )
 | |
| def monitoring(metadata):
 | |
|     return {
 | |
|         'monitoring': {
 | |
|             'services': {
 | |
|                 hostname: {
 | |
|                     'vars.command': f"/usr/bin/curl -X GET -L --fail --no-progress-meter -o /dev/null {vhost.get('check_protocol', 'https')}://{quote(hostname + vhost.get('check_path', '/'))}",
 | |
|                 }
 | |
|                     for hostname, vhost in metadata.get('nginx/vhosts').items()
 | |
|             },
 | |
|         },
 | |
|     }
 | |
| 
 | |
| 
 | |
| @metadata_reactor.provides(
 | |
|     'apt/packages',
 | |
| )
 | |
| def modules(metadata):
 | |
|     return {
 | |
|         'apt': {
 | |
|             'packages': {
 | |
|                 f'libnginx-mod-{module}': {}
 | |
|                     for module in metadata.get('nginx/modules')
 | |
|             },
 | |
|         },
 | |
|     }
 |