Compare commits
2 Commits
f7ed1c51eb
...
01c3e5374d
Author | SHA1 | Date | |
---|---|---|---|
|
01c3e5374d | ||
|
13a9891e71 |
@ -195,8 +195,14 @@ chroot_run locale-gen
|
|||||||
|
|
||||||
|
|
||||||
if [ -n "$data_device" ] ; then
|
if [ -n "$data_device" ] ; then
|
||||||
section "Mounting data dir"
|
section "Mounting and encrypting data dir"
|
||||||
cryptsetup create --type plain dmcrypt-jeancloud "$data_device"
|
run cryptsetup create --type plain dmcrypt-jeancloud "$data_device"
|
||||||
|
run mkfs.ext4 dmcrypt-jeancloud
|
||||||
|
uuid="$(blkid | grep dmcrypt-jeancloud | grep -o 'UUID="[^"]\+"')"
|
||||||
|
if [ -z "$uuid" ] ; then
|
||||||
|
die "Error, unexpected empty uuid"
|
||||||
|
fi
|
||||||
|
line_in_file "$uuid /data ext4 rw,nofail 0 1" "$mnt/etc/fstab"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
@ -210,15 +216,20 @@ line_in_file "proc /proc proc defaults" "$mnt/etc/fstab"
|
|||||||
run echo "$hostname" > "$mnt/etc/hostname"
|
run echo "$hostname" > "$mnt/etc/hostname"
|
||||||
|
|
||||||
# Prenvent suspend on lid close
|
# Prenvent suspend on lid close
|
||||||
line_in_file HandleLidSwitch=ignore /etc/systemd/logind.conf
|
line_in_file HandleLidSwitch=ignore "$mnt/etc/systemd/logind.conf"
|
||||||
|
|
||||||
# Fix path and remove noisy beep
|
# Inform futur scripts that /data is not mounted
|
||||||
|
touch "$mnt/data/mounted"
|
||||||
|
|
||||||
|
# Fix path
|
||||||
run cat > "$mnt/root/.bashrc" <<EOF
|
run cat > "$mnt/root/.bashrc" <<EOF
|
||||||
PATH=$PATH:/usr/bin:/bin:/sbin:/usr/sbin:/sbin
|
PATH=$PATH:/usr/bin:/bin:/sbin:/usr/sbin:/sbin
|
||||||
|
setterm -powerdown 0
|
||||||
EOF
|
EOF
|
||||||
# Be sure this fucking beep is gone
|
# Be sure this fucking beep is gone
|
||||||
echo 'set bell-style none' >> "$mnt/etc/inputrc"
|
echo 'set bell-style none' >> "$mnt/etc/inputrc"
|
||||||
# TODO find a third method to kill this doomed beep
|
# TODO find a second method to kill this doomed beep
|
||||||
|
line_in_file '@reboot root shutdownscreen.sh' "$mnt/etc/crontab"
|
||||||
|
|
||||||
|
|
||||||
# boot crypted
|
# boot crypted
|
||||||
|
@ -2,3 +2,6 @@ blatte :
|
|||||||
DO NOT REBOOT IT. it sometimes fails…
|
DO NOT REBOOT IT. it sometimes fails…
|
||||||
-i 'firmware-amd-graphics firmware-realtek'
|
-i 'firmware-amd-graphics firmware-realtek'
|
||||||
|
|
||||||
|
raku :
|
||||||
|
+ ajouter nonfree dans les sources
|
||||||
|
-i firmware-atheros
|
||||||
|
@ -1,9 +1,14 @@
|
|||||||
|
[shlago]
|
||||||
|
max.jean-cloud.org
|
||||||
|
tetede.jean-cloud.org
|
||||||
|
raku.jean-cloud.org
|
||||||
|
|
||||||
[servers]
|
[servers]
|
||||||
#vandamme.jean-cloud.org
|
|
||||||
#nougaro.jean-cloud.org
|
#nougaro.jean-cloud.org
|
||||||
#tetede.jean-cloud.org
|
|
||||||
#carcasse.jean-cloud.org
|
#carcasse.jean-cloud.org
|
||||||
#benevoles.karnaval.fr
|
#benevoles.karnaval.fr
|
||||||
#montbonnot.jean-cloud.org
|
#montbonnot.jean-cloud.org
|
||||||
max.jean-cloud.org
|
|
||||||
#blatte.jean-cloud.org
|
#blatte.jean-cloud.org
|
||||||
|
max.jean-cloud.org
|
||||||
|
tetede.jean-cloud.org
|
||||||
|
raku.jean-cloud.org
|
||||||
|
@ -4,6 +4,8 @@
|
|||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
|
[ ! -f /data/mounted ] && die "/data is not mounted"
|
||||||
|
|
||||||
noreload=false
|
noreload=false
|
||||||
deploy=true
|
deploy=true
|
||||||
if [ "$#" -ge 2 ] && [ "$2" = noreload ] ; then
|
if [ "$#" -ge 2 ] && [ "$2" = noreload ] ; then
|
||||||
@ -131,15 +133,8 @@ if [ -f "/docker/$service/nginx_server.conf" ] ; then
|
|||||||
run template.sh "/docker/$service/.env" < "/docker/$service/nginx_server.conf" > "$new_nginx_conf_path/$service"
|
run template.sh "/docker/$service/.env" < "/docker/$service/nginx_server.conf" > "$new_nginx_conf_path/$service"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Do we need dummy cert?
|
section "Add dummy cert if needed"
|
||||||
if [ ! -e "$certs_path/$service/fullchain.pem" ] ; then
|
dummy_cert.sh "$service" add
|
||||||
section "Create cert dir"
|
|
||||||
run mkdir -p "$certs_path/$service"
|
|
||||||
|
|
||||||
section "Link dummy to cert"
|
|
||||||
run ln -s "$dummy_cert_path/fullchain.pem" "$certs_path/$service"
|
|
||||||
run ln -s "$dummy_cert_path/privkey.pem" "$certs_path/$service"
|
|
||||||
fi
|
|
||||||
|
|
||||||
section "Testing nginx conf"
|
section "Testing nginx conf"
|
||||||
run nginx -t -c /etc/nginx/new_nginx.conf
|
run nginx -t -c /etc/nginx/new_nginx.conf
|
||||||
|
@ -11,12 +11,9 @@ set -euo pipefail
|
|||||||
# Variables
|
# Variables
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
export proxy_dir="/etc/nginx"
|
set -a
|
||||||
export nginx_conf_path="$proxy_dir/sites-enabled"
|
. /etc/jeancloud.env
|
||||||
export new_nginx_conf_path="$proxy_dir/new-sites-enabled"
|
set +a
|
||||||
|
|
||||||
export certs_path="/etc/letsencrypt/live"
|
|
||||||
export dummy_cert_path="$certs_path/dummy"
|
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# Helpers
|
# Helpers
|
||||||
@ -50,14 +47,6 @@ run chown root:root /data
|
|||||||
run chmod 755 /docker
|
run chmod 755 /docker
|
||||||
run chmod 755 /data
|
run chmod 755 /data
|
||||||
|
|
||||||
section "Check dummy cert exists "
|
|
||||||
#TODO check if expired
|
|
||||||
if [ ! -f "$dummy_cert_path/privkey.pem" ] ; then
|
|
||||||
echo "Dummy cert generation"
|
|
||||||
run mkdir -p "$dummy_cert_path"
|
|
||||||
run openssl req -x509 -newkey rsa:2048 -keyout /etc/letsencrypt/live/dummy/privkey.pem -out /etc/letsencrypt/live/dummy/fullchain.pem -days 365 -nodes -subj "/C=FR/ST=France/O=IT/CN=jean-cloud.net"
|
|
||||||
fi
|
|
||||||
|
|
||||||
section "Create new conf directory"
|
section "Create new conf directory"
|
||||||
run mkdir -p "$new_nginx_conf_path"
|
run mkdir -p "$new_nginx_conf_path"
|
||||||
|
|
||||||
|
@ -150,8 +150,8 @@ clean() {
|
|||||||
|
|
||||||
# tells where your executable is (absolute path). Follow simlinks if any argument provided
|
# tells where your executable is (absolute path). Follow simlinks if any argument provided
|
||||||
where() {
|
where() {
|
||||||
if [ -z "$1" ] ; then
|
if [ "$#" -lt 1 ] || [ -z "$1" ] ; then
|
||||||
echo "$( cd -P "$( dirname "$1" )" && pwd )"
|
echo "$( cd -P "$( dirname "$0" )" && pwd )"
|
||||||
else
|
else
|
||||||
SOURCE="$0"
|
SOURCE="$0"
|
||||||
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
|
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
|
||||||
|
38
provisioning/roles/deploy_all/files/bin/dummy_cert.sh
Executable file
38
provisioning/roles/deploy_all/files/bin/dummy_cert.sh
Executable file
@ -0,0 +1,38 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
. driglibash-base
|
||||||
|
. /etc/jeancloud.env
|
||||||
|
|
||||||
|
if [ "$#" -ne 2 ] || [ -z "$1" ] || [ -z "$2" ] ; then
|
||||||
|
die "Usage: $0 <service-name> <action>"
|
||||||
|
fi
|
||||||
|
|
||||||
|
service="$1"
|
||||||
|
action="$2"
|
||||||
|
|
||||||
|
# Create dummy cert if needed
|
||||||
|
#TODO check if expired
|
||||||
|
if [ ! -f "$dummy_cert_path/privkey.pem" ] ; then
|
||||||
|
echo "Dummy cert generation"
|
||||||
|
run mkdir -p "$dummy_cert_path"
|
||||||
|
run openssl req -x509 -newkey rsa:2048 -keyout /etc/letsencrypt/live/dummy/privkey.pem -out /etc/letsencrypt/live/dummy/fullchain.pem -days 365 -nodes -subj "/C=FR/ST=France/O=IT/CN=jean-cloud.net"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$action" = add ] ; then
|
||||||
|
# Link letsencrypt dir to dummy cert dir if there is no cert
|
||||||
|
if [ ! -e "$certs_path/$service/fullchain.pem" ] ; then
|
||||||
|
section "Create cert dir"
|
||||||
|
run mkdir -p "$certs_path/$service"
|
||||||
|
|
||||||
|
section "Link dummy to cert"
|
||||||
|
run ln -s "$dummy_cert_path/fullchain.pem" "$certs_path/$service"
|
||||||
|
run ln -s "$dummy_cert_path/privkey.pem" "$certs_path/$service"
|
||||||
|
fi
|
||||||
|
elif [ "$action" = remove ] ; then
|
||||||
|
# UNlink letsencrypt dir to dummy cert dir IF it is the dummy cert
|
||||||
|
if [ "$(readlink "$certs_path/$service_name/fullchain.pem")" = "$dummy_cert_path/fullchain.pem" ] ; then
|
||||||
|
rm -r "$certs_path/$service_name"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
die "$0: Unknown action '$action'"
|
||||||
|
fi
|
@ -14,6 +14,7 @@ nginx_conf_path='$proxy_dir/sites-enabled'
|
|||||||
new_nginx_conf_path='$proxy_dir/new-sites-enabled'
|
new_nginx_conf_path='$proxy_dir/new-sites-enabled'
|
||||||
certs_path='$certs_path'
|
certs_path='$certs_path'
|
||||||
dummy_cert_path='$certs_path/dummy'
|
dummy_cert_path='$certs_path/dummy'
|
||||||
|
servicefile=/docker/services.txt
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
for dir in /docker/* ; do
|
for dir in /docker/* ; do
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
|
||||||
declare -A usage
|
declare -A usage
|
||||||
declare -A varia
|
declare -A varia
|
||||||
|
|
||||||
@ -17,6 +18,10 @@ usage[i]="privkey used to ssh pull"
|
|||||||
varia[i]=privkey
|
varia[i]=privkey
|
||||||
privkey=''
|
privkey=''
|
||||||
|
|
||||||
|
usage[N]="Clone to a Non-empty target. Existing files will be overwriten"
|
||||||
|
varia[N]=nonempty_target
|
||||||
|
nonempty_target=false
|
||||||
|
|
||||||
|
|
||||||
. driglibash-args
|
. driglibash-args
|
||||||
|
|
||||||
@ -35,16 +40,32 @@ fi
|
|||||||
cd "$dst"
|
cd "$dst"
|
||||||
|
|
||||||
if [ -d .git ] ; then
|
if [ -d .git ] ; then
|
||||||
git fetch origin "$branch"
|
run git fetch origin "$branch"
|
||||||
git checkout --force -B "$branch" "origin/$branch"
|
run git checkout --force -B "$branch" "origin/$branch"
|
||||||
git reset --hard
|
run git reset --hard
|
||||||
git clean -qffdx
|
# Preserve existing files in some cases
|
||||||
git submodule update --init --recursive --force --recommend-shallow
|
if ! "$nonempty_target" ; then
|
||||||
git submodule foreach git fetch
|
git clean -qffdx
|
||||||
git submodule foreach git checkout --force -B "$branch" "origin/$branch"
|
fi
|
||||||
git submodule foreach git reset --hard
|
run git submodule update --init --recursive --force --recommend-shallow
|
||||||
git submodule foreach git clean -fdx
|
run git submodule foreach git fetch
|
||||||
|
run git submodule foreach git checkout --force HEAD
|
||||||
|
run git submodule foreach git reset --hard
|
||||||
|
run git submodule foreach git clean -fdx
|
||||||
else
|
else
|
||||||
git clone -b "$branch" --single-branch --recurse-submodules --shallow-submodules --depth 1 --config core.sshCommand="$ssh_opt" "$repo" .
|
clone_dst='.'
|
||||||
|
|
||||||
|
# To override an existing dir, we need to clone elsewhere first
|
||||||
|
if "$nonempty_target" ; then
|
||||||
|
clone_dst="$(mktemp -d)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
run git clone -b "$branch" --single-branch --recurse-submodules --shallow-submodules --depth 1 --config core.sshCommand="$ssh_opt" "$repo" "$clone_dst"
|
||||||
|
|
||||||
|
# To override an existing dir, we then move everything to that dir
|
||||||
|
if "$nonempty_target" ; then
|
||||||
|
run mv "$clone_dst/"{*,.*} .
|
||||||
|
run rmdir "$clone_dst"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -34,9 +34,7 @@ for file in "$nginx_sites_dir"* ; do
|
|||||||
domains="$(extract_domain_nginx_conf.sh "$file")"
|
domains="$(extract_domain_nginx_conf.sh "$file")"
|
||||||
if [ -n "$domains" ] ; then
|
if [ -n "$domains" ] ; then
|
||||||
# If using dummy cert, disabling it
|
# If using dummy cert, disabling it
|
||||||
if [ "$(readlink "/etc/letsencrypt/live/$service_name/fullchain.pem")" = "/etc/letsencrypt/live/dummy/fullchain.pem" ] ; then
|
dummy_cert.sh "$service_name" remove
|
||||||
rm -r "/etc/letsencrypt/live/$service_name"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "$domains"
|
echo "$domains"
|
||||||
# adding -d before every domain
|
# adding -d before every domain
|
||||||
@ -71,8 +69,10 @@ for file in "$nginx_sites_dir"* ; do
|
|||||||
echo " ------------------------------------------"
|
echo " ------------------------------------------"
|
||||||
echo "$out"
|
echo "$out"
|
||||||
echo " ------------------------------------------"
|
echo " ------------------------------------------"
|
||||||
|
dummy_cert.sh "$service_name" add
|
||||||
else
|
else
|
||||||
echo "Unknown error : $result.\n$out"
|
echo "Unknown error : $result.\n$out"
|
||||||
|
dummy_cert.sh "$service_name" add
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
14
provisioning/roles/deploy_all/files/bin/resolvable.sh
Executable file
14
provisioning/roles/deploy_all/files/bin/resolvable.sh
Executable file
@ -0,0 +1,14 @@
|
|||||||
|
#/bin/bash
|
||||||
|
|
||||||
|
# Read domains form stdin and echo the ones resolved successfully
|
||||||
|
|
||||||
|
server=""
|
||||||
|
if [ "$#" -ge 1 ] && [ -n "$1" ] ; then
|
||||||
|
server="$1"
|
||||||
|
fi
|
||||||
|
|
||||||
|
while read domain; do
|
||||||
|
host "$domain" $server &>/dev/null
|
||||||
|
[ "$?" -eq 0 ] && echo "$domain"
|
||||||
|
done
|
||||||
|
exit 0
|
@ -7,5 +7,6 @@ fi
|
|||||||
if [ -f "$1" ] ; then
|
if [ -f "$1" ] ; then
|
||||||
bash -c 'set -a && . '"$1"' && envsubst "$(cat '"$1"' | grep -o ^.*= | sed "s/=//" | sed "s/^/$/")"'
|
bash -c 'set -a && . '"$1"' && envsubst "$(cat '"$1"' | grep -o ^.*= | sed "s/=//" | sed "s/^/$/")"'
|
||||||
else
|
else
|
||||||
|
echo "No env file found, no modifications made." >&2
|
||||||
cat /dev/stdin
|
cat /dev/stdin
|
||||||
fi
|
fi
|
||||||
|
@ -0,0 +1 @@
|
|||||||
|
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDYnqsFJpr2wF3WD9QO81SIZJ1Ah7qRM+F3mOgGItYD1qjO4/0Hx8HCzebZkega3wP6Pn5ML/CANXzGnniib5khzjuecF2RU1yNqO40BmuuJ1T0AtdHLuLc6RXmpBmE2NFmSxTEAMN1/kWXoo2gwiBTFOqSnIElfRoHCxwAZFZN/wuEnZKuMV4xw8NWkkrmruSBdkOMHvZshtdzxkvi61FI/7MOWFdmiFy2YypmPUEx3h3ujykQcgVpZ7RYz8seh5v7j5P2N/xYJYEatMN7che31d6u1Nazd0kfV/9jAQNXxsKgSZdnxJpoKDjXe6DLLwQ3gybOT70ehzdG77SK/bi6KnVYrH5E/2lehHOGgKpdskt0pEJ8d0rM5hIgnyCX+S6S7H8c8Uca+UVc+/g59qW1XRyYmr/o4zljmkZA4Zx0IEk3MQYCFkT9JZQTjrgSCI01ggHxwOoQhpiJVnoUZNa3j3DMTi86A3H4XD5ByIK8k7t5MFzk6sDWYDi25CVa/HM= root@raku.jean-cloud.org
|
@ -24,6 +24,21 @@
|
|||||||
when: inventory_hostname in groups["shlago"]
|
when: inventory_hostname in groups["shlago"]
|
||||||
|
|
||||||
|
|
||||||
|
# Account for deploying SSL certs
|
||||||
|
- name: Add certs user
|
||||||
|
ansible.builtin.user:
|
||||||
|
name: certs
|
||||||
|
shell: /bin/bash
|
||||||
|
home: /data/letsencrypt.jean-cloud.org
|
||||||
|
|
||||||
|
- name: Set authorized key, removing all the authorized keys already set
|
||||||
|
ansible.posix.authorized_key:
|
||||||
|
user: certs
|
||||||
|
key: "{{ lookup('file', 'certs.pub') }}"
|
||||||
|
state: present
|
||||||
|
exclusive: true
|
||||||
|
|
||||||
|
#
|
||||||
- name: Show last changed password for security
|
- name: Show last changed password for security
|
||||||
copy:
|
copy:
|
||||||
dest: /etc/profile.d/user_last_passwd.sh
|
dest: /etc/profile.d/user_last_passwd.sh
|
||||||
@ -77,6 +92,7 @@
|
|||||||
"max-file": "3"
|
"max-file": "3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#TODO add this to /etc/docker/daemon.json
|
#TODO add this to /etc/docker/daemon.json
|
||||||
#{
|
#{
|
||||||
# "iptables": false
|
# "iptables": false
|
||||||
|
@ -1,64 +0,0 @@
|
|||||||
# TODO ansible secrets
|
|
||||||
# Oma-Radio host
|
|
||||||
|
|
||||||
- name: Deploy specific services
|
|
||||||
hosts: nougaro.jean-cloud.net
|
|
||||||
become: no
|
|
||||||
roles:
|
|
||||||
#- role: docker-network-setup
|
|
||||||
|
|
||||||
# The proxy docker stack must be the first to be deployed
|
|
||||||
- role: prepare-nginx
|
|
||||||
|
|
||||||
- role: deploy
|
|
||||||
service_name: proxy
|
|
||||||
state: started
|
|
||||||
monitored: false
|
|
||||||
|
|
||||||
- role: deploy
|
|
||||||
service_name: nsslave.jean-cloud.net
|
|
||||||
state: started
|
|
||||||
monitored: false
|
|
||||||
|
|
||||||
- role: deploy
|
|
||||||
service_name: registry.oma-radio.fr
|
|
||||||
state: started
|
|
||||||
|
|
||||||
- role: deploy
|
|
||||||
service_name: wordpress.inurbe.fr
|
|
||||||
state: started
|
|
||||||
|
|
||||||
- role: deploy
|
|
||||||
service_name: compagnienouvelle.fr
|
|
||||||
state: started
|
|
||||||
|
|
||||||
- role: deploy
|
|
||||||
service_name: icecast.oma-radio.fr
|
|
||||||
state: started
|
|
||||||
monitored: false
|
|
||||||
remote_docker_login_user: oma
|
|
||||||
remote_docker_login_pass: KkK8Aavmm4cN6nBM
|
|
||||||
remote_docker_login_registry: http://registry.oma-radio.fr
|
|
||||||
|
|
||||||
- role: deploy
|
|
||||||
service_name: soundbase.oma-radio.fr
|
|
||||||
state: started
|
|
||||||
monitored: false
|
|
||||||
|
|
||||||
- role: deploy
|
|
||||||
service_name: paj.oma-radio.fr
|
|
||||||
state: started
|
|
||||||
monitored: false
|
|
||||||
remote_docker_login_user: oma
|
|
||||||
remote_docker_login_pass: KkK8Aavmm4cN6nBM
|
|
||||||
remote_docker_login_registry: http://registry.oma-radio.fr
|
|
||||||
|
|
||||||
#- role: deploy
|
|
||||||
# service_name: radionimaitre.oma-radio.fr
|
|
||||||
# state: started
|
|
||||||
# monitored: false
|
|
||||||
# remote_docker_login_user: oma
|
|
||||||
# remote_docker_login_pass: KkK8Aavmm4cN6nBM
|
|
||||||
# remote_docker_login_registry: http://registry.oma-radio.fr
|
|
||||||
|
|
||||||
- role: restart-nginx
|
|
@ -1,132 +0,0 @@
|
|||||||
# The host have:
|
|
||||||
# - /data -> every data
|
|
||||||
# - /docker -> deployed docker-compose files
|
|
||||||
|
|
||||||
- name: Deploy specific services
|
|
||||||
hosts: vandamme.jean-cloud.net
|
|
||||||
become: yes
|
|
||||||
roles:
|
|
||||||
#- role: docker-network-setup
|
|
||||||
|
|
||||||
# The proxy docker stack must be the first to be deployed
|
|
||||||
- role: prepare-nginx
|
|
||||||
|
|
||||||
- role: deploy
|
|
||||||
service_name: proxy
|
|
||||||
state: started
|
|
||||||
monitored: false
|
|
||||||
|
|
||||||
- role: deploy
|
|
||||||
service_name: meta-morpho.se
|
|
||||||
state: started
|
|
||||||
|
|
||||||
- role: deploy
|
|
||||||
service_name: mailer.jean-cloud.net
|
|
||||||
state: started
|
|
||||||
remote_docker_login_user: jean-cloud
|
|
||||||
remote_docker_login_pass: KaJefxXiNr327EfG4suYD2PM4tYF5Jy8AhMYntfdjVhX
|
|
||||||
monitored: false
|
|
||||||
|
|
||||||
- role: deploy
|
|
||||||
service_name: static.jean-cloud.net
|
|
||||||
state: started
|
|
||||||
|
|
||||||
|
|
||||||
- role: deploy
|
|
||||||
service_name: ssh
|
|
||||||
state: started
|
|
||||||
monitored: false
|
|
||||||
|
|
||||||
#- role: deploy
|
|
||||||
# service_name: myrrdel.jean-cloud.net
|
|
||||||
# state: started
|
|
||||||
|
|
||||||
- role: deploy
|
|
||||||
service_name: collectif-arthadie.fr
|
|
||||||
state: started
|
|
||||||
|
|
||||||
#- role: deploy
|
|
||||||
# service_name: karna.jean-cloud.net
|
|
||||||
# state: started
|
|
||||||
|
|
||||||
- role: deploy
|
|
||||||
service_name: oma-radio.fr
|
|
||||||
state: started
|
|
||||||
|
|
||||||
- role: deploy
|
|
||||||
service_name: rpnow.jean-cloud.net
|
|
||||||
state: started
|
|
||||||
|
|
||||||
- role: deploy
|
|
||||||
service_name: ns.jean-cloud.org
|
|
||||||
state: started
|
|
||||||
monitored: false
|
|
||||||
|
|
||||||
- role: deploy
|
|
||||||
service_name: gmx-webmail.jean-cloud.net
|
|
||||||
state: started
|
|
||||||
|
|
||||||
- role: deploy
|
|
||||||
service_name: registry.jean-cloud.net
|
|
||||||
state: started
|
|
||||||
|
|
||||||
- role: deploy
|
|
||||||
service_name: inurbe.fr
|
|
||||||
state: started
|
|
||||||
|
|
||||||
- role: deploy
|
|
||||||
service_name: feteducourt.jean-cloud.net
|
|
||||||
state: started
|
|
||||||
remote_docker_login_user: jean-cloud
|
|
||||||
remote_docker_login_pass: KaJefxXiNr327EfG4suYD2PM4tYF5Jy8AhMYntfdjVhX
|
|
||||||
|
|
||||||
- role: deploy
|
|
||||||
service_name: feteducourt2020.jean-cloud.net
|
|
||||||
state: started
|
|
||||||
remote_docker_login_user: jean-cloud
|
|
||||||
remote_docker_login_pass: KaJefxXiNr327EfG4suYD2PM4tYF5Jy8AhMYntfdjVhX
|
|
||||||
|
|
||||||
- role: deploy
|
|
||||||
service_name: leida.fr
|
|
||||||
state: started
|
|
||||||
|
|
||||||
- role: deploy
|
|
||||||
service_name: lalis.fr
|
|
||||||
state: started
|
|
||||||
|
|
||||||
- role: deploy
|
|
||||||
service_name: amaglio.fr
|
|
||||||
state: started
|
|
||||||
|
|
||||||
- role: deploy
|
|
||||||
service_name: velov.jean-cloud.net
|
|
||||||
state: started
|
|
||||||
|
|
||||||
- role: deploy
|
|
||||||
service_name: cousinades.jean-cloud.net
|
|
||||||
state: started
|
|
||||||
monitored: false # web cant pass basic auth yet
|
|
||||||
|
|
||||||
- role: deploy
|
|
||||||
service_name: cousinades2.jean-cloud.net
|
|
||||||
state: started
|
|
||||||
monitored: false # web cant pass basic auth yet
|
|
||||||
|
|
||||||
|
|
||||||
- role: deploy
|
|
||||||
service_name: nuage.jean-cloud.net
|
|
||||||
state: started
|
|
||||||
|
|
||||||
- role: deploy
|
|
||||||
service_name: git.jean-cloud.net
|
|
||||||
state: started
|
|
||||||
|
|
||||||
- role: deploy
|
|
||||||
service_name: wiki-cgr.jean-cloud.net
|
|
||||||
state: started
|
|
||||||
|
|
||||||
- role: deploy
|
|
||||||
service_name: jean-cloud.net
|
|
||||||
state: started
|
|
||||||
|
|
||||||
- role: restart-nginx
|
|
@ -1,15 +0,0 @@
|
|||||||
version: '3'
|
|
||||||
services:
|
|
||||||
sshd:
|
|
||||||
image: atmoz/sftp
|
|
||||||
volumes:
|
|
||||||
- /data/ssh/ssh_host_ed25519_key:/etc/ssh/ssh_host_ed25519_key
|
|
||||||
- /data/ssh/ssh_host_rsa_key:/etc/ssh/ssh_host_rsa_key
|
|
||||||
- /data/leida.fr:/home/leida/sftp
|
|
||||||
- /data/lalis.fr:/home/lalis/sftp
|
|
||||||
- /data/oma-radio.fr:/home/oma/sftp
|
|
||||||
- /data/collectif-arthadie.fr/wordpress:/home/collectifarthadie/sftp
|
|
||||||
- /data/ssh/users.conf:/etc/sftp/users.conf:ro
|
|
||||||
ports:
|
|
||||||
- '2222:22'
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
|||||||
FROM php:7.2-fpm-alpine
|
|
||||||
#RUN apt-get update && apt-get install -y libpq-dev && docker-php-ext-install pdo pdo_pgsql
|
|
||||||
RUN set -ex \
|
|
||||||
&& apk --no-cache add \
|
|
||||||
postgresql-dev
|
|
||||||
RUN docker-php-ext-install pdo_pgsql
|
|
@ -1,35 +0,0 @@
|
|||||||
version: '3'
|
|
||||||
services:
|
|
||||||
app:
|
|
||||||
build: .
|
|
||||||
volumes:
|
|
||||||
- /data/cousinades2.jean-cloud.net/public:/usr/src/app
|
|
||||||
restart: unless-stopped
|
|
||||||
networks:
|
|
||||||
default:
|
|
||||||
ipv4_address: 172.29.8.101
|
|
||||||
deploy:
|
|
||||||
resources:
|
|
||||||
limits:
|
|
||||||
cpus: '0.50'
|
|
||||||
memory: 100M
|
|
||||||
|
|
||||||
db:
|
|
||||||
image: postgres:9.6-alpine
|
|
||||||
volumes:
|
|
||||||
- /data/cousinades2.jean-cloud.net/db:/var/lib/postgresql/data
|
|
||||||
networks:
|
|
||||||
default:
|
|
||||||
ipv4_address: 172.29.8.101
|
|
||||||
deploy:
|
|
||||||
resources:
|
|
||||||
limits:
|
|
||||||
cpus: '0.50'
|
|
||||||
memory: 100M
|
|
||||||
|
|
||||||
networks:
|
|
||||||
default:
|
|
||||||
ipam:
|
|
||||||
config:
|
|
||||||
- subnet: 172.29.8.0/24
|
|
||||||
|
|
@ -1,25 +0,0 @@
|
|||||||
server {
|
|
||||||
listen 443 ssl http2;
|
|
||||||
listen [::]:443 ssl http2;
|
|
||||||
ssl_certificate /etc/letsencrypt/live/cousinades2.jean-cloud.net/fullchain.pem;
|
|
||||||
ssl_certificate_key /etc/letsencrypt/live/cousinades2.jean-cloud.net/privkey.pem;
|
|
||||||
server_name cousinades2.jean-cloud.net www.cousinades2.jean-cloud.net;
|
|
||||||
|
|
||||||
index index.php;
|
|
||||||
root /data/cousinades2.jean-cloud.net/public;
|
|
||||||
|
|
||||||
location / {
|
|
||||||
#auth_basic "Restricted";
|
|
||||||
#auth_basic_user_file /data/cousinades2.jean-cloud.net/private/passwords.txt;
|
|
||||||
try_files $uri $uri/ =404;
|
|
||||||
}
|
|
||||||
|
|
||||||
location ~ \.php$ {
|
|
||||||
fastcgi_split_path_info ^(.+\.php)(/.+)$;
|
|
||||||
fastcgi_pass 172.29.8.100:9000;
|
|
||||||
fastcgi_index index.php;
|
|
||||||
include fastcgi_params;
|
|
||||||
fastcgi_param SCRIPT_FILENAME /usr/src/app/$fastcgi_script_name;
|
|
||||||
fastcgi_param PATH_INFO $fastcgi_path_info;
|
|
||||||
}
|
|
||||||
}
|
|
4
services/feteducourt.jean-cloud.net/deploy_http.sh
Executable file
4
services/feteducourt.jean-cloud.net/deploy_http.sh
Executable file
@ -0,0 +1,4 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
git_update.sh -d "$HTTP_DIR" -b 2021 "https://git.jean-cloud.net/adrian/feteducourt-static.git"
|
@ -1,20 +1,11 @@
|
|||||||
server {
|
server {
|
||||||
listen 443 ssl http2;
|
listen 443 ssl http2;
|
||||||
listen [::]:443 ssl http2;
|
listen [::]:443 ssl http2;
|
||||||
ssl_certificate /etc/letsencrypt/live/feteducourt.jean-cloud.net/fullchain.pem;
|
ssl_certificate /etc/letsencrypt/live/$JC_SERVICE/fullchain.pem;
|
||||||
ssl_certificate_key /etc/letsencrypt/live/feteducourt.jean-cloud.net/privkey.pem;
|
ssl_certificate_key /etc/letsencrypt/live/$JC_SERVICE/privkey.pem;
|
||||||
server_name feteducourt.jean-cloud.net www.feteducourt.jean-cloud.net;
|
server_name $JC_SERVICE www.$JC_SERVICE;
|
||||||
#location /static {
|
|
||||||
# alias /data/feteducourt.jean-cloud.net/app/static;
|
|
||||||
# try_files $uri $uri/ =404;
|
|
||||||
#}
|
|
||||||
#location / {
|
|
||||||
# proxy_pass http://app.feteducourtjean-cloudnet.docker;
|
|
||||||
# proxy_set_header Host $host;
|
|
||||||
#}
|
|
||||||
location / {
|
location / {
|
||||||
root /data/feteducourt.jean-cloud.net/static;
|
root $HTTP_DIR;
|
||||||
try_files $uri $uri/ =404;
|
try_files $uri $uri/ =404;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
4
services/feteducourt2020.jean-cloud.net/deploy_http.sh
Executable file
4
services/feteducourt2020.jean-cloud.net/deploy_http.sh
Executable file
@ -0,0 +1,4 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
git_update.sh -d "$HTTP_DIR" -b 2020 "https://git.jean-cloud.net/adrian/feteducourt-static.git"
|
@ -1,22 +1,11 @@
|
|||||||
server {
|
server {
|
||||||
listen 443 ssl http2;
|
listen 443 ssl http2;
|
||||||
listen [::]:443 ssl http2;
|
listen [::]:443 ssl http2;
|
||||||
ssl_certificate /etc/letsencrypt/live/feteducourt2020.jean-cloud.net/fullchain.pem;
|
ssl_certificate /etc/letsencrypt/live/$JC_SERVICE/fullchain.pem;
|
||||||
ssl_certificate_key /etc/letsencrypt/live/feteducourt2020.jean-cloud.net/privkey.pem;
|
ssl_certificate_key /etc/letsencrypt/live/$JC_SERVICE/privkey.pem;
|
||||||
server_name feteducourt2020.jean-cloud.net www.feteducourt2020.jean-cloud.net;
|
server_name $JC_SERVICE www.$JC_SERVICE;
|
||||||
|
|
||||||
#location /static {
|
|
||||||
# alias /data/feteducourt2020.jean-cloud.net/app/static;
|
|
||||||
# try_files $uri $uri/ =404;
|
|
||||||
#}
|
|
||||||
#location / {
|
|
||||||
# proxy_pass http://app.feteducourt2020jean-cloudnet.docker;
|
|
||||||
# proxy_set_header Host $host;
|
|
||||||
#}
|
|
||||||
|
|
||||||
location / {
|
location / {
|
||||||
root /data/feteducourt2020.jean-cloud.net/static;
|
root $HTTP_DIR;
|
||||||
try_files $uri $uri/ =404;
|
try_files $uri $uri/ =404;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
17
services/letsencrypt.jean-cloud.org/acme-dns.sh
Executable file
17
services/letsencrypt.jean-cloud.org/acme-dns.sh
Executable file
@ -0,0 +1,17 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$#" -ne 1 ] ; then
|
||||||
|
echo "Usage: $0 <service_name>" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
service="$1"
|
||||||
|
|
||||||
|
nginxfile="/docker/$service/nginx_server.conf"
|
||||||
|
if [ -f "$nginxfile" ] ; then
|
||||||
|
nginxdomains="$(extract_domain_nginx_conf.sh "$nginxfile" | template.sh "/docker/$service/.env")"
|
||||||
|
domains="$(echo "$service $nginxdomains" | tr ' ' '\n' | sort -u | resolvable.sh ns.jean-cloud.org | sed -z -e 's/\n$//' -e 's/\n/ -d /g' )"
|
||||||
|
[ -z "$domains" ] && exit 0
|
||||||
|
echo "--------------- -d $domains"
|
||||||
|
certbot certonly --config-dir "$DATA_DIR/certs" --work-dir "$tmp/work" --logs-dir "$tmp/logs" --agree-tos -m contact@jean-cloud.org -n --cert-name "$service" --dns-rfc2136 --dns-rfc2136-credentials "$DATA_DIR/rfc2136.ini" -d $domains
|
||||||
|
fi
|
8
services/letsencrypt.jean-cloud.org/deploy.sh
Executable file
8
services/letsencrypt.jean-cloud.org/deploy.sh
Executable file
@ -0,0 +1,8 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# For some variables
|
||||||
|
. /etc/jeancloud.env
|
||||||
|
|
||||||
|
apt install -y python3-certbot-dns-rfc2136
|
20
services/letsencrypt.jean-cloud.org/deploy_bind.sh
Executable file
20
services/letsencrypt.jean-cloud.org/deploy_bind.sh
Executable file
@ -0,0 +1,20 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
. /etc/jeancloud.env
|
||||||
|
|
||||||
|
[ ! -f "$DATA_DIR/rfc2136.ini" ] && echo "$0 Missing files" && exit 1
|
||||||
|
|
||||||
|
while read line ; do
|
||||||
|
read -r service target < <(echo "$line")
|
||||||
|
echo "---- $service $target ----"
|
||||||
|
nginxfile="/docker/$service/nginx_server.conf"
|
||||||
|
if [ -f "$nginxfile" ] ; then
|
||||||
|
nginxdomains="$(extract_domain_nginx_conf.sh "$nginxfile" | template.sh "/docker/$service/.env")"
|
||||||
|
domains="$(echo "$service $nginxdomains" | tr ' ' '\n' | sort -u | sed -z 's/\n/ -d /')"
|
||||||
|
echo "$domains"
|
||||||
|
certbot certonly -m contact@jean-cloud.org -n --cert-name "$service" --dns-rfc2136 --dns-rfc2136-credentials "$DATA_DIR/rfc2136.ini" -d $domains
|
||||||
|
fi
|
||||||
|
|
||||||
|
done < "$servicefile"
|
8
services/letsencrypt.jean-cloud.org/run.sh
Executable file
8
services/letsencrypt.jean-cloud.org/run.sh
Executable file
@ -0,0 +1,8 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
. driglibash-base
|
||||||
|
here="$(where)"
|
||||||
|
|
||||||
|
sudo -u bind bash -c "$here/run_bind.sh $@"
|
40
services/letsencrypt.jean-cloud.org/run_bind.sh
Executable file
40
services/letsencrypt.jean-cloud.org/run_bind.sh
Executable file
@ -0,0 +1,40 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
. driglibash-base
|
||||||
|
here="$(where)"
|
||||||
|
|
||||||
|
# For some variables
|
||||||
|
. /etc/jeancloud.env
|
||||||
|
. "$here/.env"
|
||||||
|
|
||||||
|
# Test secret presence
|
||||||
|
[ ! -f "$DATA_DIR/rfc2136.ini" ] && echo "$0 Missing file '$DATA_DIR/rfc2136.ini'" && exit 1
|
||||||
|
|
||||||
|
export tmp="$(mktemp -d)"
|
||||||
|
mkdir -p "$tmp/{work,logs}"
|
||||||
|
|
||||||
|
# If there is some args, populate a fake service file
|
||||||
|
if [ "$#" -ge 1 ] && [ -n "$1" ] ; then
|
||||||
|
servicefile="$(mktemp)"
|
||||||
|
for service in "$@" ; do
|
||||||
|
echo "$service _" >> "$servicefile"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# For each service, read all possible domains
|
||||||
|
while read line ; do
|
||||||
|
read -r service target < <(echo "$line")
|
||||||
|
|
||||||
|
# removo dummy cert
|
||||||
|
dummy_cert.sh "$service" remove
|
||||||
|
|
||||||
|
[ -d "$DATA_DIR/certs/live/$service" ] && echo "Already exists, thats a job for renew : $service" && continue
|
||||||
|
|
||||||
|
# acme
|
||||||
|
"$here/acme-dns.sh" "$service"
|
||||||
|
|
||||||
|
# Replace dummy cert if letsencrypt failed
|
||||||
|
[ "$?" -ne 0 ] && dummy_cert.sh "$servic" remove
|
||||||
|
done < "$servicefile"
|
@ -3,7 +3,7 @@ server {
|
|||||||
listen [::]:443 ssl http2;
|
listen [::]:443 ssl http2;
|
||||||
ssl_certificate /etc/letsencrypt/live/metamorphosemagazine.fr/fullchain.pem;
|
ssl_certificate /etc/letsencrypt/live/metamorphosemagazine.fr/fullchain.pem;
|
||||||
ssl_certificate_key /etc/letsencrypt/live/metamorphosemagazine.fr/privkey.pem;
|
ssl_certificate_key /etc/letsencrypt/live/metamorphosemagazine.fr/privkey.pem;
|
||||||
server_name metamorphosemagazine.fr;
|
server_name $JC_SERVICE www.$JC_SERVICE;
|
||||||
location / {
|
location / {
|
||||||
add_header Content-language fr;
|
add_header Content-language fr;
|
||||||
root $HTTP_DIR/src;
|
root $HTTP_DIR/src;
|
||||||
|
13
services/ns.jean-cloud.org/deploy.sh
Executable file
13
services/ns.jean-cloud.org/deploy.sh
Executable file
@ -0,0 +1,13 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
cd ../ns1.jean-cloud.org
|
||||||
|
. deploy.sh
|
||||||
|
. .env
|
||||||
|
|
||||||
|
# Do not run if primary exists
|
||||||
|
[ -d "$DATA_DIR/keys" ] && echo 'ns1 found on this host. Aborting.' && exit 0
|
||||||
|
|
||||||
|
export keydir=""
|
||||||
|
run secondary
|
@ -1,125 +1,60 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
. driglibash-base
|
. driglibash-base
|
||||||
|
. "$(where)/helper_functions.sh"
|
||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
# Working variables
|
# Working variables
|
||||||
debian_bind_workdir="/var/cache/bind"
|
|
||||||
debian_bind_confdir="/etc/bind"
|
debian_bind_confdir="/etc/bind"
|
||||||
keydir="$DATA_DIR/keys"
|
|
||||||
|
|
||||||
# Install dependencies
|
|
||||||
apt install -y bind9 &>/dev/null
|
|
||||||
|
|
||||||
# Create Directories
|
|
||||||
mkdir -p "$keydir"
|
|
||||||
chown bind:bind "$keydir" -R
|
|
||||||
chown bind:bind "$debian_bind_confdir" -R
|
|
||||||
|
|
||||||
# Empty bind dir if it is not our git repo
|
|
||||||
if [ ! -d "$debian_bind_confdir/.git" ] ; then
|
|
||||||
echo "lets delete $debian_bind_confdir"
|
|
||||||
rm -rf "$debian_bind_confdir/"{*,.*}
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Sync the git repo
|
|
||||||
sudo -u bind git_update.sh -b main -i "$DATA_DIR/gitkey" -d "$debian_bind_confdir" 'ssh://git@git.jean-cloud.net:22529/adrian/dnszones.git'
|
|
||||||
cd /etc/bind
|
|
||||||
sudo -u bind git status
|
|
||||||
|
|
||||||
### Generate zones from service directory ###
|
|
||||||
|
|
||||||
servicefile="/docker/services.txt"
|
|
||||||
|
|
||||||
# Function that simulate a DNS resolve by reading bind zone file
|
|
||||||
# Returns all the record line:
|
|
||||||
# @ IN A X.X.X.X
|
|
||||||
fakeresolve () {
|
|
||||||
if [ "$#" -ne 1 ] ; then
|
|
||||||
die "Usage: fakeresolve <name>"
|
|
||||||
fi
|
|
||||||
name="$1"
|
|
||||||
|
|
||||||
zonefile="$debian_bind_confdir/db.jean-cloud.org"
|
|
||||||
shortname="$(echo "$name" | grep -Po '^.*(?=\.[^\.]+\.[^\.]+$)' || true)"
|
|
||||||
|
|
||||||
grep -v -e '^[[:space:]]*;' "$zonefile" |grep -oP "^[[:space:]]*$shortname\K[[:space:]]*IN[[:space:]]*A{1,4}[[:space:]]*[\S;]+" | sed 's/^/@/'
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
# Function that add DNS record in the right file
|
|
||||||
addbindline () {
|
|
||||||
if [ "$#" -ne 2 ] ; then
|
|
||||||
die "Usage: addbindline <name> <target_cname>"
|
|
||||||
fi
|
|
||||||
|
|
||||||
name="$1"
|
|
||||||
target="$2"
|
|
||||||
|
|
||||||
# extract the truc.com part
|
|
||||||
domain="$(echo "$name" | grep -o '[^\.]\+\.[^\.]\+$' || true)"
|
|
||||||
[ -z "$domain" ] && return 0
|
|
||||||
|
|
||||||
# extract the subdomain part (www)
|
|
||||||
shortname="$(echo "$name" | grep -Po '^.*(?=\.[^\.]+\.[^\.]+$)' || true)"
|
|
||||||
|
|
||||||
# bind DB file
|
|
||||||
bindfile="$debian_bind_confdir/db.$domain"
|
|
||||||
|
|
||||||
if [ -z "$shortname" ] ; then
|
|
||||||
# CNAME are forbiden for empty shortnames, so we must resolve the target IPs
|
|
||||||
while read line ; do
|
|
||||||
line_in_file "$line" "$bindfile"
|
|
||||||
done < <(fakeresolve "$target")
|
|
||||||
else
|
|
||||||
line_in_file "$shortname IN CNAME $target." "$bindfile"
|
|
||||||
fi
|
|
||||||
|
|
||||||
#XXX Add CAA records
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
autoconf_separator=";;; Autogeneration. Do not write under this line! ;;;"
|
autoconf_separator=";;; Autogeneration. Do not write under this line! ;;;"
|
||||||
|
|
||||||
echo 'Prepare bind: Remove autogenerated part from bind conf files'
|
|
||||||
sed -i -n "/$autoconf_separator/q;p" "$debian_bind_confdir"/*
|
|
||||||
|
|
||||||
echo 'Put the separator back'
|
# File that contain "service target" lines
|
||||||
for file in $( ls "$debian_bind_confdir"/db.* | grep -v '.signed$\|.jbk$\|.jnl$') ; do
|
# With service a symbolic dns name and target an existing server hostname
|
||||||
echo "$autoconf_separator" >> "$file"
|
servicefile="/docker/services.txt"
|
||||||
done
|
|
||||||
|
|
||||||
for file in "$debian_bind_confdir"/db.* ; do
|
# The bind file containing server declarations
|
||||||
domain="$(basename "$file" | sed 's/db.//')"
|
server_zone_file="template.db.jean-cloud.org"
|
||||||
|
|
||||||
# TODO fill header too?
|
# Where you want your DNS keys stored
|
||||||
|
keydir="$DATA_DIR/keys"
|
||||||
|
|
||||||
# If no NS record in the db file
|
# IP of primary servers
|
||||||
if [ -z "$(grep '[^;].*IN.*NS' "$file")" ] ; then
|
primary_ips=""
|
||||||
echo -e "@ IN NS ns.jean-cloud.org\n" >> "$file"
|
|
||||||
|
# IP of secondary servers (for zone transfer)
|
||||||
|
secondary_ips="37.65.119.74"
|
||||||
|
|
||||||
|
# NS name
|
||||||
|
default_dns_name="shlago.jean-cloud.org."
|
||||||
|
|
||||||
|
CAA_RR='CAA 0 issue "letsencrypt.org;validationmethods=dns-01"'
|
||||||
|
|
||||||
|
run () {
|
||||||
|
if [ "$#" -ne 1 ] ; then
|
||||||
|
die "Usage: run <primary|secondary>"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo -n "
|
prepare
|
||||||
zone '$domain' {
|
primary_ips="$primary_ips;$(fakeresolve_ip_list raku)"
|
||||||
allow-update { none; };
|
secondary_ips="$secondary_ips;$(fakeresolve_ip_list shlago)"
|
||||||
type master;
|
|
||||||
file \"$file\";
|
|
||||||
};" >> "$debian_bind_confdir/named.conf.local"
|
|
||||||
done
|
|
||||||
|
|
||||||
echo 'Find every used domain and add them to bind db'
|
line_in_file "primary_ips=\"$primary_ips\"" "$DOCKER_DIR/.env"
|
||||||
while read line ; do
|
line_in_file "secondary_ips=\"$secondary_ips\"" "$DOCKER_DIR/.env"
|
||||||
read -r service target <<<$(echo "$line")
|
|
||||||
addbindline "$service" "$target"
|
if [ "$1" = "primary" ] ; then
|
||||||
nginxfile="/docker/$service/nginx_server.conf"
|
create_primary_files
|
||||||
if [ -f "$nginxfile" ] ; then
|
else
|
||||||
for name in $(extract_domain_nginx_conf.sh "$nginxfile" | template.sh "/docker/$service/.env") ; do
|
create_secondary_files
|
||||||
addbindline "$name" "$target"
|
|
||||||
done
|
|
||||||
fi
|
fi
|
||||||
done <"$servicefile"
|
|
||||||
|
|
||||||
|
restart
|
||||||
|
}
|
||||||
|
|
||||||
echo 'Restart bind9'
|
main () {
|
||||||
systemctl restart bind9
|
run primary
|
||||||
|
}
|
||||||
|
|
||||||
|
# Do not execute main if script is sourced
|
||||||
|
! (return 0 2>/dev/null) && main "$@" || true # return 0 whatever happends
|
||||||
|
184
services/ns1.jean-cloud.org/helper_functions.sh
Normal file
184
services/ns1.jean-cloud.org/helper_functions.sh
Normal file
@ -0,0 +1,184 @@
|
|||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
fakeresolve_ip_list () {
|
||||||
|
if [ "$#" -ne 1 ] ; then
|
||||||
|
die "Usage: fakeresolve_ip_list <name>"
|
||||||
|
fi
|
||||||
|
grep -oP "^$1[[:space:]]+IN[[:space:]]+A{1,4}[[:space:]]+\K[^;\s]+" "$debian_bind_confdir/$server_zone_file" | tr '\n' ';'
|
||||||
|
}
|
||||||
|
|
||||||
|
prepare () {
|
||||||
|
# Install dependencies
|
||||||
|
apt install -y bind9 &>/dev/null
|
||||||
|
|
||||||
|
# Create Directories
|
||||||
|
if [ -n "$keydir" ] ; then
|
||||||
|
mkdir -p "$keydir"
|
||||||
|
chown bind:bind "$keydir" -R
|
||||||
|
chown bind:bind "$debian_bind_confdir" -R
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Sync the git repo
|
||||||
|
sudo -u bind git_update.sh -N -b main -i "$DATA_DIR/gitkey" -d "$debian_bind_confdir" 'ssh://git@git.jean-cloud.net:22529/adrian/dnszones.git'
|
||||||
|
cd /etc/bind
|
||||||
|
|
||||||
|
|
||||||
|
echo 'Prepare bind: Remove autogenerated part from bind conf files'
|
||||||
|
sed -i -n "/$autoconf_separator/q;p" "$debian_bind_confdir"/*
|
||||||
|
|
||||||
|
echo 'Put the separator back'
|
||||||
|
for file in $( ls "$debian_bind_confdir"/template.db.* | grep -v '.signed$\|.jbk$\|.jnl$') ; do
|
||||||
|
echo "$autoconf_separator" >> "$file"
|
||||||
|
done
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
restart () {
|
||||||
|
echo 'Restart named'
|
||||||
|
systemctl restart named
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function that simulate a DNS resolve by reading bind zone file
|
||||||
|
# Returns all the record line:
|
||||||
|
# @ IN A X.X.X.X
|
||||||
|
fakeresolve () {
|
||||||
|
if [ "$#" -ne 1 ] ; then
|
||||||
|
die "Usage: fakeresolve <name>"
|
||||||
|
fi
|
||||||
|
name="$1"
|
||||||
|
|
||||||
|
zonefile="$debian_bind_confdir/$server_zone_file"
|
||||||
|
|
||||||
|
# Split full name if there are dots
|
||||||
|
shortname="$name"
|
||||||
|
if [ -n "$(echo "$name" | grep -o '\.')" ] ; then
|
||||||
|
shortname="$(echo "$name" | grep -Po '^.*(?=\.[^\.]+\.[^\.]+$)' || true)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
grep -v -e '^[[:space:]]*;' "$zonefile" |grep -oP "^[[:space:]]*$shortname\K[[:space:]]*IN[[:space:]]*A{1,4}[[:space:]]*[\S;]+" | sed 's/^/@/'
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function that add DNS record in the right file
|
||||||
|
addbindline () {
|
||||||
|
if [ "$#" -ne 2 ] ; then
|
||||||
|
die "Usage: addbindline <name> <target_cname>"
|
||||||
|
fi
|
||||||
|
|
||||||
|
name="$1"
|
||||||
|
target="$2"
|
||||||
|
|
||||||
|
# extract the truc.com part
|
||||||
|
domain="$(echo "$name" | grep -o '[^\.]\+\.[^\.]\+$' || true)"
|
||||||
|
[ -z "$domain" ] && return 0
|
||||||
|
|
||||||
|
# extract the subdomain part (www)
|
||||||
|
shortname="$(echo "$name" | grep -Po '^.*(?=\.[^\.]+\.[^\.]+$)' || true)"
|
||||||
|
|
||||||
|
# bind DB file
|
||||||
|
bindfile="$debian_bind_confdir/db.$domain"
|
||||||
|
|
||||||
|
# Only append if db file exists
|
||||||
|
[ ! -f "$bindfile" ] && return 0
|
||||||
|
|
||||||
|
# BTW allow ACME DNS update
|
||||||
|
token="#JC-ACME $domain"
|
||||||
|
acme_dns="grant letsencrypt.key. name _acme-challenge.$name. TXT;"
|
||||||
|
sed -i "s/\([[:space:]]*\)$token/\1$acme_dns\n\1$token/" "$debian_bind_confdir/named.conf.local"
|
||||||
|
|
||||||
|
|
||||||
|
if [ -z "$shortname" ] ; then
|
||||||
|
# CNAME are forbiden for empty shortnames, so we must resolve the target IPs
|
||||||
|
while read line ; do
|
||||||
|
line_in_file "$line" "$bindfile"
|
||||||
|
done < <(fakeresolve "$target")
|
||||||
|
else
|
||||||
|
line_in_file "$shortname IN CNAME $target." "$bindfile"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
list_template_db_files () {
|
||||||
|
ls "$debian_bind_confdir"/template.db.*
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
create_primary_files () {
|
||||||
|
# Compact the default SOA
|
||||||
|
SOA="$(grep -o '^[^;]*' SOA | sed -z -e 's/[[:space:]]\{2,\}/ /g' -e 's/\n/\\n/')"
|
||||||
|
|
||||||
|
cat "$debian_bind_confdir/template.named.conf" | template.sh "$DOCKER_DIR/.env" > "$debian_bind_confdir/named.conf"
|
||||||
|
|
||||||
|
for file in $(list_template_db_files) ; do
|
||||||
|
domain="$(basename "$file" | sed 's/template.db.//')"
|
||||||
|
new_db_file="$(echo "$file" | sed 's/template.db./db./')"
|
||||||
|
|
||||||
|
# Set the default SOA if needed
|
||||||
|
sed "s/^;JC_AUTOSOA$/$SOA/" "$file" > "$new_db_file"
|
||||||
|
|
||||||
|
# Set serial
|
||||||
|
serial="$(date '+%s')"
|
||||||
|
sed -i "s/\(@ IN SOA [^(]*( \)[0-9]\+/\1$serial/" "$new_db_file"
|
||||||
|
|
||||||
|
# If no NS record in the db file
|
||||||
|
if [ -z "$(grep '[^;].*IN.*NS' "$new_db_file")" ] ; then
|
||||||
|
echo "@ IN NS $default_dns_name" >> "$new_db_file"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Populate named.conf.local
|
||||||
|
cat >> "$debian_bind_confdir/named.conf.local" <<-EOF
|
||||||
|
zone "$domain" {
|
||||||
|
# Zone file
|
||||||
|
type master;
|
||||||
|
file "$new_db_file";
|
||||||
|
|
||||||
|
# Secondary conf
|
||||||
|
# https://kb.isc.org/docs/aa-00723
|
||||||
|
#allow-update { !{!{$secondary_ips};any;}; key update-key; };
|
||||||
|
allow-transfer { $secondary_ips };
|
||||||
|
also-notify { $secondary_ips };
|
||||||
|
notify yes;
|
||||||
|
|
||||||
|
# DNSSEC
|
||||||
|
dnssec-policy default;
|
||||||
|
inline-signing yes;
|
||||||
|
key-directory "$DATA_DIR/keys";
|
||||||
|
|
||||||
|
# ACME autorizations
|
||||||
|
update-policy {
|
||||||
|
#JC-ACME $domain
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
EOF
|
||||||
|
|
||||||
|
|
||||||
|
done
|
||||||
|
|
||||||
|
echo 'Find every used domain and add them to bind db'
|
||||||
|
while read line ; do
|
||||||
|
read -r service target < <(echo "$line")
|
||||||
|
addbindline "$service" "$target"
|
||||||
|
nginxfile="/docker/$service/nginx_server.conf"
|
||||||
|
if [ -f "$nginxfile" ] ; then
|
||||||
|
for name in $(extract_domain_nginx_conf.sh "$nginxfile" | template.sh "/docker/$service/.env") ; do
|
||||||
|
addbindline "$name" "$target"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
done <"$servicefile"
|
||||||
|
}
|
||||||
|
|
||||||
|
create_secondary_files () {
|
||||||
|
primary_ips="$(echo "$primary_ips" | sed 's/^;//')"
|
||||||
|
for file in "$debian_bind_confdir"/template.db.* ; do
|
||||||
|
file="$(echo "$file" | sed 's/template.db.//')"
|
||||||
|
domain="$(basename "$file")"
|
||||||
|
|
||||||
|
echo -n "
|
||||||
|
zone \"$domain\" {
|
||||||
|
masters { $primary_ips };
|
||||||
|
type slave;
|
||||||
|
file \"$file\";
|
||||||
|
};" >> "$debian_bind_confdir/named.conf.local"
|
||||||
|
done
|
||||||
|
|
||||||
|
}
|
@ -13,7 +13,6 @@ RADIO_NAME_SIMPLE=radiodemo
|
|||||||
OMA_CONFIG_NomRadio=radiodemo
|
OMA_CONFIG_NomRadio=radiodemo
|
||||||
OMA_CONFIG_LogLevel=8
|
OMA_CONFIG_LogLevel=8
|
||||||
RADIO_NAME_PRETTY="Radio Démo"
|
RADIO_NAME_PRETTY="Radio Démo"
|
||||||
RADIO_HOST=radiodemo.oma-radio.fr
|
|
||||||
COMPOSE_NAME=radiodemo-backoma-radiofr
|
COMPOSE_NAME=radiodemo-backoma-radiofr
|
||||||
DOCKER_INSTANCES_PREFIX=radiodemo-backoma-radiofr-
|
DOCKER_INSTANCES_PREFIX=radiodemo-backoma-radiofr-
|
||||||
DOCKER_INSTANCES_SUFIX=-1
|
DOCKER_INSTANCES_SUFIX=-1
|
||||||
|
@ -142,7 +142,7 @@ services:
|
|||||||
CONFIG_PATH: /config
|
CONFIG_PATH: /config
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
volumes:
|
volumes:
|
||||||
- /tmp/uwsgi/$RADIO_HOST:/tmp/uwsgi
|
- /tmp/uwsgi/$JC_SERVICE:/tmp/uwsgi
|
||||||
- /var/run/docker.sock:/var/run/docker.sock
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
- $SOUNDBASE_DIR:/soundbase
|
- $SOUNDBASE_DIR:/soundbase
|
||||||
networks:
|
networks:
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
server {
|
server {
|
||||||
listen 80;
|
listen 80;
|
||||||
listen [::]:80;
|
listen [::]:80;
|
||||||
server_name $RADIO_HOST;
|
server_name $JC_SERVICE;
|
||||||
|
|
||||||
root $SOUNDBASE_DIR/website;
|
root $SOUNDBASE_DIR/website;
|
||||||
index index.html;
|
index index.html;
|
||||||
@ -49,7 +49,7 @@ server {
|
|||||||
include uwsgi_params;
|
include uwsgi_params;
|
||||||
uwsgi_param PATH_INFO "/pigeindex$1";
|
uwsgi_param PATH_INFO "/pigeindex$1";
|
||||||
uwsgi_param SCRIPT_NAME /api;
|
uwsgi_param SCRIPT_NAME /api;
|
||||||
uwsgi_pass unix:/tmp/uwsgi/$RADIO_HOST/uwsgi-api.sock;
|
uwsgi_pass unix:/tmp/uwsgi/$JC_SERVICE/uwsgi-api.sock;
|
||||||
client_max_body_size 0;
|
client_max_body_size 0;
|
||||||
uwsgi_connect_timeout 6000;
|
uwsgi_connect_timeout 6000;
|
||||||
uwsgi_send_timeout 6000;
|
uwsgi_send_timeout 6000;
|
||||||
@ -70,7 +70,7 @@ server {
|
|||||||
include uwsgi_params;
|
include uwsgi_params;
|
||||||
uwsgi_param PATH_INFO "$1";
|
uwsgi_param PATH_INFO "$1";
|
||||||
uwsgi_param SCRIPT_NAME /api;
|
uwsgi_param SCRIPT_NAME /api;
|
||||||
uwsgi_pass unix:/tmp/uwsgi/$RADIO_HOST/uwsgi-api.sock;
|
uwsgi_pass unix:/tmp/uwsgi/$JC_SERVICE/uwsgi-api.sock;
|
||||||
client_max_body_size 0;
|
client_max_body_size 0;
|
||||||
proxy_connect_timeout 6000;
|
proxy_connect_timeout 6000;
|
||||||
proxy_send_timeout 60000;
|
proxy_send_timeout 60000;
|
||||||
|
@ -30,9 +30,4 @@ PostDown = iptables -t nat -D POSTROUTING -o $wgif -j MASQUERADE
|
|||||||
[Peer]
|
[Peer]
|
||||||
PublicKey = 1YIpMhZGrZRnZPlrTjtCfjvXXGk8j0Ug2AfcHEtN/hE=
|
PublicKey = 1YIpMhZGrZRnZPlrTjtCfjvXXGk8j0Ug2AfcHEtN/hE=
|
||||||
AllowedIPs = 10.29.0.1/32,$NET.0/24
|
AllowedIPs = 10.29.0.1/32,$NET.0/24
|
||||||
|
|
||||||
# test separation PA
|
|
||||||
[Peer]
|
|
||||||
PublicKey = todo
|
|
||||||
AllowedlIPs = 10.29.0.2
|
|
||||||
"
|
"
|
||||||
|
@ -1,34 +1,34 @@
|
|||||||
benevoles31.karnaval.fr max.jean-cloud.org
|
benevoles31.karnaval.fr max.jean-cloud.org
|
||||||
chahut.jean-cloud.net max.jean-cloud.org
|
chahut.jean-cloud.net max.jean-cloud.org
|
||||||
collectif-arthadie.fr vandamme.jean-cloud.org
|
collectif-arthadie.fr vandamme.jean-cloud.org
|
||||||
compagnienouvelle.fr max.jean-cloud.org
|
compagnienouvelle.fr nougaro.jean-cloud.org
|
||||||
copaines.jean-cloud.net max.jean-cloud.org
|
copaines.jean-cloud.net max.jean-cloud.org
|
||||||
cousinades2.jean-cloud.net max.jean-cloud.org
|
|
||||||
cousinades.jean-cloud.net max.jean-cloud.org
|
cousinades.jean-cloud.net max.jean-cloud.org
|
||||||
|
deployer.jean-cloud.org shlago.jean-cloud.org
|
||||||
etrevivant.net shlago.jean-cloud.org
|
etrevivant.net shlago.jean-cloud.org
|
||||||
feministesucl34.jean-cloud.net tetede.jean-cloud.org
|
feministesucl34.jean-cloud.net tetede.jean-cloud.org
|
||||||
feteducourt2020.jean-cloud.net tetede.jean-cloud.org
|
feteducourt2020.jean-cloud.net shlago.jean-cloud.org
|
||||||
feteducourt.jean-cloud.net tetede.jean-cloud.org
|
feteducourt.jean-cloud.net shlago.jean-cloud.org
|
||||||
|
git.jean-cloud.net vandamme.jean-cloud.org
|
||||||
grapes.chahut.jean-cloud.net max.jean-cloud.org
|
grapes.chahut.jean-cloud.net max.jean-cloud.org
|
||||||
gypsylyonfestival.com max.jean-cloud.org
|
gypsylyonfestival.com max.jean-cloud.org
|
||||||
metamorphosemagazine.fr shlago.jean-cloud.org
|
|
||||||
inurbe.fr max.jean-cloud.org
|
inurbe.fr max.jean-cloud.org
|
||||||
jean-cloud.net shlago.jean-cloud.org
|
jean-cloud.net shlago.jean-cloud.org
|
||||||
|
leida.fr vandamme.jean-cloud.org
|
||||||
|
letsencrypt.jean-cloud.org max.jean-cloud.org
|
||||||
lexicographe.jean-cloud.net shlago.jean-cloud.org
|
lexicographe.jean-cloud.net shlago.jean-cloud.org
|
||||||
|
metamorphosemagazine.fr shlago.jean-cloud.org
|
||||||
nc-backup.jean-cloud.net raku.jean-cloud.org
|
nc-backup.jean-cloud.net raku.jean-cloud.org
|
||||||
pa1.studios.oma-radio.fr tetede.jean-cloud.org
|
|
||||||
raplacgr.jean-cloud.net tetede.jean-cloud.org
|
|
||||||
velov.jean-cloud.net shlago.jean-cloud.org
|
|
||||||
radionimaitre.oma-radio.fr tetede.jean-cloud.org
|
|
||||||
paj.oma-radio.fr nougaro.jean-cloud.org
|
|
||||||
radiodemo.oma-radio.fr tetede.jean-cloud.org
|
|
||||||
radiodemo-back.oma-radio.fr montbonnot.jean-cloud.org
|
|
||||||
pa1.studios.oma-radio.fr tetede.joun-cloud.org
|
|
||||||
leida.fr shlago.jean-cloud.org
|
|
||||||
deployer.jean-cloud.org shlago.jean-cloud.org
|
|
||||||
ns1.jean-cloud.org raku.jean-cloud.org
|
ns1.jean-cloud.org raku.jean-cloud.org
|
||||||
git.jean-cloud.net vandamme.jean-cloud.org
|
ns.jean-cloud.org shlago.jean-cloud.org
|
||||||
nuage.jean-cloud.net vandamme.jean-cloud.org
|
nuage.jean-cloud.net vandamme.jean-cloud.org
|
||||||
|
pa1.studios.oma-radio.fr tetede.jean-cloud.org
|
||||||
|
paj.oma-radio.fr nougaro.jean-cloud.org
|
||||||
|
radiodemo-back.oma-radio.fr montbonnot.jean-cloud.org
|
||||||
|
radiodemo.oma-radio.fr tetede.jean-cloud.org
|
||||||
|
radionimaitre.oma-radio.fr tetede.jean-cloud.org
|
||||||
|
raplacgr.jean-cloud.net tetede.jean-cloud.org
|
||||||
rpnow.jean-cloud.net vandamme.jean-cloud.org
|
rpnow.jean-cloud.net vandamme.jean-cloud.org
|
||||||
|
sftp.jean-cloud.net max.jean-cloud.org
|
||||||
|
velov.jean-cloud.net shlago.jean-cloud.org
|
||||||
wiki-cgr.jean-cloud.net vandamme.jean-cloud.org
|
wiki-cgr.jean-cloud.net vandamme.jean-cloud.org
|
||||||
_ssh vandamme.jean-cloud.org
|
|
||||||
|
@ -3,7 +3,7 @@ services:
|
|||||||
app:
|
app:
|
||||||
image: php:7.2-fpm-alpine
|
image: php:7.2-fpm-alpine
|
||||||
volumes:
|
volumes:
|
||||||
- /data/velov.jean-cloud.net:/usr/src/app
|
- $HTTP_DIR:/usr/src/app
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
networks:
|
networks:
|
||||||
default:
|
default:
|
||||||
|
Loading…
Reference in New Issue
Block a user