mirror of
https://github.com/TautvydasDerzinskas/Thingport.git
synced 2026-10-18 20:59:55 -05:00
82 lines
3.2 KiB
Bash
Executable File
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 "$@"
|