@@ -15,18 +15,15 @@ export ETCD="$HOST:$ETCD_PORT"
1515export ETCD_PATH=${ETCD_PATH:-/ deis/ database}
1616export ETCD_TTL=${ETCD_TTL:- 10}
1717
18- # initialize data volume
19- if [[ ! -d /var/lib/postgresql/9.3/main ]]; then
20- mkdir -p /var/lib/postgresql/9.3
21- chown -R postgres:postgres /var/lib/postgresql
22- sudo -u postgres /usr/lib/postgresql/9.3/bin/initdb -D /var/lib/postgresql/9.3/main
23- else
24- chown -R postgres:postgres /var/lib/postgresql
25- fi
18+ export BUCKET_NAME=${BUCKET_NAME:- db_wal}
19+ export BACKUPS_TO_RETAIN=${BACKUPS_TO_RETAIN:- 5}
20+
21+ # how many TTL/2 sleeps between backups -- 2160 is 3 hours
22+ export BACKUP_FREQUENCY=${BACKUP_FREQUENCY:- 2160}
2623
2724# wait for etcd to be available
2825until etcdctl --no-sync -C $ETCD ls > /dev/null 2>&1 ; do
29- echo " waiting for etcd at $ETCD ..."
26+ echo " database: waiting for etcd at $ETCD ..."
3027 sleep $(( $ETCD_TTL / 2 )) # sleep for half the TTL
3128done
3229
@@ -43,13 +40,39 @@ etcd_set_default adminPass ${PG_ADMIN_PASS:-changeme123}
4340etcd_set_default user ${PG_USER_NAME:- deis}
4441etcd_set_default password ${PG_USER_PASS:- changeme123}
4542etcd_set_default name ${PG_USER_DB:- deis}
43+ etcd_set_default bucketName ${BUCKET_NAME}
4644
4745# wait for confd to run once and install initial templates
4846until confd -onetime -node $ETCD -config-file /app/confd.toml; do
4947 echo " database: waiting for confd to write initial templates..."
5048 sleep $(( $ETCD_TTL / 2 )) # sleep for half the TTL
5149done
5250
51+ # ensure WAL log bucket exists
52+ envdir /etc/wal-e.d/env /app/bin/create_bucket ${BUCKET_NAME}
53+
54+ initial_backup=0
55+ if [[ ! -f /var/lib/postgresql/9.3/main/initialized ]]; then
56+ echo " database: no existing database found."
57+ # check if there are any backups -- if so, let's restore
58+ # we could probably do better than just testing number of lines -- one line is just a heading, meaning no backups
59+ if [[ ` envdir /etc/wal-e.d/env wal-e --terse backup-list | wc -l` -gt " 1" ]]; then
60+ echo " database: restoring from backup..."
61+ rm -rf /var/lib/postgresql/9.3/main
62+ sudo -u postgres envdir /etc/wal-e.d/env wal-e backup-fetch /var/lib/postgresql/9.3/main LATEST
63+ chown -R postgres:postgres /var/lib/postgresql/9.3/main
64+ chmod 0700 /var/lib/postgresql/9.3/main
65+ echo " restore_command = 'envdir /etc/wal-e.d/env wal-e wal-fetch \" %f\" \" %p\" '" | sudo -u postgres tee /var/lib/postgresql/9.3/main/recovery.conf > /dev/null
66+ else
67+ echo " database: no backups found. Initializing a new database..."
68+ initial_backup=1
69+ fi
70+ # either way, we mark the database as initialized
71+ touch /var/lib/postgresql/9.3/main/initialized
72+ else
73+ echo " database: existing data directory found. Starting postgres..."
74+ fi
75+
5376# run the service in the background
5477sudo -i -u postgres /usr/lib/postgresql/9.3/bin/postgres \
5578 -c config-file=${PG_CONFIG:-/ etc/ postgresql/ 9.3/ main/ postgresql.conf} \
@@ -75,11 +98,17 @@ sleep 1 && while [[ -z $(netstat -lnt | awk "\$6 == \"LISTEN\" && \$4 ~ \".5432\
7598# perform a one-time reload to populate database entries
7699/usr/local/bin/reload
77100
78- echo deis-database running...
101+ if [[ " ${initial_backup} " == " 1" ]] ; then
102+ echo " database: performing an initial backup..."
103+ # perform an initial backup
104+ sudo -u postgres envdir /etc/wal-e.d/env wal-e backup-push /var/lib/postgresql/9.3/main
105+ fi
106+
107+ echo " database: postgres is running..."
79108
109+ count=1
80110# publish the service to etcd using the injected HOST and EXTERNAL_PORT
81111if [[ ! -z $EXTERNAL_PORT ]]; then
82-
83112 # configure service discovery
84113 PORT=${PORT:- 5432}
85114 PROTO=${PROTO:- tcp}
@@ -93,6 +122,22 @@ if [[ ! -z $EXTERNAL_PORT ]]; then
93122 while [[ ! -z $( netstat -lnt | awk " \$ 6 == \" LISTEN\" && \$ 4 ~ \" .$PORT \" && \$ 1 ~ \" $PROTO .?\" " ) ]] ; do
94123 etcdctl --no-sync -C $ETCD set $ETCD_PATH /host $HOST --ttl $ETCD_TTL > /dev/null
95124 etcdctl --no-sync -C $ETCD set $ETCD_PATH /port $EXTERNAL_PORT --ttl $ETCD_TTL > /dev/null
125+
126+ # perform a backup whenever we hit BACKUP_FREQUENCY
127+ # we really need cron :(
128+ if [[ " ${count} " -ge " ${BACKUP_FREQUENCY} " ]] ; then
129+ echo " database: performing a backup..."
130+ if [[ -f /var/lib/postgresql/9.3/main/recovery.conf ]] ; then
131+ echo " database: database is currently recovering from a backup. Will try again next loop..."
132+ else
133+ # perform a backup
134+ sudo -u postgres envdir /etc/wal-e.d/env wal-e backup-push /var/lib/postgresql/9.3/main
135+ # only retain the latest BACKUPS_TO_RETAIN backups
136+ sudo -u postgres envdir /etc/wal-e.d/env wal-e delete --confirm retain ${BACKUPS_TO_RETAIN}
137+ count=0
138+ fi
139+ fi
140+ (( count++ ))
96141 sleep $(( $ETCD_TTL / 2 )) # sleep for half the TTL
97142 done
98143
0 commit comments