diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..4c35021 --- /dev/null +++ b/.env.example @@ -0,0 +1,20 @@ +# GoToSocial – prostředí pro Docker +# Zkopírujte tento soubor do .env před spuštěním install.sh +# +# Konfigurace serveru je primárně v config/config.yaml. +# Zde můžete přepsat libovolnou hodnotu pomocí proměnných GTS_* +# Viz: https://docs.gotosocial.org/en/latest/configuration/ + +# Příklady přepsání config.yaml přes env (odkomentujte dle potřeby): + +# GTS_HOST="social.example.cz" +# GTS_ACCOUNT_DOMAIN="example.cz" +# GTS_DB_TYPE="sqlite" +# GTS_DB_ADDRESS="/gotosocial/storage/sqlite.db" + +# SMTP – volitelné (odeslání e-mailů) +# GTS_SMTP_HOST="" +# GTS_SMTP_PORT="587" +# GTS_SMTP_USERNAME="" +# GTS_SMTP_PASSWORD="" +# GTS_SMTP_FROM="noreply@example.cz" diff --git a/bootstrap.sh b/bootstrap.sh new file mode 100755 index 0000000..caca25d --- /dev/null +++ b/bootstrap.sh @@ -0,0 +1,86 @@ +#!/usr/bin/env bash +# bootstrap.sh – první nastavení čistého VPS +# Spusťte jako root: bash bootstrap.sh +set -euo pipefail + +if [ "$EUID" -ne 0 ]; then + echo "CHYBA: Spusťte jako root (sudo bash bootstrap.sh)." >&2 + exit 1 +fi + +TARGET_USER="archos" + +echo "==> Bootstrap VPS pro GoToSocial" +echo " Bude vytvořen uživatel: ${TARGET_USER}" +echo "" + +SSH_PUBKEY="ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIE0de1Ry3HwDjTYbgTlgM+iF4F5CbBwqYMTXnTGLP0ff archos@arch-linux" + +# === Aktualizace systému === +echo "==> Aktualizace systému..." +apt-get update -q +apt-get upgrade -y + +# === Instalace základních balíků === +apt-get install -y ufw curl git + +# === Vytvoření uživatele === +if id "$TARGET_USER" &>/dev/null; then + echo "==> Uživatel ${TARGET_USER} již existuje, přeskakuji." +else + echo "==> Vytváření uživatele ${TARGET_USER}..." + useradd -m -s /bin/bash "$TARGET_USER" + # Přidání do skupiny sudo + usermod -aG sudo "$TARGET_USER" + # Zamknutí hesla – přihlášení pouze přes SSH klíč + passwd -l "$TARGET_USER" + echo " Uživatel vytvořen." +fi + +# === SSH klíč === +echo "==> Nastavení SSH klíče..." +SSH_DIR="/home/${TARGET_USER}/.ssh" +mkdir -p "$SSH_DIR" + +# Přidej klíč jen pokud tam ještě není +if ! grep -qF "$SSH_PUBKEY" "${SSH_DIR}/authorized_keys" 2>/dev/null; then + echo "$SSH_PUBKEY" >> "${SSH_DIR}/authorized_keys" + echo " Klíč přidán." +else + echo " Klíč již existuje, přeskakuji." +fi + +chmod 700 "$SSH_DIR" +chmod 600 "${SSH_DIR}/authorized_keys" +chown -R "${TARGET_USER}:${TARGET_USER}" "$SSH_DIR" + +# === Zpevnění SSH démon konfigurace === +echo "==> Zpevnění SSH konfigurace..." +SSHD_CONF="/etc/ssh/sshd_config" +# Zakaz přihlášení roota heslem +sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin prohibit-password/' "$SSHD_CONF" +# Zakaz PasswordAuthentication (pouze klíče) +sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication no/' "$SSHD_CONF" +systemctl reload sshd + +# === UFW firewall === +echo "==> Konfigurace UFW firewallu..." +ufw --force reset +ufw default deny incoming +ufw default allow outgoing +ufw allow 22/tcp comment "SSH" +ufw allow 80/tcp comment "HTTP" +ufw allow 443/tcp comment "HTTPS" +ufw --force enable +ufw status verbose + +echo "" +echo "==> Bootstrap dokončen!" +echo "" +echo "Další kroky:" +echo " 1. Přihlaste se jako ${TARGET_USER}:" +echo " ssh ${TARGET_USER}@" +echo " 2. Naklonujte repozitář:" +echo " git clone ~/gotosocial-vps" +echo " 3. Spusťte instalaci (jako root nebo přes sudo):" +echo " cd ~/gotosocial-vps && sudo bash scripts/install.sh" diff --git a/scripts/install.sh b/scripts/install.sh old mode 100644 new mode 100755 index c90dd8d..4a1b40e --- a/scripts/install.sh +++ b/scripts/install.sh @@ -4,39 +4,146 @@ set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ROOT_DIR="$(dirname "$SCRIPT_DIR")" -echo "==> GoToSocial – instalace" +echo "==> GoToSocial – interaktivní instalace" +echo "" -# Kontrola závislostí -for cmd in docker docker-compose; do - if ! command -v "$cmd" &>/dev/null; then - echo "CHYBA: '$cmd' není nainstalován." >&2 - exit 1 - fi +# === Interaktivní vstup === +read -rp "Doména serveru (např. social.example.cz): " GTS_DOMAIN +read -rp "Account-domain (např. example.cz; Enter = shodná s doménou serveru): " GTS_ACCOUNT_DOMAIN +read -rp "Admin uživatelské jméno: " ADMIN_USER +read -rp "Admin e-mail: " ADMIN_EMAIL +while true; do + read -rsp "Admin heslo: " ADMIN_PASS + echo "" + read -rsp "Admin heslo (znovu): " ADMIN_PASS2 + echo "" + [ "$ADMIN_PASS" = "$ADMIN_PASS2" ] && break + echo "Hesla se neshodují, zkuste znovu." done -# Kontrola .env souboru -if [ ! -f "$ROOT_DIR/.env" ]; then - echo "CHYBA: Soubor .env neexistuje. Zkopírujte .env.example a vyplňte hodnoty." - echo " cp .env.example .env && nano .env" +if [ -z "$GTS_DOMAIN" ] || [ -z "$ADMIN_USER" ] || [ -z "$ADMIN_EMAIL" ] || [ -z "$ADMIN_PASS" ]; then + echo "CHYBA: Doména, admin uživatel, e-mail a heslo jsou povinné." >&2 exit 1 fi -# Vytvoření datového adresáře -mkdir -p "$ROOT_DIR/data" +SEPARATE_ACCOUNT_DOMAIN=false +if [ -n "$GTS_ACCOUNT_DOMAIN" ] && [ "$GTS_ACCOUNT_DOMAIN" != "$GTS_DOMAIN" ]; then + SEPARATE_ACCOUNT_DOMAIN=true +fi +# === Instalace závislostí === + +_install_docker() { + echo "==> Instalace Dockeru..." + apt-get update -q + apt-get install -y ca-certificates curl gnupg lsb-release + curl -fsSL https://get.docker.com | sh + systemctl enable --now docker +} + +_install_nginx() { + echo "==> Instalace Nginx..." + apt-get update -q + apt-get install -y nginx + systemctl enable --now nginx +} + +_install_certbot() { + echo "==> Instalace Certbot..." + apt-get install -y certbot python3-certbot-nginx +} + +if ! command -v docker &>/dev/null; then + _install_docker +fi + +# Detekce příkazu docker compose (plugin) nebo docker-compose (standalone) +if docker compose version &>/dev/null 2>&1; then + DC="docker compose" +elif command -v docker-compose &>/dev/null; then + DC="docker-compose" +else + echo "==> Instalace docker-compose-plugin..." + apt-get install -y docker-compose-plugin + DC="docker compose" +fi + +if ! command -v nginx &>/dev/null; then + _install_nginx +fi + +if ! command -v certbot &>/dev/null; then + _install_certbot +fi + +# === Konfigurace souborů === + +CONFIG_FILE="$ROOT_DIR/config/config.yaml" +NGINX_CONF="$ROOT_DIR/nginx/gotosocial.conf" + +echo "" +echo "==> Nastavení konfigurace..." + +# Záloha originálů pro idempotentní opakované spuštění +[ -f "${CONFIG_FILE}.orig" ] || cp "$CONFIG_FILE" "${CONFIG_FILE}.orig" +[ -f "${NGINX_CONF}.orig" ] || cp "$NGINX_CONF" "${NGINX_CONF}.orig" + +# Vždy pracuj z originálu +cp "${CONFIG_FILE}.orig" "$CONFIG_FILE" +cp "${NGINX_CONF}.orig" "$NGINX_CONF" + +# config.yaml – host +sed -i "s|host: \".*\"|host: \"${GTS_DOMAIN}\"|" "$CONFIG_FILE" + +# config.yaml – account-domain (odkomentuj pouze při odlišné doméně) +if [ "$SEPARATE_ACCOUNT_DOMAIN" = true ]; then + sed -i "s|# account-domain: \".*\"|account-domain: \"${GTS_ACCOUNT_DOMAIN}\"|" "$CONFIG_FILE" +fi + +# nginx – server_name a references na doménu +sed -i "s|server_name .*;|server_name ${GTS_DOMAIN};|g" "$NGINX_CONF" +sed -i "s|vase-domena\.cz|${GTS_DOMAIN}|g" "$NGINX_CONF" + +# Nasazení nginx konfigurace +echo "==> Nasazení Nginx konfigurace..." +cp "$NGINX_CONF" /etc/nginx/sites-available/gotosocial +ln -sf /etc/nginx/sites-available/gotosocial /etc/nginx/sites-enabled/gotosocial +nginx -t +systemctl reload nginx + +# .env – vytvoř z example pokud neexistuje +if [ ! -f "$ROOT_DIR/.env" ]; then + cp "$ROOT_DIR/.env.example" "$ROOT_DIR/.env" +fi + +# === Spuštění kontejneru === +mkdir -p "$ROOT_DIR/data" echo "==> Spouštění kontejneru..." cd "$ROOT_DIR" -docker-compose pull -docker-compose up -d +$DC pull +$DC up -d + +echo "==> Čekání na start GoToSocial (10 s)..." +sleep 10 + +# === Vytvoření admin účtu === +echo "==> Vytváření admin účtu..." +$DC exec gotosocial /gotosocial/gotosocial admin account create \ + --username "$ADMIN_USER" \ + --email "$ADMIN_EMAIL" \ + --password "$ADMIN_PASS" + +$DC exec gotosocial /gotosocial/gotosocial admin account promote \ + --username "$ADMIN_USER" + +# === SSL certifikát === +echo "" +echo "==> Získání SSL certifikátu přes Certbot..." +certbot --nginx -d "$GTS_DOMAIN" echo "" -echo "GoToSocial je spuštěn na http://127.0.0.1:8080" -echo "" -echo "Dalsi kroky:" -echo " 1. Nakonfigurujte Nginx: sudo cp nginx/gotosocial.conf /etc/nginx/sites-available/gotosocial" -echo " 2. Ziskejte SSL certifikat: sudo certbot --nginx -d vase-domena.cz" -echo " 3. Vytvořte admin účet:" -echo " docker-compose exec gotosocial /gotosocial/gotosocial admin account create \\" -echo " --username admin --email admin@vase-domena.cz --password 'silne_heslo'" -echo " docker-compose exec gotosocial /gotosocial/gotosocial admin account promote \\" -echo " --username admin" +echo "==> Instalace dokončena!" +echo " GoToSocial je dostupný na https://${GTS_DOMAIN}" +if [ "$SEPARATE_ACCOUNT_DOMAIN" = true ]; then + echo " Účty budou mít formát @uživatel@${GTS_ACCOUNT_DOMAIN}" +fi