#!/usr/bin/env bash set -e export POSTHOG_APP_TAG="${POSTHOG_APP_TAG:-latest-release}" POSTHOG_SECRET=$(head -c 28 /dev/urandom | sha224sum -b | head -c 56) export POSTHOG_SECRET # Talk to the user echo "Welcome to the single instance PostHog installer 🦔" echo "" echo "⚠️ You really need 4gb or more of memory to run this stack ⚠️" echo "" echo "What version of PostHog would you like to install? (We default to 'latest-release')" echo "You can check out available versions here: https://hub.docker.com/r/posthog/posthog/tags" read -r POSTHOG_APP_TAG_READ if [ -z "$POSTHOG_APP_TAG_READ" ] then echo "Using default and installing $POSTHOG_APP_TAG" else export POSTHOG_APP_TAG=$POSTHOG_APP_TAG_READ echo "Using provided tag: $POSTHOG_APP_TAG" fi echo "" while true; do echo "Should we setup a TLS certificate for you using Let's Encrypt?" echo "Select no if you are using this internally and PostHog will not be reachable from the internet. y/n" read -p "" yn case $yn in [Yy]* ) export USE_SELF_SIGNED_CERT=0; break ;; [Nn]* ) export USE_SELF_SIGNED_CERT=1; break ;; * ) echo "Please answer yes or no." ;; esac done echo "Let's get the exact domain PostHog will be installed on" echo "Make sure that you have a Host A DNS record pointing to this instance!" echo "This will be used for TLS 🔐" echo "ie: test.posthog.net (NOT an IP address)" read -r DOMAIN export DOMAIN=$DOMAIN echo "Ok we'll set up certs for https://$DOMAIN" echo "" echo "Do you have a Sentry DSN you would like for debugging should something go wrong?" echo "If you do enter it now, otherwise just hit enter to continue" read -r SENTRY_DSN export SENTRY_DSN="${SENTRY_DSN:-'https://public@sentry.example.com/1'}" echo "" echo "We will need sudo access so the next question is for you to give us superuser access" echo "Please enter your sudo password now:" sudo echo "" echo "Thanks! 🙏" echo "" echo "Ok! We'll take it from here 🚀" echo "Making sure any stack that might exist is stopped" sudo -E docker-compose -f docker-compose.yml stop &> /dev/null || true # update apt cache echo "Grabbing latest apt caches" sudo apt update # clone posthog echo "Installing PostHog 🦔 from Github" sudo apt install -y git # try to clone - if folder is already there pull latest for that branch git clone https://github.com/PostHog/posthog.git &> /dev/null || true cd posthog git pull cd .. # rewrite caddyfile export TLS_BLOCK="" if [[ $USE_SELF_SIGNED_CERT -eq 1 ]]; then echo "Using a self signed certificate as requested" export TLS_BLOCK="tls internal" fi rm -f Caddyfile envsubst > Caddyfile < .env < compose/start < compose/wait < docker-compose.yml rm docker-compose.yml.tmpl echo "Starting the stack!" sudo -E docker-compose -f docker-compose.yml up -d echo "We will need to wait ~5-10 minutes for things to settle down, migrations to finish, and TLS certs to be issued" echo "" echo "⏳ Waiting for PostHog web to boot (this will take a few minutes)" bash -c 'while [[ "$(curl -s -o /dev/null -w ''%{http_code}'' localhost:8000/_health)" != "200" ]]; do sleep 5; done' echo "⌛️ PostHog looks up!" echo "" echo "🎉🎉🎉 Done! 🎉🎉🎉" echo "" echo "To stop the stack run 'docker-compose stop'" echo "To start the stack again run 'docker-compose start'" echo "If you have any issues at all delete everything in this directory and run the curl command again" echo "" echo 'To upgrade: run /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/posthog/posthog/HEAD/bin/upgrade-hobby)"' echo "" echo "PostHog will be up at the location you provided!" echo "https://${DOMAIN}" echo "" echo "It's dangerous to go alone! Take this: 🦔"