Removed postgresql-9.3 from the packages to install

Fixes and tweaks for the entrypoint.sh #31
Added currently experimental Log2Zulip env vars and functions
Cleand and reformatted some Zulip puppet manifests
This commit is contained in:
Alexander Trost
2015-10-23 23:45:12 +02:00
parent 64a5cde994
commit 5d9c2acfb0
6 changed files with 87 additions and 15 deletions

View File

@@ -3,6 +3,7 @@ MAINTAINER Alexander Trost <galexrt@googlemail.com>
ENV ZULIP_VERSION="1.3.7" ZULIP_CHECKSUM="88bfa668eb14e07b0b806977db2ae2cd4d7e7ef8" DATA_DIR="/data" ENV ZULIP_VERSION="1.3.7" ZULIP_CHECKSUM="88bfa668eb14e07b0b806977db2ae2cd4d7e7ef8" DATA_DIR="/data"
ADD entrypoint.sh /entrypoint.sh
ADD zulip-puppet /root/zulip-puppet ADD zulip-puppet /root/zulip-puppet
RUN apt-get -qq update -q && \ RUN apt-get -qq update -q && \
apt-get -qq dist-upgrade -y && \ apt-get -qq dist-upgrade -y && \
@@ -34,7 +35,6 @@ RUN apt-get -qq update -q && \
apt-get -qq autoremove --purge -y && \ apt-get -qq autoremove --purge -y && \
apt-get -qq clean && \ apt-get -qq clean && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
ADD entrypoint.sh /entrypoint.sh
VOLUME ["$DATA_DIR"] VOLUME ["$DATA_DIR"]
EXPOSE 80 443 EXPOSE 80 443

View File

@@ -48,6 +48,12 @@ ZULIP_CERTIFICATE_CN="${ZULIP_CERTIFICATE_CN:-}"
# Zulip related settings # Zulip related settings
ZULIP_AUTH_BACKENDS="${ZULIP_AUTH_BACKENDS:-EmailAuthBackend}" ZULIP_AUTH_BACKENDS="${ZULIP_AUTH_BACKENDS:-EmailAuthBackend}"
ZULIP_SECRETS_rabbitmq_password="${ZULIP_SECRETS_rabbitmq_password:-$(echo $RABBITMQ_PASS)}" ZULIP_SECRETS_rabbitmq_password="${ZULIP_SECRETS_rabbitmq_password:-$(echo $RABBITMQ_PASS)}"
# Log2Zulip settings
LOG2ZULIP_ENABLED="False"
LOG2ZULIP_EMAIL=""
LOG2ZULIP_API_KEY=""
LOG2ZULIP_SITE=""
LOG2ZULIP_LOGFILES="/var/log/nginx/error.log"
# entrypoint.sh specific variables # entrypoint.sh specific variables
ZULIP_CURRENT_DEPLOY="/home/zulip/deployments/current" ZULIP_CURRENT_DEPLOY="/home/zulip/deployments/current"
@@ -121,6 +127,8 @@ setConfigurationValue() {
return 0 return 0
} }
configureCerts() { configureCerts() {
echo "Exectuing certificates configuration..."
echo "==="
case "$ZULIP_AUTO_GENERATE_CERTS" in case "$ZULIP_AUTO_GENERATE_CERTS" in
[Tt][Rr][Uu][Ee]) [Tt][Rr][Uu][Ee])
export ZULIP_AUTO_GENERATE_CERTS="True" export ZULIP_AUTO_GENERATE_CERTS="True"
@@ -140,7 +148,7 @@ configureCerts() {
ln -sfT "$DATA_DIR/certs/zulip.combined-chain.crt" /etc/ssl/certs/zulip.combined-chain.crt ln -sfT "$DATA_DIR/certs/zulip.combined-chain.crt" /etc/ssl/certs/zulip.combined-chain.crt
fi fi
if [ ! -e "$DATA_DIR/certs/zulip.key" ] && [ ! -e "$DATA_DIR/certs/zulip.combined-chain.crt" ]; then if [ ! -e "$DATA_DIR/certs/zulip.key" ] && [ ! -e "$DATA_DIR/certs/zulip.combined-chain.crt" ]; then
if [ ! -z "$ZULIP_AUTO_GENERATE_CERTS" ] && [ "$ZULIP_AUTO_GENERATE_CERTS" == "True" ]; then if [ ! -z "$ZULIP_AUTO_GENERATE_CERTS" ] && ([ "$ZULIP_AUTO_GENERATE_CERTS" == "True" ] || [ "$ZULIP_AUTO_GENERATE_CERTS" == "true" ]); then
echo "ZULIP_AUTO_GENERATE_CERTS is true and no certs where found in $DATA_DIR/certs. Autogenerating certificates ..." echo "ZULIP_AUTO_GENERATE_CERTS is true and no certs where found in $DATA_DIR/certs. Autogenerating certificates ..."
if [ -z "$ZULIP_CERTIFICATE_SUBJ" ]; then if [ -z "$ZULIP_CERTIFICATE_SUBJ" ]; then
if [ -z "$ZULIP_CERTIFICATE_CN" ]; then if [ -z "$ZULIP_CERTIFICATE_CN" ]; then
@@ -157,9 +165,9 @@ configureCerts() {
openssl req -new -nodes -subj "$ZULIP_CERTIFICATE_SUBJ" -key "$DATA_DIR/certs/zulip.key" -out /tmp/server.csr openssl req -new -nodes -subj "$ZULIP_CERTIFICATE_SUBJ" -key "$DATA_DIR/certs/zulip.key" -out /tmp/server.csr
openssl x509 -req -days 365 -in /tmp/server.csr -signkey "$DATA_DIR/certs/zulip.key" -out "$DATA_DIR/certs/zulip.combined-chain.crt" openssl x509 -req -days 365 -in /tmp/server.csr -signkey "$DATA_DIR/certs/zulip.key" -out "$DATA_DIR/certs/zulip.combined-chain.crt"
rm -f /tmp/server.csr /tmp/server.pass.key rm -f /tmp/server.csr /tmp/server.pass.key
echo "Certificates autogenerated." echo "Certificate autogeneration succeeded."
else else
echo "Certificates already exist. No need to generate them." echo "Certificates already exist. No need to generate them. Continuing."
fi fi
fi fi
if [ ! -e "$DATA_DIR/certs/zulip.key" ]; then if [ ! -e "$DATA_DIR/certs/zulip.key" ]; then
@@ -170,11 +178,19 @@ configureCerts() {
echo "No zulip.combined-chain.crt given in $DATA_DIR." echo "No zulip.combined-chain.crt given in $DATA_DIR."
return 1 return 1
fi fi
echo "==="
echo "Certificates configuration succeeded."
} }
secretsConfiguration() { secretsConfiguration() {
echo "Setting Zulip secrets ..."
echo "==="
if [ ! -e "$DATA_DIR/zulip-secrets.conf" ]; then if [ ! -e "$DATA_DIR/zulip-secrets.conf" ]; then
echo "Generating Zulip secrets ..."
su zulip -c "/root/zulip/scripts/setup/generate_secrets.py" su zulip -c "/root/zulip/scripts/setup/generate_secrets.py"
mv -f /etc/zulip/zulip-secrets.conf "$DATA_DIR/zulip-secrets.conf" mv -f /etc/zulip/zulip-secrets.conf "$DATA_DIR/zulip-secrets.conf"
echo "Zulip secrets generation succeeded."
else
echo "Zulip secrets already generated."
fi fi
ln -sfT "$DATA_DIR/zulip-secrets.conf" /etc/zulip/zulip-secrets.conf ln -sfT "$DATA_DIR/zulip-secrets.conf" /etc/zulip/zulip-secrets.conf
local SECRETS=($(env | sed -nr "s/ZULIP_SECRETS_([A-Z_a-z-]*).*/\1/p")) local SECRETS=($(env | sed -nr "s/ZULIP_SECRETS_([A-Z_a-z-]*).*/\1/p"))
@@ -195,9 +211,11 @@ secretsConfiguration() {
fi fi
done done
unset SECRET_KEY SECRET_VAR KEY unset SECRET_KEY SECRET_VAR KEY
echo "==="
echo "Zulip secrets configuration succeeded."
} }
databaseConfiguration() { databaseConfiguration() {
sed -i "s~psycopg2.connect\(.*\)~psycopg2.connect(\"host=$DB_HOST port=$DB_HOST_PORT dbname=$DB_NAME user=$DB_USER password=$DB_PASS\")~g" /usr/local/bin/process_fts_updates echo "Setting database configuration ..."
setConfigurationValue "from zerver.lib.db import TimeTrackingConnection" "" "$ZPROJECT_SETTINGS" "literal" setConfigurationValue "from zerver.lib.db import TimeTrackingConnection" "" "$ZPROJECT_SETTINGS" "literal"
VALUE="DATABASES = { VALUE="DATABASES = {
'default': { 'default': {
@@ -216,8 +234,11 @@ databaseConfiguration() {
}, },
}" }"
setConfigurationValue "DATABASES" "$VALUE" "$ZPROJECT_SETTINGS" "array" setConfigurationValue "DATABASES" "$VALUE" "$ZPROJECT_SETTINGS" "array"
sed -i "s~psycopg2.connect\(.*\)~psycopg2.connect(\"host=$DB_HOST port=$DB_HOST_PORT dbname=$DB_NAME user=$DB_USER password=$DB_PASS\")~g" /usr/local/bin/process_fts_updates
echo "Database configuration succeeded."
} }
cacheRatelimitConfiguration() { cacheRatelimitConfiguration() {
echo "Setting caches configuration ..."
VALUE="CACHES = { VALUE="CACHES = {
'default': { 'default': {
'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache', 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
@@ -235,27 +256,36 @@ cacheRatelimitConfiguration() {
}, },
}" }"
setConfigurationValue "CACHES" "$VALUE" "$ZPROJECT_SETTINGS" "array" setConfigurationValue "CACHES" "$VALUE" "$ZPROJECT_SETTINGS" "array"
echo "Caches configuration succeeded."
} }
authenticationBackends() { authenticationBackends() {
echo "Activating authentication backends ..."
echo "$ZULIP_AUTH_BACKENDS" | sed -n 1'p' | tr ',' '\n' | while read AUTH_BACKEND; do echo "$ZULIP_AUTH_BACKENDS" | sed -n 1'p' | tr ',' '\n' | while read AUTH_BACKEND; do
echo "Adding authentication backend \"$AUTH_BACKEND\"."
echo "AUTHENTICATION_BACKENDS += ('zproject.backends.${AUTH_BACKEND//\'/\'}',)" >> "$ZULIP_SETTINGS" echo "AUTHENTICATION_BACKENDS += ('zproject.backends.${AUTH_BACKEND//\'/\'}',)" >> "$ZULIP_SETTINGS"
echo "Adding authentication backend \"$AUTH_BACKEND\"."
done done
echo "Authentication backend activation succeeded."
} }
redisConfiguration() { redisConfiguration() {
echo "Setting redis configuration ..."
setConfigurationValue "RATE_LIMITING" "$REDIS_RATE_LIMITING" "$ZPROJECT_SETTINGS" "bool" setConfigurationValue "RATE_LIMITING" "$REDIS_RATE_LIMITING" "$ZPROJECT_SETTINGS" "bool"
setConfigurationValue "REDIS_HOST" "$REDIS_HOST" "$ZPROJECT_SETTINGS" setConfigurationValue "REDIS_HOST" "$REDIS_HOST" "$ZPROJECT_SETTINGS"
setConfigurationValue "REDIS_HOST_PORT" "$REDIS_HOST_PORT" "$ZPROJECT_SETTINGS" "int" setConfigurationValue "REDIS_HOST_PORT" "$REDIS_HOST_PORT" "$ZPROJECT_SETTINGS" "int"
echo "Redis configuration succeeded."
} }
rabbitmqConfiguration() { rabbitmqConfiguration() {
echo "Setting rabbitmq configuration ..."
setConfigurationValue "RABBITMQ_HOST" "$RABBITMQ_HOST" "$ZPROJECT_SETTINGS" setConfigurationValue "RABBITMQ_HOST" "$RABBITMQ_HOST" "$ZPROJECT_SETTINGS"
sed -i "s~pika.ConnectionParameters('localhost',~pika.ConnectionParameters(settings.RABBITMQ_HOST,~g" "$ZULIP_CURRENT_DEPLOY/zerver/lib/queue.py" sed -i "s~pika.ConnectionParameters('localhost',~pika.ConnectionParameters(settings.RABBITMQ_HOST,~g" "$ZULIP_CURRENT_DEPLOY/zerver/lib/queue.py"
setConfigurationValue "RABBITMQ_USERNAME" "$RABBITMQ_USERNAME" "$ZPROJECT_SETTINGS" setConfigurationValue "RABBITMQ_USERNAME" "$RABBITMQ_USERNAME" "$ZPROJECT_SETTINGS"
echo "Rabbitmq configuration succeeded."
} }
camoConfiguration() { camoConfiguration() {
setConfigurationValue "CAMO_URI" "$CAMO_URI" "$ZPROJECT_SETTINGS" "emptyreturn" setConfigurationValue "CAMO_URI" "$CAMO_URI" "$ZPROJECT_SETTINGS" "emptyreturn"
} }
zulipConfiguration() { zulipConfiguration() {
echo "Executing Zulip configuration ..."
echo "==="
if [ ! -z "$ZULIP_CUSTOM_SETTINGS" ]; then if [ ! -z "$ZULIP_CUSTOM_SETTINGS" ]; then
echo -e "\n$ZULIP_CUSTOM_SETTINGS" >> "$ZPROJECT_SETTINGS" echo -e "\n$ZULIP_CUSTOM_SETTINGS" >> "$ZPROJECT_SETTINGS"
fi fi
@@ -271,14 +301,39 @@ zulipConfiguration() {
echo "Set key \"$SETTING_KEY\"." echo "Set key \"$SETTING_KEY\"."
done done
unset SETTING_KEY SETTING_VAR KEY unset SETTING_KEY SETTING_VAR KEY
if ! su zulip -c "/home/zulip/deployments/current/manage.py checkconfig"; then
echo "Error in Zulip configuration."
exit 1
fi
echo "==="
echo "Zulip configuration succeeded."
}
log2zulipConfiguration() {
echo "log2zulip is currently not fully implemented. Stay tuned."
if [ "$LOG2ZULIP_ENABLED" != "True" ] || [ "$LOG2ZULIP_ENABLED" != "true" ]; then
rm -f /etc/cron/conf.d/log2zulip
return 0
fi
echo "Executing Log2Zulip configuration ..."
echo "==="
if ([ "$LOG2ZULIP_AUTO_CREATE" != "True" ] || [ "$LOG2ZULIP_AUTO_CREATE" != "true" ]) && [ ! -z "$LOG2ZULIP_EMAIL" ] && [ ! -z "$LOG2ZULIP_API_KEY" ] && [ ! -z "$LOG2ZULIP_SITE" ]; then
sed -i "s/email = .*/email = $LOG2ZULIP_EMAIL/g" /etc/log2zulip.zuliprc
sed -i "s/key = .*/key = $LOG2ZULIP_API_KEY/g" /etc/log2zulip.zuliprc
sed -i "s/site = .*/site = $LOG2ZULIP_SITE/g" /etc/log2zulip.zuliprc
LOGFILES="["
echo "$LOG2ZULIP_LOGFILES" | sed -n 1'p' | tr ',' '\n' | while read LOG_FILE; do
LOGFILES="$LOGFILES\"${LOG_FILE//\"/\"}\","
echo "Adding log file \"$LOG_FILE\"."
done
echo "$(echo "$LOGFILES" | sed 's/,$//g')]" > /etc/log2zulip.conf
fi
echo "==="
echo "Log2Zulip configuration succeeded."
} }
initialConfiguration() { initialConfiguration() {
echo "=== Begin Initial Configuration Phase ==="
secretsConfiguration secretsConfiguration
configureCerts configureCerts
if [ ! -e "$DATA_DIR/zulip-settings.py" ]; then
mv -f /etc/zulip/settings.py "$DATA_DIR/zulip-settings.py"
fi
ln -sfT "$DATA_DIR/zulip-settings.py" /etc/zulip/settings.py
databaseConfiguration databaseConfiguration
cacheRatelimitConfiguration cacheRatelimitConfiguration
authenticationBackends authenticationBackends
@@ -286,6 +341,8 @@ initialConfiguration() {
rabbitmqConfiguration rabbitmqConfiguration
camoConfiguration camoConfiguration
zulipConfiguration zulipConfiguration
log2zulipConfiguration
echo "=== End Initial Configuration Phase ==="
} }
# === bootstrappingEnvironment === # === bootstrappingEnvironment ===
waitingForDatabase() { waitingForDatabase() {
@@ -331,7 +388,7 @@ bootstrapRabbitMQ() {
rabbitmqctl -n "$RABBITMQ_HOST" set_user_tags "$RABBITMQ_USERNAME" administrator || : rabbitmqctl -n "$RABBITMQ_HOST" set_user_tags "$RABBITMQ_USERNAME" administrator || :
echo "RabbitMQ setting permissions for user \"$RABBITMQ_USERNAME\"." echo "RabbitMQ setting permissions for user \"$RABBITMQ_USERNAME\"."
rabbitmqctl -n "$RABBITMQ_HOST" set_permissions -p / "$RABBITMQ_USERNAME" '.*' '.*' '.*' || : rabbitmqctl -n "$RABBITMQ_HOST" set_permissions -p / "$RABBITMQ_USERNAME" '.*' '.*' '.*' || :
echo "RabbitMQ bootstrap done." echo "RabbitMQ bootstrap succeeded."
} }
zulipFirstStartInit() { zulipFirstStartInit() {
if [ -z "$FORCE_INIT" ] || [ -e "$DATA_DIR/.initiated" ]; then if [ -z "$FORCE_INIT" ] || [ -e "$DATA_DIR/.initiated" ]; then
@@ -379,14 +436,16 @@ zulipMigration() {
rm -rf "$DATA_DIR/.zulip-*" rm -rf "$DATA_DIR/.zulip-*"
touch "$DATA_DIR/.zulip-$ZULIP_VERSION" touch "$DATA_DIR/.zulip-$ZULIP_VERSION"
echo "===" echo "==="
echo "Zulip migration done." echo "Zulip migration succeeded."
} }
bootstrappingEnvironment() { bootstrappingEnvironment() {
echo "=== Begin Bootstrap Phase ==="
waitingForDatabase waitingForDatabase
bootstrapDatabase bootstrapDatabase
bootstrapRabbitMQ bootstrapRabbitMQ
zulipFirstStartInit zulipFirstStartInit
zulipMigration zulipMigration
echo "=== End Bootstrap Phase ==="
} }
# END appRun functionss # END appRun functionss
appHelp() { appHelp() {

View File

@@ -78,6 +78,7 @@ class zulip::app_frontend {
mode => 644, mode => 644,
source => "puppet:///modules/zulip/nginx/zulip-include-frontend/app", source => "puppet:///modules/zulip/nginx/zulip-include-frontend/app",
} }
file { "/etc/nginx/zulip-include/upstreams": file { "/etc/nginx/zulip-include/upstreams":
require => Package["nginx-full"], require => Package["nginx-full"],
owner => "root", owner => "root",
@@ -85,6 +86,7 @@ class zulip::app_frontend {
mode => 644, mode => 644,
source => "puppet:///modules/zulip/nginx/zulip-include-frontend/upstreams", source => "puppet:///modules/zulip/nginx/zulip-include-frontend/upstreams",
} }
file { "/etc/nginx/zulip-include/uploads.types": file { "/etc/nginx/zulip-include/uploads.types":
require => Package["nginx-full"], require => Package["nginx-full"],
owner => "root", owner => "root",
@@ -92,12 +94,14 @@ class zulip::app_frontend {
mode => 644, mode => 644,
source => "puppet:///modules/zulip/nginx/zulip-include-frontend/uploads.types", source => "puppet:///modules/zulip/nginx/zulip-include-frontend/uploads.types",
} }
file { "/etc/nginx/zulip-include/app.d/": file { "/etc/nginx/zulip-include/app.d/":
ensure => directory, ensure => directory,
owner => "root", owner => "root",
group => "root", group => "root",
mode => 755, mode => 755,
} }
file { "/etc/supervisor/conf.d/zulip.conf": file { "/etc/supervisor/conf.d/zulip.conf":
require => Package[supervisor], require => Package[supervisor],
ensure => file, ensure => file,
@@ -106,25 +110,30 @@ class zulip::app_frontend {
mode => 644, mode => 644,
source => "puppet:///modules/zulip/supervisor/conf.d/zulip.conf", source => "puppet:///modules/zulip/supervisor/conf.d/zulip.conf",
} }
file { "/home/zulip/tornado": file { "/home/zulip/tornado":
ensure => directory, ensure => directory,
owner => "zulip", owner => "zulip",
group => "zulip", group => "zulip",
mode => 755, mode => 755,
} }
file { '/home/zulip/logs': file { '/home/zulip/logs':
ensure => 'directory', ensure => 'directory',
owner => 'zulip', owner => 'zulip',
group => 'zulip', group => 'zulip',
} }
file { '/home/zulip/deployments': file { '/home/zulip/deployments':
ensure => 'directory', ensure => 'directory',
owner => 'zulip', owner => 'zulip',
group => 'zulip', group => 'zulip',
} }
file { "/etc/cron.d/email-mirror": file { "/etc/cron.d/email-mirror":
ensure => absent, ensure => absent,
} }
file { '/etc/log2zulip.conf': file { '/etc/log2zulip.conf':
ensure => file, ensure => file,
owner => "zulip", owner => "zulip",
@@ -132,6 +141,7 @@ class zulip::app_frontend {
mode => 644, mode => 644,
source => 'puppet:///modules/zulip/log2zulip.conf', source => 'puppet:///modules/zulip/log2zulip.conf',
} }
file { '/etc/log2zulip.zuliprc': file { '/etc/log2zulip.zuliprc':
ensure => file, ensure => file,
owner => "zulip", owner => "zulip",
@@ -139,6 +149,7 @@ class zulip::app_frontend {
mode => 600, mode => 600,
source => 'puppet:///modules/zulip/log2zulip.zuliprc', source => 'puppet:///modules/zulip/log2zulip.zuliprc',
} }
file { "/etc/cron.d/check-apns-tokens": file { "/etc/cron.d/check-apns-tokens":
ensure => file, ensure => file,
owner => "root", owner => "root",
@@ -146,6 +157,7 @@ class zulip::app_frontend {
mode => 644, mode => 644,
source => "puppet:///modules/zulip/cron.d/check-apns-tokens", source => "puppet:///modules/zulip/cron.d/check-apns-tokens",
} }
file { "/etc/supervisor/conf.d/cron.conf": file { "/etc/supervisor/conf.d/cron.conf":
require => Package[supervisor], require => Package[supervisor],
ensure => file, ensure => file,

View File

@@ -1,7 +1,5 @@
class zulip::postgres_common { class zulip::postgres_common {
$postgres_packages = [# The database itself $postgres_packages = [# Python modules used in our monitoring/worker threads
"postgresql-9.3",
# Python modules used in our monitoring/worker threads
"python-gevent", "python-gevent",
"python-tz", "python-tz",
"python-dateutil", "python-dateutil",

View File

@@ -13,6 +13,7 @@ class zulip::rabbit {
mode => 644, mode => 644,
source => "puppet:///modules/zulip/cron.d/rabbitmq-queuesize", source => "puppet:///modules/zulip/cron.d/rabbitmq-queuesize",
} }
file { "/etc/cron.d/rabbitmq-numconsumers": file { "/etc/cron.d/rabbitmq-numconsumers":
require => Package[rabbitmq-server], require => Package[rabbitmq-server],
ensure => file, ensure => file,

View File

@@ -40,6 +40,7 @@ class zulip::voyager {
mode => 644, mode => 644,
source => "puppet:///modules/zulip/cron.d/restart-zulip", source => "puppet:///modules/zulip/cron.d/restart-zulip",
} }
file { "/etc/supervisor/conf.d/zulip_postsetup.conf": file { "/etc/supervisor/conf.d/zulip_postsetup.conf":
require => Package[supervisor], require => Package[supervisor],
ensure => file, ensure => file,
@@ -48,6 +49,7 @@ class zulip::voyager {
mode => 644, mode => 644,
source => "puppet:///modules/zulip/supervisor/conf.d/zulip_postsetup.conf", source => "puppet:///modules/zulip/supervisor/conf.d/zulip_postsetup.conf",
} }
file { "/opt/setupZulipUser.sh": file { "/opt/setupZulipUser.sh":
ensure => file, ensure => file,
owner => "root", owner => "root",