Files
gitea/setup.sh
2026-07-18 20:57:01 +02:00

75 lines
1.8 KiB
Bash

#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ENV_FILE="$SCRIPT_DIR/.env"
if [ ! -f "$ENV_FILE" ]; then
echo "No .env found. Copy .env.example to .env and set MYSQL_PASSWORD." >&2
exit 1
fi
set -a
# shellcheck disable=SC1090
. "$ENV_FILE"
set +a
if [ -z "${MYSQL_PASSWORD:-}" ] || [ "${MYSQL_PASSWORD}" = "CHANGE_ME" ]; then
echo "MYSQL_PASSWORD is unset or still the placeholder in .env." >&2
echo "Generate one with: openssl rand -base64 32" >&2
exit 1
fi
: "${GITEA_UID:=1000}"
: "${GITEA_GID:=1000}"
: "${GITEA_DATA_DIR:=./data}"
: "${GITEA_CONFIG_DIR:=./config}"
: "${NGINX_CONFIG_DIR:=./nginx}"
resolve_path() {
case "$1" in
/*) printf '%s\n' "$1" ;;
*) printf '%s/%s\n' "$SCRIPT_DIR" "$1" ;;
esac
}
DATA_DIR="$(resolve_path "$GITEA_DATA_DIR")"
CONFIG_DIR="$(resolve_path "$GITEA_CONFIG_DIR")"
NGINX_DIR="$(resolve_path "$NGINX_CONFIG_DIR")"
mkdir -p "$DATA_DIR" "$CONFIG_DIR" "$NGINX_DIR"
# Only the Gitea bind mounts need this; MySQL uses a named volume and manages
# its own ownership.
chown_cmd=(chown -R "${GITEA_UID}:${GITEA_GID}" "$DATA_DIR" "$CONFIG_DIR")
if [ "$(id -u)" -ne 0 ]; then
if command -v sudo >/dev/null 2>&1; then
sudo "${chown_cmd[@]}"
else
echo "Need ownership change to ${GITEA_UID}:${GITEA_GID}; re-run as root or with sudo" >&2
exit 1
fi
else
"${chown_cmd[@]}"
fi
if docker compose version >/dev/null 2>&1; then
COMPOSE_CMD=(docker compose)
elif command -v docker-compose >/dev/null 2>&1; then
COMPOSE_CMD=(docker-compose)
else
echo "docker compose not found" >&2
exit 1
fi
(cd "$SCRIPT_DIR" && "${COMPOSE_CMD[@]}" up -d)
cat <<EOF
Stack is up. If this is the first run, create the admin user:
${COMPOSE_CMD[*]} exec -u git gitea gitea admin user create \\
--username admin --email you@example.com --random-password --admin
EOF