Valentin Lab
9 years ago
commit
d2867007b9
2 changed files with 710 additions and 0 deletions
@ -0,0 +1,635 @@ |
|||
#!/bin/bash |
|||
|
|||
. /etc/shlib |
|||
|
|||
|
|||
include pretty |
|||
|
|||
depends shyaml docker |
|||
|
|||
if [ -r /etc/default/charm ]; then |
|||
. /etc/default/charm |
|||
fi |
|||
|
|||
if [ -r /etc/default/$exname ]; then |
|||
. /etc/default/$exname |
|||
fi |
|||
|
|||
usage="$exname CHARM"' |
|||
|
|||
Deploy and manage a swarm of containers to provide services based on |
|||
a ``compose.yml`` definition and charms from a ``charm-store``. |
|||
' |
|||
|
|||
export DEFAULT_COMPOSE_FILE |
|||
|
|||
## |
|||
## Functions |
|||
## |
|||
|
|||
export APACHE_CONFIG_LOCATION=$CONFIGSTORE/apache/etc/apache2/sites-enabled |
|||
|
|||
apache_ssl_proxy_config () { |
|||
local DOMAIN=$1 TARGET=$2 |
|||
|
|||
cat <<EOF |
|||
<IfModule mod_ssl.c> |
|||
|
|||
<VirtualHost *:443> |
|||
ServerAdmin ${ADMIN_MAIL:-contact@$DOMAIN} |
|||
ServerName ${DOMAIN} |
|||
|
|||
ServerSignature Off |
|||
CustomLog /var/log/apache2/s-${DOMAIN}_access.log combined |
|||
ErrorLog /var/log/apache2/s-${DOMAIN}_error.log |
|||
ErrorLog syslog:local2 |
|||
|
|||
<IfModule mod_proxy.c> |
|||
ProxyRequests Off |
|||
<Proxy *> |
|||
Order deny,allow |
|||
Allow from all |
|||
</Proxy> |
|||
ProxyVia On |
|||
ProxyPass / http://$TARGET/ retry=0 |
|||
<Location / > |
|||
ProxyPassReverse / |
|||
</Location> |
|||
</IfModule> |
|||
|
|||
## Forbid any cache, this is only usefull on dev server. |
|||
#Header set Cache-Control "no-cache" |
|||
#Header set Access-Control-Allow-Origin "*" |
|||
#Header set Access-Control-Allow-Methods "POST, GET, OPTIONS" |
|||
#Header set Access-Control-Allow-Headers "origin, content-type, accept" |
|||
|
|||
RequestHeader set "X-Forwarded-Proto" "https" |
|||
|
|||
## Fix IE problem (httpapache proxy dav error 408/409) |
|||
SetEnv proxy-nokeepalive 1 |
|||
#ServerSignature On |
|||
SSLProxyEngine On |
|||
SSLEngine On |
|||
|
|||
## Full stance |
|||
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem |
|||
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key |
|||
|
|||
SSLVerifyClient None |
|||
|
|||
</VirtualHost> |
|||
|
|||
</IfModule> |
|||
EOF |
|||
|
|||
} |
|||
export -f apache_ssl_proxy_config |
|||
|
|||
apache_ssl_config() { |
|||
local DOMAIN=$1 |
|||
|
|||
cat <<EOF |
|||
<IfModule mod_ssl.c> |
|||
|
|||
<VirtualHost *:443> |
|||
ServerAdmin ${ADMIN_MAIL:-contact@$DOMAIN} |
|||
ServerName ${DOMAIN} |
|||
|
|||
ServerSignature Off |
|||
CustomLog /var/log/apache2/s-${DOMAIN}_access.log combined |
|||
ErrorLog /var/log/apache2/s-${DOMAIN}_error.log |
|||
ErrorLog syslog:local2 |
|||
|
|||
DocumentRoot /var/www/${DOMAIN} |
|||
|
|||
<Directory /> |
|||
Options FollowSymLinks |
|||
AllowOverride None |
|||
</Directory> |
|||
|
|||
<Directory /var/www/${DOMAIN}> |
|||
Options Indexes FollowSymLinks MultiViews |
|||
AllowOverride all |
|||
Order allow,deny |
|||
allow from all |
|||
</Directory> |
|||
|
|||
SSLEngine On |
|||
|
|||
## Full stance |
|||
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem |
|||
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key |
|||
SSLVerifyClient None |
|||
|
|||
</VirtualHost> |
|||
|
|||
</IfModule> |
|||
EOF |
|||
|
|||
} |
|||
export -f apache_ssl_config |
|||
|
|||
apache_ssl_add () { |
|||
local DOMAIN=$1 |
|||
[ -e "$APACHE_CONFIG_LOCATION/$DOMAIN.conf" ] && return 0 |
|||
mkdir -p "$APACHE_CONFIG_LOCATION" |
|||
apache_ssl_config $DOMAIN > $APACHE_CONFIG_LOCATION/$DOMAIN.conf |
|||
echo "Added $DOMAIN apache config." >&2 |
|||
|
|||
} |
|||
export -f apache_ssl_add |
|||
apache_ssl_proxy_add () { |
|||
local DOMAIN=$1 TARGET=$2 |
|||
[ -e "$APACHE_CONFIG_LOCATION/$DOMAIN.conf" ] && return 0 |
|||
|
|||
mkdir -p "$APACHE_CONFIG_LOCATION" |
|||
apache_ssl_proxy_config $DOMAIN $TARGET > $APACHE_CONFIG_LOCATION/$DOMAIN.conf |
|||
echo "Added $DOMAIN as a proxy to $TARGET." >&2 |
|||
} |
|||
export -f apache_ssl_proxy_add |
|||
|
|||
gen_password() { |
|||
python -c 'import random; \ |
|||
xx = "azertyuiopqsdfghjklmwxcvbn1234567890AZERTYUIOPQSDFGHJKLMWXCVBN+_-"; \ |
|||
print "".join([xx[random.randint(0, len(xx)-1)] for x in range(0, 14)])' |
|||
} |
|||
export -f gen_password |
|||
|
|||
|
|||
file_put() { |
|||
local TARGET="$1" |
|||
mkdir -p "$(dirname "$TARGET")" && |
|||
cat - > "$TARGET" |
|||
} |
|||
export -f file_put |
|||
|
|||
|
|||
apache_data_dir() { |
|||
local DOMAIN=$1 DATA_COMMA_SEPARATED=$2 |
|||
|
|||
export APACHE_DOCKER_IMAGE=$(service_base_docker_image apache) |
|||
|
|||
DOCKER_SITE_PATH=/var/www/$DOMAIN |
|||
BASE=$DATASTORE/apache |
|||
DST=$BASE/$DOCKER_SITE_PATH |
|||
DATA=() |
|||
while IFS="," read -ra ADDR; do |
|||
for dir in "${ADDR[@]}"; do |
|||
mkdir -p "$DST/$dir" |
|||
DATA+=($dir) |
|||
done |
|||
done <<< "$DATA_COMMA_SEPARATED" |
|||
|
|||
if [ -z "$APACHE_DOCKER_GID" ] && |
|||
! grep "^export APACHE_DOCKER_GID=" /etc/compose.local.conf >/dev/null 2>&1; then |
|||
echo "Adding APACHE_DOCKER_GID to '/etc/compose.local.conf'." |
|||
|
|||
export APACHE_DOCKER_GID=$(docker run "$APACHE_DOCKER_IMAGE" id -g www-data) |
|||
|
|||
cat <<EOF >> /etc/compose.local.conf |
|||
export APACHE_DOCKER_GID=$APACHE_DOCKER_GID |
|||
EOF |
|||
|
|||
fi |
|||
|
|||
dirs=() |
|||
for d in "${DATA[@]}"; do |
|||
dirs+=("$DST/$d") |
|||
done |
|||
|
|||
chgrp www-data "${dirs[@]}" -R && chmod 775 "${dirs[@]}" -R |
|||
} |
|||
export -f apache_data_dir |
|||
|
|||
|
|||
export _DOCKER_COMPOSE_DEF="" |
|||
get_compose_def() { |
|||
local local_compose |
|||
|
|||
if [ "$_DOCKER_COMPOSE_DEF" ]; then |
|||
echo "$_DOCKER_COMPOSE_DEF" |
|||
return 0 |
|||
fi |
|||
|
|||
## |
|||
## Adding sub services configurations |
|||
## |
|||
|
|||
additional_services= |
|||
if [ -z "$*" ]; then |
|||
info "No service provided, using \$DEFAULT_SERVICES variable. Target services: $DEFAULT_SERVICES" |
|||
additional_services=$DEFAULT_SERVICES |
|||
fi |
|||
declare -A loaded |
|||
for target_service in "$@" $additional_services; do |
|||
|
|||
services=$(get_ordered_service_dependencies "$target_service") || return 1 |
|||
for service in $services; do |
|||
|
|||
if [ "${loaded[$service]}" ]; then |
|||
continue |
|||
fi |
|||
loaded[$service]=1 |
|||
export _DOCKER_COMPOSE_DEF="$_DOCKER_COMPOSE_DEF |
|||
$service: |
|||
$(get_service_def "$service" | sed -r 's/^/ /g')" |
|||
|
|||
done |
|||
done |
|||
echo "$_DOCKER_COMPOSE_DEF" |
|||
} |
|||
export -f get_compose_def |
|||
|
|||
get_service_def() { |
|||
local service="$1" |
|||
|
|||
if [ -z "$service" ]; then |
|||
echo "Please specify a service." >&2 |
|||
return 1 |
|||
fi |
|||
|
|||
if [ -d "$CHARM_STORE/$service" ]; then |
|||
compose_file="$CHARM_STORE/$service/compose.yml" |
|||
local_compose="" |
|||
if [ -e "$compose_file" ]; then |
|||
debug "Found compose.yml in $service directory. Including in 'docker-compose.conf'." |
|||
local_compose="$(cat "$compose_file")" |
|||
fi |
|||
metadata_file="$CHARM_STORE/$service/metadata.yml" |
|||
if [ -e "$metadata_file" ]; then |
|||
debug "Found metadata.yml in $service directory. Including in 'docker-compose.conf'." |
|||
docker_compose_entry=$(get_docker_compose_entry_from_metadata "$service" < "$metadata_file") || return 1 |
|||
local_compose="$local_compose |
|||
$docker_compose_entry" |
|||
fi |
|||
echo "$local_compose" |
|||
return 0 |
|||
fi |
|||
|
|||
err "service '$DARKYELLOW$service$NORMAL' not found." >&2 |
|||
return 1 |
|||
} |
|||
export -f get_service_def |
|||
|
|||
service_base_docker_image() { |
|||
local service="$1" |
|||
service_def="$(get_service_def "$service")" || return 1 |
|||
|
|||
service_image=$(echo "$service_def" | shyaml get-value image 2>/dev/null) |
|||
if [ "$?" != 0 ]; then |
|||
service_build=$(echo "$service_def" | shyaml get-value build) |
|||
if [ "$?" != 0 ]; then |
|||
echo "Service '$service' has no 'image' nor 'build' parameter." >&2 |
|||
return 1 |
|||
fi |
|||
service_dockerfile="$COMPOSE_YML_PATH/$service_build/Dockerfile" |
|||
if ! [ -e "$service_dockerfile" ]; then |
|||
echo "No Dockerfile found in '$service_dockerfile' location." >&2 |
|||
return 1 |
|||
fi |
|||
|
|||
grep '^FROM' "$service_dockerfile" | xargs echo | cut -f 2 -d " " |
|||
else |
|||
echo "$service_image" |
|||
fi |
|||
|
|||
} |
|||
export -f service_base_docker_image |
|||
|
|||
|
|||
read-0() { |
|||
local eof |
|||
eof= |
|||
while [ "$1" ]; do |
|||
IFS='' read -r -d '' "$1" || eof=true |
|||
shift |
|||
done |
|||
test "$eof" != true |
|||
} |
|||
export -f read-0 |
|||
|
|||
array_values_to_stdin() { |
|||
local e |
|||
if [ "$#" -ne "1" ]; then |
|||
print_syntax_warning "$FUNCNAME: need one argument." |
|||
return 1 |
|||
fi |
|||
var="$1" |
|||
eval "for e in \"\${$var[@]}\"; do echo -en \"\$e\\0\"; done" |
|||
} |
|||
|
|||
array_keys_to_stdin() { |
|||
local e |
|||
if [ "$#" -ne "1" ]; then |
|||
print_syntax_warning "$FUNCNAME: need one argument." |
|||
return 1 |
|||
fi |
|||
var="$1" |
|||
eval "for e in \"\${!$var[@]}\"; do echo -en \"\$e\\0\"; done" |
|||
} |
|||
|
|||
array_kv_to_stdin() { |
|||
local e |
|||
if [ "$#" -ne "1" ]; then |
|||
print_syntax_warning "$FUNCNAME: need one argument." |
|||
return 1 |
|||
fi |
|||
var="$1" |
|||
eval "for e in \"\${!$var[@]}\"; do echo -n \"\$e\"; echo -en '\0'; echo -n \"\${$var[\$e]}\"; echo -en '\0'; done" |
|||
} |
|||
|
|||
|
|||
array_pop() { |
|||
local narr="$1" nres="$2" |
|||
for key in $(eval "echo \${!$narr[@]}"); do |
|||
eval "$nres=\${$narr[\"\$key\"]}" |
|||
eval "unset $narr[\"\$key\"]" |
|||
return 0 |
|||
done |
|||
} |
|||
export -f array_pop |
|||
|
|||
array_member() { |
|||
local src elt |
|||
src="$1" |
|||
elt="$2" |
|||
while read-0 key; do |
|||
if [ "$(eval "echo -n \"\${$src[\$key]}\"")" == "$elt" ]; then |
|||
return 0 |
|||
fi |
|||
done < <(array_keys_to_stdin "$src") |
|||
return 1 |
|||
} |
|||
export -f array_member |
|||
|
|||
|
|||
get_service_deps() { |
|||
local service="$1" |
|||
service_def=$(get_service_def "$service") || return 1 |
|||
echo "$service_def" | shyaml get-values links 2>/dev/null |
|||
return 0 |
|||
} |
|||
export -f get_service_deps |
|||
|
|||
## a service is not always a container. |
|||
## XXXvlab: a service name should not be a container name neither... see this later. |
|||
# get_container_name() { |
|||
# local service="$1" |
|||
# get_service_def "$service" | shyaml get-values links 2>/dev/null |
|||
# if [ "$(get_md_service_def "$service" | shyaml get-value subordinate 2>/dev/null)" != "true" ]; then |
|||
# echo "$service" |
|||
# return 0 |
|||
# fi |
|||
|
|||
# } |
|||
|
|||
_rec_get_depth() { |
|||
local elt=$1 |
|||
|
|||
if [ "${depths[$elt]}" ]; then |
|||
return 0 |
|||
fi |
|||
deps=$(get_service_deps "$elt") || return 1 |
|||
if [ -z "$deps" ]; then |
|||
depths[$elt]=0 |
|||
fi |
|||
|
|||
max=0 |
|||
for dep in $deps; do |
|||
_rec_get_depth "$dep" || return 1 |
|||
if (( "${depths[$dep]}" > "$max" )); then |
|||
max="${depths[$dep]}" |
|||
fi |
|||
done |
|||
depths[$elt]=$((max + 1)) |
|||
} |
|||
|
|||
get_ordered_service_dependencies() { |
|||
local services=("$@") |
|||
|
|||
if [ -z "${services[*]}" ]; then |
|||
print_syntax_error "$FUNCNAME: no arguments" |
|||
fi |
|||
|
|||
declare -A depths |
|||
visited=() |
|||
heads=("${services[@]}") |
|||
while [ "${#heads[@]}" != 0 ]; do |
|||
array_pop heads head |
|||
visited+=("$head") |
|||
_rec_get_depth "$head" || return 1 |
|||
done |
|||
|
|||
i=0 |
|||
while [ "${#depths[@]}" != 0 ]; do |
|||
for key in "${!depths[@]}"; do |
|||
value="${depths[$key]}" |
|||
if [ "$value" == "$i" ]; then |
|||
echo "$key" |
|||
unset depths[$key] |
|||
fi |
|||
done |
|||
i=$((i + 1)) |
|||
done |
|||
} |
|||
|
|||
run_service_hook () { |
|||
local service="$1" action="$2" |
|||
|
|||
services=$(get_ordered_service_dependencies "$service") || return 1 |
|||
## init in order |
|||
for service in $services; do |
|||
TARGET_SCRIPT="$COMPOSE_YML_PATH/service/$service/hooks/$2" |
|||
[ -e "$TARGET_SCRIPT" ] && { |
|||
[ "$verbose" ] && echo "Init $service" |
|||
SERVICE_NAME=$service \ |
|||
DOCKER_BASE_IMAGE=$(service_base_docker_image "$service") \ |
|||
SERVICE_DATASTORE="$DATASTORE/$service" \ |
|||
SERVICE_CONFIGSTORE="$CONFIGSTORE/$service" \ |
|||
"$TARGET_SCRIPT" |
|||
} |
|||
done |
|||
} |
|||
|
|||
run_service_action () { |
|||
local service="$1" action="$2" |
|||
shift shift |
|||
run_service_hook "$service" init |
|||
|
|||
services=$(get_ordered_service_dependencies "$service") || return 1 |
|||
for service in $services; do |
|||
TARGET_SCRIPT="$COMPOSE_YML_PATH/service/$service/actions/$2" |
|||
if [ -e "$TARGET_SCRIPT" ]; then |
|||
[ "$verbose" ] && echo "Init $service" |
|||
SERVICE_NAME=$service \ |
|||
CONTAINER_NAME=$(get_container_name "$service") \ |
|||
DOCKER_BASE_IMAGE=$(service_base_docker_image "$service") \ |
|||
SERVICE_DATASTORE="$DATASTORE/$service" \ |
|||
SERVICE_CONFIGSTORE="$CONFIGSTORE/$service" \ |
|||
echo "$TARGET_SCRIPT" "$@" |
|||
else |
|||
echo "Service '$service' does not have any action '$action' defined." >&2 |
|||
return 1 |
|||
fi |
|||
done |
|||
} |
|||
|
|||
get_docker_compose_entry_from_metadata() { |
|||
local service="$1" |
|||
metadata="$(cat -)" |
|||
|
|||
export DATASTORE CONFIGSTORE |
|||
## resources to volumes |
|||
volumes=$( |
|||
for resource_type in data config; do |
|||
while read-0 resource; do |
|||
eval "echo \" - \$${resource_type^^}STORE/\$service\$resource:\$resource:rw\"" |
|||
done < <(echo "$metadata" | shyaml get-values-0 "${resource_type}-resources" 2>/dev/null) |
|||
done |
|||
while read-0 resource; do |
|||
if [[ "$resource" == *:* ]]; then |
|||
echo " - $resource:rw" |
|||
else |
|||
echo " - $resource:$resource:rw" |
|||
fi |
|||
done < <(echo "$metadata" | shyaml get-values-0 "host-resources" 2>/dev/null) |
|||
) |
|||
if [ "$volumes" ]; then |
|||
echo "volumes:" |
|||
echo "$volumes" |
|||
fi |
|||
|
|||
## resources to volumes |
|||
image=$(echo "$metadata" | shyaml get-values "docker-image" 2>/dev/null) |
|||
if [ "$image" ]; then |
|||
echo "image: $image" |
|||
else |
|||
if ! [ -d "$CHARM_STORE/$service/build" ]; then |
|||
die "No 'docker-image' value set in 'metadata.yml' nor 'build/' directory found in charm $DARKYELLOW$service$NORMAL." |
|||
fi |
|||
echo "build: $service/build" |
|||
fi |
|||
} |
|||
export -f get_docker_compose_entry_from_metadata |
|||
|
|||
launch_docker_compose() { |
|||
debug "Creating temporary docker-compose directory in '$tmpdir'." |
|||
tmpdir=$(mktemp -d -t tmp.XXXXXXXXXX) |
|||
function finish { |
|||
debug "Removing temporary docker-compose directory in '$tmpdir'." |
|||
rm -rf "$tmpdir" |
|||
} |
|||
trap finish EXIT |
|||
get_compose_def > "$tmpdir/docker-compose.yml" || return 1 |
|||
## XXXvlab: could be more specific and only link the needed charms |
|||
ln -sf "$CHARM_STORE/"* "$tmpdir/" |
|||
cd "$tmpdir" && docker-compose "$@" |
|||
} |
|||
|
|||
|
|||
|
|||
## |
|||
## Argument parsing |
|||
## |
|||
|
|||
fullargs=() |
|||
opts=() |
|||
posargs=() |
|||
no_hooks= |
|||
no_init= |
|||
while [ "$#" != 0 ]; do |
|||
case "$1" in |
|||
# --help|-h) |
|||
# print_help |
|||
# exit 0 |
|||
# ;; |
|||
--verbose|-v) |
|||
fullargs+=("$1") |
|||
export VERBOSE=true |
|||
;; |
|||
--no-hooks) |
|||
export no_hooks=true |
|||
;; |
|||
--no-init) |
|||
export no_init=true |
|||
;; |
|||
--debug) |
|||
export DEBUG=true |
|||
export VERBOSE=true |
|||
;; |
|||
--) |
|||
fullargs+=("$1") |
|||
shift |
|||
opts=("${opts[@]}" "$@") |
|||
break 2 |
|||
;; |
|||
-*) |
|||
fullargs+=("$1") |
|||
opts=("${opts[@]}" "$1" "$2") |
|||
shift |
|||
;; |
|||
*) |
|||
fullargs+=("$1") |
|||
posargs=("${posargs[@]}" "$1") |
|||
;; |
|||
esac |
|||
shift |
|||
done |
|||
|
|||
|
|||
## |
|||
## Actual code |
|||
## |
|||
|
|||
export CHARM_STORE=${CHARM_STORE:-/srv/charm-store} |
|||
export DOCKER_DATASTORE=${DOCKER_DATASTORE:-/srv/docker-datastore} |
|||
|
|||
|
|||
## XXXvlab: should provide YML config opportunities in possible parent dirs ? |
|||
## userdir ? and global /etc/compose.yml ? |
|||
. /etc/compose.conf |
|||
. /etc/compose.local.conf |
|||
|
|||
if ! [ -d "$CHARM_STORE" ]; then |
|||
err "Charm store path $YELLOW$CHARM_STORE$NORMAL does not exists. " |
|||
err "Please check your $YELLOW\$CHARM_STORE$NORMAL variable value." |
|||
exit 1 |
|||
fi |
|||
|
|||
|
|||
if [ -z "$(cd "$CHARM_STORE"; ls)" ]; then |
|||
err "no available charms in charm store $YELLOW$CHARM_STORE$NORMAL. Either:" |
|||
err " - check $YELLOW\$CHARM_STORE$NORMAL variable value" |
|||
err " - download charms in $CHARM_STORE" |
|||
print_error "Charm store is empty. Cannot continue." |
|||
fi |
|||
|
|||
|
|||
action="${posargs[0]}" |
|||
case "$action" in |
|||
load|save) |
|||
service="${posargs[1]}" |
|||
run_service_action "$service" "$action" "${opts[@]}" "${posargs[@]:2}" |
|||
;; |
|||
up) |
|||
service="${posargs[1]}" |
|||
|
|||
## init in order |
|||
[ "$no_init" ] || run_service_hook "$service" init |
|||
|
|||
## XXXvlab: to be removed when all relation and service stuff is resolved |
|||
if [ -z "$no_hooks" ]; then |
|||
for script in "$CHARM_STORE/"*/hooks.d/*.sh; do |
|||
[ -e "$script" ] || continue |
|||
[ -x "$script" ] || { echo "compose: script $script is not executable." >&2; exit 1; } |
|||
( |
|||
cd "$(dirname "$script/..")"; |
|||
"$script" "$@" |
|||
) || { echo "compose: hook $script failed. Stopping." >&2; exit 1; } |
|||
done |
|||
fi |
|||
|
|||
launch_docker_compose "${fullargs[@]}" |
|||
;; |
|||
*) launch_docker_compose "${fullargs[@]}";; |
|||
esac |
@ -0,0 +1,75 @@ |
|||
## |
|||
## Links deployable services |
|||
## |
|||
|
|||
## Syntax: |
|||
|
|||
## <SERVICE>: |
|||
## charm: <CHARM> # optional: defaults to charm of same name |
|||
## link: |
|||
## <RELATION>: <CHARM> # or: |
|||
## <RELATION>: |
|||
## <SERVICE>: |
|||
## <YML RELATION'S CONFIGURATION> |
|||
## |
|||
|
|||
## launching up a SERVICE, will spawn required SERVICES for given linked RELATIONS. |
|||
## if SERVICE has no definition here AND has a charm with no requirements, it'll be |
|||
## spawned on itself as if a unwritten empty SERVICE definition existed: |
|||
## |
|||
## <SERVICE>: |
|||
## |
|||
|
|||
|
|||
enquetes: |
|||
charm: enquetes |
|||
link: |
|||
publish-dir: |
|||
apache: |
|||
source: git:$MAIN_GIT/enquete |
|||
branch: master |
|||
location: /opt/apps/limesurvey |
|||
data_dirs: |
|||
- tmp |
|||
- upload |
|||
domain: enquetes.$MAIN_DOMAIN |
|||
mysql-database: |
|||
mysql: |
|||
user: lmenquete |
|||
dbname: lmenquete |
|||
|
|||
fo: |
|||
charm: formanoo_nfo |
|||
link: |
|||
publish-dir: |
|||
apache: |
|||
source: git:$MAIN_GIT/formanoo_nfo |
|||
branch: master |
|||
location: /opt/apps/formanoo_nfo |
|||
data_dirs: |
|||
- assets/eclasseurs |
|||
- assets/mpdf/tmp |
|||
- api/v1/mpdf/tmp |
|||
- users |
|||
domain: www.$MAIN_DOMAIN |
|||
postgres-database: |
|||
postgres: |
|||
user: formanoo_nfo |
|||
dbname: formanoo_nfo |
|||
|
|||
bo: |
|||
charm: odoo |
|||
link: |
|||
pg-database: |
|||
postgres: |
|||
user: odoo |
|||
dbname: extranet |
|||
web-proxy: apache |
|||
birt-reports: birt |
|||
|
|||
monitor: |
|||
charm: facette |
|||
link: |
|||
web-proxy: |
|||
domain: monitor.${MAIN_DOMAIN} |
|||
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue