Skip to content

Commit 6036dbd

Browse files
authored
Merge pull request #39 from bird-house/autodeploy-the-autodeploy-phase-2
Autodeploy the autodeploy phase 2: everything operational but a few compatibility issues remain Part of #27 Activating the `./components/scheduler` will do everything. All configurations are centralized in the `env.local` file. One missing feature is piece-wise choice of platform or notebook autodeploy only, like with the old manual `install-*` stcripts under https://github.com/bird-house/birdhouse-deploy/tree/master/birdhouse/deployment. Right now it's all or nothing. I can work on this if you guys think it's needed. Remaining compatibility issues with Medus (Vagrant box works fine): * Notebook autodeploy do not work. It looks like using the `bash` docker image, I am unable to wget any httpS address. This same `docker run` command works fine on my Vagrant box as well. So there's something on Medus. ``` $ docker run --rm --name debug_wget_httpS -u root bash bash -c "wget https://google.com -O -" Connecting to google.com (172.217.13.206:443) wget: error getting response: Connection reset by peer ``` * All the containers are being recreated when `./pavics-compose.sh` runs inside the container (first migration to the new autodeploy mechanism). To investigate but I suspect this might be due to older version of `docker` and `docker-compose` on Medus. * This one looks like due to older kernel on Medus: ``` sysctl: error: 'net.ipv4.tcp_tw_reuse' is an unknown key sh: 0: unknown operand ``` * All the files updated by `git pull` are now owned by `root` (the user inside the container). I'll have to undo this ownership change, somehow. This one is super weird, I should have got it on my Vagrant box. Probably Vagrant did some magic to always ensure files under `/vagrant` is always owned by the user even if changed by user `root`. * Documentation: update README and list relevant configuration variables in `env.local` for this new `./component/scheduler`. Migrating to this new mechanism requires manual deletion of all the artifacts created by the old install scripts: `sudo rm /etc/cron.d/PAVICS-deploy /etc/cron.hourly/PAVICS-deploy-notebooks /etc/logrotate.d/PAVICS-deploy /usr/local/sbin/triggerdeploy.sh`. Both can not co-exist at the same time. Maximum backward-compatibility has been kept with the old existing install scripts style: * Still log to the same existing log files under `/var/log/PAVICS`. * Old single ssh deploy key is still compatible, but the new mechanism allows for different ssh deploy keys for each extra repos (again, public repos should use https clone path to avoid dealing with ssh deploy keys in the first place) * Old install scripts are kept Features missing in old existing install scripts or how this improves on the old install scripts: * Autodeploy of the autodeploy itself ! This is the biggest win. Previously, if `triggerdeploy.sh` or `PAVICS-deploy-notebooks` script changes, they have to be deployed manually. It's very annoying. Now they are volume-mount in so are fresh on each run. * `env.local` now drive absolutely everything, source control that file and we've got a true DevOPS pipeline. * Configurable platform and notebook autodeploy frequency. Previously, this means manually editing the generated cron file, less ideal. * Do not need any support on the local host other than `docker` and `docker-compose`. cron/logrotate/git/ssh versions are all locked-down in the docker images used by the autodeploy. Recall previously we had to deal with git version too old on some hosts. * Each cron job run in its own docker image meaning the runtime environment is traceable and reproducible. * The newly introduced scheduler component is made extensible so other jobs can added into it as well (ex: backup), via `env.local`, which should source control, meaning all surrounding maintenance related tasks can also be traceable and reproducible. This is a rather large PR. For a less technical overview, start with the diff of README.md, env.local.example, common.env. If a change looks funny to you, read the commit description that introduce that change, the reasoning should be there.
2 parents 939857a + 8663d8c commit 6036dbd

File tree

13 files changed

+199
-65
lines changed

13 files changed

+199
-65
lines changed

Vagrantfile

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ Vagrant.configure("2") do |config|
4040

4141
if settings.has_key?('ssh_deploy_key')
4242
config.vm.provision :file, source: settings['ssh_deploy_key'], destination: ".ssh/id_rsa_git_ssh_read_only"
43-
config.vm.provision :shell, path: "birdhouse/deployment/install-automated-deployment.sh", args: ["/vagrant", "vagrant", "5-mins"]
4443
end
4544

4645
if settings.has_key?('datasets_dirs')

birdhouse/common.env

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,16 @@ export JUPYTER_LOGIN_BANNER_BOTTOM_SECTION=""
1919

2020
# Folder inside "proxy" container to drop extra monitoring config
2121
export CANARIE_MONITORING_EXTRA_CONF_DIR="/conf.d"
22+
23+
# Folder containing ssh deploy keys for all extra git repos
24+
#
25+
# Note when overriding this variable in env.local, do not use HOME environment
26+
# var, use its fully resolved value. This default value is suitable only for
27+
# backward-compatibility when autodeploy do not run in its own container.
28+
export AUTODEPLOY_DEPLOY_KEY_ROOT_DIR="$HOME/.ssh"
29+
30+
# Daily at 5:07 AM
31+
export AUTODEPLOY_PLATFORM_FREQUENCY="7 5 * * *"
32+
33+
# Hourly
34+
export AUTODEPLOY_NOTEBOOK_FREQUENCY="@hourly"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
config.yml

birdhouse/components/scheduler/config.json

Lines changed: 0 additions & 8 deletions
This file was deleted.
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
---
2+
- name: logrotate
3+
comment: Rotate log files under /var/log/PAVICS
4+
schedule: '@daily'
5+
command: bash -c 'cp /etc/logrotate.conf.orig /etc/logrotate.conf && chown root:root /etc/logrotate.conf && chmod 644 /etc/logrotate.conf && /usr/sbin/logrotate -v /etc/logrotate.conf'
6+
dockerargs: >-
7+
--rm --name logrotate
8+
--volume /var/log/PAVICS:/var/log/PAVICS:rw
9+
--volume /data/logrotate:/var/lib:rw
10+
--volume ${COMPOSE_DIR}/deployment/PAVICS-deploy.logrotate:/etc/logrotate.conf.orig:ro
11+
image: 'stakater/logrotate:3.13.0'
12+
13+
- name: notebookdeploy
14+
comment: Auto-deploy tutorial notebooks
15+
schedule: '${AUTODEPLOY_NOTEBOOK_FREQUENCY}'
16+
command: '${COMPOSE_DIR}/deployment/trigger-deploy-notebook'
17+
dockerargs: >-
18+
--rm --name notebookdeploy
19+
--volume /var/run/docker.sock:/var/run/docker.sock:ro
20+
--volume /var/log/PAVICS:/var/log/PAVICS:rw
21+
--volume ${COMPOSE_DIR}:${COMPOSE_DIR}:ro
22+
--volume ${JUPYTERHUB_USER_DATA_DIR}:${JUPYTERHUB_USER_DATA_DIR}:rw
23+
--volume /tmp/notebookdeploy:/tmp/notebookdeploy:rw
24+
--env COMPOSE_DIR=${COMPOSE_DIR}
25+
--env TMP_BASE_DIR=/tmp/notebookdeploy
26+
--env JUPYTERHUB_USER_DATA_DIR=${JUPYTERHUB_USER_DATA_DIR}
27+
image: 'docker:19.03.6-git'
28+
29+
- name: autodeploy
30+
comment: Auto-deploy entire PAVICS platform
31+
schedule: '${AUTODEPLOY_PLATFORM_FREQUENCY}'
32+
command: '${COMPOSE_DIR}/deployment/triggerdeploy.sh ${COMPOSE_DIR}'
33+
dockerargs: >-
34+
--rm --name autodeploy${AUTODEPLOY_EXTRA_REPOS_AS_DOCKER_VOLUMES}
35+
--volume /var/run/docker.sock:/var/run/docker.sock:ro
36+
--volume /var/log/PAVICS:/var/log/PAVICS:rw
37+
--volume ${COMPOSE_DIR}/..:${COMPOSE_DIR}/..:rw
38+
--volume ${AUTODEPLOY_DEPLOY_KEY_ROOT_DIR}:${AUTODEPLOY_DEPLOY_KEY_ROOT_DIR}:ro
39+
--volume ${JUPYTERHUB_USER_DATA_DIR}:${JUPYTERHUB_USER_DATA_DIR}:rw
40+
--env COMPOSE_DIR=${COMPOSE_DIR}
41+
--env AUTODEPLOY_DEPLOY_KEY_ROOT_DIR=${AUTODEPLOY_DEPLOY_KEY_ROOT_DIR}
42+
--env JUPYTERHUB_USER_DATA_DIR=${JUPYTERHUB_USER_DATA_DIR}
43+
--env AUTODEPLOY_SILENT=true
44+
image: 'pavics/docker-compose-git:docker-18.09.7-compose-1.25.1'
45+
46+
${AUTODEPLOY_EXTRA_SCHEDULER_JOBS}

birdhouse/components/scheduler/docker-compose-extra.yml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@ version: '2.1'
22

33
services:
44
scheduler:
5-
image: willfarrell/crontab:0.5.0
5+
image: pavics/crontab:0.6-rc2
66
container_name: scheduler
77
volumes:
88
- /var/run/docker.sock:/var/run/docker.sock:ro
9-
- ./components/scheduler/config.json:/opt/crontab/config.json:ro
9+
- ./components/scheduler/config.yml:/opt/crontab/config.yml:ro
1010
environment:
1111
COMPOSE_DIR: ${PWD}
1212
JUPYTERHUB_USER_DATA_DIR: ${JUPYTERHUB_USER_DATA_DIR}
13+
AUTODEPLOY_DEPLOY_KEY_ROOT_DIR: ${AUTODEPLOY_DEPLOY_KEY_ROOT_DIR}
1314
restart: always
1415

1516
# vi: tabstop=8 expandtab shiftwidth=2 softtabstop=2

birdhouse/deployment/PAVICS-deploy.logrotate

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@
77
minsize 500k
88
copytruncate
99
compress
10+
dateext
1011
}

birdhouse/deployment/deploy.sh

Lines changed: 36 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,24 @@
11
#!/bin/sh
22
# Script to automate local deployment process.
33
#
4+
# Log to "/var/log/PAVICS/autodeploy.log" if AUTODEPLOY_SILENT is not empty.
5+
#
46
# Still have to ssh to target machine but at least this single script
57
# takes care of all the common steps for a standard deployment (see corner
68
# cases not handled below).
79
#
8-
# One time Setup for a *private* PAVICS repository:
10+
# One time Setup for each *private* repository (not applicable for *public* repos):
911
#
1012
# * create a ssh deploy key (do not re-use your personal key)
11-
# `ssh-keygen -b 4096 -t rsa -f ~/.ssh/id_rsa_git_ssh_read_only` (no passphrase)
13+
# `ssh-keygen -b 4096 -t rsa -f ~/.ssh/{repo-name}_deploy_key` (no passphrase)
1214
#
13-
# * add the public key ~/.ssh/id_rsa_git_ssh_read_only.pub to the repo as read-only deploy key
15+
# * add the public key ~/.ssh/{repo-name}_deploy_key.pub to the repo as read-only deploy key
1416
# see https://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys
1517
#
1618
# * if on host with git version less than 2.3 (no support for GIT_SSH_COMMAND),
1719
# have to configure your ~/.ssh/config with the following:
1820
# Host github.com
19-
# IdentityFile ~/.ssh/id_rsa_git_ssh_read_only
21+
# IdentityFile ~/.ssh/{repo-name}_deploy_key
2022
# UserKnownHostsFile /dev/null
2123
# StrictHostKeyChecking no
2224
#
@@ -34,7 +36,8 @@
3436
# Just run this script pointing to the checkout repo and optionally the env.local file.
3537
#
3638
# It will find the rest that it needs from the checkout repo. Only external
37-
# depency is ~/.ssh/id_rsa_git_ssh_read_only.
39+
# dependencies are the multiple ~/.ssh/{repo-name}_deploy_key (one deploy key
40+
# for each repo).
3841
#
3942
# Corner cases not handled:
4043
#
@@ -50,12 +53,10 @@
5053
# are re-read. docker-compose is not aware of any changes outside of the
5154
# docker-compose.yml file.
5255

53-
54-
GREEN=$(tput setaf 2)
55-
YELLOW=$(tput setaf 3)
56-
RED=$(tput setaf 1)
57-
NORMAL=$(tput sgr0)
58-
56+
if [ ! -z "$AUTODEPLOY_SILENT" ]; then
57+
LOG_FILE="/var/log/PAVICS/autodeploy.log"
58+
exec >>$LOG_FILE 2>&1
59+
fi
5960

6061
usage() {
6162
echo "USAGE: $0 <path to folder with docker-compose.yml file> [path to env.local]"
@@ -65,7 +66,7 @@ COMPOSE_DIR="$1"
6566
ENV_LOCAL_FILE="$2"
6667

6768
if [ -z "$COMPOSE_DIR" ]; then
68-
echo "${RED}ERROR:${NORMAL} please provide path to PAVICS docker-compose dir." 1>&2
69+
echo "ERROR: please provide path to PAVICS docker-compose dir." 1>&2
6970
usage
7071
exit 2
7172
else
@@ -83,24 +84,17 @@ REPO_ROOT="`realpath "$COMPOSE_DIR/.."`"
8384

8485
if [ ! -f "$COMPOSE_DIR/docker-compose.yml" -o \
8586
! -f "$COMPOSE_DIR/pavics-compose.sh" ]; then
86-
echo "${RED}ERROR:${NORMAL} missing docker-compose.yml or pavics-compose.sh file in '$COMPOSE_DIR'" 1>&2
87+
echo "ERROR: missing docker-compose.yml or pavics-compose.sh file in '$COMPOSE_DIR'" 1>&2
8788
exit 2
8889
fi
8990

9091
if [ ! -f "$ENV_LOCAL_FILE" ]; then
91-
echo "${RED}ERROR:${NORMAL} env.local '$ENV_LOCAL_FILE' not found, please instantiate from '$COMPOSE_DIR/env.local.example'" 1>&2
92-
exit 2
93-
fi
94-
95-
SSH_DEPLOY_KEY="$HOME/.ssh/id_rsa_git_ssh_read_only"
96-
97-
if [ ! -f "$SSH_DEPLOY_KEY" ]; then
98-
echo "${RED}ERROR:${NORMAL} '$SSH_DEPLOY_KEY' not found, please create it and set it up for this repo" 1>&2
92+
echo "ERROR: env.local '$ENV_LOCAL_FILE' not found, please instantiate from '$COMPOSE_DIR/env.local.example'" 1>&2
9993
exit 2
10094
fi
10195

10296
if [ -f "$COMPOSE_DIR/docker-compose.override.yml" ]; then
103-
echo "${YELLOW}WARNING:${NORMAL} docker-compose.override.yml found, should use EXTRA_CONF_DIRS in env.local instead"
97+
echo "WARNING: docker-compose.override.yml found, should use EXTRA_CONF_DIRS in env.local instead"
10498
fi
10599

106100
START_TIME="`date -Isecond`"
@@ -117,11 +111,11 @@ for adir in $COMPOSE_DIR $AUTODEPLOY_EXTRA_REPOS; do
117111

118112
# fail fast if unclean checkout
119113
if [ ! -z "`git status -u --porcelain`" ]; then
120-
echo "${RED}ERROR:${NORMAL} unclean repo '$adir'" 1>&2
114+
echo "ERROR: unclean repo '$adir'" 1>&2
121115
exit 1
122116
fi
123117
else
124-
echo "${YELLOW}WARNING:${NORMAL} extra repo '$adir' do not exist"
118+
echo "WARNING: extra repo '$adir' do not exist"
125119
fi
126120
done
127121

@@ -137,19 +131,31 @@ set -x
137131
# stop all to force reload any changed config that are volume-mount into the containers
138132
./pavics-compose.sh stop
139133

140-
# override git ssh command because this repo is private and need proper credentials
141-
#
142-
# https://git-scm.com/docs/git-config#Documentation/git-config.txt-sshvariant
143-
export GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o IdentityFile=$SSH_DEPLOY_KEY"
144-
145134
for adir in $COMPOSE_DIR $AUTODEPLOY_EXTRA_REPOS; do
146135
if [ -d "$adir" ]; then
147136
cd $adir
148137

138+
EXTRA_REPO="`git rev-parse --show-toplevel`"
139+
DEPLOY_KEY="$AUTODEPLOY_DEPLOY_KEY_ROOT_DIR/`basename "$EXTRA_REPO"`_deploy_key"
140+
DEFAULT_DEPLOY_KEY="$AUTODEPLOY_DEPLOY_KEY_ROOT_DIR/id_rsa_git_ssh_read_only"
141+
if [ ! -e "$DEPLOY_KEY" -a -e "$DEFAULT_DEPLOY_KEY" ]; then
142+
DEPLOY_KEY="$DEFAULT_DEPLOY_KEY"
143+
fi
144+
145+
export GIT_SSH_COMMAND="" # git ver 2.3+
146+
if [ -e "$DEPLOY_KEY" ]; then
147+
# override git ssh command for private repos only
148+
#
149+
# https://git-scm.com/docs/git-config#Documentation/git-config.txt-sshvariant
150+
export GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o IdentityFile=$DEPLOY_KEY"
151+
else
152+
unset GIT_SSH_COMMAND
153+
fi
154+
149155
# pull the current branch, so this deploy script supports any branches, not just master
150156
git pull
151157
else
152-
echo "${YELLOW}WARNING:${NORMAL} extra repo '$adir' do not exist"
158+
echo "WARNING: extra repo '$adir' do not exist"
153159
fi
154160
done
155161

birdhouse/deployment/triggerdeploy.sh

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@
1010
#
1111
# Follow same instructions in deploy.sh.
1212

13+
if [ ! -z "$AUTODEPLOY_SILENT" ]; then
14+
LOG_FILE="/var/log/PAVICS/autodeploy.log"
15+
exec >>$LOG_FILE 2>&1
16+
fi
1317

1418
usage() {
1519
echo "USAGE: $0 <path to folder with docker-compose.yml file> [path to env.local]"
@@ -47,7 +51,23 @@ fi
4751

4852
should_trigger() {
4953
EXTRA_REPO="`git rev-parse --show-toplevel`"
50-
echo "triggerdeploy: checking repo '$EXTRA_REPO'"
54+
55+
DEPLOY_KEY="$AUTODEPLOY_DEPLOY_KEY_ROOT_DIR/`basename "$EXTRA_REPO"`_deploy_key"
56+
DEFAULT_DEPLOY_KEY="$AUTODEPLOY_DEPLOY_KEY_ROOT_DIR/id_rsa_git_ssh_read_only"
57+
if [ ! -e "$DEPLOY_KEY" -a -e "$DEFAULT_DEPLOY_KEY" ]; then
58+
DEPLOY_KEY="$DEFAULT_DEPLOY_KEY"
59+
fi
60+
DEPLOY_KEY_DISPLAY=""
61+
62+
export GIT_SSH_COMMAND="" # git ver 2.3+
63+
if [ -e "$DEPLOY_KEY" ]; then
64+
DEPLOY_KEY_DISPLAY=" deploy_key='$DEPLOY_KEY'"
65+
export GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o IdentityFile=$DEPLOY_KEY"
66+
else
67+
unset GIT_SSH_COMMAND
68+
fi
69+
70+
echo "triggerdeploy: checking repo '$EXTRA_REPO'$DEPLOY_KEY_DISPLAY"
5171

5272
# fetch remote branches, not affecting current checkout
5373
git fetch --prune --all
@@ -90,8 +110,6 @@ should_trigger() {
90110
}
91111

92112

93-
SSH_DEPLOY_KEY="$HOME/.ssh/id_rsa_git_ssh_read_only"
94-
95113
START_TIME="`date -Isecond`"
96114
echo "==========
97115
triggerdeploy START_TIME=$START_TIME"
@@ -101,8 +119,6 @@ triggerdeploy START_TIME=$START_TIME"
101119

102120
set -x
103121

104-
export GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o IdentityFile=$SSH_DEPLOY_KEY"
105-
106122
SHOULD_TRIGGER=""
107123
for adir in $COMPOSE_DIR $AUTODEPLOY_EXTRA_REPOS; do
108124
if [ -d "$adir" ]; then

birdhouse/env.local.example

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
#############################################################################
22
# Mandatory vars (will be enforced by pavics-compose.sh)
33
# Can add new vars but do not remove, else automated deployment will break
4+
#
5+
# Do NOT use environment variables in here since when pavics-compose.sh runs
6+
# inside a container, the environment vars do not have the same value.
47
#############################################################################
58

69
export SSL_CERTIFICATE="/path/to/ssl/cert.pem" # path to the nginx ssl certificate, path and key bundle
@@ -72,6 +75,53 @@ export POSTGRES_MAGPIE_PASSWORD=postgres-qwerty
7275
#export AUTODEPLOY_EXTRA_REPOS="/path/to/dir1 /path/to/dir2 /path/to/dir3"
7376
#export AUTODEPLOY_EXTRA_REPOS="/path/to/private-config-containing-env.local"
7477

78+
# For each git repo in AUTODEPLOY_EXTRA_REPOS that use ssh to clone/fetch
79+
# instead of https, provide its corresponding ssh deploy key in this dir.
80+
#
81+
# See instructions in deployment/deploy.sh or
82+
# https://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys for
83+
# how to create deploy key for your git repos.
84+
#
85+
# The autodeploy mechanism runs inside its own container so environment
86+
# variables are not the same inside and outside the container. Do not use
87+
# any environment vars, use their fully resolved values.
88+
#
89+
# Format of keys inside the dir: {repo-name-1}_deploy_key,
90+
# {repo-name-2}_deploy_key, ...
91+
#
92+
# If '{repo-name}_deploy_key' file is not found, default to
93+
# 'id_rsa_git_ssh_read_only' so if multiple private repos share the same ssh
94+
# deploy key, you can just name that shared key id_rsa_git_ssh_read_only and
95+
# create {repo-name}_deploy_key only for repo specific key.
96+
#
97+
# Example of keys inside the dir: dir1_deploy_key, dir2_deploy_key,
98+
# private-config-containing-env.local_deploy_key,
99+
# id_rsa_git_ssh_read_only
100+
#
101+
#export AUTODEPLOY_DEPLOY_KEY_ROOT_DIR="/path/to/ssh-deploy-keys-for-all-repos"
102+
103+
# Frequency to trigger the various autodeploy tasks.
104+
# See common.env for default.
105+
#
106+
# For all possible syntax, see implementation at
107+
# https://github.com/Ouranosinc/docker-crontab/blob/3ac8cfa363b3f2ffdd0ead6089d355ff84521dc9/docker-entrypoint#L137-L184
108+
#
109+
# Ex:
110+
# - daily at 5:07 AM: "7 5 * * *"
111+
# - daily at midnight: "0 0 * * *" or "@daily"/"@midnight"
112+
# - hourly: ""0 * * * *" or "@hourly"
113+
# - every 2 hours: "*/120 * * * *" or "@every 2h"
114+
# - every 5 minutes: "*/5 * * * *" or "@every 5m"
115+
#
116+
#export AUTODEPLOY_PLATFORM_FREQUENCY="@every 5m"
117+
#export AUTODEPLOY_NOTEBOOK_FREQUENCY="@every 5m"
118+
119+
# Add more jobs to ./components/scheduler/config.yml
120+
#
121+
# Potential usages: other deployment, backup jobs on the same machine
122+
#
123+
#export AUTODEPLOY_EXTRA_SCHEDULER_JOBS=""
124+
75125
# Public (on the internet) fully qualified domain name of this Pavics
76126
# installation. This is optional so default to the same internal PAVICS_FQDN if
77127
# not set.

0 commit comments

Comments
 (0)