first commit
This commit is contained in:
4
config/container-mail.list.tmpl
Normal file
4
config/container-mail.list.tmpl
Normal file
@ -0,0 +1,4 @@
|
||||
# e-mail server composer
|
||||
ldap
|
||||
postfix
|
||||
sympa
|
1
config/container-orga.list.tmpl
Normal file
1
config/container-orga.list.tmpl
Normal file
@ -0,0 +1 @@
|
||||
# orga composer
|
2
config/container-proxy.list.tmpl
Normal file
2
config/container-proxy.list.tmpl
Normal file
@ -0,0 +1,2 @@
|
||||
proxy
|
||||
#traefik
|
12
config/container-withMail.list.tmpl
Normal file
12
config/container-withMail.list.tmpl
Normal file
@ -0,0 +1,12 @@
|
||||
cloud
|
||||
dokuwiki
|
||||
#framadate
|
||||
paheko
|
||||
gitea
|
||||
jirafeau
|
||||
mattermost
|
||||
roundcube
|
||||
mobilizon
|
||||
vaultwarden
|
||||
ldap
|
||||
apikaz
|
6
config/container-withoutMail.list.tmpl
Normal file
6
config/container-withoutMail.list.tmpl
Normal file
@ -0,0 +1,6 @@
|
||||
jirafeau
|
||||
ethercalc
|
||||
collabora
|
||||
etherpad
|
||||
web
|
||||
imapsync
|
153
config/dockers.tmpl.env
Normal file
153
config/dockers.tmpl.env
Normal file
@ -0,0 +1,153 @@
|
||||
# Les variables d'environnements utilisées
|
||||
# par les dockers via le lien :
|
||||
# .env -> ../../config/dockers.env
|
||||
|
||||
#######################################
|
||||
# prod / dev / local
|
||||
mode=
|
||||
|
||||
########################################
|
||||
# choix du domaine
|
||||
# prod=kaz.bzh
|
||||
domain=
|
||||
|
||||
########################################
|
||||
# choix du domaine des mails sympa
|
||||
# prod=listes.kaz.bzh
|
||||
domain_sympa=
|
||||
|
||||
########################################
|
||||
# Pour paheko qui met en "dur" dans
|
||||
# sa config l'URL pour l'atteindre
|
||||
|
||||
# prod=https
|
||||
httpProto=
|
||||
|
||||
# prod=89.234.186.111
|
||||
MAIN_IP=
|
||||
|
||||
# prod=89.234.186.151
|
||||
SYMPA_IP=
|
||||
|
||||
# prod1=prod1
|
||||
site=prod1
|
||||
|
||||
########################################
|
||||
# choix du domaine ldap
|
||||
# prod dc=kaz,dc=bzh
|
||||
ldap_root=
|
||||
|
||||
########################################
|
||||
# devrait être dans env-jirafeauServ
|
||||
# mais seuls les variables de ".env" sont
|
||||
# utilisables pour le montage des volumes
|
||||
|
||||
jirafeauDir=
|
||||
|
||||
# idem, devrait être dans le env-castopodServ mais c'est utilisé directement dans le docker-compose.yml
|
||||
castopodRedisPassword=
|
||||
|
||||
|
||||
########################################
|
||||
# politique de redémarrage
|
||||
# prod=always
|
||||
restartPolicy=
|
||||
|
||||
########################################
|
||||
# sites multiples
|
||||
# prod=prod1
|
||||
site=
|
||||
|
||||
########################################
|
||||
# URL de l'API ACME pour les certifs
|
||||
# prod=https://acme-v02.api.letsencrypt.org/directory
|
||||
acme_server=
|
||||
|
||||
|
||||
########################################
|
||||
# noms des services
|
||||
|
||||
# ou www (mais bof)
|
||||
webHost=
|
||||
|
||||
calcHost=tableur
|
||||
cloudHost=cloud
|
||||
dateHost=sondage
|
||||
dokuwikiHost=wiki
|
||||
fileHost=depot
|
||||
pahekoHost=paheko
|
||||
gitHost=git
|
||||
gravHost=grav
|
||||
matterHost=agora
|
||||
officeHost=office
|
||||
padHost=pad
|
||||
smtpHost=smtp
|
||||
ldapHost=ldap
|
||||
ldapUIHost=mdp
|
||||
sympaHost=listes
|
||||
vigiloHost=vigilo
|
||||
webmailHost=webmail
|
||||
wordpressHost=wp
|
||||
mobilizonHost=mobilizon
|
||||
vaultwardenHost=koffre
|
||||
traefikHost=dashboard
|
||||
imapsyncHost=imapsync
|
||||
castopodHost=pod
|
||||
apikazHost=apikaz
|
||||
|
||||
########################################
|
||||
# ports internes
|
||||
|
||||
matterPort=8000
|
||||
imapsyncPort=8080
|
||||
apikaz=5000
|
||||
|
||||
########################################
|
||||
# noms des containers
|
||||
|
||||
dokuwikiServName=dokuwikiServ
|
||||
ethercalcServName=ethercalcServ
|
||||
etherpadServName=etherpadServ
|
||||
framadateServName=framadateServ
|
||||
pahekoServName=pahekoServ
|
||||
gitServName=gitServ
|
||||
gravServName=gravServ
|
||||
jirafeauServName=jirafeauServ
|
||||
mattermostServName=mattermostServ
|
||||
nextcloudServName=nextcloudServ
|
||||
officeServName=officeServ
|
||||
proxyServName=proxyServ
|
||||
roundcubeServName=roundcubeServ
|
||||
smtpServName=mailServ
|
||||
ldapServName=ldapServ
|
||||
sympaServName=sympaServ
|
||||
vigiloServName=vigiloServ
|
||||
webServName=webServ
|
||||
wordpressServName=wpServ
|
||||
mobilizonServName=mobilizonServ
|
||||
vaultwardenServName=vaultwardenServ
|
||||
traefikServName=traefikServ
|
||||
prometheusServName=prometheusServ
|
||||
grafanaServName=grafanaServ
|
||||
ethercalcDBName=ethercalcDB
|
||||
etherpadDBName=etherpadDB
|
||||
framadateDBName=framadateDB
|
||||
gitDBName=gitDB
|
||||
mattermostDBName=mattermostDB
|
||||
nextcloudDBName=nextcloudDB
|
||||
roundcubeDBName=roundcubeDB
|
||||
sympaDBName=sympaDB
|
||||
vigiloDBName=vigiloDB
|
||||
wordpressDBName=wpDB
|
||||
mobilizonDBName=mobilizonDB
|
||||
vaultwardenDBName=vaultwardenDB
|
||||
ldapUIName=ldapUI
|
||||
imapsyncServName=imapsyncServ
|
||||
castopodDBName=castopodDB
|
||||
castopodServName=castopodServ
|
||||
apikazServName=apikazServ
|
||||
|
||||
########################################
|
||||
# services activés par container.sh
|
||||
# variables d'environneements utilisées
|
||||
# pour le tmpl du mandataire (proxy)
|
1
config/orgaTmpl/.env
Symbolic link
1
config/orgaTmpl/.env
Symbolic link
@ -0,0 +1 @@
|
||||
../../config/dockers.env
|
58
config/orgaTmpl/app/Dockerfile
Normal file
58
config/orgaTmpl/app/Dockerfile
Normal file
@ -0,0 +1,58 @@
|
||||
FROM alpine:3.17
|
||||
|
||||
# Some ENV variables
|
||||
ENV PATH="/mattermost/bin:${PATH}"
|
||||
#ENV MM_VERSION=5.32.0
|
||||
ENV MM_VERSION=6.1.0
|
||||
ENV MM_INSTALL_TYPE=docker
|
||||
|
||||
# Build argument to set Mattermost edition
|
||||
ARG edition=enterprise
|
||||
ARG PUID=2000
|
||||
ARG PGID=2000
|
||||
ARG MM_BINARY=
|
||||
|
||||
|
||||
# Install some needed packages
|
||||
RUN apk add --no-cache \
|
||||
ca-certificates \
|
||||
curl \
|
||||
jq \
|
||||
libc6-compat \
|
||||
libffi-dev \
|
||||
libcap \
|
||||
linux-headers \
|
||||
mailcap \
|
||||
netcat-openbsd \
|
||||
xmlsec-dev \
|
||||
tzdata \
|
||||
&& rm -rf /tmp/*
|
||||
|
||||
# Get Mattermost
|
||||
RUN mkdir -p /mattermost/data /mattermost/plugins /mattermost/client/plugins \
|
||||
&& if [ ! -z "$MM_BINARY" ]; then curl $MM_BINARY | tar -xvz ; \
|
||||
elif [ "$edition" = "team" ] ; then curl https://releases.mattermost.com/$MM_VERSION/mattermost-team-$MM_VERSION-linux-amd64.tar.gz?src=docker-app | tar -xvz ; \
|
||||
else curl https://releases.mattermost.com/$MM_VERSION/mattermost-$MM_VERSION-linux-amd64.tar.gz?src=docker-app | tar -xvz ; fi \
|
||||
&& cp /mattermost/config/config.json /config.json.save \
|
||||
&& rm -rf /mattermost/config/config.json \
|
||||
&& addgroup -g ${PGID} mattermost \
|
||||
&& adduser -D -u ${PUID} -G mattermost -h /mattermost -D mattermost \
|
||||
&& chown -R mattermost:mattermost /mattermost /config.json.save /mattermost/plugins /mattermost/client/plugins \
|
||||
&& setcap cap_net_bind_service=+ep /mattermost/bin/mattermost
|
||||
|
||||
USER mattermost
|
||||
|
||||
#Healthcheck to make sure container is ready
|
||||
HEALTHCHECK CMD curl --fail http://localhost:8000 || exit 1
|
||||
|
||||
# Configure entrypoint and command
|
||||
COPY entrypoint.sh /
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
WORKDIR /mattermost
|
||||
CMD ["mattermost"]
|
||||
|
||||
# Expose port 8000 of the container
|
||||
EXPOSE 8000
|
||||
|
||||
# Declare volumes for mount point directories
|
||||
VOLUME ["/mattermost/data", "/mattermost/logs", "/mattermost/config", "/mattermost/plugins", "/mattermost/client/plugins"]
|
82
config/orgaTmpl/app/entrypoint.sh
Executable file
82
config/orgaTmpl/app/entrypoint.sh
Executable file
@ -0,0 +1,82 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Function to generate a random salt
|
||||
generate_salt() {
|
||||
tr -dc 'a-zA-Z0-9' < /dev/urandom | fold -w 48 | head -n 1
|
||||
}
|
||||
|
||||
# Read environment variables or set default values
|
||||
DB_HOST=${DB_HOST:-db}
|
||||
DB_PORT_NUMBER=${DB_PORT_NUMBER:-5432}
|
||||
# see https://www.postgresql.org/docs/current/libpq-ssl.html
|
||||
# for usage when database connection requires encryption
|
||||
# filenames should be escaped if they contain spaces
|
||||
# i.e. $(printf %s ${MY_ENV_VAR:-''} | jq -s -R -r @uri)
|
||||
# the location of the CA file can be set using environment var PGSSLROOTCERT
|
||||
# the location of the CRL file can be set using PGSSLCRL
|
||||
# The URL syntax for connection string does not support the parameters
|
||||
# sslrootcert and sslcrl reliably, so use these PostgreSQL-specified variables
|
||||
# to set names if using a location other than default
|
||||
DB_USE_SSL=${DB_USE_SSL:-disable}
|
||||
MM_DBNAME=${MM_DBNAME:-mattermost}
|
||||
MM_CONFIG=${MM_CONFIG:-/mattermost/config/config.json}
|
||||
|
||||
_1=$(echo "$1" | awk '{ s=substr($0, 0, 1); print s; }' )
|
||||
if [ "$_1" = '-' ]; then
|
||||
set -- mattermost "$@"
|
||||
fi
|
||||
|
||||
if [ "$1" = 'mattermost' ]; then
|
||||
# Check CLI args for a -config option
|
||||
for ARG in "$@"; do
|
||||
case "$ARG" in
|
||||
-config=*) MM_CONFIG=${ARG#*=};;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ ! -f "$MM_CONFIG" ]; then
|
||||
# If there is no configuration file, create it with some default values
|
||||
echo "No configuration file $MM_CONFIG"
|
||||
echo "Creating a new one"
|
||||
# Copy default configuration file
|
||||
cp /config.json.save "$MM_CONFIG"
|
||||
# Substitute some parameters with jq
|
||||
jq '.ServiceSettings.ListenAddress = ":8000"' "$MM_CONFIG" > "$MM_CONFIG.tmp" && mv "$MM_CONFIG.tmp" "$MM_CONFIG"
|
||||
jq '.LogSettings.EnableConsole = true' "$MM_CONFIG" > "$MM_CONFIG.tmp" && mv "$MM_CONFIG.tmp" "$MM_CONFIG"
|
||||
jq '.LogSettings.ConsoleLevel = "ERROR"' "$MM_CONFIG" > "$MM_CONFIG.tmp" && mv "$MM_CONFIG.tmp" "$MM_CONFIG"
|
||||
jq '.FileSettings.Directory = "/mattermost/data/"' "$MM_CONFIG" > "$MM_CONFIG.tmp" && mv "$MM_CONFIG.tmp" "$MM_CONFIG"
|
||||
jq '.FileSettings.EnablePublicLink = true' "$MM_CONFIG" > "$MM_CONFIG.tmp" && mv "$MM_CONFIG.tmp" "$MM_CONFIG"
|
||||
jq ".FileSettings.PublicLinkSalt = \"$(generate_salt)\"" "$MM_CONFIG" > "$MM_CONFIG.tmp" && mv "$MM_CONFIG.tmp" "$MM_CONFIG"
|
||||
jq '.EmailSettings.SendEmailNotifications = false' "$MM_CONFIG" > "$MM_CONFIG.tmp" && mv "$MM_CONFIG.tmp" "$MM_CONFIG"
|
||||
jq '.EmailSettings.FeedbackEmail = ""' "$MM_CONFIG" > "$MM_CONFIG.tmp" && mv "$MM_CONFIG.tmp" "$MM_CONFIG"
|
||||
jq '.EmailSettings.SMTPServer = ""' "$MM_CONFIG" > "$MM_CONFIG.tmp" && mv "$MM_CONFIG.tmp" "$MM_CONFIG"
|
||||
jq '.EmailSettings.SMTPPort = ""' "$MM_CONFIG" > "$MM_CONFIG.tmp" && mv "$MM_CONFIG.tmp" "$MM_CONFIG"
|
||||
jq ".EmailSettings.InviteSalt = \"$(generate_salt)\"" "$MM_CONFIG" > "$MM_CONFIG.tmp" && mv "$MM_CONFIG.tmp" "$MM_CONFIG"
|
||||
jq ".EmailSettings.PasswordResetSalt = \"$(generate_salt)\"" "$MM_CONFIG" > "$MM_CONFIG.tmp" && mv "$MM_CONFIG.tmp" "$MM_CONFIG"
|
||||
jq '.RateLimitSettings.Enable = true' "$MM_CONFIG" > "$MM_CONFIG.tmp" && mv "$MM_CONFIG.tmp" "$MM_CONFIG"
|
||||
jq '.SqlSettings.DriverName = "postgres"' "$MM_CONFIG" > "$MM_CONFIG.tmp" && mv "$MM_CONFIG.tmp" "$MM_CONFIG"
|
||||
jq ".SqlSettings.AtRestEncryptKey = \"$(generate_salt)\"" "$MM_CONFIG" > "$MM_CONFIG.tmp" && mv "$MM_CONFIG.tmp" "$MM_CONFIG"
|
||||
jq '.PluginSettings.Directory = "/mattermost/plugins/"' "$MM_CONFIG" > "$MM_CONFIG.tmp" && mv "$MM_CONFIG.tmp" "$MM_CONFIG"
|
||||
else
|
||||
echo "Using existing config file $MM_CONFIG"
|
||||
fi
|
||||
|
||||
# Configure database access
|
||||
if [ -z "$MM_SQLSETTINGS_DATASOURCE" ] && [ -n "$MM_USERNAME" ] && [ -n "$MM_PASSWORD" ]; then
|
||||
echo "Configure database connection..."
|
||||
# URLEncode the password, allowing for special characters
|
||||
ENCODED_PASSWORD=$(printf %s "$MM_PASSWORD" | jq -s -R -r @uri)
|
||||
export MM_SQLSETTINGS_DATASOURCE="postgres://$MM_USERNAME:$ENCODED_PASSWORD@$DB_HOST:$DB_PORT_NUMBER/$MM_DBNAME?sslmode=$DB_USE_SSL&connect_timeout=10"
|
||||
echo "OK"
|
||||
else
|
||||
echo "Using existing database connection"
|
||||
fi
|
||||
|
||||
# Wait another second for the database to be properly started.
|
||||
# Necessary to avoid "panic: Failed to open sql connection pq: the database system is starting up"
|
||||
sleep 1
|
||||
|
||||
echo "Starting mattermost"
|
||||
fi
|
||||
|
||||
exec "$@"
|
307
config/orgaTmpl/docker-compose.yml
Normal file
307
config/orgaTmpl/docker-compose.yml
Normal file
@ -0,0 +1,307 @@
|
||||
version: '3.3'
|
||||
|
||||
#{{services
|
||||
services:
|
||||
#}}
|
||||
#{{db
|
||||
db:
|
||||
image: mariadb:10.5
|
||||
container_name: ${orga}DB
|
||||
#disk_quota: 10G
|
||||
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
|
||||
restart: ${restartPolicy}
|
||||
volumes:
|
||||
- ./initdb.d:/docker-entrypoint-initdb.d:ro
|
||||
- orgaDB:/var/lib/mysql
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
- /etc/timezone:/etc/timezone:ro
|
||||
env_file:
|
||||
- ../../secret/env-${nextcloudDBName}
|
||||
# - ../../secret/env-${mattermostDBName}
|
||||
- ../../secret/env-${wordpressDBName}
|
||||
networks:
|
||||
- orgaNet
|
||||
healthcheck: # utilisé par init-db.sh pour la créa d'orga
|
||||
test: ["CMD", 'mysqladmin', 'ping', '-h', 'localhost', '-u', 'root', '-p$$MYSQL_ROOT_PASSWORD' ]
|
||||
interval: 30s
|
||||
timeout: 30s
|
||||
retries: 5
|
||||
#}}
|
||||
#{{cloud
|
||||
cloud:
|
||||
image: nextcloud
|
||||
container_name: ${orga}${nextcloudServName}
|
||||
#disk_quota: 10G
|
||||
restart: ${restartPolicy}
|
||||
networks:
|
||||
- orgaNet
|
||||
# - postfixNet
|
||||
depends_on:
|
||||
- db
|
||||
#db:
|
||||
# condition: service_healthy # on peut mais ca va ralentir le process
|
||||
links:
|
||||
- db
|
||||
external_links:
|
||||
- ${smtpServName}:${smtpHost}
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.${orga}${nextcloudServName}.rule=Host(`${orga}${cloudHost}.${domain}`){{FOREIGN_NC}}"
|
||||
- "traefik.http.routers.${orga}${nextcloudServName}.middlewares=nextcloud-redirectregex1@file,nextcloud-redirectregex2@file"
|
||||
volumes:
|
||||
- cloudMain:/var/www/html
|
||||
- cloudData:/var/www/html/data
|
||||
- cloudConfig:/var/www/html/config
|
||||
- cloudApps:/var/www/html/apps
|
||||
- cloudCustomApps:/var/www/html/custom_apps
|
||||
- cloudThemes:/var/www/html/themes/
|
||||
- cloudPhp:/usr/local/etc/php/conf.d/
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
- /etc/timezone:/etc/timezone:ro
|
||||
env_file:
|
||||
- ../../secret/env-${nextcloudServName}
|
||||
- ../../secret/env-${nextcloudDBName}
|
||||
environment:
|
||||
- NEXTCLOUD_TRUSTED_DOMAINS=${orga}${cloudHost}.${domain}
|
||||
- SMTP_HOST=${smtpHost}
|
||||
- SMTP_PORT=25
|
||||
- MAIL_DOMAIN=${domain}
|
||||
#}}
|
||||
#{{agora
|
||||
agora:
|
||||
build:
|
||||
context: app
|
||||
# uncomment following lines for team edition or change UID/GID
|
||||
args:
|
||||
- edition=team
|
||||
- PUID=1000
|
||||
- PGID=1000
|
||||
container_name: ${orga}${mattermostServName}
|
||||
#disk_quota: 10G
|
||||
restart: ${restartPolicy}
|
||||
# memory: 1G
|
||||
networks:
|
||||
- orgaNet
|
||||
# - postfixNet
|
||||
expose:
|
||||
- ${matterPort}
|
||||
depends_on:
|
||||
- db
|
||||
#db:
|
||||
# condition: service_healthy # on peut mais ca va ralentir le process
|
||||
links:
|
||||
- db
|
||||
external_links:
|
||||
- ${smtpServName}:${smtpHost}.${domain}
|
||||
volumes:
|
||||
- matterConfig:/mattermost/config:rw
|
||||
- matterData:/mattermost/data:rw
|
||||
- matterLogs:/mattermost/logs:rw
|
||||
- matterPlugins:/mattermost/plugins:rw
|
||||
- matterClientPlugins:/mattermost/client/plugins:rw
|
||||
- matterIcons:/mattermost/client/images:ro
|
||||
- /etc/ssl:/etc/ssl:ro
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
- /etc/timezone:/etc/timezone:ro
|
||||
- /etc/environment:/etc/environment:ro
|
||||
env_file:
|
||||
- ../../secret/env-${mattermostServName}
|
||||
environment:
|
||||
- VIRTUAL_HOST=${orga}${matterHost}.${domain}
|
||||
# in case your config is not in default location
|
||||
#- MM_CONFIG=/mattermost/config/config.json
|
||||
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.${orga}${mattermostServName}.rule=Host(`${orga}${matterHost}.${domain}`)"
|
||||
#}}
|
||||
#{{wp
|
||||
wordpress:
|
||||
image: wordpress
|
||||
container_name: ${orga}${wordpressServName}
|
||||
restart: ${restartPolicy}
|
||||
networks:
|
||||
- orgaNet
|
||||
# - postfixNet
|
||||
depends_on:
|
||||
- db
|
||||
#db:
|
||||
# condition: service_healthy # on peut mais ca va ralentir le process
|
||||
links:
|
||||
- db
|
||||
external_links:
|
||||
- ${smtpServName}:${smtpHost}.${domain}
|
||||
env_file:
|
||||
- ../../secret/env-${wordpressServName}
|
||||
environment:
|
||||
- WORDPRESS_SMTP_HOST=${smtpHost}.${domain}
|
||||
- WORDPRESS_SMTP_PORT=25
|
||||
# - WORDPRESS_SMTP_USERNAME
|
||||
# - WORDPRESS_SMTP_PASSWORD
|
||||
# - WORDPRESS_SMTP_FROM=${orga}
|
||||
- WORDPRESS_SMTP_FROM_NAME=${orga}
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.${orga}${wordpressServName}.rule=Host(`${orga}${wordpressHost}.${domain}`){{FOREIGN_WP}}"
|
||||
volumes:
|
||||
- wordpress:/var/www/html
|
||||
# - ../../config/orgaTmpl/wp:/usr/local/bin/wp:ro
|
||||
#}}
|
||||
#{{wiki
|
||||
dokuwiki:
|
||||
image: mprasil/dokuwiki
|
||||
container_name: ${orga}${dokuwikiServName}
|
||||
#disk_quota: 10G
|
||||
restart: ${restartPolicy}
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.${orga}${dokuwikiServName}.rule=Host(`${orga}${dokuwikiHost}.${domain}`){{FOREIGN_DW}}"
|
||||
volumes:
|
||||
- wikiData:/dokuwiki/data
|
||||
- wikiConf:/dokuwiki/conf
|
||||
- wikiPlugins:/dokuwiki/lib/plugins
|
||||
- wikiLibtpl:/dokuwiki/lib/tpl
|
||||
- wikiLogs:/var/log
|
||||
networks:
|
||||
- orgaNet
|
||||
# - postfixNet
|
||||
external_links:
|
||||
- ${smtpServName}:${smtpHost}.${domain}
|
||||
#}}
|
||||
#{{castopod
|
||||
castopod:
|
||||
image: castopod/castopod:latest
|
||||
container_name: ${orga}${castopodServName}
|
||||
#disk_quota: 10G
|
||||
restart: ${restartPolicy}
|
||||
# memory: 1G
|
||||
networks:
|
||||
- orgaNet
|
||||
# - postfixNet
|
||||
expose:
|
||||
- 8000
|
||||
depends_on:
|
||||
- db
|
||||
links:
|
||||
- db
|
||||
external_links:
|
||||
- ${smtpServName}:${smtpHost}.${domain}
|
||||
volumes:
|
||||
- castopodMedia:/var/www/castopod/public/media
|
||||
environment:
|
||||
CP_BASEURL: "https://${orga}${castopodHost}.${domain}"
|
||||
CP_ANALYTICS_SALT: qldsgfliuzrbhgmkjbdbmkvb
|
||||
VIRTUAL_PORT: 8000
|
||||
CP_CACHE_HANDLER: redis
|
||||
CP_REDIS_HOST: redis
|
||||
CP_DATABASE_HOSTNAME: db
|
||||
env_file:
|
||||
- ../../secret/env-${castopodServName}
|
||||
- ../../secret/env-${castopodDBName}
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.${orga}${castopodServName}.rule=Host(`${orga}${castopodHost}.${domain}`){{FOREIGN_POD}}"
|
||||
redis:
|
||||
image: redis:7.0-alpine
|
||||
container_name: ${orga}castopodCache
|
||||
volumes:
|
||||
- castopodCache:/data
|
||||
networks:
|
||||
- orgaNet
|
||||
env_file:
|
||||
- ../../secret/env-${castopodServName}
|
||||
command: --requirepass ${castopodRedisPassword}
|
||||
#}}
|
||||
|
||||
|
||||
|
||||
#{{services
|
||||
volumes:
|
||||
#}}
|
||||
#{{db
|
||||
orgaDB:
|
||||
external: true
|
||||
name: orga_${orga}orgaDB
|
||||
#}}
|
||||
#{{agora
|
||||
matterConfig:
|
||||
external: true
|
||||
name: orga_${orga}matterConfig
|
||||
matterData:
|
||||
external: true
|
||||
name: orga_${orga}matterData
|
||||
matterLogs:
|
||||
external: true
|
||||
name: orga_${orga}matterLogs
|
||||
matterPlugins:
|
||||
external: true
|
||||
name: orga_${orga}matterPlugins
|
||||
matterClientPlugins:
|
||||
external: true
|
||||
name: orga_${orga}matterClientPlugins
|
||||
matterIcons:
|
||||
external: true
|
||||
name: matterIcons
|
||||
#{{cloud
|
||||
cloudMain:
|
||||
external: true
|
||||
name: orga_${orga}cloudMain
|
||||
cloudData:
|
||||
external: true
|
||||
name: orga_${orga}cloudData
|
||||
cloudConfig:
|
||||
external: true
|
||||
name: orga_${orga}cloudConfig
|
||||
cloudApps:
|
||||
external: true
|
||||
name: orga_${orga}cloudApps
|
||||
cloudCustomApps:
|
||||
external: true
|
||||
name: orga_${orga}cloudCustomApps
|
||||
cloudThemes:
|
||||
external: true
|
||||
name: orga_${orga}cloudThemes
|
||||
cloudPhp:
|
||||
external: true
|
||||
name: orga_${orga}cloudPhp
|
||||
#}}
|
||||
#{{wiki
|
||||
wikiData:
|
||||
external: true
|
||||
name: orga_${orga}wikiData
|
||||
wikiConf:
|
||||
external: true
|
||||
name: orga_${orga}wikiConf
|
||||
wikiPlugins:
|
||||
external: true
|
||||
name: orga_${orga}wikiPlugins
|
||||
wikiLibtpl:
|
||||
external: true
|
||||
name: orga_${orga}wikiLibtpl
|
||||
wikiLogs:
|
||||
external: true
|
||||
name: orga_${orga}wikiLogs
|
||||
#}}
|
||||
#{{wp
|
||||
wordpress:
|
||||
external: true
|
||||
name: orga_${orga}wordpress
|
||||
#}}
|
||||
#{{castopod
|
||||
castopodMedia:
|
||||
external: true
|
||||
name: orga_${orga}castopodMedia
|
||||
castopodCache:
|
||||
external: true
|
||||
name: orga_${orga}castopodCache
|
||||
|
||||
#}}
|
||||
|
||||
|
||||
networks:
|
||||
orgaNet:
|
||||
external: true
|
||||
name: ${orga}orgaNet
|
||||
# postfixNet:
|
||||
# external:
|
||||
# name: postfixNet
|
75
config/orgaTmpl/init-db.sh
Executable file
75
config/orgaTmpl/init-db.sh
Executable file
@ -0,0 +1,75 @@
|
||||
#!/bin/bash
|
||||
|
||||
KAZ_ROOT=$(cd $(dirname $0)/../..; pwd)
|
||||
. "${KAZ_ROOT}/bin/.commonFunctions.sh"
|
||||
setKazVars
|
||||
. "${DOCKERS_ENV}"
|
||||
. "${KAZ_KEY_DIR}/SetAllPass.sh"
|
||||
|
||||
cd $(dirname $0)
|
||||
ORGA_DIR="$(basename "$(pwd)")"
|
||||
|
||||
ORGA=${ORGA_DIR%-orga}
|
||||
if [[ -z "${ORGA}" ]]
|
||||
then
|
||||
printKazError "it's not an orga dir"
|
||||
exit
|
||||
fi
|
||||
|
||||
|
||||
waitContainerHealthy "${ORGA}-DB" 180
|
||||
[ $? -ne 0 ] && printKazError "\n La base de donnée démarre pas : impossible de terminer l'install" && exit
|
||||
|
||||
SQL=""
|
||||
|
||||
for ARG in "$@"; do
|
||||
case "${ARG}" in
|
||||
'cloud' )
|
||||
SQL="$SQL
|
||||
CREATE DATABASE IF NOT EXISTS ${nextcloud_MYSQL_DATABASE};
|
||||
|
||||
DROP USER IF EXISTS '${nextcloud_MYSQL_USER}';
|
||||
CREATE USER '${nextcloud_MYSQL_USER}'@'%';
|
||||
|
||||
GRANT ALL ON ${nextcloud_MYSQL_DATABASE}.* TO '${nextcloud_MYSQL_USER}'@'%' IDENTIFIED BY '${nextcloud_MYSQL_PASSWORD}';
|
||||
|
||||
FLUSH PRIVILEGES;"
|
||||
;;
|
||||
'agora' )
|
||||
SQL="$SQL
|
||||
CREATE DATABASE IF NOT EXISTS ${mattermost_MYSQL_DATABASE};
|
||||
|
||||
DROP USER IF EXISTS '${mattermost_MYSQL_USER}';
|
||||
CREATE USER '${mattermost_MYSQL_USER}'@'%';
|
||||
|
||||
GRANT ALL ON ${mattermost_MYSQL_DATABASE}.* TO '${mattermost_MYSQL_USER}'@'%' IDENTIFIED BY '${mattermost_MYSQL_PASSWORD}';
|
||||
|
||||
FLUSH PRIVILEGES;"
|
||||
;;
|
||||
'wp' )
|
||||
SQL="$SQL
|
||||
CREATE DATABASE IF NOT EXISTS ${wp_MYSQL_DATABASE};
|
||||
|
||||
DROP USER IF EXISTS '${wp_MYSQL_USER}';
|
||||
CREATE USER '${wp_MYSQL_USER}'@'%';
|
||||
|
||||
GRANT ALL ON ${wp_MYSQL_DATABASE}.* TO '${wp_MYSQL_USER}'@'%' IDENTIFIED BY '${wp_MYSQL_PASSWORD}';
|
||||
|
||||
FLUSH PRIVILEGES;"
|
||||
;;
|
||||
'castopod' )
|
||||
SQL="$SQL
|
||||
CREATE DATABASE IF NOT EXISTS ${castopod_MYSQL_DATABASE};
|
||||
|
||||
DROP USER IF EXISTS '${castopod_MYSQL_USER}';
|
||||
CREATE USER '${castopod_MYSQL_USER}'@'%';
|
||||
|
||||
GRANT ALL ON ${castopod_MYSQL_DATABASE}.* TO '${castopod_MYSQL_USER}'@'%' IDENTIFIED BY '${castopod_MYSQL_PASSWORD}';
|
||||
|
||||
FLUSH PRIVILEGES;"
|
||||
;;
|
||||
|
||||
esac
|
||||
done
|
||||
|
||||
echo $SQL | docker exec -i ${ORGA}-DB bash -c "mysql --user=root --password=${wp_MYSQL_ROOT_PASSWORD}"
|
27
config/orgaTmpl/init-paheko.sh
Executable file
27
config/orgaTmpl/init-paheko.sh
Executable file
@ -0,0 +1,27 @@
|
||||
#!/bin/bash
|
||||
|
||||
KAZ_ROOT=$(cd $(dirname $0)/../..; pwd)
|
||||
. "${KAZ_ROOT}/bin/.commonFunctions.sh"
|
||||
setKazVars
|
||||
|
||||
. "${DOCKERS_ENV}"
|
||||
|
||||
cd $(dirname $0)
|
||||
PWD=$(pwd)
|
||||
ORGA_DIR=$(basename ${PWD})
|
||||
|
||||
if [[ "${ORGA_DIR}" != *"-orga" ]]
|
||||
then
|
||||
printKazError "it's not an orga dir"
|
||||
exit
|
||||
fi
|
||||
ORGA=${ORGA_DIR%-orga}
|
||||
if [[ -z "${ORGA}" ]]
|
||||
then
|
||||
printKazError "it's not an orga dir"
|
||||
exit
|
||||
fi
|
||||
|
||||
printKazMsg "init paheko ${ORGA}"
|
||||
|
||||
#${KAZ_COMP_DIR}/paheko/installPlugins.sh ${ORGA}
|
39
config/orgaTmpl/init-volume.sh
Executable file
39
config/orgaTmpl/init-volume.sh
Executable file
@ -0,0 +1,39 @@
|
||||
#!/bin/bash
|
||||
|
||||
#docker network create postfix_mailNet
|
||||
|
||||
#{{db
|
||||
docker volume create --name=orga_${orga}orgaDB
|
||||
#}}
|
||||
#{{agora
|
||||
docker volume create --name=orga_${orga}matterConfig
|
||||
docker volume create --name=orga_${orga}matterData
|
||||
docker volume create --name=orga_${orga}matterLogs
|
||||
docker volume create --name=orga_${orga}matterPlugins
|
||||
docker volume create --name=orga_${orga}matterClientPlugins
|
||||
docker volume create --name=matterIcons
|
||||
#}}
|
||||
#{{cloud
|
||||
docker volume create --name=orga_${orga}cloudMain
|
||||
docker volume create --name=orga_${orga}cloudData
|
||||
docker volume create --name=orga_${orga}cloudConfig
|
||||
docker volume create --name=orga_${orga}cloudApps
|
||||
docker volume create --name=orga_${orga}cloudCustomApps
|
||||
docker volume create --name=orga_${orga}cloudThemes
|
||||
docker volume create --name=orga_${orga}cloudPhp
|
||||
chown 33:33 /var/lib/docker/volumes/orga_${orga}cloud*/_data
|
||||
#}}
|
||||
#{{wiki
|
||||
docker volume create --name=orga_${orga}wikiData
|
||||
docker volume create --name=orga_${orga}wikiConf
|
||||
docker volume create --name=orga_${orga}wikiPlugins
|
||||
docker volume create --name=orga_${orga}wikiLibtpl
|
||||
docker volume create --name=orga_${orga}wikiLogs
|
||||
#}}
|
||||
#{{wp
|
||||
docker volume create --name=orga_${orga}wordpress
|
||||
#}}
|
||||
#{{castopod
|
||||
docker volume create --name=orga_${orga}castopodCache
|
||||
docker volume create --name=orga_${orga}castopodMedia
|
||||
#}}
|
3
config/orgaTmpl/initdb.d/orga.sql
Normal file
3
config/orgaTmpl/initdb.d/orga.sql
Normal file
@ -0,0 +1,3 @@
|
||||
CREATE DATABASE IF NOT EXISTS nextcloud;
|
||||
CREATE DATABASE IF NOT EXISTS mattermost;
|
||||
CREATE DATABASE IF NOT EXISTS wpdb;
|
486
config/orgaTmpl/orga-gen.sh
Executable file
486
config/orgaTmpl/orga-gen.sh
Executable file
@ -0,0 +1,486 @@
|
||||
#!/bin/bash
|
||||
|
||||
# XXX pb arret des services retiré
|
||||
|
||||
PRG=$(basename $0)
|
||||
KAZ_ROOT=$(cd "$(dirname $0)/../.."; pwd)
|
||||
. "${KAZ_ROOT}/bin/.commonFunctions.sh"
|
||||
setKazVars
|
||||
|
||||
cd $(dirname $0)
|
||||
ORGA_DIR="$(basename "$(pwd)")"
|
||||
TIMESTAMP=YES
|
||||
TMPL_PROXY_COMPOSE="${KAZ_COMP_DIR}/proxy/docker-compose.tmpl.yml"
|
||||
TMPL_TRAEFIK_COMPOSE="${KAZ_COMP_DIR}/traefik/docker-compose.tmpl.yml"
|
||||
ORGA_LIST="${KAZ_CONF_DIR}/container-orga.list"
|
||||
LIST=""
|
||||
|
||||
STAGE_DEFAULT=true
|
||||
STAGE_CREATE=
|
||||
STAGE_INIT=
|
||||
|
||||
usage(){
|
||||
echo "Usage: $0 [-h] [-l] [+/-paheko] [-/+cloud [-/+collabora}]] [+/-agora] [+/-wiki] [+/-wp] [+/-pod] [x{G/M/k}] OrgaName"
|
||||
echo " -h|--help : this help"
|
||||
echo " -l|--list : list service"
|
||||
|
||||
echo " --create : only create (before start)"
|
||||
echo " --init : only init (after start)"
|
||||
|
||||
echo " +/- paheko : on/off paheko"
|
||||
echo " +/- cloud : on/off cloud"
|
||||
echo " +/- coll* : on/off collabora"
|
||||
echo " +/- matter*|agora : on/off agora"
|
||||
echo " +/- wiki : on/off wiki"
|
||||
echo " +/- wp|word* : on/off wp"
|
||||
echo " +/- casto*|pod : on/off castopod"
|
||||
echo " x[GMk] : set quota"
|
||||
echo " OrgaName : name must contain a-z0-9_\-"
|
||||
}
|
||||
|
||||
for ARG in "$@"; do
|
||||
case "${ARG}" in
|
||||
'-h' | '--help' )
|
||||
usage
|
||||
exit 0;;
|
||||
'-l' | '--list' )
|
||||
;;
|
||||
'--create' )
|
||||
STAGE_DEFAULT=
|
||||
STAGE_CREATE=true
|
||||
if [[ -n "${STAGE_INIT}" ]]; then
|
||||
usage
|
||||
echo " Incompatible options (--create --init)"
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
'--init' )
|
||||
STAGE_DEFAULT=
|
||||
STAGE_INIT=true
|
||||
if [[ -n "${STAGE_CREATE}" ]]; then
|
||||
usage
|
||||
echo " Incompatible options (--create --init)"
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
'-'* )
|
||||
;;
|
||||
'+'* )
|
||||
;;
|
||||
[.0-9]*[GMk] )
|
||||
;;
|
||||
* )
|
||||
if [[ "${ORGA_DIR}" = "orgaTmpl" ]]; then
|
||||
if [[ "${ARG}" =~ ^[a-z0-9_\-]+$ ]]; then
|
||||
printKazMsg "create ${ARG}"
|
||||
ORGA_PATH="${KAZ_COMP_DIR}/${ARG}-orga"
|
||||
mkdir -p "${ORGA_PATH}"
|
||||
cd "${ORGA_PATH}"
|
||||
ORGA_DIR="$(basename "$(pwd)")"
|
||||
ln -sf ../../config/dockers.env .env
|
||||
ln -sf ../../config/orgaTmpl/orga-gen.sh
|
||||
ln -sf ../../config/orgaTmpl/orga-rm.sh
|
||||
ln -sf ../../config/orgaTmpl/reload.sh
|
||||
else
|
||||
printKazError "Name must contains only a-z0-9_\-"
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
if [[ "${ARG}-orga" != "${ORGA_DIR}" ]]; then
|
||||
printKazError "Can't cross config ${ARG}-orga with ${ORGA_DIR}"
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [[ "${ORGA_DIR}" = "orgaTmpl" ]]
|
||||
then
|
||||
printKazError "You must give orga name"
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ "${ORGA_DIR}" != *"-orga" ]]
|
||||
then
|
||||
printKazError "it's not an orga dir"
|
||||
exit
|
||||
fi
|
||||
ORGA=${ORGA_DIR%-orga}
|
||||
|
||||
if [[ -z "${ORGA}" ]]
|
||||
then
|
||||
printKazError "it's not an orga dir"
|
||||
exit
|
||||
fi
|
||||
|
||||
# default values
|
||||
flagInCompose(){
|
||||
# $1 filename (docker-compose.yml)
|
||||
# $2 service name
|
||||
# $3 default value
|
||||
if [[ ! -f "$1" ]]
|
||||
then
|
||||
echo "$3"
|
||||
else
|
||||
if grep -q "$2" docker-compose.yml
|
||||
then
|
||||
echo on
|
||||
else
|
||||
echo off
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
export cloud=$(flagInCompose docker-compose.yml cloud: off)
|
||||
export collabora=$(flagInCompose docker-compose.yml collabora: off)
|
||||
export agora=$(flagInCompose docker-compose.yml agora: off)
|
||||
export wiki=$(flagInCompose docker-compose.yml dokuwiki: off)
|
||||
export wp=$(flagInCompose docker-compose.yml wordpress: off)
|
||||
export castopod=$(flagInCompose docker-compose.yml castopod: off)
|
||||
export db="off"
|
||||
export services="off"
|
||||
export paheko=$([[ -f usePaheko ]] && echo "on" || echo "off")
|
||||
export quota=10G
|
||||
if [[ -f docker-compose.yml ]]; then
|
||||
if grep -q "storage_opt" docker-compose.yml
|
||||
then
|
||||
quota=$(grep "storage_opt" docker-compose.yml | cut -d : -f 2 | tail -n 1)
|
||||
fi
|
||||
fi
|
||||
|
||||
DBaInitialiser=""
|
||||
INITCMD2="--install"
|
||||
|
||||
|
||||
for ARG in "$@"; do
|
||||
case "${ARG}" in
|
||||
'-show' )
|
||||
for i in cloud collabora agora wiki wp castopod db; do
|
||||
echo "${i}=${!i}"
|
||||
done
|
||||
exit;;
|
||||
'-h' | '--help' )
|
||||
usage
|
||||
exit 1
|
||||
;;
|
||||
'-l' | '--list' )
|
||||
LIST="list"
|
||||
;;
|
||||
'-time'* )
|
||||
TIMESTAMP=YES
|
||||
;;
|
||||
'-paheko'* )
|
||||
paheko="off"
|
||||
;;
|
||||
'-cloud' )
|
||||
cloud="off"
|
||||
collabora="off"
|
||||
;;
|
||||
'-coll'* | '-offi'* )
|
||||
collabora="off"
|
||||
;;
|
||||
'-matter'* | '-agora')
|
||||
agora="off"
|
||||
;;
|
||||
'-wiki' )
|
||||
wiki="off"
|
||||
;;
|
||||
'-wp' | '-word'* )
|
||||
wp="off"
|
||||
;;
|
||||
'-pod' | '-casto'* )
|
||||
castopod="off"
|
||||
;;
|
||||
'+paheko' )
|
||||
paheko="on"
|
||||
;;
|
||||
'+cloud' )
|
||||
cloud="on"
|
||||
DBaInitialiser="$DBaInitialiser cloud"
|
||||
INITCMD2="$INITCMD2 -cloud"
|
||||
;;
|
||||
'+coll'* | '+offi'* )
|
||||
collabora="on"
|
||||
INITCMD2="$INITCMD2 -office"
|
||||
;;
|
||||
'+matter'* | '+agora' )
|
||||
agora="on"
|
||||
DBaInitialiser="$DBaInitialiser agora"
|
||||
INITCMD2="$INITCMD2 -agora"
|
||||
;;
|
||||
'+wiki' )
|
||||
wiki="on"
|
||||
;;
|
||||
'+wp' | '+word'* )
|
||||
wp="on"
|
||||
DBaInitialiser="$DBaInitialiser wp"
|
||||
INITCMD2="$INITCMD2 -wp"
|
||||
;;
|
||||
'+pod' | '+casto'* )
|
||||
castopod="on"
|
||||
DBaInitialiser="$DBaInitialiser castopod"
|
||||
INITCMD2="$INITCMD2 -pod"
|
||||
;;
|
||||
[.0-9]*[GMk] )
|
||||
quota="${ARG}"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ "${cloud}" = "on" -o "${agora}" = "on" -o "${wp}" = "on" -o "${castopod}" = "on" ]
|
||||
then
|
||||
db="on"
|
||||
fi
|
||||
if [ "${db}" = "on" -o "${wiki}" = "on" ]
|
||||
then
|
||||
services="on"
|
||||
fi
|
||||
|
||||
. "${DOCKERS_ENV}"
|
||||
ORGA_FLAG=${ORGA_DIR//-/_}
|
||||
DOMAIN_AREA="{{${ORGA_FLAG}\n"
|
||||
ADD_DOMAIN=""
|
||||
DEL_DOMAIN=""
|
||||
|
||||
listServ () {
|
||||
for serv in $(getAvailableServices); do
|
||||
if [[ "${!serv}" == "on" ]]; then
|
||||
echo "${serv}"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
if [[ -n "${LIST}" ]] ; then
|
||||
listServ
|
||||
exit
|
||||
fi
|
||||
|
||||
if [[ "${paheko}" = "on" ]]; then
|
||||
touch usePaheko
|
||||
ADD_DOMAIN+="${ORGA}-${pahekoHost} "
|
||||
else
|
||||
rm -f usePaheko
|
||||
DEL_DOMAIN+="${ORGA}-${pahekoHost} "
|
||||
fi
|
||||
if [[ "${cloud}" = "on" ]]; then
|
||||
DOMAIN_AREA+=" - ${ORGA}-\${nextcloudServName}:${ORGA}-\${cloudHost}.\${domain}\n"
|
||||
ADD_DOMAIN+="${ORGA}-${cloudHost} "
|
||||
else
|
||||
DEL_DOMAIN+="${ORGA}-${cloudHost} "
|
||||
fi
|
||||
if [[ "${collabora}" = "on" ]]; then
|
||||
DOMAIN_AREA+=" - ${ORGA}-\${officeServName}:${ORGA}-\${officeHost}.\${domain}\n"
|
||||
ADD_DOMAIN+="${ORGA}-${officeHost} "
|
||||
else
|
||||
DEL_DOMAIN+="${ORGA}-${officeHost} "
|
||||
fi
|
||||
if [[ "${agora}" = "on" ]]; then
|
||||
DOMAIN_AREA+=" - ${ORGA}-\${mattermostServName}:${ORGA}-\${matterHost}.\${domain}\n"
|
||||
ADD_DOMAIN+="${ORGA}-${matterHost} "
|
||||
else
|
||||
DEL_DOMAIN+="${ORGA}-${matterHost} "
|
||||
fi
|
||||
if [[ "${wiki}" = "on" ]]; then
|
||||
DOMAIN_AREA+=" - ${ORGA}-\${dokuwikiServName}:${ORGA}-\${dokuwikiHost}.\${domain}\n"
|
||||
ADD_DOMAIN+="${ORGA}-${dokuwikiHost} "
|
||||
else
|
||||
DEL_DOMAIN+="${ORGA}-${dokuwikiHost} "
|
||||
fi
|
||||
if [[ "${wp}" = "on" ]]; then
|
||||
DOMAIN_AREA+=" - ${ORGA}-\${wordpressServName}:${ORGA}-\${wordpressHost}.\${domain}\n"
|
||||
ADD_DOMAIN+="${ORGA}-${wordpressHost} "
|
||||
else
|
||||
DEL_DOMAIN+="${ORGA}-${wordpressHost} "
|
||||
fi
|
||||
if [[ "${castopod}" = "on" ]]; then
|
||||
DOMAIN_AREA+=" - ${ORGA}-\${castopodServName}:${ORGA}-\${castopodHost}.\${domain}\n"
|
||||
ADD_DOMAIN+="${ORGA}-${castopodHost} "
|
||||
else
|
||||
DEL_DOMAIN+="${ORGA}-${castopodHost} "
|
||||
fi
|
||||
DOMAIN_AREA+="}}\n"
|
||||
|
||||
if [[ -n "${STAGE_DEFAULT}${STAGE_CREATE}" ]]; then
|
||||
if [[ -f "${TMPL_TRAEFIK_COMPOSE}" ]]; then
|
||||
# ########## update traefik/docker-compose.tmpl.yml
|
||||
printKazMsg "Update ${TMPL_TRAEFIK_COMPOSE}"
|
||||
if grep -q "^{{${ORGA_FLAG}" "${TMPL_TRAEFIK_COMPOSE}" 2> /dev/null ; then
|
||||
sed -i -e "/^{{${ORGA_FLAG}/,/^}}/d" "${TMPL_TRAEFIK_COMPOSE}"
|
||||
fi
|
||||
# use net
|
||||
sed "s/^#### END ORGA USE_NET/{{${ORGA_FLAG}\n - ${ORGA}Net\n}}\n#### END ORGA USE_NET/" -i "${TMPL_TRAEFIK_COMPOSE}"
|
||||
# def net
|
||||
sed "s/^#### END ORGA DEF_NET/{{${ORGA_FLAG}\n ${ORGA}Net:\n external: true\n name: ${ORGA}-orgaNet\n}}\n#### END ORGA DEF_NET/" -i "${TMPL_TRAEFIK_COMPOSE}"
|
||||
fi
|
||||
if [[ -f "${TMPL_PROXY_COMPOSE}" ]]; then
|
||||
# ########## update proxy/docker-compose.tmpl.yml
|
||||
printKazMsg "Update ${TMPL_PROXY_COMPOSE}"
|
||||
if grep -q "^{{${ORGA_FLAG}" "${TMPL_PROXY_COMPOSE}" 2> /dev/null ; then
|
||||
sed -i -e "/^{{${ORGA_FLAG}/,/^}}/d" "${TMPL_PROXY_COMPOSE}"
|
||||
fi
|
||||
# domaine
|
||||
sed "s/^#### END ORGA HOST/${DOMAIN_AREA}#### END ORGA HOST/" -i "${TMPL_PROXY_COMPOSE}"
|
||||
# use net
|
||||
sed "s/^#### END ORGA USE_NET/{{${ORGA_FLAG}\n - ${ORGA}Net\n}}\n#### END ORGA USE_NET/" -i "${TMPL_PROXY_COMPOSE}"
|
||||
# def net
|
||||
sed "s/^#### END ORGA DEF_NET/{{${ORGA_FLAG}\n ${ORGA}Net:\n external: true\n name: ${ORGA}-orgaNet\n}}\n#### END ORGA DEF_NET/" -i "${TMPL_PROXY_COMPOSE}"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ -n "${STAGE_DEFAULT}${STAGE_CREATE}" ]]; then
|
||||
# ########## update DNS
|
||||
printKazMsg "Update DNS"
|
||||
${KAZ_BIN_DIR}/dns.sh add ${ADD_DOMAIN}
|
||||
${KAZ_BIN_DIR}/dns.sh del ${DEL_DOMAIN}
|
||||
fi
|
||||
|
||||
update() {
|
||||
(
|
||||
# $1 = template
|
||||
# $2 = target
|
||||
if [ "${TIMESTAMP}" == "YES" ]; then
|
||||
echo "# Generated by $(pwd)$(basename $0)"
|
||||
echo "# à partir du modèle $1"
|
||||
echo "#" $(date "+%x %X")
|
||||
echo
|
||||
fi
|
||||
FOREIGN_WP=$(grep " ${ORGA};" "${KAZ_CONF_PROXY_DIR}/wp_kaz_map" 2>/dev/null | \
|
||||
sed "s/\([^ ]*\) ${ORGA};/ \|\| Host(\`\1\`)/" | tr -d "\r\n")
|
||||
FOREIGN_NC=$(grep " ${ORGA};" "${KAZ_CONF_PROXY_DIR}/cloud_kaz_map" 2>/dev/null | \
|
||||
sed "s/\([^ ]*\) ${ORGA};/ \|\| Host(\`\1\`)/" | tr -d "\r\n")
|
||||
FOREIGN_DW=$(grep " ${ORGA};" "${KAZ_CONF_PROXY_DIR}/wiki_kaz_map" 2>/dev/null | \
|
||||
sed "s/\([^ ]*\) ${ORGA};/ \|\| Host(\`\1\`)/" | tr -d "\r\n")
|
||||
FOREIGN_POD=$(grep " ${ORGA};" "${KAZ_CONF_PROXY_DIR}/pod_kaz_map" 2>/dev/null | \
|
||||
sed "s/\([^ ]*\) ${ORGA};/ \|\| Host(\`\1\`)/" | tr -d "\r\n")
|
||||
awk '
|
||||
BEGIN {cp=1}
|
||||
/#}}/ {cp=1 ; next};
|
||||
/#{{on/ {cp=1; next};
|
||||
/#{{off/ {cp=0; next};
|
||||
match($0, /#{{[a-zA-Z0-9_]+/) {cp=(ENVIRON[substr($0,RSTART+3,RLENGTH)] == "on"); next};
|
||||
{if (cp) print $0};' $1 | sed \
|
||||
-e "/^[ \t]*$/d"\
|
||||
-e "/^[ ]*#.*$/d"\
|
||||
-e "s/{{FOREIGN_WP}}/${FOREIGN_WP}/"\
|
||||
-e "s/{{FOREIGN_NC}}/${FOREIGN_NC}/"\
|
||||
-e "s/{{FOREIGN_DW}}/${FOREIGN_DW}/"\
|
||||
-e "s/{{FOREIGN_POD}}/${FOREIGN_POD}/"\
|
||||
-e "s|\${orga}|${ORGA}-|g"
|
||||
) > "$2"
|
||||
sed "s/storage_opt:.*/storage_opt: ${quota}/g" -i "$2"
|
||||
}
|
||||
|
||||
if [[ -n "${STAGE_DEFAULT}${STAGE_CREATE}" ]]; then
|
||||
# ########## update ${ORGA_DIR}/docker-compose.tmpl.yml
|
||||
printKazMsg "update docker-compose.yml ${ORGA}"
|
||||
update ${KAZ_CONF_DIR}/orgaTmpl/docker-compose.yml docker-compose.yml
|
||||
printKazMsg "Service enabled:"
|
||||
for service in $(listServ) ; do
|
||||
printKazMsg " * ${service}"
|
||||
done
|
||||
fi
|
||||
|
||||
if [[ -n "${STAGE_DEFAULT}${STAGE_CREATE}" ]]; then
|
||||
# ########## update ${ORGA_DIR}/init-volume.sh
|
||||
update ${KAZ_CONF_DIR}/orgaTmpl/init-volume.sh init-volume.sh
|
||||
chmod a+x init-volume.sh
|
||||
|
||||
ln -sf ../../config/orgaTmpl/orga-gen.sh
|
||||
ln -sf ../../config/orgaTmpl/orga-rm.sh
|
||||
ln -sf ../../config/orgaTmpl/init-paheko.sh
|
||||
ln -sf ../../config/orgaTmpl/initdb.d/
|
||||
ln -sf ../../config/orgaTmpl/app/
|
||||
ln -sf ../../config/orgaTmpl/wiki-conf/
|
||||
ln -sf ../../config/orgaTmpl/reload.sh
|
||||
ln -sf ../../config/orgaTmpl/init-db.sh
|
||||
fi
|
||||
|
||||
if [[ -n "${STAGE_DEFAULT}${STAGE_CREATE}" ]]; then
|
||||
# ########## update ${DOCKERS_ENV}
|
||||
if ! grep -q "proxy_orga=" .env 2> /dev/null
|
||||
then
|
||||
echo "proxy_orga=on" >> .env
|
||||
fi
|
||||
|
||||
if ! grep -q "proxy_${ORGA_FLAG}=" .env 2> /dev/null
|
||||
then
|
||||
echo "proxy_${ORGA_FLAG}=off" >> .env
|
||||
fi
|
||||
touch "${ORGA_LIST}"
|
||||
if ! grep -qx "${ORGA}-orga" "${ORGA_LIST}" 2> /dev/null
|
||||
then
|
||||
echo "${ORGA}-orga" >> "${ORGA_LIST}"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ -n "${STAGE_DEFAULT}${STAGE_CREATE}" ]]; then
|
||||
# ########## create volume
|
||||
./init-volume.sh
|
||||
fi
|
||||
|
||||
if [[ -n "${STAGE_CREATE}" ]]; then
|
||||
# ########## start docker
|
||||
docker-compose up -d
|
||||
fi
|
||||
if [[ -n "${STAGE_DEFAULT}" ]]; then
|
||||
# ########## start docker proxy
|
||||
${KAZ_BIN_DIR}/container.sh start ${ORGA}-orga
|
||||
fi
|
||||
|
||||
if [[ -n "${STAGE_DEFAULT}" ]]; then
|
||||
# ########## stop ${DOCKERS_ENV}
|
||||
for service in $("${KAZ_BIN_DIR}/kazList.sh" service disable ${ORGA}-orga); do
|
||||
DockerServName=
|
||||
case "${service}" in
|
||||
agora)
|
||||
DockerServName="${ORGA}-${mattermostServName}"
|
||||
;;
|
||||
paheko)
|
||||
continue
|
||||
;;
|
||||
cloud)
|
||||
DockerServName="${ORGA}-${nextcloudServName}"
|
||||
;;
|
||||
collabora)
|
||||
DockerServName="${ORGA}-${officeServName}"
|
||||
;;
|
||||
wiki)
|
||||
DockerServName="${ORGA}-${dokuwikiServName}"
|
||||
;;
|
||||
wp)
|
||||
DockerServName="${ORGA}-${wordpressServName}"
|
||||
;;
|
||||
esac
|
||||
if checkDockerRunning "${DockerServName}"; then
|
||||
printKazMsg " - stop ${service}"
|
||||
docker rm -f "${DockerServName}" 2>/dev/null
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
if [[ -n "${STAGE_DEFAULT}${STAGE_INIT}" ]]; then
|
||||
[ -z "$DBaInitialiser" ] || ./init-db.sh $DBaInitialiser
|
||||
# ########## init services
|
||||
[[ "${paheko}" = "on" ]] && ./init-paheko.sh
|
||||
# initCmd="--install"
|
||||
# # XXX risque d'écraser user DB
|
||||
# [[ "${cloud}" = "on" ]] && initCmd="$initCmd -cloud"
|
||||
# # XXX risque d'écraser user DB
|
||||
# [[ "${wp}" = "on" ]] && initCmd="$initCmd -wp"
|
||||
# [[ "${wiki}" = "on" ]] && initCmd="$initCmd -wiki"
|
||||
# # XXX risque d'écraser user DB
|
||||
# [[ "${agora}" = "on" ]] && initCmd="$initCmd -agora"
|
||||
# [[ "${castopod}" = "on" ]] && initCmd="$initCmd -castopod"
|
||||
|
||||
# on initialise que si il y a au moins un truc à initialiser
|
||||
[[ "${INITCMD2}" != "--install" ]] && ${KAZ_BIN_DIR}/gestContainers.sh $INITCMD2 "${ORGA}"
|
||||
fi
|
||||
|
||||
if [[ -n "${STAGE_DEFAULT}" ]]; then
|
||||
# ########## update status web page
|
||||
${KAZ_COMP_DIR}/web/web-gen.sh
|
||||
fi
|
75
config/orgaTmpl/orga-rm.sh
Executable file
75
config/orgaTmpl/orga-rm.sh
Executable file
@ -0,0 +1,75 @@
|
||||
#!/bin/bash
|
||||
|
||||
KAZ_ROOT=$(cd "$(dirname $0)/../.."; pwd)
|
||||
. "${KAZ_ROOT}/bin/.commonFunctions.sh"
|
||||
setKazVars
|
||||
|
||||
cd $(dirname $0)
|
||||
|
||||
PWD=$(pwd)
|
||||
ORGA_DIR=$(basename ${PWD})
|
||||
availableProxyComposes=($(getList "${KAZ_CONF_DIR}/container-proxy.list"))
|
||||
TMPL_PROXY_COMPOSES=()
|
||||
for item in "${availableProxyComposes[@]}"; do
|
||||
TMPL_PROXY_COMPOSES+=("${KAZ_COMP_DIR}/${item}/docker-compose.tmpl.yml")
|
||||
done
|
||||
ORGA_LIST="${KAZ_CONF_DIR}/container-orga.list"
|
||||
|
||||
remove () {
|
||||
while : ; do
|
||||
read -r -p "Are you sure remove ${ORGA}? [y/N] " response
|
||||
case "$response" in
|
||||
[oO][uU][iI] | [yY][eE][sS] | [yY] | [oO] )
|
||||
|
||||
echo "remove ${ORGA}"
|
||||
. .env
|
||||
ORGA_FLAG=${ORGA//-/_}_orga
|
||||
for item in "${TMPL_PROXY_COMPOSES[@]}"; do
|
||||
echo "Update ${item}"
|
||||
if grep -q "^{{${ORGA_FLAG}" "${item}" 2> /dev/null ; then
|
||||
sed -i -e "/^{{${ORGA_FLAG}/,/^}}/d" "${item}"
|
||||
fi
|
||||
done
|
||||
DEL_DOMAIN=""
|
||||
for serv in ${pahekoHost} ${cloudHost} ${officeHost} ${dokuwikiHost} ${wordpressHost} ${matterHost}
|
||||
do
|
||||
DEL_DOMAIN+="${ORGA}-${serv} "
|
||||
done
|
||||
${KAZ_BIN_DIR}/dns.sh del ${DEL_DOMAIN}
|
||||
${KAZ_BIN_DIR}/container.sh stop ${ORGA}-orga
|
||||
sed -i -e "/proxy_${ORGA_FLAG}=/d" "${DOCKERS_ENV}"
|
||||
sed -i -e "/^${ORGA}-orga$/d" "${ORGA_LIST}"
|
||||
rm -fr "${KAZ_COMP_DIR}/${ORGA}-orga"
|
||||
exit;;
|
||||
[Nn]* )
|
||||
|
||||
exit;;
|
||||
* )
|
||||
|
||||
echo "Please answer yes or no."
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
if [[ "${ORGA_DIR}" = "orgaTmpl" ]]
|
||||
then
|
||||
while :
|
||||
do
|
||||
echo -n "Give new organization name ? "
|
||||
read ORGA
|
||||
[[ "${ORGA}" =~ ^[a-zA-Z0-9_\-]+$ ]] && [[ ! -z "${ORGA}" ]] && break
|
||||
echo "Name must contains only a-zA-Z0-9_\-"
|
||||
done
|
||||
remove
|
||||
exit
|
||||
fi
|
||||
|
||||
if [[ "${ORGA_DIR}" != *"-orga" ]]
|
||||
then
|
||||
echo "it's not an orga dir"
|
||||
exit
|
||||
fi
|
||||
|
||||
ORGA=${ORGA_DIR%-orga}
|
||||
remove
|
15
config/orgaTmpl/reload.sh
Executable file
15
config/orgaTmpl/reload.sh
Executable file
@ -0,0 +1,15 @@
|
||||
#!/bin/bash
|
||||
|
||||
PRG=$(basename $0)
|
||||
KAZ_ROOT=$(cd "$(dirname $0)/../.."; pwd)
|
||||
. "${KAZ_ROOT}/bin/.commonFunctions.sh"
|
||||
setKazVars
|
||||
. "${DOCKERS_ENV}"
|
||||
|
||||
cd $(dirname $0)
|
||||
PWD=$(pwd)
|
||||
ORGA_DIR=$(basename ${PWD})
|
||||
ORGA=${ORGA_DIR%-orga}
|
||||
|
||||
|
||||
${KAZ_BIN_DIR}/manageWiki.sh --reload $ORGA
|
10
config/orgaTmpl/wiki-conf/acl.auth.php
Normal file
10
config/orgaTmpl/wiki-conf/acl.auth.php
Normal file
@ -0,0 +1,10 @@
|
||||
# acl.auth.php
|
||||
# <?php exit()?>
|
||||
# Don't modify the lines above
|
||||
#
|
||||
# Access Control Lists
|
||||
#
|
||||
# Auto-generated by install script
|
||||
# Date: Sat, 13 Feb 2021 17:42:28 +0000
|
||||
* @ALL 1
|
||||
* @user 8
|
26
config/orgaTmpl/wiki-conf/local.php
Normal file
26
config/orgaTmpl/wiki-conf/local.php
Normal file
@ -0,0 +1,26 @@
|
||||
<?php
|
||||
/*
|
||||
* Dokuwiki's Main Configuration File - Local Settings
|
||||
* Auto-generated by config plugin
|
||||
* Run for user: felix
|
||||
* Date: Sun, 28 Feb 2021 15:56:13 +0000
|
||||
*/
|
||||
|
||||
$conf['title'] = 'Kaz';
|
||||
$conf['template'] = 'docnavwiki';
|
||||
$conf['license'] = 'cc-by-sa';
|
||||
$conf['useacl'] = 1;
|
||||
$conf['superuser'] = '@admin';
|
||||
$conf['manager'] = '@manager';
|
||||
$conf['disableactions'] = 'register';
|
||||
$conf['remoteuser'] = '';
|
||||
$conf['mailfrom'] = 'dokuwiki@kaz.bzh';
|
||||
$conf['updatecheck'] = 0;
|
||||
$conf['userewrite'] = '1';
|
||||
$conf['useslash'] = 1;
|
||||
$conf['plugin']['ckgedit']['scayt_auto'] = 'on';
|
||||
$conf['plugin']['ckgedit']['scayt_lang'] = 'French/fr_FR';
|
||||
$conf['plugin']['ckgedit']['other_lang'] = 'fr';
|
||||
$conf['plugin']['smtp']['smtp_host'] = 'smtp.kaz.bzh';
|
||||
$conf['plugin']['todo']['CheckboxText'] = 0;
|
||||
$conf['plugin']['wrap']['restrictionType'] = '1';
|
13
config/orgaTmpl/wiki-conf/users.auth.php
Normal file
13
config/orgaTmpl/wiki-conf/users.auth.php
Normal file
@ -0,0 +1,13 @@
|
||||
# users.auth.php
|
||||
# <?php exit()?>
|
||||
# Don't modify the lines above
|
||||
#
|
||||
# Userfile
|
||||
#
|
||||
# Auto-generated by install script
|
||||
# Date: Sat, 13 Feb 2021 17:42:28 +0000
|
||||
#
|
||||
# Format:
|
||||
# login:passwordhash:Real Name:email:groups,comma,separated
|
||||
|
||||
admin:$2y$10$GYvFgViXeEUmDViplHEs7eoYV8tmbfsS8wA1vfHQ.tWgW14o9aTjy:admin:contact@kaz.bzh:admin,user
|
21
config/proxy/proxy_params
Normal file
21
config/proxy/proxy_params
Normal file
@ -0,0 +1,21 @@
|
||||
|
||||
#proxy_buffering off;
|
||||
#proxy_set_header X-Forwarded-Host $host:$server_port;
|
||||
#proxy_set_header X-Forwarded-Server $host;
|
||||
#XXX pb proxy_set_header Connection $proxy_connection;
|
||||
|
||||
proxy_buffers 256 16k;
|
||||
proxy_buffer_size 16k;
|
||||
|
||||
# mattermost
|
||||
http2_push_preload on; # Enable HTTP/2 Server Push
|
||||
add_header Strict-Transport-Security max-age=15768000;
|
||||
proxy_set_header Host $http_host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
|
||||
#proxy_hide_header 'x-frame-options';
|
||||
#proxy_set_header x-frame-options allowall;
|
||||
proxy_set_header X-Frame-Options SAMEORIGIN;
|
||||
|
89
config/skip-file.txt
Normal file
89
config/skip-file.txt
Normal file
@ -0,0 +1,89 @@
|
||||
# a verifier
|
||||
/vigilo/
|
||||
dockers/grav
|
||||
dockers/web/Dockerfile
|
||||
dockers/proxy/todo-ssl
|
||||
dockers/cloud/DEADJOE
|
||||
# jamais
|
||||
/.git/
|
||||
bin/createUser.log
|
||||
bin/createUser.old
|
||||
bin/createUser.txt
|
||||
dockers/mattermost/modif_user.txt
|
||||
state/activites_mailbox.csv
|
||||
state/collecte.csv
|
||||
config/createUser_cmds_to_run.sh
|
||||
dockers/proxy/config/pb-vigilo.txt
|
||||
*~
|
||||
*/*~
|
||||
*/*/*~
|
||||
*/*/*/*~
|
||||
.*~
|
||||
*/.*~
|
||||
*/*/.*~
|
||||
*/*/*/.*~
|
||||
*/*.old/
|
||||
*/*/*.old/
|
||||
*/*/*/*.old/
|
||||
# auto
|
||||
config/dockers.env
|
||||
dockers/proxy/config/nginx.conf
|
||||
dockers/*-orga/
|
||||
dockers/proxy-*
|
||||
# param
|
||||
config/container-*.list
|
||||
dockers/postfix/config/dovecot-quotas.cf
|
||||
dockers/postfix/config/postfix-accounts.cf
|
||||
dockers/postfix/config/postfix-accounts.cf
|
||||
dockers/postfix/config/postfix-virtual.cf
|
||||
dockers/postfix/config/ssl/demoCA/cacert.pem
|
||||
dockers/postfix/config/ssl/demoCA/careq.pem
|
||||
dockers/postfix/config/ssl/demoCA/index.txt
|
||||
dockers/postfix/config/ssl/demoCA/index.txt.attr
|
||||
dockers/postfix/config/ssl/demoCA/index.txt.old
|
||||
dockers/postfix/config/ssl/demoCA/newcerts/*.pem
|
||||
dockers/postfix/config/ssl/demoCA/private/cakey.pem
|
||||
dockers/postfix/config/ssl/demoCA/serial
|
||||
dockers/postfix/config/ssl/mail.dev.kaz.bzh-key.pem
|
||||
dockers/postfix/config/ssl/mail.dev.kaz.bzh-req.pem
|
||||
dockers/proxy/docker-compose.yml
|
||||
dockers/test-all-but-mail.sh
|
||||
dockers/web/html/status/allServices.html
|
||||
dockers/web/html/status/allServices.tmpl.html
|
||||
config/container-orga.list
|
||||
config/container-withMail.list
|
||||
config/container-withoutMail.list
|
||||
config/password/env-mailServ
|
||||
config/proxy/*_kaz_map.*
|
||||
config/proxy/*_kaz_name.*
|
||||
# parfois
|
||||
dockers/proxy/docker-compose.tmpl.yml
|
||||
# ajouté par rdiff.sh
|
||||
config/proxy/port.kaz.local
|
||||
config/proxy/allow_ip.kaz.local
|
||||
config/proxy/redirect.kaz.local
|
||||
config/proxy/foreign-certificate
|
||||
config/proxy/wiki_kaz_map
|
||||
config/proxy/wp_kaz_name
|
||||
config/proxy/agora_kaz_map
|
||||
config/proxy/wiki_kaz_name
|
||||
config/proxy/agora_kaz_name
|
||||
config/proxy/redirect
|
||||
config/proxy/port
|
||||
config/proxy/cloud_kaz_name
|
||||
config/proxy/wp_kaz_map
|
||||
config/proxy/allow_ip
|
||||
config/proxy/cloud_kaz_map
|
||||
dockers/postfix/filter/master.cf.update
|
||||
dockers/postfix/filter/filter.sh
|
||||
dockers/postfix/filter/jirafeauAPI
|
||||
dockers/postfix/filter/eMailShrinker
|
||||
dockers/postfix/filter/domainname
|
||||
dockers/postfix/filter
|
||||
dockers/jirafeau/config/config.local.php
|
||||
config/skip-email.txt
|
||||
dockers/sympa/filter/domainname
|
||||
dockers/sympa/DEADJOE
|
||||
bin/DEADJOE
|
||||
dockers/sympa/reload.sh.non.utilisé
|
||||
dockers/kaz-orga.sav
|
Reference in New Issue
Block a user