Files

82 lines
3.2 KiB
Bash
Executable File

#!/bin/sh
# Thingport quick install: curl -fsSL https://thingport.net/install.sh | sh
#
# Installs into ./thingport, or pass a directory: curl -fsSL https://thingport.net/install.sh | sh -s -- ~/thingport
# Use another port than 80 with: curl -fsSL https://thingport.net/install.sh | WEB_PORT=8080 sh
#
# Downloads the published docker-compose.deploy.yml and .env.example from the repo, fills .env
# with a random AUTH_SECRET and database password, and starts the stack with Docker Compose.
set -eu
RAW_URL="https://raw.githubusercontent.com/TautvydasDerzinskas/Thingport/main"
fail() {
printf '%s\n' "$*" >&2
exit 1
}
random_hex() {
if command -v openssl > /dev/null 2>&1; then
openssl rand -hex "$1"
else
od -An -tx1 -N"$1" /dev/urandom | tr -d ' \n'
fi
}
main() {
[ "$#" -le 1 ] || fail "Usage: sh install.sh [directory]"
for dependency in curl docker; do
command -v "$dependency" > /dev/null 2>&1 || fail "Install $dependency before running this script."
done
docker compose version > /dev/null 2>&1 || fail "Install the Docker Compose plugin before running this script."
docker info > /dev/null 2>&1 || fail "Docker is not reachable. Start Docker and check that your user can access it."
install_dir=${1:-./thingport}
mkdir -p -- "$install_dir"
cd -- "$install_dir"
for existing in compose.yaml compose.yml docker-compose.yaml docker-compose.yml .env; do
if [ -e "$existing" ] || [ -L "$existing" ]; then
fail "Found $existing in $PWD. Use a new directory, or manage the existing installation with Docker Compose."
fi
done
compose_tmp=$(mktemp ./thingport-compose.XXXXXX)
env_tmp=$(mktemp ./thingport-env.XXXXXX)
trap 'rm -f -- "$compose_tmp" "$env_tmp"' EXIT
trap 'exit 1' HUP INT TERM
printf '%s\n' "Downloading Thingport compose file..."
curl -fsSL "$RAW_URL/docker-compose.deploy.yml" -o "$compose_tmp"
curl -fsSL "$RAW_URL/.env.example" \
| awk -v secret="$(random_hex 32)" -v password="$(random_hex 24)" -v port="${WEB_PORT:-}" '
/^AUTH_SECRET=/ { print "AUTH_SECRET=" secret; next }
/^POSTGRES_PASSWORD=/ { print "POSTGRES_PASSWORD=" password; next }
/^WEB_PORT=/ && port != "" { print "WEB_PORT=" port; next }
{ print }
' > "$env_tmp"
chmod 644 "$compose_tmp"
chmod 600 "$env_tmp"
docker compose -f "$compose_tmp" --env-file "$env_tmp" config --quiet
mv -- "$compose_tmp" docker-compose.yml
mv -- "$env_tmp" .env
trap - EXIT HUP INT TERM
printf '%s\n' "Starting Thingport..."
docker compose up -d
port=$(sed -n 's/^WEB_PORT=//p' .env)
port=${port:-80}
if [ "$port" = "80" ]; then address="http://localhost"; else address="http://localhost:$port"; fi
printf '\nThingport is starting. Open %s (or this machine'"'"'s address from another device).\n' "$address"
printf '%s\n' "The first account you register becomes the admin."
printf 'Installation directory: %s\n' "$PWD"
printf '%s\n' "Your secrets are in .env there. Keep it; the database password is needed to start Thingport again."
printf '%s\n' "Update later with: docker compose pull && docker compose up -d"
printf '%s\n' "If the page does not load after a minute, check the logs:"
printf ' cd "%s" && docker compose logs backend\n' "$PWD"
}
main "$@"