Compare commits
2 commits
fa576f4b5c
...
2f5af670f4
Author | SHA1 | Date | |
---|---|---|---|
![]() |
2f5af670f4 | ||
![]() |
394a7a3b3f |
14 changed files with 114 additions and 24 deletions
|
@ -43,19 +43,23 @@ def zfs(metadata):
|
||||||
|
|
||||||
|
|
||||||
@metadata_reactor.provides(
|
@metadata_reactor.provides(
|
||||||
'dns'
|
'dns',
|
||||||
)
|
)
|
||||||
def dns(metadata):
|
def dns(metadata):
|
||||||
records = {}
|
|
||||||
|
|
||||||
if metadata.get('network/ipv4', None):
|
|
||||||
records['A'] = [str(ip_interface(metadata.get('network/ipv4')).ip)]
|
|
||||||
if metadata.get('network/ipv6', None):
|
|
||||||
records['AAAA'] = [str(ip_interface(metadata.get('network/ipv6')).ip)]
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'dns': {
|
'dns': {
|
||||||
metadata.get('backup-server/hostname'): records,
|
metadata.get('backup-server/hostname'): {
|
||||||
|
'A': [
|
||||||
|
str(ip_interface(network['ipv4']).ip)
|
||||||
|
for network in metadata.get('network').values()
|
||||||
|
if 'ipv4' in network
|
||||||
|
],
|
||||||
|
'AAAA': [
|
||||||
|
str(ip_interface(network['ipv6']).ip)
|
||||||
|
for network in metadata.get('network').values()
|
||||||
|
if 'ipv6' in network
|
||||||
|
],
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,13 @@ ssh="ssh -o StrictHostKeyChecking=no backup-receiver@$server"
|
||||||
source_dataset=$(zfs list -H -o mountpoint,name | grep -P "^$path\t" | cut -d $'\t' -f 2)
|
source_dataset=$(zfs list -H -o mountpoint,name | grep -P "^$path\t" | cut -d $'\t' -f 2)
|
||||||
target_dataset="tank/$uuid/$source_dataset"
|
target_dataset="tank/$uuid/$source_dataset"
|
||||||
target_dataset_parent=$(echo $target_dataset | rev | cut -d / -f 2- | rev)
|
target_dataset_parent=$(echo $target_dataset | rev | cut -d / -f 2- | rev)
|
||||||
new_bookmark="auto-backup_$(date +"%Y-%m-%d_%H:%M:%S")"
|
bookmark_prefix="auto-backup_"
|
||||||
|
new_bookmark="$bookmark_prefix$(date +"%Y-%m-%d_%H:%M:%S")"
|
||||||
|
|
||||||
|
for var in path uuid server ssh source_dataset target_dataset target_dataset_parent new_bookmark
|
||||||
|
do
|
||||||
|
[[ -z "${!var}" ]] && echo "ERROR - $var is empty" && exit 97
|
||||||
|
done
|
||||||
|
|
||||||
echo "BACKUP ZFS DATASET - PATH: $path, SERVER: $server, UUID: $uuid, SOURCE_DATASET: $source_dataset, TARGET_DATASET: $TARGET_DATASET"
|
echo "BACKUP ZFS DATASET - PATH: $path, SERVER: $server, UUID: $uuid, SOURCE_DATASET: $source_dataset, TARGET_DATASET: $TARGET_DATASET"
|
||||||
|
|
||||||
|
@ -21,16 +27,17 @@ then
|
||||||
$ssh sudo zfs create -p -o mountpoint=none "$target_dataset_parent"
|
$ssh sudo zfs create -p -o mountpoint=none "$target_dataset_parent"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
zfs snap $source_dataset@$new_bookmark
|
zfs snap "$source_dataset@$new_bookmark"
|
||||||
|
|
||||||
if zfs list -t bookmark -H -o name | grep '#auto-backup' | wc -l | grep -q "^0$"
|
if zfs list -t bookmark -H -o name | grep "#$bookmark_prefix" | wc -l | grep -q "^0$"
|
||||||
then
|
then
|
||||||
echo "INITIAL BACKUP"
|
echo "INITIAL BACKUP"
|
||||||
zfs send -v "$source_dataset@$new_bookmark" | $ssh sudo zfs recv -F $target_dataset
|
zfs send -v "$source_dataset@$new_bookmark" | $ssh sudo zfs recv -F "$target_dataset"
|
||||||
else
|
else
|
||||||
echo "INCREMENTAL BACKUP"
|
echo "INCREMENTAL BACKUP"
|
||||||
last_bookmark=$(zfs list -t bookmark -H -o name | sort | tail -1 | cut -d '#' -f 2)
|
last_bookmark=$(zfs list -t bookmark -H -o name | grep "#$bookmark_prefix" | sort | tail -1 | cut -d '#' -f 2)
|
||||||
zfs send -v -i "#$last_bookmark" "$source_dataset@$new_bookmark" | $ssh sudo zfs recv $target_dataset
|
[[ -z "$last_bookmark" ]] && echo "ERROR - last_bookmark is empty" && exit 98
|
||||||
|
zfs send -v -i "#$last_bookmark" "$source_dataset@$new_bookmark" | $ssh sudo zfs recv "$target_dataset"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$?" == "0" ]]
|
if [[ "$?" == "0" ]]
|
||||||
|
|
|
@ -101,7 +101,7 @@ plugin {
|
||||||
fts_decoder = decode2text
|
fts_decoder = decode2text
|
||||||
}
|
}
|
||||||
service indexer-worker {
|
service indexer-worker {
|
||||||
vsz_limit = 1G
|
vsz_limit = ${indexer_ram}
|
||||||
}
|
}
|
||||||
service decode2text {
|
service decode2text {
|
||||||
executable = script /usr/local/libexec/dovecot/decode2text.sh
|
executable = script /usr/local/libexec/dovecot/decode2text.sh
|
||||||
|
|
|
@ -31,6 +31,7 @@ files = {
|
||||||
'content_type': 'mako',
|
'content_type': 'mako',
|
||||||
'context': {
|
'context': {
|
||||||
'admin_email': node.metadata.get('mailserver/admin_email'),
|
'admin_email': node.metadata.get('mailserver/admin_email'),
|
||||||
|
'indexer_ram': node.metadata.get('dovecot/indexer_ram'),
|
||||||
},
|
},
|
||||||
'needs': {
|
'needs': {
|
||||||
'pkg_apt:'
|
'pkg_apt:'
|
||||||
|
|
|
@ -25,3 +25,13 @@ defaults = {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@metadata_reactor.provides(
|
||||||
|
'dovecot/indexer_ram',
|
||||||
|
)
|
||||||
|
def indexer_ram(metadata):
|
||||||
|
return {
|
||||||
|
'dovecot': {
|
||||||
|
'indexer_ram': str(metadata.get('vm/ram')//2)+ 'M',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
version = node.metadata.get('php/version')
|
version = node.metadata.get('php/version')
|
||||||
|
|
||||||
php_ini_context = {
|
php_ini_context = {
|
||||||
'num_cpus': node.metadata.get('vm/cpu'),
|
'num_cpus': node.metadata.get('vm/cores'),
|
||||||
'post_max_size': node.metadata.get('php/post_max_size', 10),
|
'post_max_size': node.metadata.get('php/post_max_size', 10),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,12 @@ from bundlewrap.metadata import atomic
|
||||||
defaults = {
|
defaults = {
|
||||||
'apt': {
|
'apt': {
|
||||||
'packages': {
|
'packages': {
|
||||||
'wireguard': {},
|
'wireguard': {
|
||||||
|
'backports': True,
|
||||||
|
'triggers': [
|
||||||
|
'svc_systemd:systemd-networkd:restart',
|
||||||
|
],
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
'wireguard': {
|
'wireguard': {
|
||||||
|
|
19
data/network.py
Normal file
19
data/network.py
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
'networks': [
|
||||||
|
'10.0.0.0/24',
|
||||||
|
'10.0.2.0/24',
|
||||||
|
'10.0.9.0/24',
|
||||||
|
'10.0.10.0/24',
|
||||||
|
],
|
||||||
|
'routers': {
|
||||||
|
'10.0.0.1': {
|
||||||
|
'10.0.0.0/24': None,
|
||||||
|
'10.0.0.2/24': None,
|
||||||
|
'10.0.0.9/24': None,
|
||||||
|
},
|
||||||
|
'10.0.0.2': {
|
||||||
|
'10.0.0.0/24': 'internal',
|
||||||
|
'10.0.10.0/24': 'wg0',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
|
@ -1,12 +1,8 @@
|
||||||
{
|
{
|
||||||
'bundles': [
|
'bundles': [
|
||||||
'backup',
|
|
||||||
'users',
|
'users',
|
||||||
],
|
],
|
||||||
'metadata': {
|
'metadata': {
|
||||||
'backup': {
|
|
||||||
'server': 'home.backups',
|
|
||||||
},
|
|
||||||
'dns': {},
|
'dns': {},
|
||||||
'nameservers': [
|
'nameservers': [
|
||||||
'10.0.10.2',
|
'10.0.10.2',
|
||||||
|
|
10
groups/applications/backup.py
Normal file
10
groups/applications/backup.py
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
{
|
||||||
|
'bundles': [
|
||||||
|
'backup',
|
||||||
|
],
|
||||||
|
'metadata': {
|
||||||
|
'backup': {
|
||||||
|
'server': 'home.backups',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,6 +2,7 @@
|
||||||
'hostname': '10.0.0.2',
|
'hostname': '10.0.0.2',
|
||||||
'groups': [
|
'groups': [
|
||||||
'archive',
|
'archive',
|
||||||
|
'backup',
|
||||||
'debian-10',
|
'debian-10',
|
||||||
# 'nextcloud',
|
# 'nextcloud',
|
||||||
],
|
],
|
||||||
|
@ -29,7 +30,6 @@
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
'wireguard': {
|
'wireguard': {
|
||||||
# iptables -t nat -A POSTROUTING -o enp1s0f0 -j MASQUERADE
|
|
||||||
'my_ip': '172.19.136.1/22',
|
'my_ip': '172.19.136.1/22',
|
||||||
'peers': {
|
'peers': {
|
||||||
'htz.mails': {
|
'htz.mails': {
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
{
|
{
|
||||||
'dummy': True,
|
'dummy': True,
|
||||||
'groups': [
|
'groups': [
|
||||||
|
'backup',
|
||||||
'debian-10',
|
'debian-10',
|
||||||
],
|
],
|
||||||
'bundles': [
|
'bundles': [
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
'hostname': '162.55.188.157',
|
'hostname': '162.55.188.157',
|
||||||
'groups': [
|
'groups': [
|
||||||
'archive',
|
'archive',
|
||||||
|
'backup',
|
||||||
'hetzner-cloud',
|
'hetzner-cloud',
|
||||||
'debian-10',
|
'debian-10',
|
||||||
'mailserver',
|
'mailserver',
|
||||||
|
@ -94,7 +95,8 @@
|
||||||
'installer': True,
|
'installer': True,
|
||||||
},
|
},
|
||||||
'vm': {
|
'vm': {
|
||||||
'cpu': 2,
|
'cores': 2,
|
||||||
|
'ram': 8096,
|
||||||
},
|
},
|
||||||
'wireguard': {
|
'wireguard': {
|
||||||
# ip r add 10.0.0.0/24 via 172.19.136.2 dev wg0
|
# ip r add 10.0.0.0/24 via 172.19.136.2 dev wg0
|
||||||
|
@ -107,6 +109,7 @@
|
||||||
'10.0.9.0/24',
|
'10.0.9.0/24',
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
'netcup.secondary': {},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
'zfs': {
|
'zfs': {
|
||||||
|
|
34
nodes/netcup.secondary.py
Normal file
34
nodes/netcup.secondary.py
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
{
|
||||||
|
'hostname': '46.38.240.85',
|
||||||
|
'groups': [
|
||||||
|
'debian-10',
|
||||||
|
],
|
||||||
|
'bundles': [
|
||||||
|
'wireguard',
|
||||||
|
],
|
||||||
|
'metadata': {
|
||||||
|
'id': '890848b2-a900-4f74-ad5b-b811fbb4f0bc',
|
||||||
|
'network': {
|
||||||
|
'external': {
|
||||||
|
'interface': 'eth0',
|
||||||
|
'ipv4': '46.38.240.85/22',
|
||||||
|
'gateway4': '46.38.240.1',
|
||||||
|
'ipv6': '2a03:4000:7:534::2/64',
|
||||||
|
'gateway6': 'fe80::1',
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'wireguard': {
|
||||||
|
'my_ip': '172.19.136.3/22',
|
||||||
|
'peers': {
|
||||||
|
'htz.mails': {
|
||||||
|
'route': [
|
||||||
|
'10.0.0.0/24',
|
||||||
|
'10.0.2.0/24',
|
||||||
|
'10.0.9.0/24',
|
||||||
|
'10.0.10.0/24',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
Loading…
Reference in a new issue