mirror of
https://github.com/PostHog/posthog.git
synced 2024-11-21 21:49:51 +01:00
9f96b34a7f
enable compression for reverse_proxy responses compression is disabled in caddy by default, rendering frontend PAINFULLY slow (as if Django is not slow enough already)
239 lines
7.1 KiB
Bash
Executable File
239 lines
7.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -e
|
|
|
|
export DEBIAN_FRONTEND=noninteractive
|
|
# Automatically restart without asking.
|
|
# this gets around needrestart command halting for user input
|
|
export RESTART_MODE=l
|
|
export POSTHOG_APP_TAG="${POSTHOG_APP_TAG:-latest}"
|
|
export SENTRY_DSN="${SENTRY_DSN:-'https://public@sentry.example.com/1'}"
|
|
|
|
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 "Power user or aspiring power user?"
|
|
echo "Check out our docs on deploying PostHog! https://posthog.com/docs/self-host/deploy/hobby"
|
|
echo ""
|
|
|
|
if ! [ -z "$1" ]
|
|
then
|
|
export POSTHOG_APP_TAG=$1
|
|
else
|
|
echo "What version of PostHog would you like to install? (We default to 'latest')"
|
|
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
|
|
fi
|
|
echo ""
|
|
if ! [ -z "$2" ]
|
|
then
|
|
export DOMAIN=$2
|
|
else
|
|
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
|
|
fi
|
|
echo "Ok we'll set up certs for https://$DOMAIN"
|
|
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
|
|
|
|
# send log of this install for continued support!
|
|
curl -o /dev/null -L --header "Content-Type: application/json" -d "{
|
|
\"api_key\": \"sTMFPsFhdP1Ssg\",
|
|
\"distinct_id\": \"${DOMAIN}\",
|
|
\"properties\": {\"domain\": \"${DOMAIN}\"},
|
|
\"type\": \"capture\",
|
|
\"event\": \"magic_curl_install_start\"
|
|
}" https://us.i.posthog.com/batch/ &> /dev/null
|
|
|
|
# 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
|
|
|
|
if [[ "$POSTHOG_APP_TAG" = "latest-release" ]]
|
|
then
|
|
git fetch --tags
|
|
latestReleaseTag=$(git describe --tags `git rev-list --tags --max-count=1`)
|
|
echo "Checking out latest PostHog release: $latestReleaseTag"
|
|
git checkout $latestReleaseTag
|
|
elif [[ "$POSTHOG_APP_TAG" = "latest" ]]
|
|
then
|
|
echo "Pulling latest from current branch: $(git branch --show-current)"
|
|
git pull
|
|
elif [[ "$POSTHOG_APP_TAG" =~ ^[0-9a-f]{40}$ ]]
|
|
then
|
|
echo "Checking out specific commit hash: $POSTHOG_APP_TAG"
|
|
git checkout $POSTHOG_APP_TAG
|
|
else
|
|
releaseTag="${POSTHOG_APP_TAG/release-/""}"
|
|
git fetch --tags
|
|
echo "Checking out PostHog release: $releaseTag"
|
|
git checkout $releaseTag
|
|
fi
|
|
|
|
cd ..
|
|
|
|
if [ -n "$3" ]
|
|
then
|
|
export TLS_BLOCK="acme_ca https://acme-staging-v02.api.letsencrypt.org/directory"
|
|
fi
|
|
|
|
if [ "$REGISTRY_URL" == "" ]
|
|
then
|
|
export REGISTRY_URL="posthog/posthog"
|
|
fi
|
|
|
|
# rewrite caddyfile
|
|
rm -f Caddyfile
|
|
envsubst > Caddyfile <<EOF
|
|
{
|
|
$TLS_BLOCK
|
|
}
|
|
$DOMAIN, http://, https:// {
|
|
encode gzip zstd
|
|
reverse_proxy http://web:8000
|
|
}
|
|
EOF
|
|
|
|
# Write .env file
|
|
envsubst > .env <<EOF
|
|
POSTHOG_SECRET=$POSTHOG_SECRET
|
|
SENTRY_DSN=$SENTRY_DSN
|
|
DOMAIN=$DOMAIN
|
|
EOF
|
|
|
|
# write entrypoint
|
|
# NOTE: this is duplicated in bin/upgrade-hobby, so if you change it here,
|
|
# change it there too.
|
|
rm -rf compose
|
|
mkdir -p compose
|
|
cat > compose/start <<EOF
|
|
#!/bin/bash
|
|
/compose/wait
|
|
./bin/migrate
|
|
./bin/docker-server
|
|
EOF
|
|
chmod +x compose/start
|
|
|
|
cat > compose/temporal-django-worker <<EOF
|
|
#!/bin/bash
|
|
./bin/temporal-django-worker
|
|
EOF
|
|
chmod +x compose/temporal-django-worker
|
|
|
|
# write wait script
|
|
cat > compose/wait <<EOF
|
|
#!/usr/bin/env python3
|
|
|
|
import socket
|
|
import time
|
|
|
|
def loop():
|
|
print("Waiting for ClickHouse and Postgres to be ready")
|
|
try:
|
|
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
|
|
s.connect(('clickhouse', 9000))
|
|
print("Clickhouse is ready")
|
|
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
|
|
s.connect(('db', 5432))
|
|
print("Postgres is ready")
|
|
except ConnectionRefusedError as e:
|
|
time.sleep(5)
|
|
loop()
|
|
|
|
loop()
|
|
EOF
|
|
chmod +x compose/wait
|
|
|
|
# setup docker
|
|
# setup docker
|
|
# Check if Docker is already installed
|
|
if ! command -v docker &> /dev/null; then
|
|
echo "Docker is not installed. Setting up Docker."
|
|
|
|
# Setup Docker
|
|
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
|
|
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo -E apt-key add -
|
|
sudo add-apt-repository -y "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
|
|
sudo apt update
|
|
sudo apt-cache policy docker-ce
|
|
sudo apt install -y docker-ce
|
|
else
|
|
echo "Docker is already installed. Skipping installation."
|
|
fi
|
|
|
|
# setup docker-compose
|
|
echo "Setting up Docker Compose"
|
|
sudo curl -L "https://github.com/docker/compose/releases/download/v2.13.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose || true
|
|
sudo chmod +x /usr/local/bin/docker-compose
|
|
|
|
# enable docker without sudo
|
|
sudo usermod -aG docker "${USER}" || true
|
|
|
|
# start up the stack
|
|
echo "Configuring Docker Compose...."
|
|
rm -f docker-compose.yml
|
|
cp posthog/docker-compose.base.yml docker-compose.base.yml
|
|
cp posthog/docker-compose.hobby.yml docker-compose.yml.tmpl
|
|
envsubst < docker-compose.yml.tmpl > 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/_health)" != "200" ]]; do sleep 5; done'
|
|
echo "⌛️ PostHog looks up!"
|
|
echo ""
|
|
echo "🎉🎉🎉 Done! 🎉🎉🎉"
|
|
# send log of this install for continued support!
|
|
curl -o /dev/null -L --header "Content-Type: application/json" -d "{
|
|
\"api_key\": \"sTMFPsFhdP1Ssg\",
|
|
\"distinct_id\": \"${DOMAIN}\",
|
|
\"properties\": {\"domain\": \"${DOMAIN}\"},
|
|
\"type\": \"capture\",
|
|
\"event\": \"magic_curl_install_complete\"
|
|
}" https://us.i.posthog.com/batch/ &> /dev/null
|
|
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: 🦔"
|