115 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			115 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import builtins
 | |
| 
 | |
| 
 | |
| root_password = repo.vault.password_for(f'{node.name} postgresql root')
 | |
| 
 | |
| defaults = {
 | |
|     'apt': {
 | |
|         'packages': {
 | |
|             'postgresql': {
 | |
|                 'needs': {
 | |
|                     'zfs_dataset:tank/postgresql',
 | |
|                 },
 | |
|             },
 | |
|         },
 | |
|     },
 | |
|     'backup': {
 | |
|         'paths': {
 | |
|             '/var/lib/postgresql',
 | |
|         },
 | |
|     },
 | |
|     'postgresql': {
 | |
|         'conf': {},
 | |
|         'roles': {
 | |
|             'root': {
 | |
|                 'password': root_password,
 | |
|                 'superuser': True,
 | |
|             },
 | |
|         },
 | |
|         'databases': {},
 | |
|     },
 | |
|     'grafana_rows': set(),
 | |
| }
 | |
| 
 | |
| 
 | |
| @metadata_reactor.provides(
 | |
|     'postgresql/conf',
 | |
| )
 | |
| def conf(metadata):
 | |
|     conf = {}
 | |
| 
 | |
|     def limit(value, min=float('-inf'), max=float('inf'), unit=None):
 | |
|         result = int(builtins.max([builtins.min([max, value]), min]))
 | |
|         return str(result) + unit if unit else result
 | |
| 
 | |
|     ram = metadata.get('vm/ram', None)
 | |
|     if ram:
 | |
|         conf['max_connections'] = limit(ram/50, min=100)
 | |
|         conf['shared_buffers'] = limit(ram/20, min=128, unit='MB')
 | |
|         conf['work_mem'] = limit(ram/500, min=4, max=64, unit='MB')
 | |
|         conf['temp_buffers'] = limit(ram/500, min=8, max=64, unit='MB')
 | |
|         conf['effective_cache_size'] = limit(ram/3, min=4096, unit='MB')
 | |
|         conf['maintenance_work_mem'] = limit(ram/50, min=64, unit='MB')
 | |
| 
 | |
|     return {
 | |
|         'postgresql': {
 | |
|             'conf': conf,
 | |
|         },
 | |
|     }
 | |
| 
 | |
| 
 | |
| @metadata_reactor.provides(
 | |
|     'apt/config/APT/NeverAutoRemove',
 | |
| )
 | |
| def apt(metadata):
 | |
|     return {
 | |
|         'apt': {
 | |
|             'config': {
 | |
|                 'APT': {
 | |
|                     'NeverAutoRemove': {
 | |
|                         # https://github.com/credativ/postgresql-common/blob/master/pg_updateaptconfig#L17-L21
 | |
|                         f"^postgresql.*-{metadata.get('postgresql/version')}",
 | |
|                     },
 | |
|                 },
 | |
|             },
 | |
|         },
 | |
|     }
 | |
| 
 | |
| 
 | |
| 
 | |
| @metadata_reactor.provides(
 | |
|     'zfs/datasets',
 | |
| )
 | |
| def zfs(metadata):
 | |
|     if not node.has_bundle('zfs'):
 | |
|         return {}
 | |
| 
 | |
|     return {
 | |
|         'zfs': {
 | |
|             'datasets': {
 | |
|                 'tank/postgresql': {
 | |
|                     'mountpoint': '/var/lib/postgresql',
 | |
|                     'recordsize': '8192',
 | |
|                     'atime': 'off',
 | |
|                 },
 | |
|             },
 | |
|         },
 | |
|     }
 | |
| 
 | |
| 
 | |
| @metadata_reactor.provides(
 | |
|     'telegraf/config/inputs/postgresql',
 | |
| )
 | |
| def telegraf(metadata):
 | |
|     return {
 | |
|         'telegraf': {
 | |
|             'config': {
 | |
|                 'inputs': {
 | |
|                     'postgresql': [{
 | |
|                         'address': f'postgres://root:{root_password}@localhost:5432/postgres',
 | |
|                         'databases': sorted(list(node.metadata.get('postgresql/databases').keys())),
 | |
|                     }],
 | |
|                 },
 | |
|             },
 | |
|         },
 | |
|     }
 |