|
| 1 | +#!/usr/bin/env bash |
| 2 | + |
| 3 | +run_sql() { |
| 4 | + PGSSLMODE="require" \ |
| 5 | + PGPASSWORD="${FEATURES_DB_PASSWORD}" \ |
| 6 | + psql \ |
| 7 | + --username="${FEATURES_DB_USER}" \ |
| 8 | + --port="${FEATURES_DB_PORT}" \ |
| 9 | + --host="${FEATURES_DB_HOST}" \ |
| 10 | + --dbname="$1" \ |
| 11 | +} |
| 12 | + |
| 13 | +load_features_dump() { |
| 14 | + PGSSLMODE="require" \ |
| 15 | + PGPASSWORD="${FEATURES_DB_PASSWORD}" \ |
| 16 | + pg_restore \ |
| 17 | + --username="${FEATURES_DB_USER}" \ |
| 18 | + --port="${FEATURES_DB_PORT}" \ |
| 19 | + --host="${FEATURES_DB_HOST}" \ |
| 20 | + --dbname="${FEATURES_DB_NAME}" \ |
| 21 | + --jobs="$(grep -c ^processor /proc/cpuinfo)" \ |
| 22 | + "$1" |
| 23 | +} |
| 24 | + |
| 25 | +features_database_exists() { |
| 26 | + echo "SELECT 'yes' FROM pg_database WHERE datname='${FEATURES_DB_NAME}';" \ |
| 27 | + | run_sql 'postgres' \ |
| 28 | + | grep -q 'yes' |
| 29 | +} |
| 30 | + |
| 31 | +log() { |
| 32 | + echo "[$(date)] $1" |
| 33 | +} |
| 34 | + |
| 35 | +fail() { |
| 36 | + echo "$1" >&2 |
| 37 | + exit 1 |
| 38 | +} |
| 39 | + |
| 40 | +if [ -z "${FEATURES_DB_USER}" ]; then fail "Need to provide FEATURES_DB_USER environment variable"; fi |
| 41 | +if [ -z "${FEATURES_DB_PASSWORD}" ]; then fail "Need to provide FEATURES_DB_PASSWORD environment variable"; fi |
| 42 | +if [ -z "${FEATURES_DB_HOST}" ]; then fail "Need to provide FEATURES_DB_HOST environment variable"; fi |
| 43 | + |
| 44 | +if ! features_database_exists; then |
| 45 | + dump_file="/tmp/db.fc.gz" |
| 46 | + |
| 47 | + log "Setting up database..." |
| 48 | + echo "CREATE DATABASE ${FEATURES_DB_NAME};" | run_sql 'postgres' |
| 49 | + echo "CREATE USER ops WITH login password 'changeme';" | run_sql 'postgres' |
| 50 | + echo "CREATE USER frontend WITH login password 'changeme';" | run_sql 'postgres' |
| 51 | + echo "ALTER USER ops WITH password '${FEATURES_DB_PASSWORD}';" | run_sql 'postgres' |
| 52 | + echo "ALTER USER frontend WITH password '${FEATURES_DB_PASSWORD}';" | run_sql 'postgres' |
| 53 | + echo "GRANT ops TO ${FEATURES_DB_USER%@*};" | run_sql 'postgres' |
| 54 | + echo "GRANT frontend TO ${FEATURES_DB_USER%@*};" | run_sql 'postgres' |
| 55 | + log "...done, database is now set up" |
| 56 | + |
| 57 | + log "Setting up schema..." |
| 58 | + < /app/ddl/schema.sql run_sql "${FEATURES_DB_NAME}" |
| 59 | + log "...done, schema is now set up" |
| 60 | + |
| 61 | + log "Fetching database dump..." |
| 62 | + curl --silent "${FEATURES_DB_DUMP_URL}" > "${dump_file}" |
| 63 | + log "...done, database dump is now available" |
| 64 | + |
| 65 | + log "Ingesting database dump..." |
| 66 | + load_features_dump "${dump_file}" |
| 67 | + rm "${dump_file}" |
| 68 | + log "...done, database dump is now ingested" |
| 69 | + |
| 70 | + log "Setting up indices..." |
| 71 | + < /app/ddl/indices.sql run_sql "${FEATURES_DB_NAME}" |
| 72 | + log "...done, indices are now set up" |
| 73 | + |
| 74 | + log "Improving query planner..." |
| 75 | + echo "ANALYZE;" | run_sql "${FEATURES_DB_NAME}" |
| 76 | + log "...done, query planner is now ready" |
| 77 | +fi |
| 78 | + |
| 79 | +FEATURES_CONNECTION_STRING="postgres://frontend:${FEATURES_DB_PASSWORD}@${FEATURES_DB_HOST}:${FEATURES_DB_PORT}/${FEATURES_DB_NAME}?ssl=true" \ |
| 80 | +npm start |
0 commit comments