added caddy install

added osxfer script for transfering a root filesystem based on subvolumes
master
David Kebler 2024-04-10 10:45:23 -07:00
parent edfbbe7fe0
commit 0efd6a0b9e
16 changed files with 232 additions and 36 deletions

22
containers/caddy.inst Executable file
View File

@ -0,0 +1,22 @@
caddy_install () {
local target
local dir="$(dirname $(realpath "${BASH_SOURCE:-$0}"))"
target=${1:-/opt/caddy}
[[ -d $target ]] || mkdir -p $target
echo installing caddy to $target
if /bin/cp -r -f $dir/caddy/* $target; then
pushd $target || return
echo CADDY_DIR=$target >> .env
source .env
cp conf/example.conf conf/$CONF
./config
else
echo unable to copy caddy files to $target, install aborted
fi
popd || return
}
# if script was executed then call the function
(return 0 2>/dev/null) || caddy_install $@

9
containers/caddy/.env Normal file
View File

@ -0,0 +1,9 @@
# copy to .env and edit to suit
COMPOSE_PROJECT_NAME=caddy
# default NAME is caddy
NAME=${COMPOSE_PROJECT_NAME}
IMAGE=ucommandit/caddy-r53
CREDENTIALS=${DNS_CHALLENGE_CREDENTIALS:-$PWD/credentials.env}
# will use Caddyfile unless CONF is set
# this file should be in /conf on your host (e.g. my.conf)
CONF=$(hostnamectl hostname)

View File

@ -0,0 +1,23 @@
#!/bin/bash
# example using wildcart
*.domain.net *.subdomain.domain.net {
tls domain.net@gmail.com {
dns route53 {
max_retries 10
}
}
# example simple files server
# @files host files.domain.net
# handle @files {
# root * <some dir>
# file_server browse
# }
@portainer host docker.domain.net
handle @portainer {
reverse_proxy subdomain.domain.net:9000
}
}

2
containers/caddy/config Executable file
View File

@ -0,0 +1,2 @@
#!/bin/bash
docker-compose config

View File

@ -0,0 +1,38 @@
services:
caddy:
container_name: ${NAME:-caddy}
image: ${IMAGE:-caddy}
# if no $CONF is given then Caddyfile in ${PWD}/conf:/opt/caddy/conf will be used
command: caddy run ${CONF}
hostname: ${NAME:-caddy}
env_file:
- $CREDENTIALS
volumes:
- data:/opt/caddy/data
- settings:/opt/caddy/settings
- conf:/opt/caddy/conf
# - files:/opt/caddy/files
restart: unless-stopped
ports:
- 80:80
- 443:443
# port 2019 is for API, not required
# - 2019:2019
# binding data and settings are not required
# But if there volumes are deleted caddy will need to redo all the certs
volumes:
data:
# driver_opts:
# type: none
# device: ${PWD}/data
# o: bind
settings:
# driver_opts:
# type: none
# device: ${PWD}/config
# o: bind
conf:
driver_opts:
type: none
device: ${PWD}/conf
o: bind

3
containers/caddy/logs Executable file
View File

@ -0,0 +1,3 @@
[[ $1 ]] && opt="-n $1"
[[ $1 == "f" ]] && opt="-f"
docker-compose logs $opt

View File

@ -0,0 +1,9 @@
# UCI Caddy Container
use caddy.inst to install on your host
by default install script will create file <hostname>.conf in /opt/caddy/conf
/opt/caddy/conf by default will be mounted in container
now create your (route53) dns challenge credentails file, by defualt with be /opt/caddy/credentials.env

3
containers/caddy/restart Executable file
View File

@ -0,0 +1,3 @@
#!/bin/bash
./stop
./start

1
containers/caddy/run Executable file
View File

@ -0,0 +1 @@
docker-compose up

1
containers/caddy/scrub Executable file
View File

@ -0,0 +1 @@
docker-compose down -v

5
containers/caddy/start Executable file
View File

@ -0,0 +1,5 @@
echo upping the max size of the host buffer
echo net.core.rmem_max=2500000 | sudo tee -a /etc/sysctl.conf
# confirm
sudo sysctl -p | grep rmem_max
docker-compose up -d

1
containers/caddy/stop Executable file
View File

@ -0,0 +1 @@
docker-compose down

3
containers/caddy/term Executable file
View File

@ -0,0 +1,3 @@
#!/bin/bash
source .env
docker exec -it ${NAME:-caddy} bash -l

4
containers/caddy/upgrade Executable file
View File

@ -0,0 +1,4 @@
#!/bin/bash
./stop
docker-compose pull
./start

View File

@ -1,36 +0,0 @@
#!/bin/bash
module_load filesystem
module_load confirm
copy_rootfs () {
local dr=""
# local de=--delete-excluded
[[ ! $(mounted $1) ]] && echo $1 is not a mountpoint exiting && return 2
cmd=$(echo sudo rsync $dr $de --progress -aAXv --exclude={\
"/dev/*",\
"/proc/*",\
"/sys/*",\
"tmp/*",\
"/run/*",\
"/mnt/*",\
"/media/*",\
"/lost+found",\
"/data/*",\
"/backup/*",\
"/snapshots/*",\
"/remotes/*",\
"*[Cc]ache*",\
"*/[Ll]og/*",\
"*/[Ll]ogs/*",\
"*.[Ll]og",\
"/etc/fstab*",\
"/boot/refind_linux.conf"\
}\
/ $1
)
echo $cmd
if confirm run this copy command; then
$cmd
fi
}

108
osxfer/osxfer Normal file
View File

@ -0,0 +1,108 @@
#!/bin/bash
scripts_dir="$(dirname $(realpath "${BASH_SOURCE:-$0}"))"
clone_snaps () {
local snap; local bsnap
if ! sudo mkdir -p $TDIR/$TNAME &>/dev/null; then
echo ERROR unable to make directory $TDIR/$TNAME
return 1
fi
echo cloning transfered read only snapshots at $TSNAPS
ls -la $TSNAPS
echo to $TDIR/$TNAME
echo "################"
echo cdir: $CDIR, tname: $TNAME
latest=$(sudo btrbk -c "$CDIR/$TNAME.conf" list --format col:h:target_subvolume | xargs -I % sh -c 'basename %' | sed '$!N; /^\(.*\)\n\1$/!P; D')
echo $latest
if [[ $latest ]]; then
for snap in $latest; do
# dests+=" $(btrbk -c $file list target --format col:h:target_path)"
bsnap=$(basename "${snap%.*}")
echo cloning $TSNAPS/$snap to $TDIR/$TNAME/$bsnap
if [[ -d $TDIR/$TNAME/$bsnap ]]; then
echo snapshot $TDIR/$TNAME/$bsnap already exists you must manually remove it if you want to overwrite
echo "'sudo btrfs sub del $TDIR/$TNAME/$bsnap' or 'sudo btrfs sub del $TDIR/$TNAME/*'"
else
sudo btrfs sub snap $TSNAPS/$snap $TDIR/$TNAME/$bsnap
echo $TDIR/$TNAME/$bsnap
ls -la $TDIR/$TNAME/$bsnap
fi
done
echo $TDIR/$TNAME
ls -la $TDIR/$TNAME
else
echo no transfered snapshots, nothing to clone
fi
}
osxfer () {
local TDIR; local TSNAPS; local SDIR; local CDIR
efile=$1.env
if [[ -f $efile ]]; then
module_load confirm
echo "#### sourcing $efile ########"
source $efile
TDIR=${TDIR:-/snapshots/transfer/target}
TSNAPS=${TDIR:-/snapshots/transfer/target}/${TSNAPS:-tmp/tsnaps}
SDIR=${SDIR:-/snapshots/transfer/source}
CDIR=${CDIR:-/snapshots/conf}
echo tsnaps: $TSNAPS
# TODO make sure minimal environment is set
source <(
source $efile
bash $(module_find btpl) $scripts_dir/os.conf.tmpl
) >$CDIR/$TNAME.conf
# echo "######### btrbk file: $TNAME.conf ##############"
echo "$CDIR/$TNAME.conf"
# echo "#######################"
# if ! confirm "conf file is ok?"; then exit; fi
module_load btrbk btrfs
mkdir -p $TDIR &>/dev/null
mkdir -p $SDIR &>/dev/null
# echo $SDIR
# ls -la /snapshots/transfer
[[ $TLABEL ]] && sudo mount -L $TLABEL $TDIR
[[ $TUUID ]] && sudo mount --UUID=$TUUID $TDIR
[[ $TDEV ]] && sudo mount /dev/$TDEV $TDIR
if mountpoint $TDIR &>/dev/null; then
sudo mkdir -p $TSNAPS
echo able to mount $TLABEL $TUUID $TDEV at $TDIR... continuing transfer
if ls $TSNAPS/@root.* &>/dev/null; then
echo exists
if ! confirm a set of transfer snapshots exist at destination, resend?; then
clone_snaps
return
fi
fi
if btrbk_run $2 "$CDIR/$TNAME.conf"; then
echo successful transfer from $SMP/$SNAME to $TLABEL $TUUID $TDEV - $TSNAPS
sudo btrbk -c "$CDIR/$TNAME.conf" list latest
echo "########################"
clone_snaps
else
echo ERROR: snapshot transfer to $TLABEL $TUUID $TDEV - $TSNAPS failed
fi
echo deleting temporary transfer snapshots at $SDIR
sudo btrfs sub del $SDIR/*
sudo rm -rf $SDIR
# echo deleting temporary transfer snapshots at $TSNAPS
# sudo btrfs sub del $TSNAPS/*
# sudo rm -rf $TSNAPS
echo unmounting $TDIR
if sudo umount -R $TDIR; then
if ! confirm "remove local mount directory $TDIR?"; then exit; fi
sudo rm -f $TDIR
else
echo WARNING: not able to unmount $TDIR
fi
else
echo unable to mount $TLABEL $TUUID $TDEV at $TDIR
fi
else
echo environment file $efile does not exisit
fi
}