-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathrun
More file actions
84 lines (68 loc) · 3.09 KB
/
run
File metadata and controls
84 lines (68 loc) · 3.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#!/bin/bash
set -e
die() { echo "$@" 1>&2 ; exit 1; }
PG_CONF_PATH=/etc/postgresql/9.3/main/postgresql.conf
PG_HBA_PATH=/etc/postgresql/9.3/main/pg_hba.conf
PG_BIN=/usr/lib/postgresql/9.3/bin/postgres
PG_DATA_DIR=/var/lib/postgresql/9.3/main
pg_single() {
su postgres -c "$PG_BIN --single --config-file=$PG_CONF_PATH"
}
# set shared buffer size to 25% of total_memory
SH_BUF_SIZE=$(awk '/MemTotal/ { print int($2/4000) }' /proc/meminfo)
sed -i "s/shared_buffers = .*/shared_buffers = ${SH_BUF_SIZE}MB/" $PG_CONF_PATH
# listen on all interfaces
sed -i "s/#listen_addresses = .*/listen_addresses = '*'/" $PG_CONF_PATH
# allow connections from everywhere
echo "host all all 0.0.0.0/0 md5" >> $PG_HBA_PATH
if [ ! -z $ROLE ]; then
[ ! -z $REP_USER ] || die "Missing environment variable REP_USER"
[ ! -z $REP_PASSWORD ] || die "Missing environment variable REP_PASSWORD"
su postgres -c "cat >> $PG_CONF_PATH" << EOF
wal_level = hot_standby
max_wal_senders = 3
checkpoint_segments = 8
wal_keep_segments = 8
EOF
fi
if [ ! -d $PG_DATA_DIR ]; then
mkdir -p $PG_DATA_DIR
chown -R postgres:postgres $PG_DATA_DIR
su postgres -c "/usr/lib/postgresql/9.3/bin/initdb -D $PG_DATA_DIR -E 'UTF-8'"
fi
if [ "$ROLE" = "master" ]; then
if pg_single <<< "SELECT count(*) FROM pg_user WHERE usename = '$REP_USER';" | grep 'count = "0"'; then
pg_single <<< "CREATE USER $REP_USER REPLICATION LOGIN ENCRYPTED PASSWORD '$REP_PASSWORD';" > /dev/null
fi
echo "hostssl replication $REP_USER 0.0.0.0/0 md5" >> $PG_HBA_PATH
elif [ "$ROLE" = "slave" ]; then
[ ! -z $MASTER_HOST ] || die "Missing environment variable MASTER_HOST"
MASTER_PORT=${MASTER_PORT:-5432}
echo "starting base backup"
su postgres -c "rm -rf $PG_DATA_DIR"
su postgres -c "echo '$REP_PASSWORD' | pg_basebackup -h $MASTER_HOST -p $MASTER_PORT -D $PG_DATA_DIR -U $REP_USER -W -v"
echo "setting up slave config"
su postgres -c "cat >> $PG_CONF_PATH" <<< "hot_standby = on"
su postgres -c "cat > $PG_DATA_DIR/recovery.conf" << EOF
standby_mode = 'on'
primary_conninfo = 'host=$MASTER_HOST port=$MASTER_PORT user=$REP_USER password=$REP_PASSWORD sslmode=require'
trigger_file = '/tmp/postgresql.trigger'
EOF
fi
# if we're a master or not doing replication, we need to set up the user and
# create the database. slaves get this from the master.
if [ ! "$ROLE" = "slave" ]; then
[ ! -z $DB_USER ] || die "Missing environment variable DB_USER"
[ ! -z $DB_PASSWORD ] || die "Missing environment variable DB_PASSWORD"
[ ! -z $DB_NAME ] || die "Missing environment variable DB_NAME"
if pg_single <<< "SELECT count(*) FROM pg_user WHERE usename = '$DB_USER';" | grep 'count = "0"'; then
echo "setting up $DB_USER user"
pg_single <<< "CREATE USER $DB_USER WITH SUPERUSER;" > /dev/null
pg_single <<< "ALTER USER $DB_USER WITH PASSWORD '$DB_PASSWORD';" > /dev/null
fi
if pg_single <<< "SELECT count(*) FROM pg_database WHERE datname = '$DB_NAME';" | grep 'count = "0"'; then
pg_single <<< "CREATE DATABASE $DB_NAME OWNER $DB_USER;" > /dev/null
fi
fi
echo "starting postgres"
su postgres -c "$PG_BIN --config-file=$PG_CONF_PATH"