Compare commits
106 Commits
ece04aa063
...
master
Author | SHA1 | Date | |
---|---|---|---|
98cc875611 | |||
618f22db6b | |||
290c6fe360 | |||
3b5d01d5df | |||
3a3c4f4d0c | |||
898d6a652d | |||
3bf952b57f | |||
70442f6464 | |||
33f793fcbe | |||
813e0e761f | |||
2e62e9782e | |||
fc4adc0fae | |||
74812fa79a | |||
3220d862a6 | |||
1936326535 | |||
a630e47bfe | |||
33fc237cb8 | |||
ed5ef23ed2 | |||
6f33808736 | |||
|
477a9155fe | ||
bce3b9eff5 | |||
d506f000a3 | |||
|
8906974a83 | ||
|
c12cafc277 | ||
|
f268f5f5f4 | ||
|
d8bc48ec3a | ||
3940c3801d | |||
00f9e3ee5f | |||
|
1bacfd307c | ||
|
8f6913565c | ||
|
62b34e4ac0 | ||
|
70c32de959 | ||
|
3eedd4293b | ||
|
a2f737eb46 | ||
|
82a3440d5a | ||
a3e86ac6ac | |||
556471d321 | |||
9d666afab5 | |||
5eb4ccb58e | |||
|
84849b71b1 | ||
|
316206140a | ||
|
7cc7df6ac1 | ||
|
0d1c13d125 | ||
|
cb9a449882 | ||
|
678388afaa | ||
016b47774b | |||
|
6db4d1a5a8 | ||
f54de7a26c | |||
|
75678ca093 | ||
|
554d7a5ddc | ||
62e75a42f2 | |||
|
4a6b575ce0 | ||
8d83a2716b | |||
|
4807624dbc | ||
|
b5aa7e9945 | ||
|
8d0caad3c7 | ||
|
87b007d4b9 | ||
7852e82e74 | |||
9b92276fc1 | |||
|
e39ce5518c | ||
|
ea6e48886d | ||
4187f4b772 | |||
|
b00916ceba | ||
|
f95b959bf2 | ||
|
609b5c1d62 | ||
|
a6a20e0dea | ||
|
821335e1ca | ||
|
e31c75d8b1 | ||
|
c041bac532 | ||
8eb33813d6 | |||
faf2e2bc8e | |||
adc0528c81 | |||
1259857474 | |||
db684d4ebd | |||
df657bb035 | |||
5d8634c8df | |||
c55e984918 | |||
4b95553be0 | |||
1f8520db90 | |||
9de98c4021 | |||
85b8048aa9 | |||
0bf808f0cf | |||
|
1609e7725f | ||
|
6bd95d1056 | ||
|
07f8ef8151 | ||
|
aad57eafae | ||
4370436c42 | |||
79c52c2067 | |||
|
d341122676 | ||
|
93a929d291 | ||
5d6e46bb37 | |||
545ed42968 | |||
53ba95b9d3 | |||
61f4629d1f | |||
b7bb45869a | |||
888c614bdd | |||
16683616c1 | |||
c613184594 | |||
aaf3d9343e | |||
|
e8fdead666 | ||
b28c04928b | |||
|
286b2fa144 | ||
|
6a7fd829e5 | ||
|
5f20548e21 | ||
b0dd373a00 | |||
6eec84f2ab |
@@ -85,6 +85,7 @@ done
|
|||||||
-e "s|__VIGILO_HOST__|${vigiloHost}|g"\
|
-e "s|__VIGILO_HOST__|${vigiloHost}|g"\
|
||||||
-e "s|__WEBMAIL_HOST__|${webmailHost}|g"\
|
-e "s|__WEBMAIL_HOST__|${webmailHost}|g"\
|
||||||
-e "s|__CASTOPOD_HOST__|${castopodHost}|g"\
|
-e "s|__CASTOPOD_HOST__|${castopodHost}|g"\
|
||||||
|
-e "s|__SPIP_HOST__|${spipHost}|g"\
|
||||||
-e "s|__IMAPSYNC_HOST__|${imapsyncHost}|g"\
|
-e "s|__IMAPSYNC_HOST__|${imapsyncHost}|g"\
|
||||||
-e "s|__YAKFORMS_HOST__|${yakformsHost}|g"\
|
-e "s|__YAKFORMS_HOST__|${yakformsHost}|g"\
|
||||||
-e "s|__WORDPRESS_HOST__|${wordpressHost}|g"\
|
-e "s|__WORDPRESS_HOST__|${wordpressHost}|g"\
|
||||||
|
24
bin/certbot-dns-alwaysdata.sh
Normal file
24
bin/certbot-dns-alwaysdata.sh
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
#/bin/bash
|
||||||
|
|
||||||
|
# certbot certonly --manual --preferred-challenges=dns --manual-auth-hook certbot-dns-alwaysdata.sh --manual-cleanup-hook certbot-dns-alwaysdata.sh -d "*.kaz.bzh" -d "kaz.bzh"
|
||||||
|
|
||||||
|
ALWAYSDATA_TOKEN="TOKEN"
|
||||||
|
ALWAYSDATA_ACCOUNT="ACCOUNT"
|
||||||
|
ALWAYSDATA_API="https://api.alwaysdata.com/v1/"
|
||||||
|
|
||||||
|
DOMAIN_ID=$(curl -s -X GET --basic --user "${ALWAYSDATA_TOKEN} account=${ALWAYSDATA_ACCOUNT}:" ${ALWAYSDATA_API}/domain/?name=${CERTBOT_DOMAIN} | jq '.[0].id')
|
||||||
|
|
||||||
|
add_record(){
|
||||||
|
RECORD_ID=$(curl -s -X POST -d "{\"domain\":\"${DOMAIN_ID}\", \"type\":\"TXT\", \"name\":\"_acme-challenge\", \"value\":\"${CERTBOT_VALIDATION}\"}" --basic --user "${ALWAYSDATA_TOKEN} account=${ALWAYSDATA_ACCOUNT}:" "${ALWAYSDATA_API}/record/")
|
||||||
|
}
|
||||||
|
|
||||||
|
del_record(){
|
||||||
|
RECORD_ID=$(curl -s -X GET --basic --user "${ALWAYSDATA_TOKEN} account=${ALWAYSDATA_ACCOUNT}:" "${ALWAYSDATA_API}/record/?name=_acme-challenge&type=TXT&domain=${DOMAIN_ID}" | jq ".[0].id")
|
||||||
|
curl -s -X DELETE --basic --user "${ALWAYSDATA_TOKEN} account=${ALWAYSDATA_ACCOUNT}:" "${ALWAYSDATA_API}/record/${RECORD_ID}/"
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ -z ${CERTBOT_AUTH_OUTPUT} ]; then
|
||||||
|
add_record
|
||||||
|
else
|
||||||
|
del_record
|
||||||
|
fi
|
@@ -8,6 +8,9 @@
|
|||||||
# Did : 13 fevrier 2025 modif des save en postgres et mysql
|
# Did : 13 fevrier 2025 modif des save en postgres et mysql
|
||||||
# Did : ajout des sauvegardes de mobilizon et mattermost en postgres
|
# Did : ajout des sauvegardes de mobilizon et mattermost en postgres
|
||||||
|
|
||||||
|
# 20/04/2025
|
||||||
|
# Did : Ajout des sauvegardes de peertube dans les services generaux
|
||||||
|
|
||||||
|
|
||||||
# En cas d'absence de postfix, il faut lancer :
|
# En cas d'absence de postfix, il faut lancer :
|
||||||
# docker network create postfix_mailNet
|
# docker network create postfix_mailNet
|
||||||
@@ -16,8 +19,7 @@
|
|||||||
# sauvegarde la base de données d'un compose
|
# sauvegarde la base de données d'un compose
|
||||||
# met à jours les paramètres de configuration du mandataire (proxy)
|
# met à jours les paramètres de configuration du mandataire (proxy)
|
||||||
|
|
||||||
#KAZ_ROOT=$(cd "$(dirname $0)/.."; pwd)
|
KAZ_ROOT=$(cd "$(dirname $0)/.."; pwd)
|
||||||
KAZ_ROOT=/kaz
|
|
||||||
. "${KAZ_ROOT}/bin/.commonFunctions.sh"
|
. "${KAZ_ROOT}/bin/.commonFunctions.sh"
|
||||||
setKazVars
|
setKazVars
|
||||||
|
|
||||||
@@ -221,6 +223,14 @@ saveComposes () {
|
|||||||
echo "save mobilizon"
|
echo "save mobilizon"
|
||||||
saveDB ${mobilizonDBName} "${mobilizon_POSTGRES_USER}" "${mobilizon_POSTGRES_PASSWORD}" "${mobilizon_POSTGRES_DB}" mobilizon postgres
|
saveDB ${mobilizonDBName} "${mobilizon_POSTGRES_USER}" "${mobilizon_POSTGRES_PASSWORD}" "${mobilizon_POSTGRES_DB}" mobilizon postgres
|
||||||
;;
|
;;
|
||||||
|
peertube)
|
||||||
|
echo "save peertube"
|
||||||
|
saveDB ${peertubeDBName} "${peertube_POSTGRES_USER}" "${peertube_POSTGRES_PASSWORD}" "${PEERTUBE_DB_HOSTNAME}" peertube postgres
|
||||||
|
;;
|
||||||
|
mastodon)
|
||||||
|
echo "save mastodon"
|
||||||
|
saveDB ${mastodonDBName} "${mastodon_POSTGRES_USER}" "${mastodon_POSTGRES_PASSWORD}" "${mastodon_POSTGRES_DB}" mastodon postgres
|
||||||
|
;;
|
||||||
roundcube)
|
roundcube)
|
||||||
echo "save roundcube"
|
echo "save roundcube"
|
||||||
saveDB ${roundcubeDBName} "${roundcube_MYSQL_USER}" "${roundcube_MYSQL_PASSWORD}" "${roundcube_MYSQL_DATABASE}" roundcube mysql
|
saveDB ${roundcubeDBName} "${roundcube_MYSQL_USER}" "${roundcube_MYSQL_PASSWORD}" "${roundcube_MYSQL_DATABASE}" roundcube mysql
|
||||||
|
@@ -41,8 +41,6 @@ cd "${KAZ_ROOT}"
|
|||||||
|
|
||||||
# DOCK_DIR="${KAZ_COMP_DIR}" # ???
|
# DOCK_DIR="${KAZ_COMP_DIR}" # ???
|
||||||
|
|
||||||
SETUP_MAIL="docker exec -ti mailServ setup"
|
|
||||||
|
|
||||||
# on détermine le script appelant, le fichier log et le fichier source, tous issus de la même racine
|
# on détermine le script appelant, le fichier log et le fichier source, tous issus de la même racine
|
||||||
PRG=$(basename $0)
|
PRG=$(basename $0)
|
||||||
RACINE=${PRG%.sh}
|
RACINE=${PRG%.sh}
|
||||||
@@ -210,15 +208,6 @@ done
|
|||||||
echo "numero,nom,quota_disque,action_auto" > "${TEMP_PAHEKO}"
|
echo "numero,nom,quota_disque,action_auto" > "${TEMP_PAHEKO}"
|
||||||
echo "curl \"https://${paheko_API_USER}:${paheko_API_PASSWORD}@kaz-paheko.kaz.bzh/api/user/import\" -T \"${TEMP_PAHEKO}\"" >> "${CMD_PAHEKO}"
|
echo "curl \"https://${paheko_API_USER}:${paheko_API_PASSWORD}@kaz-paheko.kaz.bzh/api/user/import\" -T \"${TEMP_PAHEKO}\"" >> "${CMD_PAHEKO}"
|
||||||
|
|
||||||
#echo "récupération des login postfix... "
|
|
||||||
## on stocke les emails et les alias KAZ déjà créés
|
|
||||||
#(
|
|
||||||
# ${SETUP_MAIL} email list
|
|
||||||
# ${SETUP_MAIL} alias list
|
|
||||||
#) | cut -d ' ' -f 2 | grep @ | sort > "${TFILE_EMAIL}"
|
|
||||||
# did on supprime le ^M en fin de fichier pour pas faire planter les grep
|
|
||||||
#dos2unix "${TFILE_EMAIL}"
|
|
||||||
|
|
||||||
echo "on récupère tous les emails (secours/alias/kaz) sur le ldap"
|
echo "on récupère tous les emails (secours/alias/kaz) sur le ldap"
|
||||||
FILE_LDIF=/home/sauve/ldap.ldif
|
FILE_LDIF=/home/sauve/ldap.ldif
|
||||||
/kaz/bin/ldap/ldap_sauve.sh
|
/kaz/bin/ldap/ldap_sauve.sh
|
||||||
@@ -226,13 +215,13 @@ gunzip ${FILE_LDIF}.gz -f
|
|||||||
grep -aEiorh '([[:alnum:]]+([._-][[:alnum:]]+)*@[[:alnum:]]+([._-][[:alnum:]]+)*\.[[:alpha:]]{2,6})' ${FILE_LDIF} | sort -u > ${TFILE_EMAIL}
|
grep -aEiorh '([[:alnum:]]+([._-][[:alnum:]]+)*@[[:alnum:]]+([._-][[:alnum:]]+)*\.[[:alpha:]]{2,6})' ${FILE_LDIF} | sort -u > ${TFILE_EMAIL}
|
||||||
|
|
||||||
echo "récupération des login mattermost... "
|
echo "récupération des login mattermost... "
|
||||||
docker exec -ti mattermostServ bin/mmctl user list --all | grep ":.*(" | cut -d ':' -f 2 | cut -d ' ' -f 2 | sort > "${TFILE_MM}"
|
docker exec -i mattermostServ bin/mmctl user list --all | grep ":.*(" | cut -d ':' -f 2 | cut -d ' ' -f 2 | sort > "${TFILE_MM}"
|
||||||
|
|
||||||
dos2unix "${TFILE_MM}"
|
dos2unix "${TFILE_MM}"
|
||||||
echo "done"
|
echo "done"
|
||||||
|
|
||||||
# se connecter à l'agora pour ensuite pouvoir passer toutes les commandes mmctl
|
# se connecter à l'agora pour ensuite pouvoir passer toutes les commandes mmctl
|
||||||
echo "docker exec -ti mattermostServ bin/mmctl auth login ${httpProto}://${URL_AGORA} --name local-server --username ${mattermost_user} --password ${mattermost_pass}" | tee -a "${CMD_INIT}"
|
echo "docker exec -i mattermostServ bin/mmctl auth login ${httpProto}://${URL_AGORA} --name local-server --username ${mattermost_user} --password ${mattermost_pass}" | tee -a "${CMD_INIT}"
|
||||||
|
|
||||||
# vérif des emails
|
# vérif des emails
|
||||||
regex="^(([A-Za-z0-9]+((\.|\-|\_|\+)?[A-Za-z0-9]?)*[A-Za-z0-9]+)|[A-Za-z0-9]+)@(([A-Za-z0-9]+)+((\.|\-|\_)?([A-Za-z0-9]+)+)*)+\.([A-Za-z]{2,})+$"
|
regex="^(([A-Za-z0-9]+((\.|\-|\_|\+)?[A-Za-z0-9]?)*[A-Za-z0-9]+)|[A-Za-z0-9]+)@(([A-Za-z0-9]+)+((\.|\-|\_)?([A-Za-z0-9]+)+)*)+\.([A-Za-z]{2,})+$"
|
||||||
@@ -379,8 +368,6 @@ while read ligne; do
|
|||||||
else
|
else
|
||||||
SEND_MSG_CREATE=true
|
SEND_MSG_CREATE=true
|
||||||
echo "${EMAIL_SOUHAITE} n'existe pas" | tee -a "${LOG}"
|
echo "${EMAIL_SOUHAITE} n'existe pas" | tee -a "${LOG}"
|
||||||
echo "${SETUP_MAIL} email add ${EMAIL_SOUHAITE} ${PASSWORD}" | tee -a "${CMD_LOGIN}"
|
|
||||||
echo "${SETUP_MAIL} quota set ${EMAIL_SOUHAITE} ${QUOTA}G" | tee -a "${CMD_LOGIN}"
|
|
||||||
# LDAP, à tester
|
# LDAP, à tester
|
||||||
user=$(echo ${EMAIL_SOUHAITE} | awk -F '@' '{print $1}')
|
user=$(echo ${EMAIL_SOUHAITE} | awk -F '@' '{print $1}')
|
||||||
domain=$(echo ${EMAIL_SOUHAITE} | awk -F '@' '{print $2}')
|
domain=$(echo ${EMAIL_SOUHAITE} | awk -F '@' '{print $2}')
|
||||||
@@ -597,11 +584,11 @@ userPassword: {CRYPT}${pass}\n\n' | ldapmodify -c -H ldap://${LDAP_IP} -D \"cn=$
|
|||||||
echo "${IDENT_KAZ} existe déjà sur mattermost" | tee -a "${LOG}"
|
echo "${IDENT_KAZ} existe déjà sur mattermost" | tee -a "${LOG}"
|
||||||
else
|
else
|
||||||
# on créé le compte mattermost
|
# on créé le compte mattermost
|
||||||
echo "docker exec -ti mattermostServ bin/mmctl user create --email ${EMAIL_SOUHAITE} --username ${IDENT_KAZ} --password ${PASSWORD}" | tee -a "${CMD_LOGIN}"
|
echo "docker exec -i mattermostServ bin/mmctl user create --email ${EMAIL_SOUHAITE} --username ${IDENT_KAZ} --password ${PASSWORD}" | tee -a "${CMD_LOGIN}"
|
||||||
# et enfin on ajoute toujours le user à l'équipe KAZ et aux 2 channels publiques
|
# et enfin on ajoute toujours le user à l'équipe KAZ et aux 2 channels publiques
|
||||||
echo "docker exec -ti mattermostServ bin/mmctl team users add kaz ${EMAIL_SOUHAITE}" | tee -a "${CMD_LOGIN}"
|
echo "docker exec -i mattermostServ bin/mmctl team users add kaz ${EMAIL_SOUHAITE}" | tee -a "${CMD_LOGIN}"
|
||||||
echo "docker exec -ti mattermostServ bin/mmctl channel users add kaz:une-question--un-soucis ${EMAIL_SOUHAITE}" | tee -a "${CMD_LOGIN}"
|
echo "docker exec -i mattermostServ bin/mmctl channel users add kaz:une-question--un-soucis ${EMAIL_SOUHAITE}" | tee -a "${CMD_LOGIN}"
|
||||||
echo "docker exec -ti mattermostServ bin/mmctl channel users add kaz:cafe-du-commerce--ouvert-2424h ${EMAIL_SOUHAITE}" | tee -a "${CMD_LOGIN}"
|
echo "docker exec -i mattermostServ bin/mmctl channel users add kaz:cafe-du-commerce--ouvert-2424h ${EMAIL_SOUHAITE}" | tee -a "${CMD_LOGIN}"
|
||||||
NB_SERVICES_BASE=$((NB_SERVICES_BASE+1))
|
NB_SERVICES_BASE=$((NB_SERVICES_BASE+1))
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -609,10 +596,10 @@ userPassword: {CRYPT}${pass}\n\n' | ldapmodify -c -H ldap://${LDAP_IP} -D \"cn=$
|
|||||||
# l'équipe existe t-elle déjà ?
|
# l'équipe existe t-elle déjà ?
|
||||||
nb=$(docker exec mattermostServ bin/mmctl team list | grep -w "${EQUIPE_AGORA}" | wc -l)
|
nb=$(docker exec mattermostServ bin/mmctl team list | grep -w "${EQUIPE_AGORA}" | wc -l)
|
||||||
if [ "${nb}" == "0" ];then # non, on la créé en mettant le user en admin de l'équipe
|
if [ "${nb}" == "0" ];then # non, on la créé en mettant le user en admin de l'équipe
|
||||||
echo "docker exec -ti mattermostServ bin/mmctl team create --name ${EQUIPE_AGORA} --display_name ${EQUIPE_AGORA} --email ${EMAIL_SOUHAITE}" --private | tee -a "${CMD_INIT}"
|
echo "docker exec -i mattermostServ bin/mmctl team create --name ${EQUIPE_AGORA} --display_name ${EQUIPE_AGORA} --email ${EMAIL_SOUHAITE}" --private | tee -a "${CMD_INIT}"
|
||||||
fi
|
fi
|
||||||
# puis ajouter le user à l'équipe
|
# puis ajouter le user à l'équipe
|
||||||
echo "docker exec -ti mattermostServ bin/mmctl team users add ${EQUIPE_AGORA} ${EMAIL_SOUHAITE}" | tee -a "${CMD_INIT}"
|
echo "docker exec -i mattermostServ bin/mmctl team users add ${EQUIPE_AGORA} ${EMAIL_SOUHAITE}" | tee -a "${CMD_INIT}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -n "${CREATE_ORGA_SERVICES}" ]; then
|
if [ -n "${CREATE_ORGA_SERVICES}" ]; then
|
||||||
@@ -629,16 +616,16 @@ userPassword: {CRYPT}${pass}\n\n' | ldapmodify -c -H ldap://${LDAP_IP} -D \"cn=$
|
|||||||
# TODO : utiliser liste sur dev également
|
# TODO : utiliser liste sur dev également
|
||||||
|
|
||||||
# on inscrit le user sur sympa, à la liste infos@${domain_sympa}
|
# on inscrit le user sur sympa, à la liste infos@${domain_sympa}
|
||||||
# docker exec -ti sympaServ /usr/lib/sympa/bin/sympa_soap_client.pl --soap_url=https://listes.kaz.sns/sympasoap --trusted_application=SOAP_USER --trusted_application_password=SOAP_PASSWORD --proxy_vars="USER_EMAIL=contact1@kaz.sns" --service=which
|
# docker exec -i sympaServ /usr/lib/sympa/bin/sympa_soap_client.pl --soap_url=https://listes.kaz.sns/sympasoap --trusted_application=SOAP_USER --trusted_application_password=SOAP_PASSWORD --proxy_vars="USER_EMAIL=contact1@kaz.sns" --service=which
|
||||||
if [[ "${mode}" = "dev" ]]; then
|
if [[ "${mode}" = "dev" ]]; then
|
||||||
echo "# DEV, on teste l'inscription à sympa"| tee -a "${CMD_SYMPA}"
|
echo "# DEV, on teste l'inscription à sympa"| tee -a "${CMD_SYMPA}"
|
||||||
LISTMASTER=$(echo ${sympa_LISTMASTERS} | cut -d',' -f1)
|
LISTMASTER=$(echo ${sympa_LISTMASTERS} | cut -d',' -f1)
|
||||||
echo "docker exec -ti sympaServ /usr/lib/sympa/bin/sympa_soap_client.pl --soap_url=${httpProto}://${URL_LISTE}/sympasoap --trusted_application=${sympa_SOAP_USER} --trusted_application_password=${sympa_SOAP_PASSWORD} --proxy_vars=\"USER_EMAIL=${LISTMASTER}\" --service=add --service_parameters=\"${NL_LIST},${EMAIL_SOUHAITE}\"" | tee -a "${CMD_SYMPA}"
|
echo "docker exec -i sympaServ /usr/lib/sympa/bin/sympa_soap_client.pl --soap_url=${httpProto}://${URL_LISTE}/sympasoap --trusted_application=${sympa_SOAP_USER} --trusted_application_password=${sympa_SOAP_PASSWORD} --proxy_vars=\"USER_EMAIL=${LISTMASTER}\" --service=add --service_parameters=\"${NL_LIST},${EMAIL_SOUHAITE}\"" | tee -a "${CMD_SYMPA}"
|
||||||
else
|
else
|
||||||
echo "# PROD, on inscrit à sympa"| tee -a "${CMD_SYMPA}"
|
echo "# PROD, on inscrit à sympa"| tee -a "${CMD_SYMPA}"
|
||||||
LISTMASTER=$(echo ${sympa_LISTMASTERS} | cut -d',' -f1)
|
LISTMASTER=$(echo ${sympa_LISTMASTERS} | cut -d',' -f1)
|
||||||
echo "docker exec -ti sympaServ /usr/lib/sympa/bin/sympa_soap_client.pl --soap_url=${httpProto}://${URL_LISTE}/sympasoap --trusted_application=${sympa_SOAP_USER} --trusted_application_password=${sympa_SOAP_PASSWORD} --proxy_vars=\"USER_EMAIL=${LISTMASTER}\" --service=add --service_parameters=\"${NL_LIST},${EMAIL_SOUHAITE}\"" | tee -a "${CMD_SYMPA}"
|
echo "docker exec -i sympaServ /usr/lib/sympa/bin/sympa_soap_client.pl --soap_url=${httpProto}://${URL_LISTE}/sympasoap --trusted_application=${sympa_SOAP_USER} --trusted_application_password=${sympa_SOAP_PASSWORD} --proxy_vars=\"USER_EMAIL=${LISTMASTER}\" --service=add --service_parameters=\"${NL_LIST},${EMAIL_SOUHAITE}\"" | tee -a "${CMD_SYMPA}"
|
||||||
echo "docker exec -ti sympaServ /usr/lib/sympa/bin/sympa_soap_client.pl --soap_url=${httpProto}://${URL_LISTE}/sympasoap --trusted_application=${sympa_SOAP_USER} --trusted_application_password=${sympa_SOAP_PASSWORD} --proxy_vars=\"USER_EMAIL=${LISTMASTER}\" --service=add --service_parameters=\"${NL_LIST},${EMAIL_SECOURS}\"" | tee -a "${CMD_SYMPA}"
|
echo "docker exec -i sympaServ /usr/lib/sympa/bin/sympa_soap_client.pl --soap_url=${httpProto}://${URL_LISTE}/sympasoap --trusted_application=${sympa_SOAP_USER} --trusted_application_password=${sympa_SOAP_PASSWORD} --proxy_vars=\"USER_EMAIL=${LISTMASTER}\" --service=add --service_parameters=\"${NL_LIST},${EMAIL_SECOURS}\"" | tee -a "${CMD_SYMPA}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "${service[ADMIN_ORGA]}" == "O" ]; then
|
if [ "${service[ADMIN_ORGA]}" == "O" ]; then
|
||||||
@@ -760,7 +747,7 @@ ${MAIL_KAZ}
|
|||||||
EOF" | tee -a "${CMD_MSG}"
|
EOF" | tee -a "${CMD_MSG}"
|
||||||
|
|
||||||
echo " # on envoie la confirmation d'inscription sur l'agora " | tee -a "${CMD_MSG}"
|
echo " # on envoie la confirmation d'inscription sur l'agora " | tee -a "${CMD_MSG}"
|
||||||
echo "docker exec -ti mattermostServ bin/mmctl post create kaz:Creation-Comptes --message \"${MAIL_KAZ}\"" | tee -a "${CMD_MSG}"
|
echo "docker exec -i mattermostServ bin/mmctl post create kaz:Creation-Comptes --message \"${MAIL_KAZ}\"" | tee -a "${CMD_MSG}"
|
||||||
|
|
||||||
# fin des inscriptions
|
# fin des inscriptions
|
||||||
done <<< "${ALL_LINES}"
|
done <<< "${ALL_LINES}"
|
||||||
|
128
bin/dns.sh
128
bin/dns.sh
@@ -1,6 +1,11 @@
|
|||||||
#!/bin/bash
|
#/bin/bash
|
||||||
|
|
||||||
# list/ajout/supprime/ un sous-domaine
|
#koi: gestion des records dns sur AlwaysData
|
||||||
|
#ki: fanch&gaël&fab
|
||||||
|
#kan: 06/04/2025
|
||||||
|
|
||||||
|
#doc: https://api.alwaysdata.com/v1/record/doc/
|
||||||
|
#doc: https://help.alwaysdata.com/fr/api/
|
||||||
|
|
||||||
KAZ_ROOT=$(cd "$(dirname $0)"/..; pwd)
|
KAZ_ROOT=$(cd "$(dirname $0)"/..; pwd)
|
||||||
. "${KAZ_ROOT}/bin/.commonFunctions.sh"
|
. "${KAZ_ROOT}/bin/.commonFunctions.sh"
|
||||||
@@ -15,6 +20,7 @@ export ETC_HOSTS="/etc/hosts"
|
|||||||
# no more export in .env
|
# no more export in .env
|
||||||
export $(set | grep "domain=")
|
export $(set | grep "domain=")
|
||||||
|
|
||||||
|
#TODO: récupérer la liste des services kaz au lieu des les écrire en dur
|
||||||
declare -a forbidenName
|
declare -a forbidenName
|
||||||
forbidenName=(${calcHost} calc ${cloudHost} bureau ${dateHost} date ${dokuwikiHost} dokuwiki ${fileHost} file ${ldapHost} ${pahekoHost} ${gitHost} ${gravHost} ${matterHost} ${officeHost} collabora ${padHost} ${sympaHost} listes ${webmailHost} ${wordpressHost} www ${vigiloHost} form)
|
forbidenName=(${calcHost} calc ${cloudHost} bureau ${dateHost} date ${dokuwikiHost} dokuwiki ${fileHost} file ${ldapHost} ${pahekoHost} ${gitHost} ${gravHost} ${matterHost} ${officeHost} collabora ${padHost} ${sympaHost} listes ${webmailHost} ${wordpressHost} www ${vigiloHost} form)
|
||||||
|
|
||||||
@@ -31,6 +37,15 @@ usage(){
|
|||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
. "${KAZ_KEY_DIR}/env-alwaysdata"
|
||||||
|
|
||||||
|
if [[ -z "${ALWAYSDATA_TOKEN}" ]] ; then
|
||||||
|
echo "no ALWAYSDATA_TOKEN set in ${KAZ_KEY_DIR}/env-alwaysdata"
|
||||||
|
usage
|
||||||
|
fi
|
||||||
|
|
||||||
|
DOMAIN_ID=$(curl -s -X GET --basic --user "${ALWAYSDATA_TOKEN} account=${ALWAYSDATA_ACCOUNT}:" ${ALWAYSDATA_API}/domain/?name=${domain} | jq '.[0].id')
|
||||||
|
|
||||||
for ARG in $@
|
for ARG in $@
|
||||||
do
|
do
|
||||||
case "${ARG}" in
|
case "${ARG}" in
|
||||||
@@ -60,78 +75,15 @@ if [ -z "${CMD}" ]; then
|
|||||||
usage
|
usage
|
||||||
fi
|
fi
|
||||||
|
|
||||||
. "${KAZ_KEY_DIR}/env-gandi"
|
|
||||||
|
|
||||||
if [[ -z "${GANDI_KEY}" ]] ; then
|
|
||||||
echo
|
|
||||||
echo "no GANDI_KEY set in ${KAZ_KEY_DIR}/env-gandi"
|
|
||||||
usage
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
waitNet () {
|
|
||||||
if [[ "${domain}" = "kaz.local" ]]; then
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
### wait when error code 503
|
|
||||||
if [[ $(curl -H "authorization: Apikey ${GANDI_KEY}" --connect-timeout 2 -s -D - "${GANDI_API}" -o /dev/null 2>/dev/null | head -n1) != *200* ]]; then
|
|
||||||
echo "DNS not available. Please wait..."
|
|
||||||
while [[ $(curl -H "authorization: Apikey ${GANDI_KEY}" --connect-timeout 2 -s -D - "${GANDI_API}" -o /dev/null 2>/dev/null | head -n1) != *200* ]]
|
|
||||||
do
|
|
||||||
sleep 5
|
|
||||||
done
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
list(){
|
list(){
|
||||||
if [[ "${domain}" = "kaz.local" ]]; then
|
TARGET=$@
|
||||||
grep --perl-regex "^${IP}\s.*${domain}" "${ETC_HOSTS}" 2> /dev/null | sed -e "s|^${IP}\s*\([0-9a-z.-]${domain}\)$|\1|g"
|
LISTE=$(curl -s -X GET --basic --user "${ALWAYSDATA_TOKEN} account=${ALWAYSDATA_ACCOUNT}:" "${ALWAYSDATA_API}/record/?domain=${DOMAIN_ID}&type=CNAME&name=${TARGET}" | jq '.[] | "\(.name):\(.value)"')
|
||||||
return
|
echo ${LISTE}
|
||||||
fi
|
|
||||||
waitNet
|
|
||||||
trap 'rm -f "${TMPFILE}"' EXIT
|
|
||||||
TMPFILE="$(mktemp)" || exit 1
|
|
||||||
if [[ -n "${SIMU}" ]] ; then
|
|
||||||
${SIMU} curl -X GET "${GANDI_API}/records" -H "authorization: Apikey ${GANDI_KEY}"
|
|
||||||
else
|
|
||||||
curl -X GET "${GANDI_API}/records" -H "authorization: Apikey ${GANDI_KEY}" 2>/dev/null | \
|
|
||||||
sed "s/,{/\n/g" | \
|
|
||||||
sed 's/.*rrset_name":"\([^"]*\)".*rrset_values":\["\([^"]*\)".*/\1:\2/g'| \
|
|
||||||
grep -v '^[_@]'| \
|
|
||||||
grep -e ":${domain}\.*$" -e ":prod[0-9]*$" > ${TMPFILE}
|
|
||||||
fi
|
|
||||||
if [ $# -lt 1 ]; then
|
|
||||||
cat ${TMPFILE}
|
|
||||||
else
|
|
||||||
for ARG in $@
|
|
||||||
do
|
|
||||||
cat ${TMPFILE} | grep "${ARG}.*:"
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
|
|
||||||
saveDns () {
|
saveDns () {
|
||||||
for ARG in $@ ; do
|
mkdir -p /root/dns
|
||||||
if [[ "${ARG}" =~ .local$ ]] ; then
|
${SIMU} curl -s -X GET --basic --user "${ALWAYSDATA_TOKEN} account=${ALWAYSDATA_ACCOUNT}:" "${ALWAYSDATA_API}/record/?domain=${DOMAIN_ID}" -o /root/dns/dns_save_$(date +'%Y%m%d%H%M%S')
|
||||||
echo "${PRG}: old fasion style (remove .local at the end)"
|
|
||||||
usage;
|
|
||||||
fi
|
|
||||||
if [[ "${ARG}" =~ .bzh$ ]] ; then
|
|
||||||
echo "${PRG}: old fasion style (remove .bzh at the end)"
|
|
||||||
usage;
|
|
||||||
fi
|
|
||||||
if [[ "${ARG}" =~ .dev$ ]] ; then
|
|
||||||
echo "${PRG}: old fasion style (remove .dev at the end)"
|
|
||||||
usage;
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
if [[ "${domain}" = "kaz.local" ]]; then
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
waitNet
|
|
||||||
${SIMU} curl -X POST "${GANDI_API}/snapshots" -H "authorization: Apikey ${GANDI_KEY}" 2>/dev/null
|
|
||||||
}
|
}
|
||||||
|
|
||||||
badName(){
|
badName(){
|
||||||
@@ -154,28 +106,14 @@ add(){
|
|||||||
echo "can't manage '${ARG}'. Use -f option"
|
echo "can't manage '${ARG}'. Use -f option"
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
case "${domain}" in
|
${SIMU} curl -s -X POST -d "{\"domain\":\"${DOMAIN_ID}\", \"type\":\"CNAME\", \"name\":\"${ARG}\", \"value\":\"${site}.${domain}\"}" --basic --user "${ALWAYSDATA_TOKEN} account=${ALWAYSDATA_ACCOUNT}:" "${ALWAYSDATA_API}/record/"
|
||||||
kaz.local )
|
|
||||||
if grep -q --perl-regex "^${IP}.*[ \t]${ARG}.${domain}" "${ETC_HOSTS}" 2> /dev/null ; then
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
if grep -q --perl-regex "^${IP}[ \t]" "${ETC_HOSTS}" 2> /dev/null ; then
|
|
||||||
${SIMU} sudo sed -i -e "0,/^${IP}[ \t]/s/^\(${IP}[ \t]\)/\1${ARG}.${domain} /g" "${ETC_HOSTS}"
|
|
||||||
else
|
|
||||||
${SIMU} sudo sed -i -e "$ a ${IP}\t${ARG}.${domain}" "${ETC_HOSTS}" 2> /dev/null
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
${SIMU} curl -X POST "${GANDI_API}/records" -H "authorization: Apikey ${GANDI_KEY}" -H 'content-type: application/json' -d '{"rrset_type":"CNAME", "rrset_name":"'${ARG}'", "rrset_values":["'${site}'"]}'
|
|
||||||
echo
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
ADDED+=("${ARG}")
|
ADDED+=("${ARG}")
|
||||||
done
|
done
|
||||||
echo "Domains added to ${domain}: ${ADDED[@]}"
|
echo "Domains added to ${domain}: ${ADDED[@]}"
|
||||||
}
|
}
|
||||||
|
|
||||||
del(){
|
del(){
|
||||||
|
|
||||||
if [ $# -lt 1 ]; then
|
if [ $# -lt 1 ]; then
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
@@ -187,23 +125,11 @@ del(){
|
|||||||
echo "can't manage '${ARG}'. Use -f option"
|
echo "can't manage '${ARG}'. Use -f option"
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
case "${domain}" in
|
RECORD_ID=$(curl -s -X GET --basic --user "${ALWAYSDATA_TOKEN} account=${ALWAYSDATA_ACCOUNT}:" "${ALWAYSDATA_API}/record/?name=${ARG}&type=CNAME&domain=${DOMAIN_ID}" | jq ".[] | select(.name==\"${ARG}\").id")
|
||||||
kaz.local )
|
${SIMU} curl -s -X DELETE --basic --user "${ALWAYSDATA_TOKEN} account=${ALWAYSDATA_ACCOUNT}:" "${ALWAYSDATA_API}/record/${RECORD_ID}/"
|
||||||
if !grep -q --perl-regex "^${IP}.*[ \t]${ARG}.${domain}" "${ETC_HOSTS}" 2> /dev/null ; then
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
${SIMU} sudo sed -i -e "/^${IP}[ \t]*${ARG}.${domain}[ \t]*$/d" \
|
|
||||||
-e "s|^\(${IP}.*\)[ \t]${ARG}.${domain}|\1|g" "${ETC_HOSTS}"
|
|
||||||
;;
|
|
||||||
* )
|
|
||||||
${SIMU} curl -X DELETE "${GANDI_API}/records/${ARG}" -H "authorization: Apikey ${GANDI_KEY}"
|
|
||||||
echo
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
REMOVED+=("${ARG}")
|
REMOVED+=("${ARG}")
|
||||||
done
|
done
|
||||||
echo "Domains removed from ${domain}: ${REMOVED[@]}"
|
echo "Domains removed from ${domain}: ${REMOVED[@]}"
|
||||||
}
|
}
|
||||||
|
|
||||||
#echo "CMD: ${CMD} $*"
|
|
||||||
${CMD} $*
|
${CMD} $*
|
||||||
|
135
bin/dns_alwaysdata.sh
Executable file
135
bin/dns_alwaysdata.sh
Executable file
@@ -0,0 +1,135 @@
|
|||||||
|
#/bin/bash
|
||||||
|
|
||||||
|
#koi: gestion des records dns sur AlwaysData
|
||||||
|
#ki: fanch&gaël&fab
|
||||||
|
#kan: 06/04/2025
|
||||||
|
|
||||||
|
#doc: https://api.alwaysdata.com/v1/record/doc/
|
||||||
|
#doc: https://help.alwaysdata.com/fr/api/
|
||||||
|
|
||||||
|
KAZ_ROOT=$(cd "$(dirname $0)"/..; pwd)
|
||||||
|
. "${KAZ_ROOT}/bin/.commonFunctions.sh"
|
||||||
|
setKazVars
|
||||||
|
. "${DOCKERS_ENV}"
|
||||||
|
|
||||||
|
cd "${KAZ_ROOT}"
|
||||||
|
export PRG="$0"
|
||||||
|
export IP="127.0.0.1"
|
||||||
|
export ETC_HOSTS="/etc/hosts"
|
||||||
|
|
||||||
|
# no more export in .env
|
||||||
|
export $(set | grep "domain=")
|
||||||
|
|
||||||
|
#TODO: récupérer la liste des services kaz au lieu des les écrire en dur
|
||||||
|
declare -a forbidenName
|
||||||
|
forbidenName=(${calcHost} calc ${cloudHost} bureau ${dateHost} date ${dokuwikiHost} dokuwiki ${fileHost} file ${ldapHost} ${pahekoHost} ${gitHost} ${gravHost} ${matterHost} ${officeHost} collabora ${padHost} ${sympaHost} listes ${webmailHost} ${wordpressHost} www ${vigiloHost} form)
|
||||||
|
|
||||||
|
export FORCE="NO"
|
||||||
|
export CMD=""
|
||||||
|
export SIMU=""
|
||||||
|
|
||||||
|
usage(){
|
||||||
|
echo "Usage: ${PRG} list [sub-domain...]"
|
||||||
|
echo " ${PRG} [-n] [-f] {add/del} sub-domain..."
|
||||||
|
echo " -h help"
|
||||||
|
echo " -n simulation"
|
||||||
|
echo " -f force protected domain"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
. "${KAZ_KEY_DIR}/env-alwaysdata"
|
||||||
|
|
||||||
|
if [[ -z "${ALWAYSDATA_TOKEN}" ]] ; then
|
||||||
|
echo "no ALWAYSDATA_TOKEN set in ${KAZ_KEY_DIR}/env-alwaysdata"
|
||||||
|
usage
|
||||||
|
fi
|
||||||
|
|
||||||
|
DOMAIN_ID=$(curl -s -X GET --basic --user "${ALWAYSDATA_TOKEN} account=${ALWAYSDATA_ACCOUNT}:" ${ALWAYSDATA_API}/domain/?name=${domain} | jq '.[0].id')
|
||||||
|
|
||||||
|
for ARG in $@
|
||||||
|
do
|
||||||
|
case "${ARG}" in
|
||||||
|
'-h' | '-help' )
|
||||||
|
usage
|
||||||
|
;;
|
||||||
|
'-f' )
|
||||||
|
shift
|
||||||
|
export FORCE="YES"
|
||||||
|
;;
|
||||||
|
'-n' )
|
||||||
|
shift
|
||||||
|
export SIMU="echo"
|
||||||
|
;;
|
||||||
|
'list'|'add'|'del' )
|
||||||
|
shift
|
||||||
|
CMD="${ARG}"
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
* )
|
||||||
|
usage
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ -z "${CMD}" ]; then
|
||||||
|
usage
|
||||||
|
fi
|
||||||
|
|
||||||
|
list(){
|
||||||
|
TARGET=$@
|
||||||
|
LISTE=$(curl -s -X GET --basic --user "${ALWAYSDATA_TOKEN} account=${ALWAYSDATA_ACCOUNT}:" "${ALWAYSDATA_API}/record/?domain=${DOMAIN_ID}&type=CNAME&name=${TARGET}" | jq '.[] | "\(.name):\(.value)"')
|
||||||
|
echo ${LISTE}
|
||||||
|
}
|
||||||
|
|
||||||
|
saveDns () {
|
||||||
|
mkdir -p /root/dns
|
||||||
|
${SIMU} curl -s -X GET --basic --user "${ALWAYSDATA_TOKEN} account=${ALWAYSDATA_ACCOUNT}:" "${ALWAYSDATA_API}/record/?domain=${DOMAIN_ID}" -o /root/dns/dns_save_$(date +'%Y%m%d%H%M%S')
|
||||||
|
}
|
||||||
|
|
||||||
|
badName(){
|
||||||
|
[[ -z "$1" ]] && return 0;
|
||||||
|
for item in "${forbidenName[@]}"; do
|
||||||
|
[[ "${item}" == "$1" ]] && [[ "${FORCE}" == "NO" ]] && return 0
|
||||||
|
done
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
add(){
|
||||||
|
if [ $# -lt 1 ]; then
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
saveDns $@
|
||||||
|
declare -a ADDED
|
||||||
|
for ARG in $@
|
||||||
|
do
|
||||||
|
if badName "${ARG}" ; then
|
||||||
|
echo "can't manage '${ARG}'. Use -f option"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
${SIMU} curl -s -X POST -d "{\"domain\":\"${DOMAIN_ID}\", \"type\":\"CNAME\", \"name\":\"${ARG}\", \"value\":\"${site}.${domain}\"}" --basic --user "${ALWAYSDATA_TOKEN} account=${ALWAYSDATA_ACCOUNT}:" "${ALWAYSDATA_API}/record/"
|
||||||
|
ADDED+=("${ARG}")
|
||||||
|
done
|
||||||
|
echo "Domains added to ${domain}: ${ADDED[@]}"
|
||||||
|
}
|
||||||
|
|
||||||
|
del(){
|
||||||
|
|
||||||
|
if [ $# -lt 1 ]; then
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
saveDns $@
|
||||||
|
declare -a REMOVED
|
||||||
|
for ARG in $@
|
||||||
|
do
|
||||||
|
if badName "${ARG}" ; then
|
||||||
|
echo "can't manage '${ARG}'. Use -f option"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
RECORD_ID=$(curl -s -X GET --basic --user "${ALWAYSDATA_TOKEN} account=${ALWAYSDATA_ACCOUNT}:" "${ALWAYSDATA_API}/record/?name=${ARG}&type=CNAME&domain=${DOMAIN_ID}" | jq ".[] | select(.name==\"${ARG}\").id")
|
||||||
|
${SIMU} curl -s -X DELETE --basic --user "${ALWAYSDATA_TOKEN} account=${ALWAYSDATA_ACCOUNT}:" "${ALWAYSDATA_API}/record/${RECORD_ID}/"
|
||||||
|
REMOVED+=("${ARG}")
|
||||||
|
done
|
||||||
|
echo "Domains removed from ${domain}: ${REMOVED[@]}"
|
||||||
|
}
|
||||||
|
|
||||||
|
${CMD} $*
|
209
bin/dns_gandi.sh
Executable file
209
bin/dns_gandi.sh
Executable file
@@ -0,0 +1,209 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# list/ajout/supprime/ un sous-domaine
|
||||||
|
|
||||||
|
KAZ_ROOT=$(cd "$(dirname $0)"/..; pwd)
|
||||||
|
. "${KAZ_ROOT}/bin/.commonFunctions.sh"
|
||||||
|
setKazVars
|
||||||
|
. "${DOCKERS_ENV}"
|
||||||
|
|
||||||
|
cd "${KAZ_ROOT}"
|
||||||
|
export PRG="$0"
|
||||||
|
export IP="127.0.0.1"
|
||||||
|
export ETC_HOSTS="/etc/hosts"
|
||||||
|
|
||||||
|
# no more export in .env
|
||||||
|
export $(set | grep "domain=")
|
||||||
|
|
||||||
|
declare -a forbidenName
|
||||||
|
forbidenName=(${calcHost} calc ${cloudHost} bureau ${dateHost} date ${dokuwikiHost} dokuwiki ${fileHost} file ${ldapHost} ${pahekoHost} ${gitHost} ${gravHost} ${matterHost} ${officeHost} collabora ${padHost} ${sympaHost} listes ${webmailHost} ${wordpressHost} www ${vigiloHost} form)
|
||||||
|
|
||||||
|
export FORCE="NO"
|
||||||
|
export CMD=""
|
||||||
|
export SIMU=""
|
||||||
|
|
||||||
|
usage(){
|
||||||
|
echo "Usage: ${PRG} list [sub-domain...]"
|
||||||
|
echo " ${PRG} [-n] [-f] {add/del} sub-domain..."
|
||||||
|
echo " -h help"
|
||||||
|
echo " -n simulation"
|
||||||
|
echo " -f force protected domain"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
for ARG in $@
|
||||||
|
do
|
||||||
|
case "${ARG}" in
|
||||||
|
'-h' | '-help' )
|
||||||
|
usage
|
||||||
|
;;
|
||||||
|
'-f' )
|
||||||
|
shift
|
||||||
|
export FORCE="YES"
|
||||||
|
;;
|
||||||
|
'-n' )
|
||||||
|
shift
|
||||||
|
export SIMU="echo"
|
||||||
|
;;
|
||||||
|
'list'|'add'|'del' )
|
||||||
|
shift
|
||||||
|
CMD="${ARG}"
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
* )
|
||||||
|
usage
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ -z "${CMD}" ]; then
|
||||||
|
usage
|
||||||
|
fi
|
||||||
|
|
||||||
|
. "${KAZ_KEY_DIR}/env-gandi"
|
||||||
|
|
||||||
|
if [[ -z "${GANDI_KEY}" ]] ; then
|
||||||
|
echo
|
||||||
|
echo "no GANDI_KEY set in ${KAZ_KEY_DIR}/env-gandi"
|
||||||
|
usage
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
waitNet () {
|
||||||
|
if [[ "${domain}" = "kaz.local" ]]; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
### wait when error code 503
|
||||||
|
if [[ $(curl -H "authorization: Apikey ${GANDI_KEY}" --connect-timeout 2 -s -D - "${GANDI_API}" -o /dev/null 2>/dev/null | head -n1) != *200* ]]; then
|
||||||
|
echo "DNS not available. Please wait..."
|
||||||
|
while [[ $(curl -H "authorization: Apikey ${GANDI_KEY}" --connect-timeout 2 -s -D - "${GANDI_API}" -o /dev/null 2>/dev/null | head -n1) != *200* ]]
|
||||||
|
do
|
||||||
|
sleep 5
|
||||||
|
done
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
list(){
|
||||||
|
if [[ "${domain}" = "kaz.local" ]]; then
|
||||||
|
grep --perl-regex "^${IP}\s.*${domain}" "${ETC_HOSTS}" 2> /dev/null | sed -e "s|^${IP}\s*\([0-9a-z.-]${domain}\)$|\1|g"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
waitNet
|
||||||
|
trap 'rm -f "${TMPFILE}"' EXIT
|
||||||
|
TMPFILE="$(mktemp)" || exit 1
|
||||||
|
if [[ -n "${SIMU}" ]] ; then
|
||||||
|
${SIMU} curl -X GET "${GANDI_API}/records" -H "authorization: Apikey ${GANDI_KEY}"
|
||||||
|
else
|
||||||
|
curl -X GET "${GANDI_API}/records" -H "authorization: Apikey ${GANDI_KEY}" 2>/dev/null | \
|
||||||
|
sed "s/,{/\n/g" | \
|
||||||
|
sed 's/.*rrset_name":"\([^"]*\)".*rrset_values":\["\([^"]*\)".*/\1:\2/g'| \
|
||||||
|
grep -v '^[_@]'| \
|
||||||
|
grep -e ":${domain}\.*$" -e ":prod[0-9]*$" > ${TMPFILE}
|
||||||
|
fi
|
||||||
|
if [ $# -lt 1 ]; then
|
||||||
|
cat ${TMPFILE}
|
||||||
|
else
|
||||||
|
for ARG in $@
|
||||||
|
do
|
||||||
|
cat ${TMPFILE} | grep "${ARG}.*:"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
saveDns () {
|
||||||
|
for ARG in $@ ; do
|
||||||
|
if [[ "${ARG}" =~ .local$ ]] ; then
|
||||||
|
echo "${PRG}: old fasion style (remove .local at the end)"
|
||||||
|
usage;
|
||||||
|
fi
|
||||||
|
if [[ "${ARG}" =~ .bzh$ ]] ; then
|
||||||
|
echo "${PRG}: old fasion style (remove .bzh at the end)"
|
||||||
|
usage;
|
||||||
|
fi
|
||||||
|
if [[ "${ARG}" =~ .dev$ ]] ; then
|
||||||
|
echo "${PRG}: old fasion style (remove .dev at the end)"
|
||||||
|
usage;
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [[ "${domain}" = "kaz.local" ]]; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
waitNet
|
||||||
|
${SIMU} curl -X POST "${GANDI_API}/snapshots" -H "authorization: Apikey ${GANDI_KEY}" 2>/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
badName(){
|
||||||
|
[[ -z "$1" ]] && return 0;
|
||||||
|
for item in "${forbidenName[@]}"; do
|
||||||
|
[[ "${item}" == "$1" ]] && [[ "${FORCE}" == "NO" ]] && return 0
|
||||||
|
done
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
add(){
|
||||||
|
if [ $# -lt 1 ]; then
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
saveDns $@
|
||||||
|
declare -a ADDED
|
||||||
|
for ARG in $@
|
||||||
|
do
|
||||||
|
if badName "${ARG}" ; then
|
||||||
|
echo "can't manage '${ARG}'. Use -f option"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
case "${domain}" in
|
||||||
|
kaz.local )
|
||||||
|
if grep -q --perl-regex "^${IP}.*[ \t]${ARG}.${domain}" "${ETC_HOSTS}" 2> /dev/null ; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
if grep -q --perl-regex "^${IP}[ \t]" "${ETC_HOSTS}" 2> /dev/null ; then
|
||||||
|
${SIMU} sudo sed -i -e "0,/^${IP}[ \t]/s/^\(${IP}[ \t]\)/\1${ARG}.${domain} /g" "${ETC_HOSTS}"
|
||||||
|
else
|
||||||
|
${SIMU} sudo sed -i -e "$ a ${IP}\t${ARG}.${domain}" "${ETC_HOSTS}" 2> /dev/null
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
${SIMU} curl -X POST "${GANDI_API}/records" -H "authorization: Apikey ${GANDI_KEY}" -H 'content-type: application/json' -d '{"rrset_type":"CNAME", "rrset_name":"'${ARG}'", "rrset_values":["'${site}'"]}'
|
||||||
|
echo
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
ADDED+=("${ARG}")
|
||||||
|
done
|
||||||
|
echo "Domains added to ${domain}: ${ADDED[@]}"
|
||||||
|
}
|
||||||
|
|
||||||
|
del(){
|
||||||
|
if [ $# -lt 1 ]; then
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
saveDns $@
|
||||||
|
declare -a REMOVED
|
||||||
|
for ARG in $@
|
||||||
|
do
|
||||||
|
if badName "${ARG}" ; then
|
||||||
|
echo "can't manage '${ARG}'. Use -f option"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
case "${domain}" in
|
||||||
|
kaz.local )
|
||||||
|
if !grep -q --perl-regex "^${IP}.*[ \t]${ARG}.${domain}" "${ETC_HOSTS}" 2> /dev/null ; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
${SIMU} sudo sed -i -e "/^${IP}[ \t]*${ARG}.${domain}[ \t]*$/d" \
|
||||||
|
-e "s|^\(${IP}.*\)[ \t]${ARG}.${domain}|\1|g" "${ETC_HOSTS}"
|
||||||
|
;;
|
||||||
|
* )
|
||||||
|
${SIMU} curl -X DELETE "${GANDI_API}/records/${ARG}" -H "authorization: Apikey ${GANDI_KEY}"
|
||||||
|
echo
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
REMOVED+=("${ARG}")
|
||||||
|
done
|
||||||
|
echo "Domains removed from ${domain}: ${REMOVED[@]}"
|
||||||
|
}
|
||||||
|
|
||||||
|
#echo "CMD: ${CMD} $*"
|
||||||
|
${CMD} $*
|
176
bin/dynDNS.sh
Executable file
176
bin/dynDNS.sh
Executable file
@@ -0,0 +1,176 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# nohup /kaz/bin/dynDNS.sh &
|
||||||
|
|
||||||
|
KAZ_ROOT=$(cd "$(dirname $0)"/..; pwd)
|
||||||
|
. "${KAZ_ROOT}/bin/.commonFunctions.sh"
|
||||||
|
setKazVars
|
||||||
|
. "${DOCKERS_ENV}"
|
||||||
|
# no more export in .env
|
||||||
|
export $(set | grep "domain=")
|
||||||
|
|
||||||
|
cd "${KAZ_ROOT}"
|
||||||
|
export PRG="$0"
|
||||||
|
|
||||||
|
export MYHOST="${site}"
|
||||||
|
|
||||||
|
MYIP_URL="https://kaz.bzh/myip.php"
|
||||||
|
DNS_IP=""
|
||||||
|
|
||||||
|
DELAI_WAIT=10 # DNS occupé
|
||||||
|
DELAI_GET=5 # min entre 2 requêtes
|
||||||
|
DELAI_CHANGE=3600 # propagation 1h
|
||||||
|
DELAI_NO_CHANGE=300 # pas de changement 5 min
|
||||||
|
|
||||||
|
BOLD='\e[1m'
|
||||||
|
RED='\e[0;31m'
|
||||||
|
GREEN='\e[0;32m'
|
||||||
|
YELLOW='\e[0;33m'
|
||||||
|
BLUE='\e[0;34m'
|
||||||
|
MAGENTA='\e[0;35m'
|
||||||
|
CYAN='\e[0;36m'
|
||||||
|
NC='\e[0m' # No Color
|
||||||
|
NL='
|
||||||
|
'
|
||||||
|
|
||||||
|
export VERBOSE=""
|
||||||
|
export SIMU=""
|
||||||
|
|
||||||
|
usage(){
|
||||||
|
echo "Usage: ${PRG} list [sub-domain...]"
|
||||||
|
echo " -h help"
|
||||||
|
echo " -v verbose"
|
||||||
|
echo " -n simulation"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
#. "${KAZ_KEY_DIR}/env-gandi"
|
||||||
|
. "${KAZ_KEY_DIR}/env-alwaysdata"
|
||||||
|
|
||||||
|
if [[ -z "${ALWAYSDATA_TOKEN}" ]] ; then
|
||||||
|
echo "no ALWAYSDATA_TOKEN set in ${KAZ_KEY_DIR}/env-alwaysdata"
|
||||||
|
usage
|
||||||
|
fi
|
||||||
|
|
||||||
|
DOMAIN_ID=$(curl -s -X GET --basic --user "${ALWAYSDATA_TOKEN} account=${ALWAYSDATA_ACCOUNT}:" ${ALWAYSDATA_API}/domain/?name=${domain} | jq '.[0].id')
|
||||||
|
|
||||||
|
if [[ -z "${DOMAIN_ID}" ]] ; then
|
||||||
|
echo "no DOMAIN_ID give by alwaysdata"
|
||||||
|
usage
|
||||||
|
fi
|
||||||
|
|
||||||
|
# if [[ -z "${GANDI_KEY}" ]] ; then
|
||||||
|
# echo
|
||||||
|
# echo "no GANDI_KEY set in ${KAZ_KEY_DIR}/env-gandi"
|
||||||
|
# usage
|
||||||
|
# exit
|
||||||
|
# fi
|
||||||
|
|
||||||
|
for ARG in $@
|
||||||
|
do
|
||||||
|
case "${ARG}" in
|
||||||
|
'-h' | '-help' )
|
||||||
|
usage
|
||||||
|
;;
|
||||||
|
'-v' )
|
||||||
|
shift
|
||||||
|
export VERBOSE=":"
|
||||||
|
;;
|
||||||
|
'-n' )
|
||||||
|
shift
|
||||||
|
export SIMU="echo"
|
||||||
|
;;
|
||||||
|
* )
|
||||||
|
usage
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
log () {
|
||||||
|
echo -e "${BLUE}$(date +%d-%m-%Y-%H-%M-%S)${NC} : $*"
|
||||||
|
}
|
||||||
|
|
||||||
|
simu () {
|
||||||
|
echo -e "${YELLOW}$(date +%d-%m-%Y-%H-%M-%S)${NC} : $*"
|
||||||
|
}
|
||||||
|
|
||||||
|
cmdWait () {
|
||||||
|
#ex gandi
|
||||||
|
#curl -H "authorization: Apikey ${GANDI_KEY}" --connect-timeout 2 -s -D - -o /dev/null "${GANDI_API}" 2>/dev/null
|
||||||
|
curl -s -X GET --basic --user "${ALWAYSDATA_TOKEN} account=${ALWAYSDATA_ACCOUNT}:" --connect-timeout 2 -D - -o /dev/null "${ALWAYSDATA_API}/record/?domain=${DOMAIN_ID}&type=CNAME&name=${TARGET}" 2>/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
waitNet () {
|
||||||
|
### wait when error code 503
|
||||||
|
if [[ $(cmdWait | head -n1) != *200* ]]; then
|
||||||
|
log "DNS not available. Please wait..."
|
||||||
|
while [[ $(cmdWait | head -n1) != *200* ]]; do
|
||||||
|
[[ -z "${VERBOSE}" ]] || simu curl -s -X GET --basic --user "${ALWAYSDATA_TOKEN} account=${ALWAYSDATA_ACCOUNT}:" --connect-timeout 2 -D - -o /dev/null "${ALWAYSDATA_API}/record/?domain=${DOMAIN_ID}&type=CNAME&name=${TARGET}"
|
||||||
|
sleep "${DELAI_WAIT}"
|
||||||
|
done
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
getDNS () {
|
||||||
|
# curl -s -X GET "${GANDI_API}/records" -H "authorization: Apikey ${GANDI_KEY}"|
|
||||||
|
# sed "s/,{/\n/g"|
|
||||||
|
# sed 's/.*rrset_name":"\([^"]*\)".*rrset_values":\["\([^"]*\)".*/\1:\2/g'|
|
||||||
|
# grep -e "^${MYHOST}:"|
|
||||||
|
# sed "s/^${MYHOST}://g" |
|
||||||
|
# tr -d '\n\t\r '
|
||||||
|
${SIMU} curl -s -X GET --basic --user "${ALWAYSDATA_TOKEN} account=${ALWAYSDATA_ACCOUNT}:" "${ALWAYSDATA_API}/record/?domain=${DOMAIN_ID}&type=A&name=${MYHOST}" | jq '.[] | "\(.value)"' | tr -d '"'
|
||||||
|
}
|
||||||
|
|
||||||
|
saveDns () {
|
||||||
|
mkdir -p /root/dns
|
||||||
|
${SIMU} curl -s -X GET --basic --user "${ALWAYSDATA_TOKEN} account=${ALWAYSDATA_ACCOUNT}:" "${ALWAYSDATA_API}/record/?domain=${DOMAIN_ID}" -o /root/dns/dns_save_$(date +'%Y%m%d%H%M%S')
|
||||||
|
}
|
||||||
|
|
||||||
|
setDNS () {
|
||||||
|
saveDns
|
||||||
|
# curl -s -X POST "${GANDI_API}/records" -H "authorization: Apikey ${GANDI_KEY}" -H 'content-type: application/json' -d '{"rrset_type":"A", "rrset_name":"'${MYHOST}'", "rrset_values":["'${IP}'"]}'
|
||||||
|
${SIMU} curl -s -X POST -d "{\"domain\":\"${DOMAIN_ID}\", \"type\":\"A\", \"name\":\"${MYHOST}\", \"value\":\"${IP}\"}" --basic --user "${ALWAYSDATA_TOKEN} account=${ALWAYSDATA_ACCOUNT}:" "${ALWAYSDATA_API}/record/"
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
while :; do
|
||||||
|
sleep "${DELAI_GET}"
|
||||||
|
IP=$(curl -s "${MYIP_URL}" | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' | tr -d '\n\t\r ')
|
||||||
|
if ! [[ ${IP} =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
||||||
|
log "BAB IP ${IP}" ; continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "${DNS_IP}" ]; then
|
||||||
|
# Variable pas encore initialisée
|
||||||
|
waitNet
|
||||||
|
DNS_IP=$(getDNS)
|
||||||
|
|
||||||
|
if [ -z "${DNS_IP}" ]; then
|
||||||
|
# C'est la première fois que le site est en prod
|
||||||
|
log "set ${MYHOST} : ${IP}"
|
||||||
|
setDNS
|
||||||
|
DNS_IP=$(getDNS)
|
||||||
|
log "DNS set ${MYHOST}:${IP} (=${DNS_IP})"
|
||||||
|
sleep "${DELAI_CHANGE}"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${DNS_IP}" != "${IP}" ]; then
|
||||||
|
log "${MYHOST} : ${DNS_IP} must change to ${IP}"
|
||||||
|
# Changement d'adresse
|
||||||
|
waitNet
|
||||||
|
#curl -s -X DELETE "${GANDI_API}/records/${MYHOST}" -H "authorization: Apikey ${GANDI_KEY}"
|
||||||
|
RECORD_ID=$(curl -s -X GET --basic --user "${ALWAYSDATA_TOKEN} account=${ALWAYSDATA_ACCOUNT}:" "${ALWAYSDATA_API}/record/?name=${MYHOST}&type=A&domain=${DOMAIN_ID}" | jq ".[] | select(.name==\"${MYHOST}\").id")
|
||||||
|
${SIMU} curl -s -X DELETE --basic --user "${ALWAYSDATA_TOKEN} account=${ALWAYSDATA_ACCOUNT}:" "${ALWAYSDATA_API}/record/${RECORD_ID}/"
|
||||||
|
setDNS
|
||||||
|
DNS_IP=$(getDNS)
|
||||||
|
log "DNS reset ${MYHOST}:${IP} (=${DNS_IP})"
|
||||||
|
sleep "${DELAI_CHANGE}"
|
||||||
|
else
|
||||||
|
log "OK ${MYHOST}:${DNS_IP} / ${IP}"
|
||||||
|
sleep ${DELAI_NO_CHANGE}
|
||||||
|
fi
|
||||||
|
done
|
@@ -23,7 +23,7 @@ PRG=$(basename $0)
|
|||||||
# TEMPO_ACTION_STOP=2 # Lors de redémarrage avec tempo, on attend après le stop
|
# TEMPO_ACTION_STOP=2 # Lors de redémarrage avec tempo, on attend après le stop
|
||||||
# TEMPO_ACTION_START=60 # Lors de redémarrage avec tempo, avant de reload le proxy
|
# TEMPO_ACTION_START=60 # Lors de redémarrage avec tempo, avant de reload le proxy
|
||||||
|
|
||||||
# DEFAULTCONTAINERS="cloud agora wp wiki office paheko castopod"
|
# DEFAULTCONTAINERS="cloud agora wp wiki office paheko castopod spip"
|
||||||
|
|
||||||
# APPLIS_PAR_DEFAUT="tasks calendar contacts bookmarks mail richdocuments external drawio snappymail ransomware_protection" #rainloop richdocumentscode
|
# APPLIS_PAR_DEFAUT="tasks calendar contacts bookmarks mail richdocuments external drawio snappymail ransomware_protection" #rainloop richdocumentscode
|
||||||
|
|
||||||
@@ -42,16 +42,16 @@ CONTAINERS_TYPES=
|
|||||||
|
|
||||||
|
|
||||||
declare -A DockerServNames # le nom des containers correspondant
|
declare -A DockerServNames # le nom des containers correspondant
|
||||||
DockerServNames=( [cloud]="${nextcloudServName}" [agora]="${mattermostServName}" [wiki]="${dokuwikiServName}" [wp]="${wordpressServName}" [office]="${officeServName}" [paheko]="${pahekoServName}" [castopod]="${castopodServName}" )
|
DockerServNames=( [cloud]="${nextcloudServName}" [agora]="${mattermostServName}" [wiki]="${dokuwikiServName}" [wp]="${wordpressServName}" [office]="${officeServName}" [paheko]="${pahekoServName}" [castopod]="${castopodServName}" [spip]="${spipServName}" )
|
||||||
|
|
||||||
declare -A FilterLsVolume # Pour trouver quel volume appartient à quel container
|
declare -A FilterLsVolume # Pour trouver quel volume appartient à quel container
|
||||||
FilterLsVolume=( [cloud]="cloudMain" [agora]="matterConfig" [wiki]="wikiConf" [wp]="wordpress" [castopod]="castopodMedia" )
|
FilterLsVolume=( [cloud]="cloudMain" [agora]="matterConfig" [wiki]="wikiConf" [wp]="wordpress" [castopod]="castopodMedia" [spip]="spip")
|
||||||
|
|
||||||
declare -A composeDirs # Le nom du repertoire compose pour le commun
|
declare -A composeDirs # Le nom du repertoire compose pour le commun
|
||||||
composeDirs=( [cloud]="cloud" [agora]="mattermost" [wiki]="dokuwiki" [office]="collabora" [paheko]="paheko" [castopod]="castopod" )
|
composeDirs=( [cloud]="cloud" [agora]="mattermost" [wiki]="dokuwiki" [office]="collabora" [paheko]="paheko" [castopod]="castopod" [spip]="spip")
|
||||||
|
|
||||||
declare -A serviceNames # Le nom du du service dans le dockerfile d'orga
|
declare -A serviceNames # Le nom du du service dans le dockerfile d'orga
|
||||||
serviceNames=( [cloud]="cloud" [agora]="agora" [wiki]="dokuwiki" [wp]="wordpress" [office]="collabora" [castopod]="castopod")
|
serviceNames=( [cloud]="cloud" [agora]="agora" [wiki]="dokuwiki" [wp]="wordpress" [office]="collabora" [castopod]="castopod" [spip]="spip")
|
||||||
|
|
||||||
declare -A subScripts
|
declare -A subScripts
|
||||||
subScripts=( [cloud]="manageCloud.sh" [agora]="manageAgora.sh" [wiki]="manageWiki.sh" [wp]="manageWp.sh" [castopod]="manageCastopod.sh" )
|
subScripts=( [cloud]="manageCloud.sh" [agora]="manageAgora.sh" [wiki]="manageWiki.sh" [wp]="manageWp.sh" [castopod]="manageCastopod.sh" )
|
||||||
@@ -93,6 +93,7 @@ CONTAINERS_TYPES
|
|||||||
-office Les collabora
|
-office Les collabora
|
||||||
-paheko Le paheko
|
-paheko Le paheko
|
||||||
-castopod Les castopod
|
-castopod Les castopod
|
||||||
|
-spip Les spip
|
||||||
|
|
||||||
COMMANDES (on peut en mettre plusieurs dans l'ordre souhaité)
|
COMMANDES (on peut en mettre plusieurs dans l'ordre souhaité)
|
||||||
-I|--install L'initialisation du container
|
-I|--install L'initialisation du container
|
||||||
@@ -551,6 +552,8 @@ for ARG in "$@"; do
|
|||||||
CONTAINERS_TYPES="${CONTAINERS_TYPES} paheko" ;;
|
CONTAINERS_TYPES="${CONTAINERS_TYPES} paheko" ;;
|
||||||
'-pod'|'--pod'|'-castopod'|'--castopod')
|
'-pod'|'--pod'|'-castopod'|'--castopod')
|
||||||
CONTAINERS_TYPES="${CONTAINERS_TYPES} castopod" ;;
|
CONTAINERS_TYPES="${CONTAINERS_TYPES} castopod" ;;
|
||||||
|
'-spip')
|
||||||
|
CONTAINERS_TYPES="${CONTAINERS_TYPES} spip" ;;
|
||||||
'-t' )
|
'-t' )
|
||||||
COMMANDS="${COMMANDS} RESTART-COMPOSE" ;;
|
COMMANDS="${COMMANDS} RESTART-COMPOSE" ;;
|
||||||
'-r' )
|
'-r' )
|
||||||
|
@@ -1,5 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# gestion des utilisateurs de kaz ( mail, cloud général, mattermost )
|
# gestion des utilisateurs de kaz ( mail, cloud général, mattermost )
|
||||||
|
# Ki : Did
|
||||||
|
# koi : gestion globale des users Kaz mais aussi les users d'autres domaines hébergés
|
||||||
|
|
||||||
KAZ_ROOT=$(cd "$(dirname $0)"/..; pwd)
|
KAZ_ROOT=$(cd "$(dirname $0)"/..; pwd)
|
||||||
. $KAZ_ROOT/bin/.commonFunctions.sh
|
. $KAZ_ROOT/bin/.commonFunctions.sh
|
||||||
@@ -8,7 +10,7 @@ setKazVars
|
|||||||
. $DOCKERS_ENV
|
. $DOCKERS_ENV
|
||||||
. $KAZ_ROOT/secret/SetAllPass.sh
|
. $KAZ_ROOT/secret/SetAllPass.sh
|
||||||
|
|
||||||
VERSION="5-12-2024"
|
VERSION="18-05-2025"
|
||||||
PRG=$(basename $0)
|
PRG=$(basename $0)
|
||||||
RACINE=$(echo $PRG | awk '{print $1}')
|
RACINE=$(echo $PRG | awk '{print $1}')
|
||||||
IFS=' '
|
IFS=' '
|
||||||
@@ -968,9 +970,9 @@ updateUser() {
|
|||||||
MAILALIAS_CHANGE=0
|
MAILALIAS_CHANGE=0
|
||||||
for VALMAIL in ${CONTENU_ATTRIBUT}
|
for VALMAIL in ${CONTENU_ATTRIBUT}
|
||||||
do
|
do
|
||||||
read -p " - On garde ${VALMAIL} (o/n) ? [o] : " READVALMAIL
|
read -p " - On garde ${VALMAIL} (o/n) [o] ? : " READVALMAIL
|
||||||
case ${READVALMAIL} in
|
case ${READVALMAIL} in
|
||||||
* | "" | o | O )
|
"" | o | O )
|
||||||
NEW_CONTENU_ATTRIBUT="${NEW_CONTENU_ATTRIBUT} ${VALMAIL}"
|
NEW_CONTENU_ATTRIBUT="${NEW_CONTENU_ATTRIBUT} ${VALMAIL}"
|
||||||
;;
|
;;
|
||||||
n | N )
|
n | N )
|
||||||
@@ -1007,7 +1009,7 @@ updateUser() {
|
|||||||
done
|
done
|
||||||
;;
|
;;
|
||||||
"" | n | N )
|
"" | n | N )
|
||||||
#CHANGED+=([mailAlias]="${NEW_CONTENU_ATTRIBUT}")
|
CHANGED+=([mailAlias]="${NEW_CONTENU_ATTRIBUT}")
|
||||||
;;
|
;;
|
||||||
* )
|
* )
|
||||||
printKazMsg "Erreur"
|
printKazMsg "Erreur"
|
||||||
|
18
bin/getX509Certificates.sh
Executable file
18
bin/getX509Certificates.sh
Executable file
@@ -0,0 +1,18 @@
|
|||||||
|
#/bin/bash
|
||||||
|
|
||||||
|
#koi: récupération des certifs traefik vers x509 pour mail et listes
|
||||||
|
#ki: fanch
|
||||||
|
#kan: 18/04/2025
|
||||||
|
|
||||||
|
KAZ_ROOT=$(cd "$(dirname $0)"/..; pwd)
|
||||||
|
. "${KAZ_ROOT}/bin/.commonFunctions.sh"
|
||||||
|
setKazVars
|
||||||
|
. "${DOCKERS_ENV}"
|
||||||
|
|
||||||
|
certificates="mail listes"
|
||||||
|
|
||||||
|
for i in ${certificates}; do
|
||||||
|
jq -r ".letsencrypt.Certificates[] | select(.domain.main==\"${i}.${domain}\") | .certificate" /var/lib/docker/volumes/traefik_letsencrypt/_data/acme.json | base64 -d > /etc/ssl/certs/${i}.pem
|
||||||
|
jq -r ".letsencrypt.Certificates[] | select(.domain.main==\"${i}.${domain}\") | .key" /var/lib/docker/volumes/traefik_letsencrypt/_data/acme.json | base64 -d > /etc/ssl/private/${i}.key
|
||||||
|
chmod 600 /etc/ssl/private/${i}.key
|
||||||
|
done
|
@@ -123,6 +123,8 @@ export DebugLog="${KAZ_ROOT}/log/log-install-$(date +%y-%m-%d-%T)-"
|
|||||||
if [[ " ${DOCKERS_LIST[*]} " =~ " traefik " ]]; then
|
if [[ " ${DOCKERS_LIST[*]} " =~ " traefik " ]]; then
|
||||||
# on initialise traefik :-(
|
# on initialise traefik :-(
|
||||||
${KAZ_COMP_DIR}/traefik/first.sh
|
${KAZ_COMP_DIR}/traefik/first.sh
|
||||||
|
# on démarre traefik (plus lancé dans container.sh)
|
||||||
|
docker-compose -f ${KAZ_COMP_DIR}/traefik/docker-compose.yml up -d
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ " ${DOCKERS_LIST[*]} " =~ " etherpad " ]]; then
|
if [[ " ${DOCKERS_LIST[*]} " =~ " etherpad " ]]; then
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
KAZ_ROOT=$(cd "$(dirname $0)"/..; pwd)
|
KAZ_ROOT=$(cd "$(dirname $0)"/..; pwd)
|
||||||
|
|
||||||
. $KAZ_ROOT/bin/.commonFunctions.sh
|
. $KAZ_ROOT/bin/.commonFunctions.sh
|
||||||
setKazVars
|
setKazVars
|
||||||
|
|
||||||
@@ -76,6 +77,10 @@ Int_paheko_Action() {
|
|||||||
do
|
do
|
||||||
eval $VAL_GAR=$(jq .$VAL_GAR ${TFILE_INT_PAHEKO_IDFILE})
|
eval $VAL_GAR=$(jq .$VAL_GAR ${TFILE_INT_PAHEKO_IDFILE})
|
||||||
done
|
done
|
||||||
|
################################
|
||||||
|
# test du mail valide en $domain
|
||||||
|
echo ${email} | grep -i "${domain}" || { echo "le mail ${email} n'est pas en ${domain}"; exit ;}
|
||||||
|
################################
|
||||||
#comme tout va bien on continue
|
#comme tout va bien on continue
|
||||||
#on compte le nom de champs dans la zone nom pour gérer les noms et prénoms composés
|
#on compte le nom de champs dans la zone nom pour gérer les noms et prénoms composés
|
||||||
# si il y a 3 champs, on associe les 2 premieres valeurs avec un - et on laisse le 3ème identique
|
# si il y a 3 champs, on associe les 2 premieres valeurs avec un - et on laisse le 3ème identique
|
||||||
@@ -145,6 +150,9 @@ Int_paheko_Action() {
|
|||||||
nc_base="N"
|
nc_base="N"
|
||||||
admin_orga="O"
|
admin_orga="O"
|
||||||
fi
|
fi
|
||||||
|
#On met le mail et le mail de secours en minuscules
|
||||||
|
email=$(echo $email | tr [:upper:] [:lower:])
|
||||||
|
email_secours=$(echo $email_secours | tr [:upper:] [:lower:])
|
||||||
# Pour le reste on renomme les null en N ( non ) et les valeurs 1 en O ( Oui)
|
# Pour le reste on renomme les null en N ( non ) et les valeurs 1 en O ( Oui)
|
||||||
cloud=$(echo $cloud | sed -e 's/0/N/g' | sed -e 's/1/O/g')
|
cloud=$(echo $cloud | sed -e 's/0/N/g' | sed -e 's/1/O/g')
|
||||||
paheko=$(echo $garradin | sed -e 's/0/N/g' | sed -e 's/1/O/g')
|
paheko=$(echo $garradin | sed -e 's/0/N/g' | sed -e 's/1/O/g')
|
||||||
@@ -155,11 +163,11 @@ Int_paheko_Action() {
|
|||||||
echo "$nom_ok;$prenom_ok;$email;$email_secours;$nom_orga;$admin_orga;$cloud;$paheko;$wordpress;$agora;$docuwiki;$nc_base;$groupe_nc_base;$equipe_agora;$quota_disque">>${FILE_CREATEUSER}
|
echo "$nom_ok;$prenom_ok;$email;$email_secours;$nom_orga;$admin_orga;$cloud;$paheko;$wordpress;$agora;$docuwiki;$nc_base;$groupe_nc_base;$equipe_agora;$quota_disque">>${FILE_CREATEUSER}
|
||||||
done
|
done
|
||||||
else
|
else
|
||||||
echo "Rien à créer"
|
[ "$OPTION" = "silence" ] || echo "Rien à créer"
|
||||||
exit 2
|
exit 2
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
#Int_paheko_Action "A créer" "silence"
|
# Main
|
||||||
Int_paheko_Action "A créer"
|
Int_paheko_Action "A créer" "silence"
|
||||||
exit 0
|
exit 0
|
||||||
|
|
||||||
|
@@ -16,7 +16,7 @@ availableOrga=($(getList "${KAZ_CONF_DIR}/container-orga.list"))
|
|||||||
AVAILABLE_ORGAS=${availableOrga[*]//-orga/}
|
AVAILABLE_ORGAS=${availableOrga[*]//-orga/}
|
||||||
|
|
||||||
# CLOUD
|
# CLOUD
|
||||||
APPLIS_PAR_DEFAUT="tasks calendar contacts bookmarks mail richdocuments external drawio snappymail ransomware_protection" #rainloop richdocumentscode
|
APPLIS_PAR_DEFAUT="tasks calendar contacts bookmarks mail richdocuments external drawio ransomware_protection" #rainloop richdocumentscode
|
||||||
QUIET="1"
|
QUIET="1"
|
||||||
ONNAS=
|
ONNAS=
|
||||||
|
|
||||||
@@ -120,10 +120,11 @@ firstInstall(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
setOfficeUrl(){
|
setOfficeUrl(){
|
||||||
OFFICE_URL="https://${officeHost}.${domain}"
|
# Did le 25 mars les offices sont tous normalisé sur les serveurs https://${site}-${officeHost}.${domain}
|
||||||
if [ ! "${site}" = "prod1" ]; then
|
#OFFICE_URL="https://${officeHost}.${domain}"
|
||||||
OFFICE_URL="https://${site}-${officeHost}.${domain}"
|
#if [ ! "${site}" = "prod1" ]; then
|
||||||
fi
|
OFFICE_URL="https://${site}-${officeHost}.${domain}"
|
||||||
|
#fi
|
||||||
occCommand "config:app:set --value $OFFICE_URL richdocuments public_wopi_url"
|
occCommand "config:app:set --value $OFFICE_URL richdocuments public_wopi_url"
|
||||||
occCommand "config:app:set --value $OFFICE_URL richdocuments wopi_url"
|
occCommand "config:app:set --value $OFFICE_URL richdocuments wopi_url"
|
||||||
occCommand "config:app:set --value $OFFICE_URL richdocuments disable_certificate_verification"
|
occCommand "config:app:set --value $OFFICE_URL richdocuments disable_certificate_verification"
|
||||||
|
@@ -143,6 +143,4 @@ for orgaLong in ${Orgas}; do
|
|||||||
|
|
||||||
${SIMU} ssh -p 2201 root@${SITE_DST}.${domain} "${KAZ_BIN_DIR}/manageCloud.sh" --officeURL "${orgaCourt}"
|
${SIMU} ssh -p 2201 root@${SITE_DST}.${domain} "${KAZ_BIN_DIR}/manageCloud.sh" --officeURL "${orgaCourt}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
done
|
done
|
||||||
|
41
bin/nettoyer_acme_json_certifs.sh
Executable file
41
bin/nettoyer_acme_json_certifs.sh
Executable file
@@ -0,0 +1,41 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
#date: 23/04/2025
|
||||||
|
#ki: fab
|
||||||
|
#koi: supprimer de acme.json les certificats LE devenus inutiles
|
||||||
|
|
||||||
|
KAZ_ROOT=$(cd "$(dirname $0)"/..; pwd)
|
||||||
|
. "${KAZ_ROOT}/bin/.commonFunctions.sh"
|
||||||
|
setKazVars
|
||||||
|
. "${DOCKERS_ENV}"
|
||||||
|
|
||||||
|
FILE_ACME_ORI="/var/lib/docker/volumes/traefik_letsencrypt/_data/acme.json"
|
||||||
|
FILE_ACME="/tmp/acme.json"
|
||||||
|
FILE_URL=$(mktemp)
|
||||||
|
FILE_ACME_TMP=$(mktemp)
|
||||||
|
|
||||||
|
#l'ip du serveur:
|
||||||
|
#marche po pour les machines hébergée chez T.C... :( on récupère l'IP dans config/dockers.env
|
||||||
|
#MAIN_IP=$(curl ifconfig.me)
|
||||||
|
|
||||||
|
#DANGER: IP depuis config/dockers.env ne fonctionne pas pour les domaines hors *.kaz.bzh (ex:radiokalon.fr)
|
||||||
|
|
||||||
|
#sauvegarde
|
||||||
|
cp $FILE_ACME_ORI $FILE_ACME
|
||||||
|
cp $FILE_ACME "$FILE_ACME"_$(date +%Y%m%d_%H%M%S)
|
||||||
|
|
||||||
|
#je cherche toutes les url
|
||||||
|
jq -r '.letsencrypt.Certificates[].domain.main' $FILE_ACME > $FILE_URL
|
||||||
|
|
||||||
|
while read -r url; do
|
||||||
|
#echo "Traitement de : $url"
|
||||||
|
nb=$(dig $url | grep $MAIN_IP | wc -l)
|
||||||
|
if [ "$nb" -eq 0 ]; then
|
||||||
|
#absent, on vire de acme.json
|
||||||
|
echo "on supprime "$url
|
||||||
|
jq --arg url "$url" 'del(.letsencrypt.Certificates[] | select(.domain.main == $url))' $FILE_ACME > $FILE_ACME_TMP
|
||||||
|
mv -f $FILE_ACME_TMP $FILE_ACME
|
||||||
|
fi
|
||||||
|
done < "$FILE_URL"
|
||||||
|
|
||||||
|
echo "si satisfait, remettre "$FILE_ACME" dans "$FILE_ACME_ORI
|
@@ -1,7 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# --------------------------------------------------------------------------------------
|
# --------------------------------------------------------------------------------------
|
||||||
# Didier
|
# Didier
|
||||||
#
|
|
||||||
# Script de sauvegarde avec BorgBackup
|
# Script de sauvegarde avec BorgBackup
|
||||||
# la commande de creation du dépot est : borg init --encryption=repokey /mnt/backup-nas1/BorgRepo
|
# la commande de creation du dépot est : borg init --encryption=repokey /mnt/backup-nas1/BorgRepo
|
||||||
# la conf de borg est dans /root/.config/borg
|
# la conf de borg est dans /root/.config/borg
|
||||||
@@ -18,9 +17,13 @@ KAZ_ROOT=$(cd "$(dirname $0)"/..; pwd)
|
|||||||
. $KAZ_ROOT/bin/.commonFunctions.sh
|
. $KAZ_ROOT/bin/.commonFunctions.sh
|
||||||
setKazVars
|
setKazVars
|
||||||
. $DOCKERS_ENV
|
. $DOCKERS_ENV
|
||||||
. $KAZ_ROOT/secret/SetAllPass.sh
|
. ${KAZ_KEY_DIR}/env-borg
|
||||||
|
# Si la variable SCRIPTBORG est renseignée avec un fichier on le source
|
||||||
VERSION="V-3-11-2024"
|
if [ ! -z ${SCRIPTBORG} ]
|
||||||
|
then
|
||||||
|
[ -f ${SCRIPTBORG} ] && . ${SCRIPTBORG}
|
||||||
|
fi
|
||||||
|
VERSION="V-07-08-2025"
|
||||||
PRG=$(basename $0)
|
PRG=$(basename $0)
|
||||||
RACINE=$(echo $PRG | awk '{print $1}')
|
RACINE=$(echo $PRG | awk '{print $1}')
|
||||||
#IFS=' '
|
#IFS=' '
|
||||||
@@ -72,20 +75,10 @@ LogFic() {
|
|||||||
}
|
}
|
||||||
#
|
#
|
||||||
ExpMail() {
|
ExpMail() {
|
||||||
MAIL_SOURCE=$1
|
MAIL_DEST=$1
|
||||||
MAIL_SUJET=$2
|
MAIL_SUJET=$2
|
||||||
MAIL_DEST=$3
|
MAIL_TEXTE=$3
|
||||||
MAIL_TEXTE=$4
|
|
||||||
# a mettre ailleurs
|
|
||||||
mailexp=${borg_MAILEXP}
|
|
||||||
mailpassword=${borg_MAILPASSWORD}
|
|
||||||
mailserveur=${borg_MAILSERVEUR}
|
|
||||||
#
|
|
||||||
#sendemail -t ${MAIL_DEST} -u ${MAIL_SUJET} -m ${MAIL_TEXTE} -f $mailexp -s $mailserveur:587 -xu $mailexp -xp $mailpassword -o tls=yes >/dev/null 2>&1
|
|
||||||
printf "Subject:${MAIL_SUJET}\n${MAIL_TEXTE}" | msmtp ${MAIL_DEST}
|
printf "Subject:${MAIL_SUJET}\n${MAIL_TEXTE}" | msmtp ${MAIL_DEST}
|
||||||
#docker exec -i mailServ mailx -a 'Content-Type: text/plain; charset="UTF-8"' -r ${MAIL_SOURCE} -s "${MAIL_SUJET}" ${MAIL_DEST} << EOF
|
|
||||||
#${MAIL_TEXTE}
|
|
||||||
#EOF
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Pre_Sauvegarde() {
|
Pre_Sauvegarde() {
|
||||||
@@ -297,7 +290,7 @@ if [ "${REPO_MOUNT_ACTIVE}" = "true" ]
|
|||||||
then
|
then
|
||||||
echo "le REPO : ${BORG_REPO} est monté , je sors"
|
echo "le REPO : ${BORG_REPO} est monté , je sors"
|
||||||
LogFic "le REPO : ${BORG_REPO} est monté , je sors"
|
LogFic "le REPO : ${BORG_REPO} est monté , je sors"
|
||||||
ExpMail borg@${domain} "${site} : Sauvegarde en erreur" ${MAIL_RAPPORT} "le REPO : ${BORG_REPO} est monté, sauvegarde impossible"
|
ExpMail ${MAIL_RAPPORT} "${site} : Sauvegarde en erreur" "le REPO : ${BORG_REPO} est monté, sauvegarde impossible"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -349,7 +342,7 @@ BorgBackup
|
|||||||
|
|
||||||
"
|
"
|
||||||
LogFic " - la sauvegarde est OK"
|
LogFic " - la sauvegarde est OK"
|
||||||
[ "$MAILOK" = true ] && ExpMail borg@${domain} "${site} : Sauvegarde Ok" ${MAIL_RAPPORT} ${MESS_SAUVE_OK}${LOGDATA}
|
[ "$MAILOK" = true ] && ExpMail ${MAIL_RAPPORT} "${site} : Sauvegarde Ok" ${MESS_SAUVE_OK}${LOGDATA}
|
||||||
IFS=' '
|
IFS=' '
|
||||||
;;
|
;;
|
||||||
'1' )
|
'1' )
|
||||||
@@ -365,7 +358,7 @@ BorgBackup
|
|||||||
|
|
||||||
"
|
"
|
||||||
LogFic " - Sauvegarde en Warning: ${BACKUP_EXIT}"
|
LogFic " - Sauvegarde en Warning: ${BACKUP_EXIT}"
|
||||||
[ "$MAILWARNING" = true ] && ExpMail borg@${domain} "${site} : Sauvegarde en Warning: ${BACKUP_EXIT}" ${MAIL_RAPPORT} ${MESS_SAUVE_ERR}${LOGDATA}
|
[ "$MAILWARNING" = true ] && ExpMail ${MAIL_RAPPORT} "${site} : Sauvegarde en Warning: ${BACKUP_EXIT}" ${MESS_SAUVE_ERR}${LOGDATA}
|
||||||
IFS=' '
|
IFS=' '
|
||||||
;;
|
;;
|
||||||
* )
|
* )
|
||||||
@@ -381,7 +374,7 @@ BorgBackup
|
|||||||
|
|
||||||
"
|
"
|
||||||
LogFic " - !!!!! Sauvegarde en Erreur !!!!! : ${BACKUP_EXIT}"
|
LogFic " - !!!!! Sauvegarde en Erreur !!!!! : ${BACKUP_EXIT}"
|
||||||
ExpMail borg@${domain} "${site} : Sauvegarde en Erreur !!!! : ${BACKUP_EXIT}" ${MAIL_RAPPORT} ${MESS_SAUVE_ERR}${LOGDATA}
|
ExpMail ${MAIL_RAPPORT} "${site} : Sauvegarde en Erreur !!!! : ${BACKUP_EXIT}" ${MESS_SAUVE_ERR}${LOGDATA}
|
||||||
IFS=' '
|
IFS=' '
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
@@ -30,12 +30,12 @@ while read line ; do
|
|||||||
sed "s%\(.*\)--clean_val--\(.*\)%\1${JIRAFEAU_DIR}\2%" <<< ${line}
|
sed "s%\(.*\)--clean_val--\(.*\)%\1${JIRAFEAU_DIR}\2%" <<< ${line}
|
||||||
continue
|
continue
|
||||||
;;
|
;;
|
||||||
*DATABASE*)
|
*DATABASE*|*DB_NAME*)
|
||||||
dbName="$(sed "s/\([^_]*\)_.*/\1/" <<< ${line})_$(apg -n 1 -m 2 -M NCL | cut -c 1-2)"
|
dbName="$(sed "s/\([^_]*\)_.*/\1/" <<< ${line})_$(apg -n 1 -m 2 -M NCL | cut -c 1-2)"
|
||||||
sed "s/\(.*\)--clean_val--\(.*\)/\1${dbName}\2/" <<< ${line}
|
sed "s/\(.*\)--clean_val--\(.*\)/\1${dbName}\2/" <<< ${line}
|
||||||
continue
|
continue
|
||||||
;;
|
;;
|
||||||
*ROOT_PASSWORD*|*PASSWORD*)
|
*ROOT_PASSWORD*|*PASSWORD*|*SECRET*)
|
||||||
pass="$(apg -n 1 -m 16 -M NCL)"
|
pass="$(apg -n 1 -m 16 -M NCL)"
|
||||||
sed "s/\(.*\)--clean_val--\(.*\)/\1${pass}\2/" <<< ${line}
|
sed "s/\(.*\)--clean_val--\(.*\)/\1${pass}\2/" <<< ${line}
|
||||||
continue
|
continue
|
||||||
|
@@ -84,7 +84,6 @@ jirafeauUpdate(){
|
|||||||
updateEnvDB "etherpad" "${KAZ_KEY_DIR}/env-${etherpadDBName}" "${etherpadDBName}"
|
updateEnvDB "etherpad" "${KAZ_KEY_DIR}/env-${etherpadDBName}" "${etherpadDBName}"
|
||||||
updateEnvDB "framadate" "${KAZ_KEY_DIR}/env-${framadateDBName}" "${framadateDBName}"
|
updateEnvDB "framadate" "${KAZ_KEY_DIR}/env-${framadateDBName}" "${framadateDBName}"
|
||||||
updateEnvDB "gitea" "${KAZ_KEY_DIR}/env-${gitDBName}" "${gitDBName}"
|
updateEnvDB "gitea" "${KAZ_KEY_DIR}/env-${gitDBName}" "${gitDBName}"
|
||||||
updateEnvDB "mattermost" "${KAZ_KEY_DIR}/env-${mattermostDBName}" "${mattermostDBName}"
|
|
||||||
updateEnvDB "nextcloud" "${KAZ_KEY_DIR}/env-${nextcloudDBName}" "${nextcloudDBName}"
|
updateEnvDB "nextcloud" "${KAZ_KEY_DIR}/env-${nextcloudDBName}" "${nextcloudDBName}"
|
||||||
updateEnvDB "roundcube" "${KAZ_KEY_DIR}/env-${roundcubeDBName}" "${roundcubeDBName}"
|
updateEnvDB "roundcube" "${KAZ_KEY_DIR}/env-${roundcubeDBName}" "${roundcubeDBName}"
|
||||||
updateEnvDB "sympa" "${KAZ_KEY_DIR}/env-${sympaDBName}" "${sympaDBName}"
|
updateEnvDB "sympa" "${KAZ_KEY_DIR}/env-${sympaDBName}" "${sympaDBName}"
|
||||||
@@ -92,6 +91,8 @@ updateEnvDB "vigilo" "${KAZ_KEY_DIR}/env-${vigiloDBName}" "${vigiloDBName}"
|
|||||||
updateEnvDB "wp" "${KAZ_KEY_DIR}/env-${wordpressDBName}" "${wordpressDBName}"
|
updateEnvDB "wp" "${KAZ_KEY_DIR}/env-${wordpressDBName}" "${wordpressDBName}"
|
||||||
updateEnvDB "vaultwarden" "${KAZ_KEY_DIR}/env-${vaultwardenDBName}" "${vaultwardenDBName}"
|
updateEnvDB "vaultwarden" "${KAZ_KEY_DIR}/env-${vaultwardenDBName}" "${vaultwardenDBName}"
|
||||||
updateEnvDB "castopod" "${KAZ_KEY_DIR}/env-${castopodDBName}" "${castopodDBName}"
|
updateEnvDB "castopod" "${KAZ_KEY_DIR}/env-${castopodDBName}" "${castopodDBName}"
|
||||||
|
updateEnvDB "spip" "${KAZ_KEY_DIR}/env-${spipDBName}" "${spipDBName}"
|
||||||
|
updateEnvDB "mastodon" "${KAZ_KEY_DIR}/env-${mastodonDBName}" "${mastodonDBName}"
|
||||||
|
|
||||||
updateEnv "apikaz" "${KAZ_KEY_DIR}/env-${apikazServName}"
|
updateEnv "apikaz" "${KAZ_KEY_DIR}/env-${apikazServName}"
|
||||||
updateEnv "ethercalc" "${KAZ_KEY_DIR}/env-${ethercalcServName}"
|
updateEnv "ethercalc" "${KAZ_KEY_DIR}/env-${ethercalcServName}"
|
||||||
@@ -101,6 +102,7 @@ updateEnv "gandi" "${KAZ_KEY_DIR}/env-gandi"
|
|||||||
updateEnv "gitea" "${KAZ_KEY_DIR}/env-${gitServName}"
|
updateEnv "gitea" "${KAZ_KEY_DIR}/env-${gitServName}"
|
||||||
updateEnv "jirafeau" "${KAZ_KEY_DIR}/env-${jirafeauServName}"
|
updateEnv "jirafeau" "${KAZ_KEY_DIR}/env-${jirafeauServName}"
|
||||||
updateEnv "mattermost" "${KAZ_KEY_DIR}/env-${mattermostServName}"
|
updateEnv "mattermost" "${KAZ_KEY_DIR}/env-${mattermostServName}"
|
||||||
|
updateEnv "mattermost" "${KAZ_KEY_DIR}/env-${mattermostDBName}"
|
||||||
updateEnv "nextcloud" "${KAZ_KEY_DIR}/env-${nextcloudServName}"
|
updateEnv "nextcloud" "${KAZ_KEY_DIR}/env-${nextcloudServName}"
|
||||||
updateEnv "office" "${KAZ_KEY_DIR}/env-${officeServName}"
|
updateEnv "office" "${KAZ_KEY_DIR}/env-${officeServName}"
|
||||||
updateEnv "roundcube" "${KAZ_KEY_DIR}/env-${roundcubeServName}"
|
updateEnv "roundcube" "${KAZ_KEY_DIR}/env-${roundcubeServName}"
|
||||||
@@ -113,7 +115,11 @@ updateEnv "mobilizon" "${KAZ_KEY_DIR}/env-${mobilizonServName}"
|
|||||||
updateEnv "mobilizon" "${KAZ_KEY_DIR}/env-${mobilizonDBName}"
|
updateEnv "mobilizon" "${KAZ_KEY_DIR}/env-${mobilizonDBName}"
|
||||||
updateEnv "vaultwarden" "${KAZ_KEY_DIR}/env-${vaultwardenServName}"
|
updateEnv "vaultwarden" "${KAZ_KEY_DIR}/env-${vaultwardenServName}"
|
||||||
updateEnv "castopod" "${KAZ_KEY_DIR}/env-${castopodServName}"
|
updateEnv "castopod" "${KAZ_KEY_DIR}/env-${castopodServName}"
|
||||||
|
updateEnv "spip" "${KAZ_KEY_DIR}/env-${spipServName}"
|
||||||
updateEnv "ldap" "${KAZ_KEY_DIR}/env-${ldapUIName}"
|
updateEnv "ldap" "${KAZ_KEY_DIR}/env-${ldapUIName}"
|
||||||
|
updateEnv "peertube" "${KAZ_KEY_DIR}/env-${peertubeServName}"
|
||||||
|
updateEnv "peertube" "${KAZ_KEY_DIR}/env-${peertubeDBName}" "${peertubeDBName}"
|
||||||
|
updateEnv "mastodon" "${KAZ_KEY_DIR}/env-${mastodonServName}"
|
||||||
|
|
||||||
|
|
||||||
framadateUpdate
|
framadateUpdate
|
||||||
|
@@ -1,2 +1,2 @@
|
|||||||
proxy
|
# proxy
|
||||||
#traefik
|
traefik
|
||||||
|
@@ -4,7 +4,7 @@ dokuwiki
|
|||||||
paheko
|
paheko
|
||||||
gitea
|
gitea
|
||||||
jirafeau
|
jirafeau
|
||||||
mattermost
|
#mattermost
|
||||||
roundcube
|
roundcube
|
||||||
mobilizon
|
mobilizon
|
||||||
vaultwarden
|
vaultwarden
|
||||||
|
@@ -4,3 +4,4 @@ collabora
|
|||||||
etherpad
|
etherpad
|
||||||
web
|
web
|
||||||
imapsync
|
imapsync
|
||||||
|
spip
|
||||||
|
@@ -93,13 +93,15 @@ vaultwardenHost=koffre
|
|||||||
traefikHost=dashboard
|
traefikHost=dashboard
|
||||||
imapsyncHost=imapsync
|
imapsyncHost=imapsync
|
||||||
castopodHost=pod
|
castopodHost=pod
|
||||||
|
spipHost=spip
|
||||||
|
mastodonHost=masto
|
||||||
apikazHost=apikaz
|
apikazHost=apikaz
|
||||||
snappymailHost=snappymail
|
snappymailHost=snappymail
|
||||||
|
|
||||||
########################################
|
########################################
|
||||||
# ports internes
|
# ports internes
|
||||||
|
|
||||||
matterPort=8000
|
matterPort=8065
|
||||||
imapsyncPort=8080
|
imapsyncPort=8080
|
||||||
apikaz=5000
|
apikaz=5000
|
||||||
|
|
||||||
@@ -147,6 +149,10 @@ ldapUIName=ldapUI
|
|||||||
imapsyncServName=imapsyncServ
|
imapsyncServName=imapsyncServ
|
||||||
castopodDBName=castopodDB
|
castopodDBName=castopodDB
|
||||||
castopodServName=castopodServ
|
castopodServName=castopodServ
|
||||||
|
mastodonServName=mastodonServ
|
||||||
|
spipDBName=spipDB
|
||||||
|
spipServName=spipServ
|
||||||
|
mastodonDBName=mastodonDB
|
||||||
apikazServName=apikazServ
|
apikazServName=apikazServ
|
||||||
|
|
||||||
########################################
|
########################################
|
||||||
|
@@ -13,6 +13,8 @@ services:
|
|||||||
- orgaDB:/var/lib/mysql
|
- orgaDB:/var/lib/mysql
|
||||||
- /etc/localtime:/etc/localtime:ro
|
- /etc/localtime:/etc/localtime:ro
|
||||||
- /etc/timezone:/etc/timezone:ro
|
- /etc/timezone:/etc/timezone:ro
|
||||||
|
environment:
|
||||||
|
- MARIADB_AUTO_UPGRADE=1
|
||||||
env_file:
|
env_file:
|
||||||
- ../../secret/env-${nextcloudDBName}
|
- ../../secret/env-${nextcloudDBName}
|
||||||
# - ../../secret/env-${mattermostDBName}
|
# - ../../secret/env-${mattermostDBName}
|
||||||
@@ -214,6 +216,31 @@ services:
|
|||||||
- ../../secret/env-${castopodServName}
|
- ../../secret/env-${castopodServName}
|
||||||
command: --requirepass ${castopodRedisPassword}
|
command: --requirepass ${castopodRedisPassword}
|
||||||
#}}
|
#}}
|
||||||
|
#{{spip
|
||||||
|
spip:
|
||||||
|
image: ipeos/spip:4.4
|
||||||
|
restart: ${restartPolicy}
|
||||||
|
depends_on:
|
||||||
|
- db
|
||||||
|
links:
|
||||||
|
- db
|
||||||
|
env_file:
|
||||||
|
- ../../secret/env-${spipServName}
|
||||||
|
environment:
|
||||||
|
- SPIP_AUTO_INSTALL=1
|
||||||
|
- SPIP_DB_HOST=db
|
||||||
|
- SPIP_SITE_ADDRESS=https://${orga}${spipHost}.${domain}
|
||||||
|
expose:
|
||||||
|
- 80
|
||||||
|
labels:
|
||||||
|
- "traefik.enable=true"
|
||||||
|
- "traefik.http.routers.${orga}${spipServName}.rule=Host(`${orga}${spipHost}.${domain}`){{FOREIGN_SPIP}}"
|
||||||
|
networks:
|
||||||
|
- orgaNet
|
||||||
|
volumes:
|
||||||
|
- spip:/usr/src/spip
|
||||||
|
#}}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -296,8 +323,13 @@ volumes:
|
|||||||
castopodCache:
|
castopodCache:
|
||||||
external: true
|
external: true
|
||||||
name: orga_${orga}castopodCache
|
name: orga_${orga}castopodCache
|
||||||
|
|
||||||
#}}
|
#}}
|
||||||
|
#{{spip
|
||||||
|
spip:
|
||||||
|
external: true
|
||||||
|
name: orga_${orga}spip
|
||||||
|
#}}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
|
@@ -68,6 +68,18 @@ GRANT ALL ON ${castopod_MYSQL_DATABASE}.* TO '${castopod_MYSQL_USER}'@'%' IDENTI
|
|||||||
|
|
||||||
FLUSH PRIVILEGES;"
|
FLUSH PRIVILEGES;"
|
||||||
;;
|
;;
|
||||||
|
'spip' )
|
||||||
|
SQL="$SQL
|
||||||
|
CREATE DATABASE IF NOT EXISTS ${spip_MYSQL_DATABASE};
|
||||||
|
|
||||||
|
DROP USER IF EXISTS '${spip_MYSQL_USER}';
|
||||||
|
CREATE USER '${spip_MYSQL_USER}'@'%';
|
||||||
|
|
||||||
|
GRANT ALL ON ${spip_MYSQL_DATABASE}.* TO '${spip_MYSQL_USER}'@'%' IDENTIFIED BY '${spip_MYSQL_PASSWORD}';
|
||||||
|
|
||||||
|
FLUSH PRIVILEGES;"
|
||||||
|
;;
|
||||||
|
|
||||||
|
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
@@ -37,3 +37,7 @@ docker volume create --name=orga_${orga}wordpress
|
|||||||
docker volume create --name=orga_${orga}castopodCache
|
docker volume create --name=orga_${orga}castopodCache
|
||||||
docker volume create --name=orga_${orga}castopodMedia
|
docker volume create --name=orga_${orga}castopodMedia
|
||||||
#}}
|
#}}
|
||||||
|
#{{spip
|
||||||
|
docker volume create --name=orga_${orga}spip
|
||||||
|
#}}
|
||||||
|
|
||||||
|
@@ -20,7 +20,7 @@ STAGE_CREATE=
|
|||||||
STAGE_INIT=
|
STAGE_INIT=
|
||||||
|
|
||||||
usage(){
|
usage(){
|
||||||
echo "Usage: $0 [-h] [-l] [+/-paheko] [-/+cloud [-/+collabora}]] [+/-agora] [+/-wiki] [+/-wp] [+/-pod] [x{G/M/k}] OrgaName"
|
echo "Usage: $0 [-h] [-l] [+/-paheko] [-/+cloud [-/+collabora}]] [+/-agora] [+/-wiki] [+/-wp] [+/-pod] [+/-spip] [x{G/M/k}] OrgaName"
|
||||||
echo " -h|--help : this help"
|
echo " -h|--help : this help"
|
||||||
echo " -l|--list : list service"
|
echo " -l|--list : list service"
|
||||||
|
|
||||||
@@ -34,6 +34,7 @@ usage(){
|
|||||||
echo " +/- wiki : on/off wiki"
|
echo " +/- wiki : on/off wiki"
|
||||||
echo " +/- wp|word* : on/off wp"
|
echo " +/- wp|word* : on/off wp"
|
||||||
echo " +/- casto*|pod : on/off castopod"
|
echo " +/- casto*|pod : on/off castopod"
|
||||||
|
echo " +/- spip : on/off spip"
|
||||||
echo " x[GMk] : set quota"
|
echo " x[GMk] : set quota"
|
||||||
echo " OrgaName : name must contain a-z0-9_\-"
|
echo " OrgaName : name must contain a-z0-9_\-"
|
||||||
}
|
}
|
||||||
@@ -141,6 +142,7 @@ export agora=$(flagInCompose docker-compose.yml agora: off)
|
|||||||
export wiki=$(flagInCompose docker-compose.yml dokuwiki: off)
|
export wiki=$(flagInCompose docker-compose.yml dokuwiki: off)
|
||||||
export wp=$(flagInCompose docker-compose.yml wordpress: off)
|
export wp=$(flagInCompose docker-compose.yml wordpress: off)
|
||||||
export castopod=$(flagInCompose docker-compose.yml castopod: off)
|
export castopod=$(flagInCompose docker-compose.yml castopod: off)
|
||||||
|
export spip=$(flagInCompose docker-compose.yml spip: off)
|
||||||
export db="off"
|
export db="off"
|
||||||
export services="off"
|
export services="off"
|
||||||
export paheko=$([[ -f usePaheko ]] && echo "on" || echo "off")
|
export paheko=$([[ -f usePaheko ]] && echo "on" || echo "off")
|
||||||
@@ -159,7 +161,7 @@ INITCMD2="--install"
|
|||||||
for ARG in "$@"; do
|
for ARG in "$@"; do
|
||||||
case "${ARG}" in
|
case "${ARG}" in
|
||||||
'-show' )
|
'-show' )
|
||||||
for i in cloud collabora agora wiki wp castopod db; do
|
for i in cloud collabora agora wiki wp castopod spip db; do
|
||||||
echo "${i}=${!i}"
|
echo "${i}=${!i}"
|
||||||
done
|
done
|
||||||
exit;;
|
exit;;
|
||||||
@@ -225,6 +227,11 @@ for ARG in "$@"; do
|
|||||||
DBaInitialiser="$DBaInitialiser castopod"
|
DBaInitialiser="$DBaInitialiser castopod"
|
||||||
INITCMD2="$INITCMD2 -pod"
|
INITCMD2="$INITCMD2 -pod"
|
||||||
;;
|
;;
|
||||||
|
'+spip' )
|
||||||
|
spip="on"
|
||||||
|
DBaInitialiser="$DBaInitialiser spip"
|
||||||
|
;;
|
||||||
|
|
||||||
[.0-9]*[GMk] )
|
[.0-9]*[GMk] )
|
||||||
quota="${ARG}"
|
quota="${ARG}"
|
||||||
;;
|
;;
|
||||||
@@ -304,6 +311,13 @@ if [[ "${castopod}" = "on" ]]; then
|
|||||||
else
|
else
|
||||||
DEL_DOMAIN+="${ORGA}-${castopodHost} "
|
DEL_DOMAIN+="${ORGA}-${castopodHost} "
|
||||||
fi
|
fi
|
||||||
|
if [[ "${spip}" = "on" ]]; then
|
||||||
|
DOMAIN_AREA+=" - ${ORGA}-\${spipServName}:${ORGA}-\${spipHost}.\${domain}\n"
|
||||||
|
ADD_DOMAIN+="${ORGA}-${spipHost} "
|
||||||
|
else
|
||||||
|
DEL_DOMAIN+="${ORGA}-${spipHost} "
|
||||||
|
fi
|
||||||
|
|
||||||
DOMAIN_AREA+="}}\n"
|
DOMAIN_AREA+="}}\n"
|
||||||
|
|
||||||
if [[ -n "${STAGE_DEFAULT}${STAGE_CREATE}" ]]; then
|
if [[ -n "${STAGE_DEFAULT}${STAGE_CREATE}" ]]; then
|
||||||
@@ -358,6 +372,9 @@ update() {
|
|||||||
sed "s/\([^ ]*\) ${ORGA};/ \|\| Host(\`\1\`)/" | tr -d "\r\n")
|
sed "s/\([^ ]*\) ${ORGA};/ \|\| Host(\`\1\`)/" | tr -d "\r\n")
|
||||||
FOREIGN_POD=$(grep " ${ORGA};" "${KAZ_CONF_PROXY_DIR}/pod_kaz_map" 2>/dev/null | \
|
FOREIGN_POD=$(grep " ${ORGA};" "${KAZ_CONF_PROXY_DIR}/pod_kaz_map" 2>/dev/null | \
|
||||||
sed "s/\([^ ]*\) ${ORGA};/ \|\| Host(\`\1\`)/" | tr -d "\r\n")
|
sed "s/\([^ ]*\) ${ORGA};/ \|\| Host(\`\1\`)/" | tr -d "\r\n")
|
||||||
|
FOREIGN_SPIP=$(grep " ${ORGA};" "${KAZ_CONF_PROXY_DIR}/spip_kaz_map" 2>/dev/null | \
|
||||||
|
sed "s/\([^ ]*\) ${ORGA};/ \|\| Host(\`\1\`)/" | tr -d "\r\n")
|
||||||
|
|
||||||
awk '
|
awk '
|
||||||
BEGIN {cp=1}
|
BEGIN {cp=1}
|
||||||
/#}}/ {cp=1 ; next};
|
/#}}/ {cp=1 ; next};
|
||||||
@@ -371,6 +388,7 @@ update() {
|
|||||||
-e "s/{{FOREIGN_NC}}/${FOREIGN_NC}/"\
|
-e "s/{{FOREIGN_NC}}/${FOREIGN_NC}/"\
|
||||||
-e "s/{{FOREIGN_DW}}/${FOREIGN_DW}/"\
|
-e "s/{{FOREIGN_DW}}/${FOREIGN_DW}/"\
|
||||||
-e "s/{{FOREIGN_POD}}/${FOREIGN_POD}/"\
|
-e "s/{{FOREIGN_POD}}/${FOREIGN_POD}/"\
|
||||||
|
-e "s/{{FOREIGN_SPIP}}/${FOREIGN_SPIP}/"\
|
||||||
-e "s|\${orga}|${ORGA}-|g"
|
-e "s|\${orga}|${ORGA}-|g"
|
||||||
) > "$2"
|
) > "$2"
|
||||||
sed "s/storage_opt:.*/storage_opt: ${quota}/g" -i "$2"
|
sed "s/storage_opt:.*/storage_opt: ${quota}/g" -i "$2"
|
||||||
|
42
dockers/cadvisor/docker-compose.yml
Normal file
42
dockers/cadvisor/docker-compose.yml
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
services:
|
||||||
|
|
||||||
|
cadvisor:
|
||||||
|
image: gcr.io/cadvisor/cadvisor:v0.52.0
|
||||||
|
container_name: cadvisor
|
||||||
|
command:
|
||||||
|
- "--store_container_labels=false"
|
||||||
|
- "--whitelisted_container_labels=com.docker.compose.project"
|
||||||
|
- "--housekeeping_interval=60s"
|
||||||
|
- "--docker_only=true"
|
||||||
|
- "--disable_metrics=percpu,sched,tcp,udp,disk,diskIO,hugetlb,referenced_memory,cpu_topology,resctrl"
|
||||||
|
networks:
|
||||||
|
- traefikNet
|
||||||
|
|
||||||
|
labels:
|
||||||
|
- "traefik.enable=true"
|
||||||
|
- "traefik.http.routers.cadvisor-secure.entrypoints=websecure"
|
||||||
|
- "traefik.http.routers.cadvisor-secure.rule=Host(`cadvisor-${site}.${domain}`)"
|
||||||
|
#- "traefik.http.routers.grafana-secure.tls=true"
|
||||||
|
- "traefik.http.routers.cadvisor-secure.service=cadvisor"
|
||||||
|
- "traefik.http.routers.cadvisor-secure.middlewares=test-adminipallowlist@file"
|
||||||
|
- "traefik.http.services.cadvisor.loadbalancer.server.port=8080"
|
||||||
|
- "traefik.docker.network=traefikNet"
|
||||||
|
|
||||||
|
# ports:
|
||||||
|
# - 8098:8080
|
||||||
|
volumes:
|
||||||
|
- /:/rootfs:ro
|
||||||
|
- /var/run:/var/run:ro
|
||||||
|
- /sys:/sys:ro
|
||||||
|
- /var/lib/docker/:/var/lib/docker:ro
|
||||||
|
- /dev/disk/:/dev/disk:ro
|
||||||
|
devices:
|
||||||
|
- /dev/kmsg
|
||||||
|
privileged: true
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
networks:
|
||||||
|
traefikNet:
|
||||||
|
external: true
|
||||||
|
name: traefikNet
|
||||||
|
|
@@ -27,11 +27,13 @@ services:
|
|||||||
- "traefik.docker.network=giteaNet"
|
- "traefik.docker.network=giteaNet"
|
||||||
|
|
||||||
db:
|
db:
|
||||||
image: mariadb:10.5
|
image: mariadb
|
||||||
container_name: ${gitDBName}
|
container_name: ${gitDBName}
|
||||||
restart: ${restartPolicy}
|
restart: ${restartPolicy}
|
||||||
env_file:
|
env_file:
|
||||||
- ../../secret/env-${gitDBName}
|
- ../../secret/env-${gitDBName}
|
||||||
|
environment:
|
||||||
|
- MARIADB_AUTO_UPGRADE=1
|
||||||
volumes:
|
volumes:
|
||||||
- gitDB:/var/lib/mysql
|
- gitDB:/var/lib/mysql
|
||||||
- /etc/timezone:/etc/timezone:ro
|
- /etc/timezone:/etc/timezone:ro
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
services:
|
services:
|
||||||
|
|
||||||
prometheus:
|
prometheus:
|
||||||
image: prom/prometheus:v2.15.2
|
image: prom/prometheus:v3.3.0
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
container_name: ${prometheusServName}
|
container_name: ${prometheusServName}
|
||||||
volumes:
|
volumes:
|
||||||
@@ -10,27 +10,27 @@ services:
|
|||||||
- /etc/timezone:/etc/timezone:ro
|
- /etc/timezone:/etc/timezone:ro
|
||||||
- /etc/localtime:/etc/localtime:ro
|
- /etc/localtime:/etc/localtime:ro
|
||||||
command:
|
command:
|
||||||
- "--web.route-prefix=/"
|
# - "--web.route-prefix=/"
|
||||||
- "--web.external-url=https://${site}.${domain}/prometheus"
|
# - "--web.external-url=https://prometheus.${domain}"
|
||||||
- "--config.file=/etc/prometheus/prometheus.yml"
|
- "--config.file=/etc/prometheus/prometheus.yml"
|
||||||
- "--storage.tsdb.path=/prometheus"
|
- "--storage.tsdb.path=/prometheus"
|
||||||
- "--web.console.libraries=/usr/share/prometheus/console_libraries"
|
- "--web.console.libraries=/usr/share/prometheus/console_libraries"
|
||||||
- "--web.console.templates=/usr/share/prometheus/consoles"
|
- "--web.console.templates=/usr/share/prometheus/consoles"
|
||||||
networks:
|
networks:
|
||||||
- traefikNet
|
- traefikNet
|
||||||
labels:
|
# labels:
|
||||||
- "traefik.enable=true"
|
# - "traefik.enable=true"
|
||||||
- "traefik.http.routers.prometheus-secure.entrypoints=websecure"
|
# - "traefik.http.routers.prometheus-secure.entrypoints=websecure"
|
||||||
- "traefik.http.middlewares.prometheus-stripprefix.stripprefix.prefixes=/prometheus"
|
# - "traefik.http.middlewares.prometheus-stripprefix.stripprefix.prefixes=/prometheus"
|
||||||
- "traefik.http.routers.prometheus-secure.rule=Host(`${site}.${domain}`) && PathPrefix(`/prometheus`)"
|
# - "traefik.http.routers.prometheus-secure.rule=Host(`prometheus.${domain}`)"
|
||||||
# - "traefik.http.routers.prometheus-secure.tls=true"
|
# # - "traefik.http.routers.prometheus-secure.tls=true"
|
||||||
- "traefik.http.routers.prometheus-secure.middlewares=prometheus-stripprefix,test-adminiallowlist@file,traefik-auth"
|
# - "traefik.http.routers.prometheus-secure.middlewares=prometheus-stripprefix,test-adminiallowlist@file,traefik-auth"
|
||||||
- "traefik.http.routers.prometheus-secure.service=prometheus"
|
# - "traefik.http.routers.prometheus-secure.service=prometheus"
|
||||||
- "traefik.http.services.prometheus.loadbalancer.server.port=9090"
|
# - "traefik.http.services.prometheus.loadbalancer.server.port=9090"
|
||||||
- "traefik.docker.network=traefikNet"
|
# - "traefik.docker.network=traefikNet"
|
||||||
|
|
||||||
grafana:
|
grafana:
|
||||||
image: grafana/grafana:6.6.1
|
image: grafana/grafana:11.6.0
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
container_name: ${grafanaServName}
|
container_name: ${grafanaServName}
|
||||||
volumes:
|
volumes:
|
||||||
@@ -48,8 +48,8 @@ services:
|
|||||||
- "traefik.enable=true"
|
- "traefik.enable=true"
|
||||||
- "traefik.http.routers.grafana-secure.entrypoints=websecure"
|
- "traefik.http.routers.grafana-secure.entrypoints=websecure"
|
||||||
- "traefik.http.middlewares.grafana-stripprefix.stripprefix.prefixes=/grafana"
|
- "traefik.http.middlewares.grafana-stripprefix.stripprefix.prefixes=/grafana"
|
||||||
- "traefik.http.routers.grafana-secure.rule=Host(`${site}.${domain}`) && PathPrefix(`/grafana`)"
|
- "traefik.http.routers.grafana-secure.rule=Host(`grafana.${domain}`)"
|
||||||
# - "traefik.http.routers.grafana-secure.tls=true"
|
#- "traefik.http.routers.grafana-secure.tls=true"
|
||||||
- "traefik.http.routers.grafana-secure.service=grafana"
|
- "traefik.http.routers.grafana-secure.service=grafana"
|
||||||
- "traefik.http.routers.grafana-secure.middlewares=grafana-stripprefix,test-adminipallowlist@file,traefik-auth"
|
- "traefik.http.routers.grafana-secure.middlewares=grafana-stripprefix,test-adminipallowlist@file,traefik-auth"
|
||||||
- "traefik.http.services.grafana.loadbalancer.server.port=3000"
|
- "traefik.http.services.grafana.loadbalancer.server.port=3000"
|
||||||
|
23545
dockers/grafana/grafana/provisioning/dashboards/Node_Exporter_Full.json
Normal file
23545
dockers/grafana/grafana/provisioning/dashboards/Node_Exporter_Full.json
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,874 @@
|
|||||||
|
{
|
||||||
|
"__inputs": [
|
||||||
|
{
|
||||||
|
"name": "DS_PROMETHEUS",
|
||||||
|
"label": "Prometheus",
|
||||||
|
"description": "",
|
||||||
|
"type": "datasource",
|
||||||
|
"pluginId": "prometheus",
|
||||||
|
"pluginName": "Prometheus"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"__elements": {},
|
||||||
|
"__requires": [
|
||||||
|
{
|
||||||
|
"type": "grafana",
|
||||||
|
"id": "grafana",
|
||||||
|
"name": "Grafana",
|
||||||
|
"version": "11.6.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "datasource",
|
||||||
|
"id": "prometheus",
|
||||||
|
"name": "Prometheus",
|
||||||
|
"version": "1.0.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "panel",
|
||||||
|
"id": "stat",
|
||||||
|
"name": "Stat",
|
||||||
|
"version": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "panel",
|
||||||
|
"id": "timeseries",
|
||||||
|
"name": "Time series",
|
||||||
|
"version": ""
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"annotations": {
|
||||||
|
"list": [
|
||||||
|
{
|
||||||
|
"builtIn": 1,
|
||||||
|
"datasource": {
|
||||||
|
"type": "grafana",
|
||||||
|
"uid": "-- Grafana --"
|
||||||
|
},
|
||||||
|
"enable": true,
|
||||||
|
"hide": true,
|
||||||
|
"iconColor": "rgba(0, 211, 255, 1)",
|
||||||
|
"name": "Annotations & Alerts",
|
||||||
|
"type": "dashboard"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"description": "Docker monitoring with Prometheus and cAdvisor",
|
||||||
|
"editable": true,
|
||||||
|
"fiscalYearStartMonth": 0,
|
||||||
|
"graphTooltip": 1,
|
||||||
|
"id": null,
|
||||||
|
"links": [
|
||||||
|
{
|
||||||
|
"asDropdown": false,
|
||||||
|
"icon": "external link",
|
||||||
|
"includeVars": false,
|
||||||
|
"keepTime": false,
|
||||||
|
"tags": [],
|
||||||
|
"targetBlank": true,
|
||||||
|
"title": "Portainer",
|
||||||
|
"tooltip": "",
|
||||||
|
"type": "link",
|
||||||
|
"url": "https://portainer.kaz.bzh/"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"panels": [
|
||||||
|
{
|
||||||
|
"collapsed": false,
|
||||||
|
"gridPos": {
|
||||||
|
"h": 1,
|
||||||
|
"w": 24,
|
||||||
|
"x": 0,
|
||||||
|
"y": 0
|
||||||
|
},
|
||||||
|
"id": 8,
|
||||||
|
"panels": [],
|
||||||
|
"repeat": "host",
|
||||||
|
"title": "$host",
|
||||||
|
"type": "row"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "prometheus",
|
||||||
|
"uid": "${DS_PROMETHEUS}"
|
||||||
|
},
|
||||||
|
"fieldConfig": {
|
||||||
|
"defaults": {
|
||||||
|
"mappings": [
|
||||||
|
{
|
||||||
|
"options": {
|
||||||
|
"match": "null",
|
||||||
|
"result": {
|
||||||
|
"text": "N/A"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": "special"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"thresholds": {
|
||||||
|
"mode": "absolute",
|
||||||
|
"steps": [
|
||||||
|
{
|
||||||
|
"color": "green"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"color": "red",
|
||||||
|
"value": 80
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"unit": "none"
|
||||||
|
},
|
||||||
|
"overrides": []
|
||||||
|
},
|
||||||
|
"gridPos": {
|
||||||
|
"h": 3,
|
||||||
|
"w": 8,
|
||||||
|
"x": 0,
|
||||||
|
"y": 1
|
||||||
|
},
|
||||||
|
"id": 7,
|
||||||
|
"maxDataPoints": 100,
|
||||||
|
"options": {
|
||||||
|
"colorMode": "none",
|
||||||
|
"graphMode": "none",
|
||||||
|
"justifyMode": "auto",
|
||||||
|
"orientation": "horizontal",
|
||||||
|
"percentChangeColorMode": "standard",
|
||||||
|
"reduceOptions": {
|
||||||
|
"calcs": [
|
||||||
|
"mean"
|
||||||
|
],
|
||||||
|
"fields": "",
|
||||||
|
"values": false
|
||||||
|
},
|
||||||
|
"showPercentChange": false,
|
||||||
|
"textMode": "auto",
|
||||||
|
"wideLayout": true
|
||||||
|
},
|
||||||
|
"pluginVersion": "11.6.0",
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "prometheus",
|
||||||
|
"uid": "${DS_PROMETHEUS}"
|
||||||
|
},
|
||||||
|
"editorMode": "code",
|
||||||
|
"expr": "count(container_last_seen{image!=\"\", host=\"$host\"})",
|
||||||
|
"intervalFactor": 2,
|
||||||
|
"legendFormat": "",
|
||||||
|
"metric": "container_last_seen",
|
||||||
|
"range": true,
|
||||||
|
"refId": "A",
|
||||||
|
"step": 240
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"title": "Running containers",
|
||||||
|
"transparent": true,
|
||||||
|
"type": "stat"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "prometheus",
|
||||||
|
"uid": "${DS_PROMETHEUS}"
|
||||||
|
},
|
||||||
|
"fieldConfig": {
|
||||||
|
"defaults": {
|
||||||
|
"mappings": [
|
||||||
|
{
|
||||||
|
"options": {
|
||||||
|
"match": "null",
|
||||||
|
"result": {
|
||||||
|
"text": "N/A"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": "special"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"thresholds": {
|
||||||
|
"mode": "absolute",
|
||||||
|
"steps": [
|
||||||
|
{
|
||||||
|
"color": "green"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"color": "red",
|
||||||
|
"value": 80
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"unit": "mbytes"
|
||||||
|
},
|
||||||
|
"overrides": []
|
||||||
|
},
|
||||||
|
"gridPos": {
|
||||||
|
"h": 3,
|
||||||
|
"w": 8,
|
||||||
|
"x": 8,
|
||||||
|
"y": 1
|
||||||
|
},
|
||||||
|
"id": 5,
|
||||||
|
"maxDataPoints": 100,
|
||||||
|
"options": {
|
||||||
|
"colorMode": "none",
|
||||||
|
"graphMode": "none",
|
||||||
|
"justifyMode": "auto",
|
||||||
|
"orientation": "horizontal",
|
||||||
|
"percentChangeColorMode": "standard",
|
||||||
|
"reduceOptions": {
|
||||||
|
"calcs": [
|
||||||
|
"lastNotNull"
|
||||||
|
],
|
||||||
|
"fields": "",
|
||||||
|
"values": false
|
||||||
|
},
|
||||||
|
"showPercentChange": false,
|
||||||
|
"textMode": "auto",
|
||||||
|
"wideLayout": true
|
||||||
|
},
|
||||||
|
"pluginVersion": "11.6.0",
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "prometheus",
|
||||||
|
"uid": "${DS_PROMETHEUS}"
|
||||||
|
},
|
||||||
|
"editorMode": "code",
|
||||||
|
"expr": "sum(container_memory_usage_bytes{image!=\"\", host=\"$host\"})/1024/1024",
|
||||||
|
"intervalFactor": 2,
|
||||||
|
"legendFormat": "",
|
||||||
|
"metric": "container_memory_usage_bytes",
|
||||||
|
"range": true,
|
||||||
|
"refId": "A",
|
||||||
|
"step": 240
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"title": "Total Memory Usage",
|
||||||
|
"transparent": true,
|
||||||
|
"type": "stat"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "prometheus",
|
||||||
|
"uid": "${DS_PROMETHEUS}"
|
||||||
|
},
|
||||||
|
"fieldConfig": {
|
||||||
|
"defaults": {
|
||||||
|
"mappings": [
|
||||||
|
{
|
||||||
|
"options": {
|
||||||
|
"match": "null",
|
||||||
|
"result": {
|
||||||
|
"text": "N/A"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": "special"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"max": 100,
|
||||||
|
"min": 0,
|
||||||
|
"thresholds": {
|
||||||
|
"mode": "absolute",
|
||||||
|
"steps": [
|
||||||
|
{
|
||||||
|
"color": "green"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"color": "red",
|
||||||
|
"value": 80
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"unit": "percent"
|
||||||
|
},
|
||||||
|
"overrides": []
|
||||||
|
},
|
||||||
|
"gridPos": {
|
||||||
|
"h": 3,
|
||||||
|
"w": 8,
|
||||||
|
"x": 16,
|
||||||
|
"y": 1
|
||||||
|
},
|
||||||
|
"id": 6,
|
||||||
|
"maxDataPoints": 100,
|
||||||
|
"options": {
|
||||||
|
"colorMode": "none",
|
||||||
|
"graphMode": "none",
|
||||||
|
"justifyMode": "auto",
|
||||||
|
"orientation": "horizontal",
|
||||||
|
"percentChangeColorMode": "standard",
|
||||||
|
"reduceOptions": {
|
||||||
|
"calcs": [
|
||||||
|
"lastNotNull"
|
||||||
|
],
|
||||||
|
"fields": "",
|
||||||
|
"values": false
|
||||||
|
},
|
||||||
|
"showPercentChange": false,
|
||||||
|
"textMode": "auto",
|
||||||
|
"wideLayout": true
|
||||||
|
},
|
||||||
|
"pluginVersion": "11.6.0",
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "prometheus",
|
||||||
|
"uid": "${DS_PROMETHEUS}"
|
||||||
|
},
|
||||||
|
"editorMode": "code",
|
||||||
|
"expr": "sum(rate(container_cpu_user_seconds_total{image!=\"\", host=\"$host\"}[5m]) * 100)",
|
||||||
|
"intervalFactor": 2,
|
||||||
|
"legendFormat": "",
|
||||||
|
"metric": "container_memory_usage_bytes",
|
||||||
|
"range": true,
|
||||||
|
"refId": "A",
|
||||||
|
"step": 240
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"title": "Total CPU Usage",
|
||||||
|
"transparent": true,
|
||||||
|
"type": "stat"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "prometheus",
|
||||||
|
"uid": "${DS_PROMETHEUS}"
|
||||||
|
},
|
||||||
|
"fieldConfig": {
|
||||||
|
"defaults": {
|
||||||
|
"color": {
|
||||||
|
"mode": "palette-classic"
|
||||||
|
},
|
||||||
|
"custom": {
|
||||||
|
"axisBorderShow": false,
|
||||||
|
"axisCenteredZero": false,
|
||||||
|
"axisColorMode": "text",
|
||||||
|
"axisLabel": "",
|
||||||
|
"axisPlacement": "auto",
|
||||||
|
"barAlignment": 0,
|
||||||
|
"barWidthFactor": 0.6,
|
||||||
|
"drawStyle": "line",
|
||||||
|
"fillOpacity": 10,
|
||||||
|
"gradientMode": "none",
|
||||||
|
"hideFrom": {
|
||||||
|
"legend": false,
|
||||||
|
"tooltip": false,
|
||||||
|
"viz": false
|
||||||
|
},
|
||||||
|
"insertNulls": false,
|
||||||
|
"lineInterpolation": "linear",
|
||||||
|
"lineWidth": 2,
|
||||||
|
"pointSize": 5,
|
||||||
|
"scaleDistribution": {
|
||||||
|
"type": "linear"
|
||||||
|
},
|
||||||
|
"showPoints": "never",
|
||||||
|
"spanNulls": true,
|
||||||
|
"stacking": {
|
||||||
|
"group": "A",
|
||||||
|
"mode": "none"
|
||||||
|
},
|
||||||
|
"thresholdsStyle": {
|
||||||
|
"mode": "off"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"links": [
|
||||||
|
{
|
||||||
|
"oneClick": false,
|
||||||
|
"targetBlank": true,
|
||||||
|
"title": "Portainer host",
|
||||||
|
"url": "https://portainer.kaz.bzh/#!/${__field.labels.portainer_id}/docker/containers"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"targetBlank": true,
|
||||||
|
"title": "Portainer container",
|
||||||
|
"url": "https://portainer.kaz.bzh/#!/${__field.labels.portainer_id}/docker/containers/${__field.labels.id.21}${__field.labels.id.22}${__field.labels.id.23}${__field.labels.id.24}${__field.labels.id.25}${__field.labels.id.26}${__field.labels.id.27}${__field.labels.id.28}${__field.labels.id.29}${__field.labels.id.30}${__field.labels.id.31}${__field.labels.id.32}"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"mappings": [],
|
||||||
|
"thresholds": {
|
||||||
|
"mode": "absolute",
|
||||||
|
"steps": [
|
||||||
|
{
|
||||||
|
"color": "green"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"color": "red",
|
||||||
|
"value": 80
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"unit": "percent"
|
||||||
|
},
|
||||||
|
"overrides": [
|
||||||
|
{
|
||||||
|
"__systemRef": "hideSeriesFrom",
|
||||||
|
"matcher": {
|
||||||
|
"id": "byNames",
|
||||||
|
"options": {
|
||||||
|
"mode": "exclude",
|
||||||
|
"names": [
|
||||||
|
"lagalette-orga/lagalette-wpServ"
|
||||||
|
],
|
||||||
|
"prefix": "All except:",
|
||||||
|
"readOnly": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"properties": [
|
||||||
|
{
|
||||||
|
"id": "custom.hideFrom",
|
||||||
|
"value": {
|
||||||
|
"legend": false,
|
||||||
|
"tooltip": false,
|
||||||
|
"viz": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"gridPos": {
|
||||||
|
"h": 7,
|
||||||
|
"w": 24,
|
||||||
|
"x": 0,
|
||||||
|
"y": 4
|
||||||
|
},
|
||||||
|
"id": 2,
|
||||||
|
"options": {
|
||||||
|
"legend": {
|
||||||
|
"calcs": [
|
||||||
|
"mean",
|
||||||
|
"lastNotNull"
|
||||||
|
],
|
||||||
|
"displayMode": "table",
|
||||||
|
"placement": "right",
|
||||||
|
"showLegend": true,
|
||||||
|
"sortBy": "Mean",
|
||||||
|
"sortDesc": true
|
||||||
|
},
|
||||||
|
"tooltip": {
|
||||||
|
"hideZeros": false,
|
||||||
|
"mode": "multi",
|
||||||
|
"sort": "desc"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pluginVersion": "11.6.0",
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "prometheus",
|
||||||
|
"uid": "${DS_PROMETHEUS}"
|
||||||
|
},
|
||||||
|
"editorMode": "code",
|
||||||
|
"expr": "rate(container_cpu_user_seconds_total{image!=\"\", host=\"$host\"}[5m]) * 100",
|
||||||
|
"intervalFactor": 2,
|
||||||
|
"legendFormat": "{{container_label_com_docker_compose_project}}/{{name}}",
|
||||||
|
"metric": "cpu",
|
||||||
|
"range": true,
|
||||||
|
"refId": "A",
|
||||||
|
"step": 10
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"title": "CPU Usage",
|
||||||
|
"type": "timeseries"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "prometheus",
|
||||||
|
"uid": "${DS_PROMETHEUS}"
|
||||||
|
},
|
||||||
|
"fieldConfig": {
|
||||||
|
"defaults": {
|
||||||
|
"color": {
|
||||||
|
"mode": "palette-classic"
|
||||||
|
},
|
||||||
|
"custom": {
|
||||||
|
"axisBorderShow": false,
|
||||||
|
"axisCenteredZero": false,
|
||||||
|
"axisColorMode": "text",
|
||||||
|
"axisLabel": "",
|
||||||
|
"axisPlacement": "auto",
|
||||||
|
"barAlignment": 0,
|
||||||
|
"barWidthFactor": 0.6,
|
||||||
|
"drawStyle": "line",
|
||||||
|
"fillOpacity": 10,
|
||||||
|
"gradientMode": "none",
|
||||||
|
"hideFrom": {
|
||||||
|
"legend": false,
|
||||||
|
"tooltip": false,
|
||||||
|
"viz": false
|
||||||
|
},
|
||||||
|
"insertNulls": false,
|
||||||
|
"lineInterpolation": "linear",
|
||||||
|
"lineWidth": 2,
|
||||||
|
"pointSize": 5,
|
||||||
|
"scaleDistribution": {
|
||||||
|
"type": "linear"
|
||||||
|
},
|
||||||
|
"showPoints": "never",
|
||||||
|
"spanNulls": true,
|
||||||
|
"stacking": {
|
||||||
|
"group": "A",
|
||||||
|
"mode": "none"
|
||||||
|
},
|
||||||
|
"thresholdsStyle": {
|
||||||
|
"mode": "off"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"links": [
|
||||||
|
{
|
||||||
|
"targetBlank": true,
|
||||||
|
"title": "Portainer host",
|
||||||
|
"url": "https://portainer.kaz.bzh/#!/${__field.labels.portainer_id}/docker/containers"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"targetBlank": true,
|
||||||
|
"title": "Portainer container",
|
||||||
|
"url": "https://portainer.kaz.bzh/#!/${__field.labels.portainer_id}/docker/containers/${__field.labels.id.21}${__field.labels.id.22}${__field.labels.id.23}${__field.labels.id.24}${__field.labels.id.25}${__field.labels.id.26}${__field.labels.id.27}${__field.labels.id.28}${__field.labels.id.29}${__field.labels.id.30}${__field.labels.id.31}${__field.labels.id.32}"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"mappings": [],
|
||||||
|
"thresholds": {
|
||||||
|
"mode": "absolute",
|
||||||
|
"steps": [
|
||||||
|
{
|
||||||
|
"color": "green"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"color": "red",
|
||||||
|
"value": 80
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"unit": "bytes"
|
||||||
|
},
|
||||||
|
"overrides": []
|
||||||
|
},
|
||||||
|
"gridPos": {
|
||||||
|
"h": 7,
|
||||||
|
"w": 24,
|
||||||
|
"x": 0,
|
||||||
|
"y": 11
|
||||||
|
},
|
||||||
|
"id": 1,
|
||||||
|
"links": [
|
||||||
|
{
|
||||||
|
"targetBlank": true,
|
||||||
|
"title": "Portainer",
|
||||||
|
"url": "https://portainer.kaz.bzh"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"options": {
|
||||||
|
"legend": {
|
||||||
|
"calcs": [
|
||||||
|
"mean",
|
||||||
|
"lastNotNull"
|
||||||
|
],
|
||||||
|
"displayMode": "table",
|
||||||
|
"placement": "right",
|
||||||
|
"showLegend": true
|
||||||
|
},
|
||||||
|
"tooltip": {
|
||||||
|
"hideZeros": false,
|
||||||
|
"mode": "multi",
|
||||||
|
"sort": "desc"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pluginVersion": "11.6.0",
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "prometheus",
|
||||||
|
"uid": "${DS_PROMETHEUS}"
|
||||||
|
},
|
||||||
|
"editorMode": "builder",
|
||||||
|
"expr": "container_memory_usage_bytes{image!=\"\", host=\"$host\"}",
|
||||||
|
"hide": false,
|
||||||
|
"intervalFactor": 2,
|
||||||
|
"legendFormat": "{{container_label_com_docker_compose_project}}/{{name}}",
|
||||||
|
"metric": "container_memory_usage_bytes",
|
||||||
|
"range": true,
|
||||||
|
"refId": "A",
|
||||||
|
"step": 10
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"title": "Memory Usage",
|
||||||
|
"type": "timeseries"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "prometheus",
|
||||||
|
"uid": "${DS_PROMETHEUS}"
|
||||||
|
},
|
||||||
|
"fieldConfig": {
|
||||||
|
"defaults": {
|
||||||
|
"color": {
|
||||||
|
"mode": "palette-classic"
|
||||||
|
},
|
||||||
|
"custom": {
|
||||||
|
"axisBorderShow": false,
|
||||||
|
"axisCenteredZero": false,
|
||||||
|
"axisColorMode": "text",
|
||||||
|
"axisLabel": "",
|
||||||
|
"axisPlacement": "auto",
|
||||||
|
"barAlignment": 0,
|
||||||
|
"barWidthFactor": 0.6,
|
||||||
|
"drawStyle": "line",
|
||||||
|
"fillOpacity": 10,
|
||||||
|
"gradientMode": "none",
|
||||||
|
"hideFrom": {
|
||||||
|
"legend": false,
|
||||||
|
"tooltip": false,
|
||||||
|
"viz": false
|
||||||
|
},
|
||||||
|
"insertNulls": false,
|
||||||
|
"lineInterpolation": "linear",
|
||||||
|
"lineWidth": 2,
|
||||||
|
"pointSize": 5,
|
||||||
|
"scaleDistribution": {
|
||||||
|
"type": "linear"
|
||||||
|
},
|
||||||
|
"showPoints": "never",
|
||||||
|
"spanNulls": true,
|
||||||
|
"stacking": {
|
||||||
|
"group": "A",
|
||||||
|
"mode": "none"
|
||||||
|
},
|
||||||
|
"thresholdsStyle": {
|
||||||
|
"mode": "off"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mappings": [],
|
||||||
|
"thresholds": {
|
||||||
|
"mode": "absolute",
|
||||||
|
"steps": [
|
||||||
|
{
|
||||||
|
"color": "green"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"color": "red",
|
||||||
|
"value": 80
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"unit": "Bps"
|
||||||
|
},
|
||||||
|
"overrides": []
|
||||||
|
},
|
||||||
|
"gridPos": {
|
||||||
|
"h": 7,
|
||||||
|
"w": 12,
|
||||||
|
"x": 0,
|
||||||
|
"y": 18
|
||||||
|
},
|
||||||
|
"id": 3,
|
||||||
|
"options": {
|
||||||
|
"legend": {
|
||||||
|
"calcs": [
|
||||||
|
"mean",
|
||||||
|
"lastNotNull"
|
||||||
|
],
|
||||||
|
"displayMode": "table",
|
||||||
|
"placement": "right",
|
||||||
|
"showLegend": true,
|
||||||
|
"sortBy": "Mean",
|
||||||
|
"sortDesc": true
|
||||||
|
},
|
||||||
|
"tooltip": {
|
||||||
|
"hideZeros": false,
|
||||||
|
"mode": "multi",
|
||||||
|
"sort": "desc"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pluginVersion": "11.6.0",
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "prometheus",
|
||||||
|
"uid": "${DS_PROMETHEUS}"
|
||||||
|
},
|
||||||
|
"editorMode": "code",
|
||||||
|
"expr": "irate(container_network_receive_bytes_total{image!=\"\", host=\"$host\"}[5m])",
|
||||||
|
"intervalFactor": 2,
|
||||||
|
"legendFormat": "{{container_label_com_docker_compose_project}}/{{name}}",
|
||||||
|
"metric": "container_network_receive_bytes_total",
|
||||||
|
"range": true,
|
||||||
|
"refId": "A",
|
||||||
|
"step": 20
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"title": "Network Rx",
|
||||||
|
"transformations": [
|
||||||
|
{
|
||||||
|
"id": "renameByRegex",
|
||||||
|
"options": {
|
||||||
|
"regex": "(.*)",
|
||||||
|
"renamePattern": "$1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"type": "timeseries"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "prometheus",
|
||||||
|
"uid": "${DS_PROMETHEUS}"
|
||||||
|
},
|
||||||
|
"fieldConfig": {
|
||||||
|
"defaults": {
|
||||||
|
"color": {
|
||||||
|
"mode": "palette-classic"
|
||||||
|
},
|
||||||
|
"custom": {
|
||||||
|
"axisBorderShow": false,
|
||||||
|
"axisCenteredZero": false,
|
||||||
|
"axisColorMode": "text",
|
||||||
|
"axisLabel": "",
|
||||||
|
"axisPlacement": "auto",
|
||||||
|
"barAlignment": 0,
|
||||||
|
"barWidthFactor": 0.6,
|
||||||
|
"drawStyle": "line",
|
||||||
|
"fillOpacity": 10,
|
||||||
|
"gradientMode": "none",
|
||||||
|
"hideFrom": {
|
||||||
|
"legend": false,
|
||||||
|
"tooltip": false,
|
||||||
|
"viz": false
|
||||||
|
},
|
||||||
|
"insertNulls": false,
|
||||||
|
"lineInterpolation": "linear",
|
||||||
|
"lineWidth": 2,
|
||||||
|
"pointSize": 5,
|
||||||
|
"scaleDistribution": {
|
||||||
|
"type": "linear"
|
||||||
|
},
|
||||||
|
"showPoints": "never",
|
||||||
|
"spanNulls": true,
|
||||||
|
"stacking": {
|
||||||
|
"group": "A",
|
||||||
|
"mode": "none"
|
||||||
|
},
|
||||||
|
"thresholdsStyle": {
|
||||||
|
"mode": "off"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mappings": [],
|
||||||
|
"thresholds": {
|
||||||
|
"mode": "absolute",
|
||||||
|
"steps": [
|
||||||
|
{
|
||||||
|
"color": "green"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"color": "red",
|
||||||
|
"value": 80
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"unit": "Bps"
|
||||||
|
},
|
||||||
|
"overrides": []
|
||||||
|
},
|
||||||
|
"gridPos": {
|
||||||
|
"h": 7,
|
||||||
|
"w": 12,
|
||||||
|
"x": 12,
|
||||||
|
"y": 18
|
||||||
|
},
|
||||||
|
"id": 9,
|
||||||
|
"options": {
|
||||||
|
"legend": {
|
||||||
|
"calcs": [
|
||||||
|
"mean",
|
||||||
|
"lastNotNull"
|
||||||
|
],
|
||||||
|
"displayMode": "table",
|
||||||
|
"placement": "right",
|
||||||
|
"showLegend": true,
|
||||||
|
"sortBy": "Mean",
|
||||||
|
"sortDesc": true
|
||||||
|
},
|
||||||
|
"tooltip": {
|
||||||
|
"hideZeros": false,
|
||||||
|
"mode": "multi",
|
||||||
|
"sort": "desc"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pluginVersion": "11.6.0",
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "prometheus",
|
||||||
|
"uid": "${DS_PROMETHEUS}"
|
||||||
|
},
|
||||||
|
"editorMode": "code",
|
||||||
|
"expr": "irate(container_network_transmit_bytes_total{image!=\"\", host=\"$host\"}[5m])",
|
||||||
|
"hide": false,
|
||||||
|
"intervalFactor": 2,
|
||||||
|
"legendFormat": "{{container_label_com_docker_compose_project}}/{{name}}",
|
||||||
|
"metric": "container_network_receive_bytes_total",
|
||||||
|
"range": true,
|
||||||
|
"refId": "B",
|
||||||
|
"step": 20
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"title": "Network Tx",
|
||||||
|
"type": "timeseries"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"refresh": "30s",
|
||||||
|
"schemaVersion": 41,
|
||||||
|
"tags": [],
|
||||||
|
"templating": {
|
||||||
|
"list": [
|
||||||
|
{
|
||||||
|
"allowCustomValue": false,
|
||||||
|
"current": {},
|
||||||
|
"definition": "label_values(host)",
|
||||||
|
"includeAll": true,
|
||||||
|
"multi": true,
|
||||||
|
"name": "host",
|
||||||
|
"options": [],
|
||||||
|
"query": {
|
||||||
|
"qryType": 1,
|
||||||
|
"query": "label_values(host)",
|
||||||
|
"refId": "PrometheusVariableQueryEditor-VariableQuery"
|
||||||
|
},
|
||||||
|
"refresh": 1,
|
||||||
|
"regex": "",
|
||||||
|
"type": "query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"baseFilters": [],
|
||||||
|
"datasource": {
|
||||||
|
"type": "prometheus",
|
||||||
|
"uid": "PBFA97CFB590B2093"
|
||||||
|
},
|
||||||
|
"filters": [
|
||||||
|
{
|
||||||
|
"condition": "",
|
||||||
|
"key": "container_label_com_docker_compose_project",
|
||||||
|
"keyLabel": "container_label_com_docker_compose_project",
|
||||||
|
"operator": "=~",
|
||||||
|
"value": ".*",
|
||||||
|
"valueLabels": [
|
||||||
|
".*"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"hide": 1,
|
||||||
|
"name": "filter",
|
||||||
|
"type": "adhoc"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"time": {
|
||||||
|
"from": "now-3h",
|
||||||
|
"to": "now"
|
||||||
|
},
|
||||||
|
"timepicker": {},
|
||||||
|
"timezone": "browser",
|
||||||
|
"title": "Docker monitoring par host",
|
||||||
|
"uid": "eekgch7tdq8sgc",
|
||||||
|
"version": 29,
|
||||||
|
"weekStart": ""
|
||||||
|
}
|
@@ -0,0 +1,442 @@
|
|||||||
|
|
||||||
|
"color": "green"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"color": "red",
|
||||||
|
"value": 80
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"unit": "Bps"
|
||||||
|
},
|
||||||
|
"overrides": []
|
||||||
|
},
|
||||||
|
"gridPos": {
|
||||||
|
"h": 7,
|
||||||
|
"w": 12,
|
||||||
|
"x": 0,
|
||||||
|
"y": 14
|
||||||
|
},
|
||||||
|
"id": 84,
|
||||||
|
"options": {
|
||||||
|
"legend": {
|
||||||
|
"calcs": [
|
||||||
|
"mean",
|
||||||
|
"lastNotNull",
|
||||||
|
"max",
|
||||||
|
"min"
|
||||||
|
],
|
||||||
|
"displayMode": "table",
|
||||||
|
"placement": "bottom",
|
||||||
|
"showLegend": true
|
||||||
|
},
|
||||||
|
"tooltip": {
|
||||||
|
"hideZeros": false,
|
||||||
|
"mode": "multi",
|
||||||
|
"sort": "none"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pluginVersion": "11.6.0",
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "prometheus"
|
||||||
|
},
|
||||||
|
"editorMode": "code",
|
||||||
|
"expr": "rate(node_network_receive_bytes_total{host=\"$host\", device=~\"$device\"}[5m])",
|
||||||
|
"format": "time_series",
|
||||||
|
"intervalFactor": 1,
|
||||||
|
"legendFormat": "{{device}} - rx",
|
||||||
|
"range": true,
|
||||||
|
"refId": "A",
|
||||||
|
"step": 240
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "prometheus"
|
||||||
|
},
|
||||||
|
"editorMode": "code",
|
||||||
|
"expr": "- rate(node_network_transmit_bytes_total{host=\"$host\", device=~\"$device\"}[5m])",
|
||||||
|
"hide": false,
|
||||||
|
"instant": false,
|
||||||
|
"legendFormat": "{{device}} - tx",
|
||||||
|
"range": true,
|
||||||
|
"refId": "B"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"title": "Network Traffic Rx",
|
||||||
|
"type": "timeseries"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "prometheus"
|
||||||
|
},
|
||||||
|
"description": "",
|
||||||
|
"fieldConfig": {
|
||||||
|
"defaults": {
|
||||||
|
"color": {
|
||||||
|
"mode": "palette-classic"
|
||||||
|
},
|
||||||
|
"custom": {
|
||||||
|
"axisBorderShow": false,
|
||||||
|
"axisCenteredZero": false,
|
||||||
|
"axisColorMode": "text",
|
||||||
|
"axisLabel": "",
|
||||||
|
"axisPlacement": "auto",
|
||||||
|
"barAlignment": 0,
|
||||||
|
"barWidthFactor": 0.6,
|
||||||
|
"drawStyle": "line",
|
||||||
|
"fillOpacity": 0,
|
||||||
|
"gradientMode": "none",
|
||||||
|
"hideFrom": {
|
||||||
|
"legend": false,
|
||||||
|
"tooltip": false,
|
||||||
|
"viz": false
|
||||||
|
},
|
||||||
|
"insertNulls": false,
|
||||||
|
"lineInterpolation": "linear",
|
||||||
|
"lineWidth": 1,
|
||||||
|
"pointSize": 5,
|
||||||
|
"scaleDistribution": {
|
||||||
|
"type": "linear"
|
||||||
|
},
|
||||||
|
"showPoints": "auto",
|
||||||
|
"spanNulls": false,
|
||||||
|
"stacking": {
|
||||||
|
"group": "A",
|
||||||
|
"mode": "none"
|
||||||
|
},
|
||||||
|
"thresholdsStyle": {
|
||||||
|
"mode": "off"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"links": [],
|
||||||
|
"mappings": [],
|
||||||
|
"max": 100,
|
||||||
|
"min": 0,
|
||||||
|
"thresholds": {
|
||||||
|
"mode": "absolute",
|
||||||
|
"steps": [
|
||||||
|
{
|
||||||
|
"color": "green"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"color": "red",
|
||||||
|
"value": 80
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"unit": "percent"
|
||||||
|
},
|
||||||
|
"overrides": []
|
||||||
|
},
|
||||||
|
"gridPos": {
|
||||||
|
"h": 7,
|
||||||
|
"w": 12,
|
||||||
|
"x": 12,
|
||||||
|
"y": 14
|
||||||
|
},
|
||||||
|
"id": 174,
|
||||||
|
"options": {
|
||||||
|
"alertThreshold": true,
|
||||||
|
"legend": {
|
||||||
|
"calcs": [],
|
||||||
|
"displayMode": "list",
|
||||||
|
"placement": "bottom",
|
||||||
|
"showLegend": true
|
||||||
|
},
|
||||||
|
"tooltip": {
|
||||||
|
"hideZeros": false,
|
||||||
|
"mode": "single",
|
||||||
|
"sort": "none"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pluginVersion": "11.6.0",
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "prometheus"
|
||||||
|
},
|
||||||
|
"editorMode": "code",
|
||||||
|
"expr": "(node_filesystem_size_bytes{host=\"$host\",fstype=~\"ext.*|xfs\",mountpoint !~\".*pod.*\"}-node_filesystem_free_bytes{host=\"$host\",fstype=~\"ext.*|xfs\",mountpoint !~\".*pod.*\"}) *100/(node_filesystem_avail_bytes{host=\"$host\",fstype=~\"ext.*|xfs\",mountpoint !~\".*pod.*\"}+(node_filesystem_size_bytes{host=\"$host\",fstype=~\"ext.*|xfs\",mountpoint !~\".*pod.*\"}-node_filesystem_free_bytes{host=\"$host\",fstype=~\"ext.*|xfs\",mountpoint !~\".*pod.*\"}))",
|
||||||
|
"format": "time_series",
|
||||||
|
"instant": false,
|
||||||
|
"interval": "",
|
||||||
|
"intervalFactor": 1,
|
||||||
|
"legendFormat": "{{mountpoint}}",
|
||||||
|
"refId": "A"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "prometheus"
|
||||||
|
},
|
||||||
|
"expr": "node_filesystem_files_free{host=\"$host\",fstype=~\"ext.?|xfs\"} / node_filesystem_files{host=\"$host\",fstype=~\"ext.?|xfs\"}",
|
||||||
|
"hide": true,
|
||||||
|
"interval": "",
|
||||||
|
"legendFormat": "Inodes:{{instance}}:{{mountpoint}}",
|
||||||
|
"refId": "B"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"title": "Disk",
|
||||||
|
"type": "timeseries"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "prometheus"
|
||||||
|
},
|
||||||
|
"description": "Physical machines only",
|
||||||
|
"fieldConfig": {
|
||||||
|
"defaults": {
|
||||||
|
"color": {
|
||||||
|
"mode": "palette-classic"
|
||||||
|
},
|
||||||
|
"custom": {
|
||||||
|
"axisBorderShow": false,
|
||||||
|
"axisCenteredZero": false,
|
||||||
|
"axisColorMode": "text",
|
||||||
|
"axisLabel": "",
|
||||||
|
"axisPlacement": "auto",
|
||||||
|
"barAlignment": 0,
|
||||||
|
"barWidthFactor": 0.6,
|
||||||
|
"drawStyle": "line",
|
||||||
|
"fillOpacity": 0,
|
||||||
|
"gradientMode": "none",
|
||||||
|
"hideFrom": {
|
||||||
|
"legend": false,
|
||||||
|
"tooltip": false,
|
||||||
|
"viz": false
|
||||||
|
},
|
||||||
|
"insertNulls": false,
|
||||||
|
"lineInterpolation": "linear",
|
||||||
|
"lineWidth": 1,
|
||||||
|
"pointSize": 5,
|
||||||
|
"scaleDistribution": {
|
||||||
|
"type": "linear"
|
||||||
|
},
|
||||||
|
"showPoints": "auto",
|
||||||
|
"spanNulls": false,
|
||||||
|
"stacking": {
|
||||||
|
"group": "A",
|
||||||
|
"mode": "none"
|
||||||
|
},
|
||||||
|
"thresholdsStyle": {
|
||||||
|
"mode": "off"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mappings": [],
|
||||||
|
"min": 0,
|
||||||
|
"thresholds": {
|
||||||
|
"mode": "absolute",
|
||||||
|
"steps": [
|
||||||
|
{
|
||||||
|
"color": "green"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"color": "red",
|
||||||
|
"value": 80
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"unit": "celsius"
|
||||||
|
},
|
||||||
|
"overrides": []
|
||||||
|
},
|
||||||
|
"gridPos": {
|
||||||
|
"h": 7,
|
||||||
|
"w": 12,
|
||||||
|
"x": 0,
|
||||||
|
"y": 21
|
||||||
|
},
|
||||||
|
"id": 175,
|
||||||
|
"options": {
|
||||||
|
"legend": {
|
||||||
|
"calcs": [],
|
||||||
|
"displayMode": "list",
|
||||||
|
"placement": "bottom",
|
||||||
|
"showLegend": true
|
||||||
|
},
|
||||||
|
"tooltip": {
|
||||||
|
"hideZeros": false,
|
||||||
|
"mode": "single",
|
||||||
|
"sort": "none"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pluginVersion": "11.6.0",
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"editorMode": "code",
|
||||||
|
"expr": "node_thermal_zone_temp{host=\"$host\"}",
|
||||||
|
"legendFormat": "{{type}}-zone{{zone}}",
|
||||||
|
"range": true,
|
||||||
|
"refId": "A"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"title": "Temperature",
|
||||||
|
"type": "timeseries"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "prometheus"
|
||||||
|
},
|
||||||
|
"fieldConfig": {
|
||||||
|
"defaults": {
|
||||||
|
"color": {
|
||||||
|
"mode": "palette-classic"
|
||||||
|
},
|
||||||
|
"custom": {
|
||||||
|
"axisBorderShow": false,
|
||||||
|
"axisCenteredZero": false,
|
||||||
|
"axisColorMode": "text",
|
||||||
|
"axisLabel": "",
|
||||||
|
"axisPlacement": "auto",
|
||||||
|
"barAlignment": 0,
|
||||||
|
"barWidthFactor": 0.6,
|
||||||
|
"drawStyle": "line",
|
||||||
|
"fillOpacity": 0,
|
||||||
|
"gradientMode": "none",
|
||||||
|
"hideFrom": {
|
||||||
|
"legend": false,
|
||||||
|
"tooltip": false,
|
||||||
|
"viz": false
|
||||||
|
},
|
||||||
|
"insertNulls": false,
|
||||||
|
"lineInterpolation": "linear",
|
||||||
|
"lineWidth": 1,
|
||||||
|
"pointSize": 5,
|
||||||
|
"scaleDistribution": {
|
||||||
|
"type": "linear"
|
||||||
|
},
|
||||||
|
"showPoints": "auto",
|
||||||
|
"spanNulls": false,
|
||||||
|
"stacking": {
|
||||||
|
"group": "A",
|
||||||
|
"mode": "none"
|
||||||
|
},
|
||||||
|
"thresholdsStyle": {
|
||||||
|
"mode": "off"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mappings": [],
|
||||||
|
"thresholds": {
|
||||||
|
"mode": "absolute",
|
||||||
|
"steps": [
|
||||||
|
{
|
||||||
|
"color": "green"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"color": "red",
|
||||||
|
"value": 80
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"overrides": []
|
||||||
|
},
|
||||||
|
"gridPos": {
|
||||||
|
"h": 7,
|
||||||
|
"w": 12,
|
||||||
|
"x": 12,
|
||||||
|
"y": 21
|
||||||
|
},
|
||||||
|
"id": 176,
|
||||||
|
"options": {
|
||||||
|
"legend": {
|
||||||
|
"calcs": [],
|
||||||
|
"displayMode": "list",
|
||||||
|
"placement": "bottom",
|
||||||
|
"showLegend": true
|
||||||
|
},
|
||||||
|
"tooltip": {
|
||||||
|
"hideZeros": false,
|
||||||
|
"mode": "single",
|
||||||
|
"sort": "none"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pluginVersion": "11.6.0",
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"editorMode": "code",
|
||||||
|
"expr": "rate(node_disk_reads_completed_total{host=\"$host\"}[2m])",
|
||||||
|
"legendFormat": "{{device}} reads",
|
||||||
|
"range": true,
|
||||||
|
"refId": "A"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "prometheus"
|
||||||
|
},
|
||||||
|
"editorMode": "code",
|
||||||
|
"expr": " rate(node_disk_writes_completed_total{host=~\"$host\"}[2m])",
|
||||||
|
"hide": false,
|
||||||
|
"instant": false,
|
||||||
|
"legendFormat": "{{device}} writes",
|
||||||
|
"range": true,
|
||||||
|
"refId": "B"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"title": "Disks IOs",
|
||||||
|
"type": "timeseries"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"preload": false,
|
||||||
|
"refresh": "5s",
|
||||||
|
"schemaVersion": 41,
|
||||||
|
"tags": [],
|
||||||
|
"templating": {
|
||||||
|
"list": [
|
||||||
|
{
|
||||||
|
"allowCustomValue": false,
|
||||||
|
"current": {
|
||||||
|
"text": "kazguel",
|
||||||
|
"value": "kazguel"
|
||||||
|
},
|
||||||
|
"definition": "label_values(host)",
|
||||||
|
"includeAll": false,
|
||||||
|
"name": "host",
|
||||||
|
"options": [],
|
||||||
|
"query": {
|
||||||
|
"qryType": 1,
|
||||||
|
"query": "label_values(host)",
|
||||||
|
"refId": "PrometheusVariableQueryEditor-VariableQuery"
|
||||||
|
},
|
||||||
|
"refresh": 1,
|
||||||
|
"regex": "",
|
||||||
|
"type": "query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allowCustomValue": false,
|
||||||
|
"current": {
|
||||||
|
"text": [
|
||||||
|
"ens18"
|
||||||
|
],
|
||||||
|
"value": [
|
||||||
|
"ens18"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"definition": "label_values(node_network_info{device!~\"br.*|veth.*|lo.*|tap.*|docker.*|vibr.*\"},device)",
|
||||||
|
"includeAll": true,
|
||||||
|
"label": "NIC",
|
||||||
|
"multi": true,
|
||||||
|
"name": "device",
|
||||||
|
"options": [],
|
||||||
|
"query": {
|
||||||
|
"qryType": 1,
|
||||||
|
"query": "label_values(node_network_info{device!~\"br.*|veth.*|lo.*|tap.*|docker.*|vibr.*\"},device)",
|
||||||
|
"refId": "PrometheusVariableQueryEditor-VariableQuery"
|
||||||
|
},
|
||||||
|
"refresh": 1,
|
||||||
|
"regex": "",
|
||||||
|
"type": "query"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"time": {
|
||||||
|
"from": "now-6h",
|
||||||
|
"to": "now"
|
||||||
|
},
|
||||||
|
"timepicker": {},
|
||||||
|
"timezone": "",
|
||||||
|
"title": "Vue Serveur",
|
||||||
|
"uid": "deki6c3qvihhcd",
|
||||||
|
"version": 22
|
||||||
|
}
|
1197
dockers/grafana/grafana/provisioning/dashboards/server_overview.json
Normal file
1197
dockers/grafana/grafana/provisioning/dashboards/server_overview.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,12 +1,108 @@
|
|||||||
global:
|
global:
|
||||||
scrape_interval: 15s
|
scrape_interval: 60s
|
||||||
evaluation_interval: 15s
|
evaluation_interval: 60s
|
||||||
|
scrape_timeout: 55s
|
||||||
|
|
||||||
rule_files:
|
rule_files:
|
||||||
- 'alert.rules'
|
- 'alert.rules'
|
||||||
|
|
||||||
scrape_configs:
|
scrape_configs:
|
||||||
- job_name: 'traefik'
|
# unused for now
|
||||||
scrape_interval: 5s
|
#- job_name: 'traefik'
|
||||||
|
# scrape_interval: 5s
|
||||||
|
# static_configs:
|
||||||
|
# - targets: ['reverse-proxy:8080']
|
||||||
|
|
||||||
|
- job_name: prometheus
|
||||||
static_configs:
|
static_configs:
|
||||||
- targets: ['dashboard.kaz.sns:8289','dashboard2.kaz.sns:8289']
|
- targets: ["prometheus:9090"]
|
||||||
|
|
||||||
|
|
||||||
|
- job_name: cadvisor-prod1
|
||||||
|
scheme: "https"
|
||||||
|
static_configs:
|
||||||
|
- targets: ["cadvisor-prod1.kaz.bzh:443"]
|
||||||
|
labels:
|
||||||
|
host: 'prod1'
|
||||||
|
portainer_id: 2
|
||||||
|
|
||||||
|
- job_name: cadvisor-prod2
|
||||||
|
scheme: "https"
|
||||||
|
static_configs:
|
||||||
|
- targets: ["cadvisor-prod2.kaz.bzh:443"]
|
||||||
|
labels:
|
||||||
|
host: 'prod2'
|
||||||
|
portainer_id: 4
|
||||||
|
|
||||||
|
- job_name: cadvisor-kazoulet
|
||||||
|
scheme: "https"
|
||||||
|
static_configs:
|
||||||
|
- targets: ["cadvisor-kazoulet.kaz.bzh:443"]
|
||||||
|
labels:
|
||||||
|
host: 'kazoulet'
|
||||||
|
portainer_id: 3
|
||||||
|
|
||||||
|
- job_name: cadvisor-tykaz
|
||||||
|
scheme: "https"
|
||||||
|
static_configs:
|
||||||
|
- targets: ["cadvisor-tykaz.kaz.bzh:443"]
|
||||||
|
labels:
|
||||||
|
host: 'tykaz'
|
||||||
|
portainer_id: 10
|
||||||
|
|
||||||
|
- job_name: cadvisor-kazguel
|
||||||
|
scheme: "https"
|
||||||
|
static_configs:
|
||||||
|
- targets: ["cadvisor-kazguel.kaz.bzh:443"]
|
||||||
|
labels:
|
||||||
|
host: 'kazguel'
|
||||||
|
portainer_id: 11
|
||||||
|
|
||||||
|
- job_name: cadvisor-kazkouil
|
||||||
|
scheme: "https"
|
||||||
|
static_configs:
|
||||||
|
- targets: ["cadvisor-dev.kazkouil.fr:443"]
|
||||||
|
labels:
|
||||||
|
host: 'kazkouil'
|
||||||
|
portainer_id: 5
|
||||||
|
|
||||||
|
- job_name: node-exporter-prod1
|
||||||
|
static_configs:
|
||||||
|
# - targets: ["prod1.kaz.bzh:9100","prod2.kaz.bzh:9100","kazoulet.kaz.bzh:9100","tykaz.kaz.bzh:9100","kazguel.kaz.bzh:9100","kazkouil.fr:9100"]
|
||||||
|
|
||||||
|
- targets: ["prod1.kaz.bzh:9100"]
|
||||||
|
labels:
|
||||||
|
host: 'prod1'
|
||||||
|
|
||||||
|
|
||||||
|
- job_name: node-exporter-prod2
|
||||||
|
static_configs:
|
||||||
|
# - targets: ["prod1.kaz.bzh:9100","prod2.kaz.bzh:9100","kazoulet.kaz.bzh:9100","tykaz.kaz.bzh:9100","kazguel.kaz.bzh:9100","kazkouil.fr:9100"]
|
||||||
|
|
||||||
|
- targets: ["prod2.kaz.bzh:9100"]
|
||||||
|
labels:
|
||||||
|
host: 'prod2'
|
||||||
|
|
||||||
|
- job_name: node-exporter-kazoulet
|
||||||
|
static_configs:
|
||||||
|
- targets: ["kazoulet.kaz.bzh:9100"]
|
||||||
|
labels:
|
||||||
|
host: 'kazoulet'
|
||||||
|
|
||||||
|
- job_name: node-exporter-tykaz
|
||||||
|
static_configs:
|
||||||
|
- targets: ["tykaz.kaz.bzh:9100"]
|
||||||
|
labels:
|
||||||
|
host: 'tykaz'
|
||||||
|
|
||||||
|
- job_name: node-exporter-kazguel
|
||||||
|
static_configs:
|
||||||
|
- targets: ["kazguel.kaz.bzh:9100"]
|
||||||
|
labels:
|
||||||
|
host: 'kazguel'
|
||||||
|
|
||||||
|
- job_name: node-exporter-kazkouil
|
||||||
|
static_configs:
|
||||||
|
- targets: ["kazkouil.fr:9100"]
|
||||||
|
labels:
|
||||||
|
host: 'kazkouil'
|
||||||
|
1
dockers/mastodon/.env
Symbolic link
1
dockers/mastodon/.env
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../../config/dockers.env
|
6
dockers/mastodon/README.md
Normal file
6
dockers/mastodon/README.md
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
Initialiser la DB :
|
||||||
|
docker-compose run --rm web bundle exec rails db:setup
|
||||||
|
|
||||||
|
Créer un compte admin :
|
||||||
|
tootctl accounts create adminkaz --email admin@kaz.bzh --confirmed --role Owner
|
||||||
|
tootctl accounts approve adminkaz
|
184
dockers/mastodon/docker-compose.yml
Normal file
184
dockers/mastodon/docker-compose.yml
Normal file
@@ -0,0 +1,184 @@
|
|||||||
|
# This file is designed for production server deployment, not local development work
|
||||||
|
# For a containerized local dev environment, see: https://github.com/mastodon/mastodon/blob/main/docs/DEVELOPMENT.md#docker
|
||||||
|
|
||||||
|
services:
|
||||||
|
db:
|
||||||
|
container_name: ${mastodonDBName}
|
||||||
|
restart: ${restartPolicy}
|
||||||
|
image: postgres:14-alpine
|
||||||
|
shm_size: 256mb
|
||||||
|
networks:
|
||||||
|
- mastodonNet
|
||||||
|
healthcheck:
|
||||||
|
test: ['CMD', 'pg_isready', '-U', 'postgres']
|
||||||
|
volumes:
|
||||||
|
- postgres:/var/lib/postgresql/data
|
||||||
|
# environment:
|
||||||
|
# - 'POSTGRES_HOST_AUTH_METHOD=trust'
|
||||||
|
env_file:
|
||||||
|
- ../../secret/env-mastodonDB
|
||||||
|
|
||||||
|
redis:
|
||||||
|
container_name: ${mastodonRedisName}
|
||||||
|
restart: ${restartPolicy}
|
||||||
|
image: redis:7-alpine
|
||||||
|
networks:
|
||||||
|
- mastodonNet
|
||||||
|
healthcheck:
|
||||||
|
test: ['CMD', 'redis-cli', 'ping']
|
||||||
|
volumes:
|
||||||
|
- redis:/data
|
||||||
|
|
||||||
|
# es:
|
||||||
|
# restart: always
|
||||||
|
# image: docker.elastic.co/elasticsearch/elasticsearch:7.17.4
|
||||||
|
# environment:
|
||||||
|
# - "ES_JAVA_OPTS=-Xms512m -Xmx512m -Des.enforce.bootstrap.checks=true"
|
||||||
|
# - "xpack.license.self_generated.type=basic"
|
||||||
|
# - "xpack.security.enabled=false"
|
||||||
|
# - "xpack.watcher.enabled=false"
|
||||||
|
# - "xpack.graph.enabled=false"
|
||||||
|
# - "xpack.ml.enabled=false"
|
||||||
|
# - "bootstrap.memory_lock=true"
|
||||||
|
# - "cluster.name=es-mastodon"
|
||||||
|
# - "discovery.type=single-node"
|
||||||
|
# - "thread_pool.write.queue_size=1000"
|
||||||
|
# networks:
|
||||||
|
# - external_network
|
||||||
|
# - internal_network
|
||||||
|
# healthcheck:
|
||||||
|
# test: ["CMD-SHELL", "curl --silent --fail localhost:9200/_cluster/health || exit 1"]
|
||||||
|
# volumes:
|
||||||
|
# - ./elasticsearch:/usr/share/elasticsearch/data
|
||||||
|
# ulimits:
|
||||||
|
# memlock:
|
||||||
|
# soft: -1
|
||||||
|
# hard: -1
|
||||||
|
# nofile:
|
||||||
|
# soft: 65536
|
||||||
|
# hard: 65536
|
||||||
|
# ports:
|
||||||
|
# - '127.0.0.1:9200:9200'
|
||||||
|
|
||||||
|
web:
|
||||||
|
# You can uncomment the following line if you want to not use the prebuilt image, for example if you have local code changes
|
||||||
|
# build: .
|
||||||
|
container_name: ${mastodonServName}
|
||||||
|
image: ghcr.io/mastodon/mastodon:v4.3.6
|
||||||
|
restart: ${restartPolicy}
|
||||||
|
environment:
|
||||||
|
- LOCAL_DOMAIN=${mastodonHost}.${domain}
|
||||||
|
- SMTP_SERVER=smtp.${domain}
|
||||||
|
- SMTP_LOGIN=admin@${domain}
|
||||||
|
- SMTP_FROM_ADDRESS=admin@${domain}
|
||||||
|
env_file:
|
||||||
|
- env-config
|
||||||
|
- ../../secret/env-mastodonServ
|
||||||
|
- ../../secret/env-mastodonDB
|
||||||
|
command: bundle exec puma -C config/puma.rb
|
||||||
|
networks:
|
||||||
|
- mastodonNet
|
||||||
|
healthcheck:
|
||||||
|
# prettier-ignore
|
||||||
|
test: ['CMD-SHELL',"curl -s --noproxy localhost localhost:3000/health | grep -q 'OK' || exit 1"]
|
||||||
|
ports:
|
||||||
|
- '127.0.0.1:3000:3000'
|
||||||
|
depends_on:
|
||||||
|
- db
|
||||||
|
- redis
|
||||||
|
# - es
|
||||||
|
volumes:
|
||||||
|
- public_system:/mastodon/public/system
|
||||||
|
- images:/mastodon/app/javascript/images
|
||||||
|
labels:
|
||||||
|
- "traefik.enable=true"
|
||||||
|
- "traefik.http.routers.koz.rule=Host(`${mastodonHost}.${domain}`)"
|
||||||
|
- "traefik.http.services.koz.loadbalancer.server.port=3000"
|
||||||
|
- "traefik.docker.network=mastodonNet"
|
||||||
|
|
||||||
|
|
||||||
|
streaming:
|
||||||
|
# You can uncomment the following lines if you want to not use the prebuilt image, for example if you have local code changes
|
||||||
|
# build:
|
||||||
|
# dockerfile: ./streaming/Dockerfile
|
||||||
|
# context: .
|
||||||
|
container_name: ${mastodonStreamingName}
|
||||||
|
image: ghcr.io/mastodon/mastodon-streaming:v4.3.6
|
||||||
|
restart: ${restartPolicy}
|
||||||
|
environment:
|
||||||
|
- LOCAL_DOMAIN=${mastodonHost}.${domain}
|
||||||
|
- SMTP_SERVER=smtp.${domain}
|
||||||
|
- SMTP_LOGIN=admin@${domain}
|
||||||
|
- SMTP_FROM_ADDRESS=admin@${domain}
|
||||||
|
env_file:
|
||||||
|
- env-config
|
||||||
|
- ../../secret/env-mastodonServ
|
||||||
|
command: node ./streaming/index.js
|
||||||
|
networks:
|
||||||
|
- mastodonNet
|
||||||
|
healthcheck:
|
||||||
|
# prettier-ignore
|
||||||
|
test: ['CMD-SHELL', "curl -s --noproxy localhost localhost:4000/api/v1/streaming/health | grep -q 'OK' || exit 1"]
|
||||||
|
ports:
|
||||||
|
- '127.0.0.1:4000:4000'
|
||||||
|
depends_on:
|
||||||
|
- db
|
||||||
|
- redis
|
||||||
|
labels:
|
||||||
|
- "traefik.enable=true"
|
||||||
|
- "traefik.http.routers.kozs.rule=(Host(`${mastodonHost}.${domain}`) && PathPrefix(`/api/v1/streaming`))"
|
||||||
|
- "traefik.http.services.kozs.loadbalancer.server.port=4000"
|
||||||
|
- "traefik.docker.network=mastodonNet"
|
||||||
|
|
||||||
|
sidekiq:
|
||||||
|
# You can uncomment the following line if you want to not use the prebuilt image, for example if you have local code changes
|
||||||
|
# build: .
|
||||||
|
container_name: ${mastodonSidekiqName}
|
||||||
|
image: ghcr.io/mastodon/mastodon:v4.3.6
|
||||||
|
restart: ${restartPolicy}
|
||||||
|
environment:
|
||||||
|
- LOCAL_DOMAIN=${mastodonHost}.${domain}
|
||||||
|
- SMTP_SERVER=smtp.${domain}
|
||||||
|
- SMTP_LOGIN=admin@${domain}
|
||||||
|
- SMTP_FROM_ADDRESS=admin@${domain}
|
||||||
|
env_file:
|
||||||
|
- env-config
|
||||||
|
- ../../secret/env-mastodonServ
|
||||||
|
command: bundle exec sidekiq
|
||||||
|
depends_on:
|
||||||
|
- db
|
||||||
|
- redis
|
||||||
|
networks:
|
||||||
|
- mastodonNet
|
||||||
|
volumes:
|
||||||
|
- public_system:/mastodon/public/system
|
||||||
|
healthcheck:
|
||||||
|
test: ['CMD-SHELL', "ps aux | grep '[s]idekiq\ 6' || false"]
|
||||||
|
|
||||||
|
## Uncomment to enable federation with tor instances along with adding the following ENV variables
|
||||||
|
## http_hidden_proxy=http://privoxy:8118
|
||||||
|
## ALLOW_ACCESS_TO_HIDDEN_SERVICE=true
|
||||||
|
# tor:
|
||||||
|
# image: sirboops/tor
|
||||||
|
# networks:
|
||||||
|
# - external_network
|
||||||
|
# - internal_network
|
||||||
|
#
|
||||||
|
# privoxy:
|
||||||
|
# image: sirboops/privoxy
|
||||||
|
# volumes:
|
||||||
|
# - ./priv-config:/opt/config
|
||||||
|
# networks:
|
||||||
|
# - external_network
|
||||||
|
# - internal_network
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
postgres:
|
||||||
|
redis:
|
||||||
|
public_system:
|
||||||
|
images:
|
||||||
|
|
||||||
|
networks:
|
||||||
|
mastodonNet:
|
||||||
|
external: true
|
||||||
|
name: mastodonNet
|
113
dockers/mastodon/env-config
Normal file
113
dockers/mastodon/env-config
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
# This is a sample configuration file. You can generate your configuration
|
||||||
|
# with the `bundle exec rails mastodon:setup` interactive setup wizard, but to customize
|
||||||
|
# your setup even further, you'll need to edit it manually. This sample does
|
||||||
|
# not demonstrate all available configuration options. Please look at
|
||||||
|
# https://docs.joinmastodon.org/admin/config/ for the full documentation.
|
||||||
|
|
||||||
|
# Note that this file accepts slightly different syntax depending on whether
|
||||||
|
# you are using `docker-compose` or not. In particular, if you use
|
||||||
|
# `docker-compose`, the value of each declared variable will be taken verbatim,
|
||||||
|
# including surrounding quotes.
|
||||||
|
# See: https://github.com/mastodon/mastodon/issues/16895
|
||||||
|
|
||||||
|
# Federation
|
||||||
|
# ----------
|
||||||
|
# This identifies your server and cannot be changed safely later
|
||||||
|
# ----------
|
||||||
|
# LOCAL_DOMAIN=
|
||||||
|
|
||||||
|
# Redis
|
||||||
|
# -----
|
||||||
|
REDIS_HOST=redis
|
||||||
|
REDIS_PORT=
|
||||||
|
|
||||||
|
# PostgreSQL
|
||||||
|
# ----------
|
||||||
|
DB_HOST=db
|
||||||
|
#DB_USER=postgres
|
||||||
|
#DB_NAME=postgres
|
||||||
|
#DB_PASS=
|
||||||
|
DB_PORT=5432
|
||||||
|
|
||||||
|
# Elasticsearch (optional)
|
||||||
|
# ------------------------
|
||||||
|
ES_ENABLED=false
|
||||||
|
ES_HOST=localhost
|
||||||
|
ES_PORT=9200
|
||||||
|
# Authentication for ES (optional)
|
||||||
|
ES_USER=elastic
|
||||||
|
ES_PASS=password
|
||||||
|
|
||||||
|
# Secrets
|
||||||
|
# -------
|
||||||
|
# Make sure to use `bundle exec rails secret` to generate secrets
|
||||||
|
# -------
|
||||||
|
#SECRET_KEY_BASE=
|
||||||
|
#OTP_SECRET=
|
||||||
|
|
||||||
|
# Encryption secrets
|
||||||
|
# ------------------
|
||||||
|
# Must be available (and set to same values) for all server processes
|
||||||
|
# These are private/secret values, do not share outside hosting environment
|
||||||
|
# Use `bin/rails db:encryption:init` to generate fresh secrets
|
||||||
|
# Do NOT change these secrets once in use, as this would cause data loss and other issues
|
||||||
|
# ------------------
|
||||||
|
#ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY=
|
||||||
|
#ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT=
|
||||||
|
#ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY=
|
||||||
|
|
||||||
|
|
||||||
|
# Web Push
|
||||||
|
# --------
|
||||||
|
# Generate with `bundle exec rails mastodon:webpush:generate_vapid_key`
|
||||||
|
# --------
|
||||||
|
#VAPID_PRIVATE_KEY=
|
||||||
|
#VAPID_PUBLIC_KEY=
|
||||||
|
|
||||||
|
# Sending mail
|
||||||
|
# ------------
|
||||||
|
#SMTP_SERVER=
|
||||||
|
SMTP_PORT=587
|
||||||
|
#SMTP_LOGIN=
|
||||||
|
#SMTP_PASSWORD=
|
||||||
|
#SMTP_FROM_ADDRESS=
|
||||||
|
|
||||||
|
# File storage (optional)
|
||||||
|
# -----------------------
|
||||||
|
S3_ENABLED=false
|
||||||
|
S3_BUCKET=files.example.com
|
||||||
|
AWS_ACCESS_KEY_ID=
|
||||||
|
AWS_SECRET_ACCESS_KEY=
|
||||||
|
S3_ALIAS_HOST=files.example.com
|
||||||
|
|
||||||
|
# IP and session retention
|
||||||
|
# -----------------------
|
||||||
|
# Make sure to modify the scheduling of ip_cleanup_scheduler in config/sidekiq.yml
|
||||||
|
# to be less than daily if you lower IP_RETENTION_PERIOD below two days (172800).
|
||||||
|
# -----------------------
|
||||||
|
IP_RETENTION_PERIOD=31556952
|
||||||
|
SESSION_RETENTION_PERIOD=31556952
|
||||||
|
|
||||||
|
# Fetch All Replies Behavior
|
||||||
|
# --------------------------
|
||||||
|
# When a user expands a post (DetailedStatus view), fetch all of its replies
|
||||||
|
# (default: false)
|
||||||
|
FETCH_REPLIES_ENABLED=false
|
||||||
|
|
||||||
|
# Period to wait between fetching replies (in minutes)
|
||||||
|
FETCH_REPLIES_COOLDOWN_MINUTES=15
|
||||||
|
|
||||||
|
# Period to wait after a post is first created before fetching its replies (in minutes)
|
||||||
|
FETCH_REPLIES_INITIAL_WAIT_MINUTES=5
|
||||||
|
|
||||||
|
# Max number of replies to fetch - total, recursively through a whole reply tree
|
||||||
|
FETCH_REPLIES_MAX_GLOBAL=1000
|
||||||
|
|
||||||
|
# Max number of replies to fetch - for a single post
|
||||||
|
FETCH_REPLIES_MAX_SINGLE=500
|
||||||
|
|
||||||
|
# Max number of replies Collection pages to fetch - total
|
||||||
|
FETCH_REPLIES_MAX_PAGES=500
|
||||||
|
|
||||||
|
SINGLE_USER_MODE=false
|
||||||
|
#EMAIL_DOMAIN_ALLOWLIST=
|
@@ -1,7 +1,7 @@
|
|||||||
services:
|
services:
|
||||||
|
|
||||||
app:
|
app:
|
||||||
image: mattermost/mattermost-team-edition:10.5
|
image: mattermost/mattermost-team-edition:10.9.1
|
||||||
container_name: ${mattermostServName}
|
container_name: ${mattermostServName}
|
||||||
restart: ${restartPolicy}
|
restart: ${restartPolicy}
|
||||||
volumes:
|
volumes:
|
||||||
|
@@ -11,3 +11,7 @@ cd $(dirname $0)
|
|||||||
"${KAZ_BIN_DIR}/gestContainers.sh" --install -M -agora
|
"${KAZ_BIN_DIR}/gestContainers.sh" --install -M -agora
|
||||||
|
|
||||||
|
|
||||||
|
docker exec ${mattermostServName} mmctl auth login https://${matterHost}.${domain} --name local-server --username ${mattermost_MM_ADMIN_USER} --password ${mattermost_MM_ADMIN_PASSWORD}
|
||||||
|
docker exec ${mattermostServName} mmctl channel create --team kaz --name "une-question--un-soucis" --display-name "Une question ? Un souci ?"
|
||||||
|
docker exec ${mattermostServName} mmctl channel create --team kaz --name "cafe-du-commerce--ouvert-2424h" --display-name "Café du commerce"
|
||||||
|
docker exec ${mattermostServName} mmctl channel create --team kaz --name "creation-comptes" --display-name "Création comptes"
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
FROM paheko/paheko:1.3.12
|
FROM paheko/paheko:1.3.15
|
||||||
|
|
||||||
ENV PAHEKO_DIR /var/www/paheko
|
ENV PAHEKO_DIR /var/www/paheko
|
||||||
|
|
||||||
@@ -11,6 +11,9 @@ RUN mkdir ${PAHEKO_DIR}/users
|
|||||||
RUN docker-php-ext-install calendar
|
RUN docker-php-ext-install calendar
|
||||||
|
|
||||||
RUN apt-get update
|
RUN apt-get update
|
||||||
|
RUN apt-get install -y libwebp-dev
|
||||||
|
RUN docker-php-ext-configure gd --with-jpeg --with-freetype --with-webp
|
||||||
|
RUN docker-php-ext-install gd
|
||||||
|
|
||||||
#Plugin facturation (le seul qui ne fasse pas parti de la distribution de base
|
#Plugin facturation (le seul qui ne fasse pas parti de la distribution de base
|
||||||
RUN apt-get install unzip
|
RUN apt-get install unzip
|
||||||
|
@@ -127,4 +127,4 @@ define('Paheko\SHOW_ERRORS', true);
|
|||||||
#add by fab le 21/04/2022
|
#add by fab le 21/04/2022
|
||||||
//const PDF_COMMAND = 'prince';
|
//const PDF_COMMAND = 'prince';
|
||||||
# const PDF_COMMAND = 'auto';
|
# const PDF_COMMAND = 'auto';
|
||||||
const PDF_COMMAND = 'chromium --no-sandbox --headless --disable-dev-shm-usage --autoplay-policy=no-user-gesture-required --no-first-run --disable-gpu --disable-features=DefaultPassthroughCommandDecoder --use-fake-ui-for-media-stream --use-fake-device-for-media-stream --disable-sync --print-to-pdf=%2$s %1$s';
|
const PDF_COMMAND = 'chromium --no-sandbox --headless --no-pdf-header-footer --disable-dev-shm-usage --autoplay-policy=no-user-gesture-required --no-first-run --disable-gpu --disable-features=DefaultPassthroughCommandDecoder --use-fake-ui-for-media-stream --use-fake-device-for-media-stream --disable-sync --print-to-pdf=%2$s %1$s';
|
||||||
|
Binary file not shown.
84
dockers/peertube/docker-compose.yml
Normal file
84
dockers/peertube/docker-compose.yml
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
services:
|
||||||
|
|
||||||
|
webserver:
|
||||||
|
image: chocobozzz/peertube-webserver:latest
|
||||||
|
restart: ${restartPolicy}
|
||||||
|
depends_on:
|
||||||
|
- peertube
|
||||||
|
networks:
|
||||||
|
- peertubeNet
|
||||||
|
#ports:
|
||||||
|
#- "80:80"
|
||||||
|
#- "443:443"
|
||||||
|
volumes:
|
||||||
|
- assets:/var/www/peertube/peertube-latest/client/dist:ro
|
||||||
|
- data:/var/www/peertube/storage
|
||||||
|
env_file:
|
||||||
|
- ../../secret/env-${peertubeServName}
|
||||||
|
labels:
|
||||||
|
- "traefik.enable=true"
|
||||||
|
- "traefik.http.routers.${peertubeServName}.rule=Host(`${peertubeHost}.${domain}`)"
|
||||||
|
- "traefik.docker.network=peertubeNet"
|
||||||
|
|
||||||
|
peertube:
|
||||||
|
image: chocobozzz/peertube:production-bookworm
|
||||||
|
container_name: ${peertubeServName}
|
||||||
|
restart: ${restartPolicy}
|
||||||
|
depends_on:
|
||||||
|
- postgres
|
||||||
|
- redis
|
||||||
|
networks:
|
||||||
|
- peertubeNet
|
||||||
|
volumes:
|
||||||
|
# Remove the following line if you want to use another webserver/proxy or test PeerTube in local
|
||||||
|
- assets:/app/client/dist
|
||||||
|
- data:/data
|
||||||
|
- config:/config
|
||||||
|
env_file:
|
||||||
|
- ../../secret/env-${peertubeServName}
|
||||||
|
labels:
|
||||||
|
- "traefik.enable=true"
|
||||||
|
- "traefik.http.routers.${peertubeServName}.rule=Host(`${peertubeHost}.${domain}`)"
|
||||||
|
- "traefik.docker.network=peertubeNet"
|
||||||
|
- "traefik.http.services.${peertubeServName}.loadbalancer.server.port=9000"
|
||||||
|
#traefik.frontend.rule: "Host:videos.kaz.bzh"
|
||||||
|
#traefik.port: "9000"
|
||||||
|
# traefik.frontend.redirect.entryPoint: https
|
||||||
|
|
||||||
|
postgres:
|
||||||
|
image: postgres:13-alpine
|
||||||
|
container_name: ${peertubeDBName}
|
||||||
|
restart: ${restartPolicy}
|
||||||
|
networks:
|
||||||
|
- peertubeNet
|
||||||
|
volumes:
|
||||||
|
- db:/var/lib/postgresql/data
|
||||||
|
env_file:
|
||||||
|
- ../../secret/env-${peertubeDBName}
|
||||||
|
labels:
|
||||||
|
traefik.enable: "false"
|
||||||
|
|
||||||
|
redis:
|
||||||
|
image: redis:6-alpine
|
||||||
|
container_name: peertubeCache
|
||||||
|
restart: ${restartPolicy}
|
||||||
|
networks:
|
||||||
|
- peertubeNet
|
||||||
|
env_file:
|
||||||
|
- ../../secret/env-${peertubeServName}
|
||||||
|
volumes:
|
||||||
|
- redis:/data
|
||||||
|
labels:
|
||||||
|
traefik.enable: "false"
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
assets:
|
||||||
|
data:
|
||||||
|
config:
|
||||||
|
db:
|
||||||
|
redis:
|
||||||
|
|
||||||
|
networks:
|
||||||
|
peertubeNet:
|
||||||
|
external: true
|
||||||
|
name: peertubeNet
|
@@ -1,4 +1,4 @@
|
|||||||
FROM docker.io/mailserver/docker-mailserver:14.0.0
|
FROM docker.io/mailserver/docker-mailserver:15.0.2
|
||||||
|
|
||||||
########################################
|
########################################
|
||||||
# APT local cache
|
# APT local cache
|
||||||
|
@@ -26,7 +26,7 @@ services:
|
|||||||
- filterConfig:/home/filter/config/
|
- filterConfig:/home/filter/config/
|
||||||
- /etc/localtime:/etc/localtime:ro
|
- /etc/localtime:/etc/localtime:ro
|
||||||
- /etc/timezone:/etc/timezone:ro
|
- /etc/timezone:/etc/timezone:ro
|
||||||
- /etc/letsencrypt:/etc/letsencrypt:ro
|
- /etc/ssl:/etc/ssl:ro
|
||||||
# - /etc/ssl:/etc/ssl:ro
|
# - /etc/ssl:/etc/ssl:ro
|
||||||
# - /usr/local/share/ca-certificates:/usr/local/share/ca-certificates:ro
|
# - /usr/local/share/ca-certificates:/usr/local/share/ca-certificates:ro
|
||||||
environment:
|
environment:
|
||||||
@@ -41,6 +41,14 @@ services:
|
|||||||
cap_add:
|
cap_add:
|
||||||
- NET_ADMIN
|
- NET_ADMIN
|
||||||
- SYS_PTRACE
|
- SYS_PTRACE
|
||||||
|
labels:
|
||||||
|
- "traefik.enable=true"
|
||||||
|
- "traefik.http.routers.mail.rule=Host(`mail.${domain}`) || Host(`smtp.${domain}`)"
|
||||||
|
- "traefik.http.routers.webmails.rule=Host(`webmail.${domain}`)"
|
||||||
|
- "traefik.http.middlewares.reg-webmails.redirectregex.regex=^https://webmail.${domain}(.*)"
|
||||||
|
- "traefik.http.middlewares.reg-webmails.redirectregex.replacement=https://kaz.bzh/relever-ses-mails-chez-kaz-via-un-webmail"
|
||||||
|
- "traefik.http.middlewares.reg-webmails.redirectregex.permanent=true"
|
||||||
|
- "traefik.http.routers.webmails.middlewares=reg-webmails"
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
mailData:
|
mailData:
|
||||||
|
@@ -94,10 +94,10 @@ SMTP_ONLY=
|
|||||||
# custom => Enables custom certificates
|
# custom => Enables custom certificates
|
||||||
# manual => Let's you manually specify locations of your SSL certificates for non-standard cases
|
# manual => Let's you manually specify locations of your SSL certificates for non-standard cases
|
||||||
# self-signed => Enables self-signed certificates
|
# self-signed => Enables self-signed certificates
|
||||||
#SSL_TYPE=self-signed
|
SSL_TYPE=manual
|
||||||
SSL_TYPE=letsencrypt
|
#SSL_TYPE=letsencrypt
|
||||||
#SSL_CERT_PATH=
|
SSL_CERT_PATH=/etc/ssl/certs/mail.pem
|
||||||
#SSL_KEY_PATH=
|
SSL_KEY_PATH=/etc/ssl/private/mail.key
|
||||||
|
|
||||||
# Set how many days a virusmail will stay on the server before being deleted
|
# Set how many days a virusmail will stay on the server before being deleted
|
||||||
# empty => 7 days
|
# empty => 7 days
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
services:
|
services:
|
||||||
|
|
||||||
app:
|
app:
|
||||||
image: roundcube/roundcubemail:1.6.9-apache
|
image: roundcube/roundcubemail
|
||||||
container_name: ${roundcubeServName}
|
container_name: ${roundcubeServName}
|
||||||
restart: ${restartPolicy}
|
restart: ${restartPolicy}
|
||||||
depends_on:
|
depends_on:
|
||||||
@@ -26,7 +26,7 @@ services:
|
|||||||
- ../../secret/env-${roundcubeServName}
|
- ../../secret/env-${roundcubeServName}
|
||||||
labels:
|
labels:
|
||||||
- "traefik.enable=true"
|
- "traefik.enable=true"
|
||||||
- "traefik.http.routers.${roundcubeServName}.rule=Host(`${webmailHost}.${domain}`) || host(`roundcube.${domain}`)"
|
- "traefik.http.routers.${roundcubeServName}.rule=host(`roundcube.${domain}`)"
|
||||||
- "traefik.docker.network=roundcubeNet"
|
- "traefik.docker.network=roundcubeNet"
|
||||||
|
|
||||||
db:
|
db:
|
||||||
|
42
dockers/spip/docker-compose.yml
Normal file
42
dockers/spip/docker-compose.yml
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
services:
|
||||||
|
db:
|
||||||
|
image: mariadb:11.4
|
||||||
|
container_name: ${spipDBName}
|
||||||
|
restart: ${restartPolicy}
|
||||||
|
env_file:
|
||||||
|
- ../../secret/env-${spipDBName}
|
||||||
|
volumes:
|
||||||
|
- spipDB:/var/lib/mysql
|
||||||
|
networks:
|
||||||
|
- spipNet
|
||||||
|
|
||||||
|
spip:
|
||||||
|
image: ipeos/spip:4.4
|
||||||
|
restart: ${restartPolicy}
|
||||||
|
container_name: ${spipServName}
|
||||||
|
env_file:
|
||||||
|
- ../../secret/env-${spipServName}
|
||||||
|
links:
|
||||||
|
- db:mysql
|
||||||
|
environment:
|
||||||
|
- SPIP_AUTO_INSTALL=1
|
||||||
|
- SPIP_DB_HOST=${spipDBName}
|
||||||
|
- SPIP_SITE_ADDRESS=https://${spipHost}.${domain}
|
||||||
|
expose:
|
||||||
|
- 80
|
||||||
|
labels:
|
||||||
|
- "traefik.enable=true"
|
||||||
|
- "traefik.http.routers.${spipServName}.rule=Host(`${spipHost}.${domain}`)"
|
||||||
|
networks:
|
||||||
|
- spipNet
|
||||||
|
volumes:
|
||||||
|
- spipData:/usr/src/spip
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
spipDB:
|
||||||
|
spipData:
|
||||||
|
|
||||||
|
networks:
|
||||||
|
spipNet:
|
||||||
|
external: true
|
||||||
|
name: spipNet
|
@@ -99,7 +99,7 @@ RUN echo "root: ADMIN_EMAIL" >> /etc/aliases \
|
|||||||
RUN echo aliases_program postalias >>/etc/sympa/sympa/sympa.conf \
|
RUN echo aliases_program postalias >>/etc/sympa/sympa/sympa.conf \
|
||||||
&& echo sendmail /usr/sbin/sendmail >>/etc/sympa/sympa/sympa.conf \
|
&& echo sendmail /usr/sbin/sendmail >>/etc/sympa/sympa/sympa.conf \
|
||||||
&& echo soap_url /sympasoap >>/etc/sympa/sympa/sympa.conf \
|
&& echo soap_url /sympasoap >>/etc/sympa/sympa/sympa.conf \
|
||||||
&& echo dmarc_protection.mode dmarc_reject >>/etc/sympa/sympa/sympa.conf \
|
&& echo dmarc_protection.mode dmarc_reject,dmarc_quarantine >>/etc/sympa/sympa/sympa.conf \
|
||||||
&& cp /usr/share/doc/sympa/examples/script/sympa_soap_client.pl.gz /usr/lib/sympa/bin/ \
|
&& cp /usr/share/doc/sympa/examples/script/sympa_soap_client.pl.gz /usr/lib/sympa/bin/ \
|
||||||
&& gunzip /usr/lib/sympa/bin/sympa_soap_client.pl.gz \
|
&& gunzip /usr/lib/sympa/bin/sympa_soap_client.pl.gz \
|
||||||
&& chmod +x /usr/lib/sympa/bin/sympa_soap_client.pl \
|
&& chmod +x /usr/lib/sympa/bin/sympa_soap_client.pl \
|
||||||
|
@@ -3,6 +3,7 @@ orange.com veryslow:
|
|||||||
wanadoo.com veryslow:
|
wanadoo.com veryslow:
|
||||||
wanadoo.fr veryslow:
|
wanadoo.fr veryslow:
|
||||||
gmail.com slow:
|
gmail.com slow:
|
||||||
|
laposte.net slow:
|
||||||
yahoo.com slow:
|
yahoo.com slow:
|
||||||
yahoo.fr slow:
|
yahoo.fr slow:
|
||||||
outlook.com veryslow:
|
outlook.com veryslow:
|
||||||
|
@@ -16,7 +16,6 @@ services:
|
|||||||
- ${jirafeauServName}:${fileHost}
|
- ${jirafeauServName}:${fileHost}
|
||||||
ports:
|
ports:
|
||||||
- ${SYMPA_IP}:25:25
|
- ${SYMPA_IP}:25:25
|
||||||
- ${SYMPA_IP}:80:80
|
|
||||||
- ${SYMPA_IP}:443:443
|
- ${SYMPA_IP}:443:443
|
||||||
env_file:
|
env_file:
|
||||||
- ../../secret/env-${sympaServName}
|
- ../../secret/env-${sympaServName}
|
||||||
@@ -33,7 +32,12 @@ services:
|
|||||||
- ./config/transport:/etc/postfix/transport:rw
|
- ./config/transport:/etc/postfix/transport:rw
|
||||||
- /etc/localtime:/etc/localtime:ro
|
- /etc/localtime:/etc/localtime:ro
|
||||||
- /etc/timezone:/etc/timezone:ro
|
- /etc/timezone:/etc/timezone:ro
|
||||||
- /etc/letsencrypt:/etc/letsencrypt:ro
|
- /etc/ssl:/etc/ssl:ro
|
||||||
|
labels:
|
||||||
|
- "traefik.enable=true"
|
||||||
|
- "traefik.http.routers.sympa.rule=host(`listes.${domain}`)"
|
||||||
|
- "traefik.docker.network=sympaNet"
|
||||||
|
|
||||||
|
|
||||||
db:
|
db:
|
||||||
image: mariadb:10.5
|
image: mariadb:10.5
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
services:
|
services:
|
||||||
reverse-proxy:
|
reverse-proxy:
|
||||||
image: traefik:v3.3.4
|
image: traefik:v3.4.4
|
||||||
container_name: ${traefikServName}
|
container_name: ${traefikServName}
|
||||||
restart: ${restartPolicy}
|
restart: ${restartPolicy}
|
||||||
# Enables the web UI and tells Traefik to listen to docker
|
# Enables the web UI and tells Traefik to listen to docker
|
||||||
@@ -11,6 +11,7 @@ services:
|
|||||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||||
- ./conf:/etc/traefik/
|
- ./conf:/etc/traefik/
|
||||||
- letsencrypt:/letsencrypt
|
- letsencrypt:/letsencrypt
|
||||||
|
- log:/log
|
||||||
environment:
|
environment:
|
||||||
- TRAEFIK_PROVIDERS_DOCKER=true
|
- TRAEFIK_PROVIDERS_DOCKER=true
|
||||||
- TRAEFIK_PROVIDERS_DOCKER_EXPOSEDBYDEFAULT=false
|
- TRAEFIK_PROVIDERS_DOCKER_EXPOSEDBYDEFAULT=false
|
||||||
@@ -22,14 +23,23 @@ services:
|
|||||||
- TRAEFIK_ENTRYPOINTS_websecure_HTTP_TLS_CERTRESOLVER=letsencrypt
|
- TRAEFIK_ENTRYPOINTS_websecure_HTTP_TLS_CERTRESOLVER=letsencrypt
|
||||||
- TRAEFIK_ENTRYPOINTS_websecure_HTTP_MIDDLEWARES=hsts@file,test-ipallowlist@file
|
- TRAEFIK_ENTRYPOINTS_websecure_HTTP_MIDDLEWARES=hsts@file,test-ipallowlist@file
|
||||||
- TRAEFIK_ENTRYPOINTS_websecure_TRANSPORT_RESPONDINGTIMEOUTS_READTIMEOUT=600
|
- TRAEFIK_ENTRYPOINTS_websecure_TRANSPORT_RESPONDINGTIMEOUTS_READTIMEOUT=600
|
||||||
|
- TRAEFIK_ENTRYPOINTS_websecure_TRANSPORT_RESPONDINGTIMEOUTS_IDLETIMEOUT=600
|
||||||
- TRAEFIK_CERTIFICATESRESOLVERS_letsencrypt_ACME_EMAIL=admin@${domain}
|
- TRAEFIK_CERTIFICATESRESOLVERS_letsencrypt_ACME_EMAIL=admin@${domain}
|
||||||
- TRAEFIK_CERTIFICATESRESOLVERS_letsencrypt_ACME_CASERVER=${acme_server}
|
- TRAEFIK_CERTIFICATESRESOLVERS_letsencrypt_ACME_CASERVER=${acme_server}
|
||||||
- TRAEFIK_CERTIFICATESRESOLVERS_letsencrypt_ACME_STORAGE=/letsencrypt/acme.json
|
- TRAEFIK_CERTIFICATESRESOLVERS_letsencrypt_ACME_STORAGE=/letsencrypt/acme.json
|
||||||
- TRAEFIK_CERTIFICATESRESOLVERS_letsencrypt_ACME_TLSCHALLENGE=true
|
- TRAEFIK_CERTIFICATESRESOLVERS_letsencrypt_ACME_HTTPCHALLENGE_ENTRYPOINT=web
|
||||||
- TRAEFIK_LOG_LEVEL=INFO
|
|
||||||
- TRAEFIK_API_DASHBOARD=true
|
- TRAEFIK_API_DASHBOARD=true
|
||||||
#pour la migration vers traefik3
|
#pour la migration vers traefik3
|
||||||
- TRAEFIK_CORE_DEFAULTRULESYNTAX=v3
|
- TRAEFIK_CORE_DEFAULTRULESYNTAX=v3
|
||||||
|
|
||||||
|
- TZ=Europe/Paris
|
||||||
|
- TRAEFIK_ACCESSLOG=true
|
||||||
|
- TRAEFIK_ACCESSLOG_FILEPATH=/log/traefik_acces.log
|
||||||
|
- TRAEFIK_ACCESSLOG_FILTERS_STATUSCODES=404,403,401
|
||||||
|
- TRAEFIK_LOG=true
|
||||||
|
- TRAEFIK_LOG_LEVEL=INFO
|
||||||
|
- TRAEFIK_LOG_FILEPATH=/log/traefik.log
|
||||||
|
|
||||||
labels:
|
labels:
|
||||||
- "traefik.enable=true"
|
- "traefik.enable=true"
|
||||||
- "traefik.http.routers.traefik_https.rule=Host(`${site}.${domain}`) && PathPrefix(`/api`, `/dashboard`)"
|
- "traefik.http.routers.traefik_https.rule=Host(`${site}.${domain}`) && PathPrefix(`/api`, `/dashboard`)"
|
||||||
@@ -98,6 +108,15 @@ services:
|
|||||||
{{apikaz
|
{{apikaz
|
||||||
- apikazNet
|
- apikazNet
|
||||||
}}
|
}}
|
||||||
|
{{mastodon
|
||||||
|
- mastodonNet
|
||||||
|
}}
|
||||||
|
{{peertube
|
||||||
|
- peertubeNet
|
||||||
|
}}
|
||||||
|
{{spip
|
||||||
|
- spipNet
|
||||||
|
}}
|
||||||
|
|
||||||
#### BEGIN ORGA USE_NET
|
#### BEGIN ORGA USE_NET
|
||||||
#### END ORGA USE_NET
|
#### END ORGA USE_NET
|
||||||
@@ -201,9 +220,26 @@ networks:
|
|||||||
external: true
|
external: true
|
||||||
name: apikazNet
|
name: apikazNet
|
||||||
}}
|
}}
|
||||||
|
{{mastodon
|
||||||
|
mastodonNet:
|
||||||
|
external: true
|
||||||
|
name: mastodonNet
|
||||||
|
}}
|
||||||
|
{{peertube
|
||||||
|
peertubeNet:
|
||||||
|
external: true
|
||||||
|
name: peertubeNet
|
||||||
|
}}
|
||||||
|
{{spip
|
||||||
|
spipNet:
|
||||||
|
external: true
|
||||||
|
name: spipNet
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
#### BEGIN ORGA DEF_NET
|
#### BEGIN ORGA DEF_NET
|
||||||
#### END ORGA DEF_NET
|
#### END ORGA DEF_NET
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
letsencrypt:
|
letsencrypt:
|
||||||
|
log:
|
||||||
|
@@ -67,3 +67,59 @@ div.kaz::after {
|
|||||||
border-width: thin;
|
border-width: thin;
|
||||||
border-color: red;
|
border-color: red;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
div.kaz2:hover {
|
||||||
|
font-size: initial !important;
|
||||||
|
color: initial !important;
|
||||||
|
}
|
||||||
|
div.kaz2:hover a.kaz2 {
|
||||||
|
background-size: initial !important;
|
||||||
|
padding: 4px 0 4px 230px;
|
||||||
|
}
|
||||||
|
div.kaz2 a.kaz2 {
|
||||||
|
background-size: 110px 12px;
|
||||||
|
padding: 4px 0 4px 120px;
|
||||||
|
}
|
||||||
|
div.kaz2 {
|
||||||
|
font-size: 10px;
|
||||||
|
color: #969696;
|
||||||
|
padding: 1pc 0 0 0;
|
||||||
|
margin: 0 0 0 80px;
|
||||||
|
min-height: 200px;
|
||||||
|
clear: left;
|
||||||
|
}
|
||||||
|
div.kaz2::before {
|
||||||
|
content: url("/m/logo.png");
|
||||||
|
position: absolute;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0 0 0 -70px;
|
||||||
|
width: 50px;
|
||||||
|
height: 100px;
|
||||||
|
}
|
||||||
|
div.kaz2>ul>li {
|
||||||
|
list-style-type: none; /* Remove bullets */
|
||||||
|
}
|
||||||
|
div.kaz2>ul>li::before {
|
||||||
|
content: "\2713";
|
||||||
|
color: green;
|
||||||
|
margin-left: -20px;
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
a.kaz2 {
|
||||||
|
background-image: url("/m/coche.png");
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
padding: 4px 0 4px 230px;
|
||||||
|
margin: 0 0 0 0;
|
||||||
|
min-height: 25px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.kaz2 div.nb {
|
||||||
|
padding: 1pc;
|
||||||
|
margin: 0 0 0 -70px;
|
||||||
|
display: block;
|
||||||
|
border-radius: 30px;
|
||||||
|
border-style: solid;
|
||||||
|
border-width: thin;
|
||||||
|
border-color: red;
|
||||||
|
}
|
||||||
|
@@ -48,30 +48,18 @@ gandi_dns_gandi_api_key="${gandi_GANDI_KEY}"
|
|||||||
|
|
||||||
####################
|
####################
|
||||||
# mattermost
|
# mattermost
|
||||||
mattermost_MYSQL_ROOT_PASSWORD="--clean_val--"
|
mattermost_POSTGRES_USER="mattermost"
|
||||||
mattermost_MYSQL_DATABASE="--clean_val--"
|
mattermost_POSTGRES_PASSWORD="--clean_val--"
|
||||||
mattermost_MYSQL_USER="--clean_val--"
|
mattermost_POSTGRES_DB="mattermost"
|
||||||
mattermost_MYSQL_PASSWORD="--clean_val--"
|
|
||||||
|
|
||||||
# Share with mattermostDB
|
mattermost_MM_ADMIN_EMAIL="${matterHost}@${domain}"
|
||||||
mattermost_MM_DBNAME="${mattermost_MYSQL_DATABASE}"
|
mattermost_MM_ADMIN_USER="admin-mattermost"
|
||||||
mattermost_MM_USERNAME="${mattermost_MYSQL_USER}"
|
mattermost_MM_ADMIN_PASSWORD="--clean_val--@"
|
||||||
mattermost_MM_PASSWORD="${mattermost_MYSQL_PASSWORD}"
|
mattermost_MM_SQLSETTINGS_DATASOURCE="postgres://${mattermost_POSTGRES_USER}:${mattermost_POSTGRES_PASSWORD}@postgres:5432/${mattermost_POSTGRES_DB}?sslmode=disable&connect_timeout=10"
|
||||||
|
|
||||||
mattermost_DB_PORT_NUMBER="3306"
|
|
||||||
mattermost_DB_HOST="db"
|
|
||||||
mattermost_MM_SQLSETTINGS_DRIVERNAME="mysql"
|
|
||||||
mattermost_MM_ADMIN_EMAIL="admin@kaz.bzh"
|
|
||||||
|
|
||||||
# mattermost_MM_SQLSETTINGS_DATASOURCE = "MM_USERNAME:MM_PASSWORD@tcp(DB_HOST:DB_PORT_NUMBER)/MM_DBNAME?charset=utf8mb4,utf8&readTimeout=30s&writeTimeout=30s"
|
|
||||||
# Don't forget to replace all entries (beginning by MM_ and DB_) in MM_SQLSETTINGS_DATASOURCE with the real variables values.
|
|
||||||
mattermost_MM_SQLSETTINGS_DATASOURCE="${mattermost_MYSQL_USER}:${mattermost_MYSQL_PASSWORD}@tcp(${mattermost_DB_HOST}:${mattermost_DB_PORT_NUMBER})/${mattermost_MM_DBNAME}?charset=utf8mb4,utf8&readTimeout=30s&writeTimeout=30s"
|
|
||||||
# sinon avec postgres
|
|
||||||
# mattermost_MM_SQLSETTINGS_DATASOURCE = "postgres://${MM_USERNAME}:${MM_PASSWORD}@db:5432/${MM_DBNAME}?sslmode=disable&connect_timeout=10"
|
|
||||||
|
|
||||||
# pour envoyer des messages sur l'agora avec mmctl
|
# pour envoyer des messages sur l'agora avec mmctl
|
||||||
mattermost_user="admin-mattermost"
|
mattermost_user="${mattermost_MM_ADMIN_USER}"
|
||||||
mattermost_pass="--clean_val--"
|
mattermost_pass="${mattermost_MM_ADMIN_PASSWORD}"
|
||||||
mattermost_token="xxx-private"
|
mattermost_token="xxx-private"
|
||||||
|
|
||||||
##################
|
##################
|
||||||
@@ -159,8 +147,8 @@ sympa_MYSQL_DATABASE="sympa"
|
|||||||
sympa_MYSQL_USER="sympa"
|
sympa_MYSQL_USER="sympa"
|
||||||
sympa_MYSQL_PASSWORD="--clean_val--"
|
sympa_MYSQL_PASSWORD="--clean_val--"
|
||||||
|
|
||||||
sympa_KEY="/etc/letsencrypt/live/${domain}/privkey.pem"
|
sympa_KEY="/etc/ssl/private/listes.key"
|
||||||
sympa_CERT="/etc/letsencrypt/live/${domain}/fullchain.pem"
|
sympa_CERT="/etc/ssl/certs/listes.pem"
|
||||||
sympa_LISTMASTERS="listmaster@${domain_sympa}"
|
sympa_LISTMASTERS="listmaster@${domain_sympa}"
|
||||||
sympa_ADMINEMAIL="listmaster@${domain_sympa}"
|
sympa_ADMINEMAIL="listmaster@${domain_sympa}"
|
||||||
sympa_SOAP_USER="sympa"
|
sympa_SOAP_USER="sympa"
|
||||||
@@ -303,7 +291,61 @@ castopod_CP_EMAIL_SMTP_PASSWORD=
|
|||||||
castopod_CP_EMAIL_FROM=noreply@${domain}
|
castopod_CP_EMAIL_FROM=noreply@${domain}
|
||||||
castopod_CP_EMAIL_SMTP_CRYPTO=tls
|
castopod_CP_EMAIL_SMTP_CRYPTO=tls
|
||||||
|
|
||||||
######################
|
|
||||||
|
#####################
|
||||||
|
# Spip
|
||||||
|
spip_MYSQL_ROOT_PASSWORD="--clean_val--"
|
||||||
|
spip_MYSQL_DATABASE="--clean_val--"
|
||||||
|
spip_MYSQL_USER="--clean_val--"
|
||||||
|
spip_MYSQL_PASSWORD="--clean_val--"
|
||||||
|
spip_SPIP_AUTO_INSTALL=1
|
||||||
|
spip_SPIP_DB_SERVER=mysql
|
||||||
|
spip_SPIP_DB_LOGIN="${spip_MYSQL_USER}"
|
||||||
|
spip_SPIP_DB_PASS="${spip_MYSQL_PASSWORD}"
|
||||||
|
spip_SPIP_DB_NAME="${spip_MYSQL_DATABASE}"
|
||||||
|
spip_SPIP_ADMIN_NAME=admin
|
||||||
|
spip_SPIP_ADMIN_LOGIN=admin
|
||||||
|
spip_SPIP_ADMIN_EMAIL=admin@${domain}
|
||||||
|
spip_SPIP_ADMIN_PASS="--clean_val--"
|
||||||
|
spip_PHP_TIMEZONE="Europe/Paris"
|
||||||
|
|
||||||
|
#####################
|
||||||
|
# Peertube
|
||||||
|
peertube_POSTGRES_USER="--clean_val--"
|
||||||
|
peertube_POSTGRES_PASSWORD="--clean_val--"
|
||||||
|
peertube_PEERTUBE_DB_NAME="--clean_val--"
|
||||||
|
|
||||||
|
peertube_PEERTUBE_DB_USERNAME="${peertube_POSTGRES_USER}"
|
||||||
|
peertube_PEERTUBE_DB_PASSWORD="${peertube_POSTGRES_PASSWORD}"
|
||||||
|
peertube_PEERTUBE_DB_SSL=false
|
||||||
|
peertube_PEERTUBE_DB_HOSTNAME="${peertubeDBName}"
|
||||||
|
peertube_PEERTUBE_WEBSERVER_HOSTNAME="${peertubeHost}.${domain}"
|
||||||
|
peertube_PEERTUBE_TRUST_PROXY="['10.0.0.0/8', '127.0.0.1', 'loopback', '172.18.0.0/16']"
|
||||||
|
|
||||||
|
peertube_PEERTUBE_SECRET="--clean_val--"
|
||||||
|
peertube_PT_INITIAL_ROOT_PASSWORD="--clean_val--"
|
||||||
|
|
||||||
|
#peertube_PEERTUBE_SMTP_USERNAME=
|
||||||
|
#peertube_PEERTUBE_SMTP_PASSWORD=
|
||||||
|
# Default to Postfix service name "postfix" in docker-compose.yml
|
||||||
|
# May be the hostname of your Custom SMTP server
|
||||||
|
peertube_PEERTUBE_SMTP_HOSTNAME=
|
||||||
|
peertube_PEERTUBE_SMTP_PORT=25
|
||||||
|
peertube_PEERTUBE_SMTP_FROM=
|
||||||
|
peertube_PEERTUBE_SMTP_TLS=false
|
||||||
|
peertube_PEERTUBE_SMTP_DISABLE_STARTTLS=false
|
||||||
|
peertube_PEERTUBE_ADMIN_EMAIL=
|
||||||
|
peertube_POSTFIX_myhostname=
|
||||||
|
#peertube_OPENDKIM_DOMAINS=peertube
|
||||||
|
peertube_OPENDKIM_RequireSafeKeys=no
|
||||||
|
|
||||||
|
peertube_PEERTUBE_OBJECT_STORAGE_UPLOAD_ACL_PUBLIC="public-read"
|
||||||
|
peertube_PEERTUBE_OBJECT_STORAGE_UPLOAD_ACL_PRIVATE="private"
|
||||||
|
|
||||||
|
######################
|
||||||
|
peertube_POSTGRES_DB="${peertube_PEERTUBE_DB_NAME}"
|
||||||
|
|
||||||
|
######################
|
||||||
# SNAPPYMAIL
|
# SNAPPYMAIL
|
||||||
# Url https://snappymail.${domain}/?admin
|
# Url https://snappymail.${domain}/?admin
|
||||||
# au premier lancement un mot de passe est généré en aut par l' appli dans le
|
# au premier lancement un mot de passe est généré en aut par l' appli dans le
|
||||||
@@ -313,3 +355,11 @@ castopod_CP_EMAIL_SMTP_CRYPTO=tls
|
|||||||
snappymail_TZ="Europe/Paris"
|
snappymail_TZ="Europe/Paris"
|
||||||
snappymail_UPLOAD_MAX_SIZE="100M"
|
snappymail_UPLOAD_MAX_SIZE="100M"
|
||||||
|
|
||||||
|
####################
|
||||||
|
# mastodon
|
||||||
|
mastodon_POSTGRES_USER="--clean_val--"
|
||||||
|
mastodon_POSTGRES_PASSWORD="--clean_val--"
|
||||||
|
mastodon_POSTGRES_DB=mastodon
|
||||||
|
mastodon_DB_USER="${mastodon_POSTGRES_USER}"
|
||||||
|
mastodon_DB_PASS="${mastodon_POSTGRES_PASSWORD}"
|
||||||
|
mastodon_DB_NAME=mastodon
|
||||||
|
3
secret.tmpl/env-alwaysdata
Normal file
3
secret.tmpl/env-alwaysdata
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
ALWAYSDATA_TOKEN=
|
||||||
|
ALWAYSDATA_API=
|
||||||
|
ALWAYSDATA_ACCOUNT=
|
6
secret.tmpl/env-mastodonDB
Normal file
6
secret.tmpl/env-mastodonDB
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
DB_USER=
|
||||||
|
DB_NAME=
|
||||||
|
DB_PASS=
|
||||||
|
POSTGRES_USER=
|
||||||
|
POSTGRES_PASSWORD=
|
||||||
|
POSTGRES_DB=postgres
|
10
secret.tmpl/env-mastodonServ
Normal file
10
secret.tmpl/env-mastodonServ
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
SECRET_KEY_BASE=
|
||||||
|
OTP_SECRET=
|
||||||
|
ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY=
|
||||||
|
ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT=
|
||||||
|
ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY=
|
||||||
|
VAPID_PRIVATE_KEY==
|
||||||
|
VAPID_PUBLIC_KEY=
|
||||||
|
SMTP_PASSWORD=
|
||||||
|
EMAIL_DOMAIN_ALLOWLIST=
|
||||||
|
ADMIN_PASSWORD=
|
@@ -1,8 +1,3 @@
|
|||||||
|
POSTGRES_USER=
|
||||||
MYSQL_ROOT_PASSWORD=
|
POSTGRES_PASSWORD=
|
||||||
MYSQL_DATABASE=
|
POSTGRES_DB=
|
||||||
MYSQL_USER=
|
|
||||||
MYSQL_PASSWORD=
|
|
||||||
|
|
||||||
MM_MYSQL_USER=
|
|
||||||
MM_MYSQL_PASSWORD=
|
|
||||||
|
@@ -1,15 +1,4 @@
|
|||||||
|
MM_SQLSETTINGS_DATASOURCE=
|
||||||
# share with matterDB
|
|
||||||
MM_DBNAME=
|
|
||||||
MM_USERNAME=
|
|
||||||
MM_PASSWORD=
|
|
||||||
|
|
||||||
MM_ADMIN_EMAIL=
|
MM_ADMIN_EMAIL=
|
||||||
MM_ADMIN_USER=
|
MM_ADMIN_USER=
|
||||||
MM_ADMIN_PASSWORD=
|
MM_ADMIN_PASSWORD=
|
||||||
|
|
||||||
DB_HOST=
|
|
||||||
DB_PORT_NUMBER=
|
|
||||||
MM_SQLSETTINGS_DRIVERNAME=
|
|
||||||
MM_SQLSETTINGS_DATASOURCE=
|
|
||||||
|
|
4
secret.tmpl/env-spipDB
Normal file
4
secret.tmpl/env-spipDB
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
MYSQL_ROOT_PASSWORD=
|
||||||
|
MYSQL_DATABASE=
|
||||||
|
MYSQL_USER=
|
||||||
|
MYSQL_PASSWORD=
|
10
secret.tmpl/env-spipServ
Normal file
10
secret.tmpl/env-spipServ
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
SPIP_AUTO_INSTALL=1
|
||||||
|
SPIP_DB_SERVER=mysql
|
||||||
|
SPIP_DB_LOGIN=
|
||||||
|
SPIP_DB_PASS=
|
||||||
|
SPIP_DB_NAME=
|
||||||
|
SPIP_ADMIN_NAME=
|
||||||
|
SPIP_ADMIN_LOGIN=
|
||||||
|
SPIP_ADMIN_EMAIL=
|
||||||
|
SPIP_ADMIN_PASS=
|
||||||
|
PHP_TIMEZONE=
|
Reference in New Issue
Block a user