#!/bin/bash set -e MODE=${1:-production} echo "" echo "╔══════════════════════════════════════╗" echo "║ Aziros Server Setup ║" echo "║ Mode: $MODE ║" echo "╚══════════════════════════════════════╝" echo "" # ═══════════════════════════════════════ # ROOT CHECK # ═══════════════════════════════════════ if [ "$EUID" -ne 0 ]; then echo "❌ Bitte als root ausführen" exit 1 fi # ═══════════════════════════════════════ # SCHRITT 1 — System Update # ═══════════════════════════════════════ echo "→ System wird aktualisiert..." apt update && apt upgrade -y apt install -y curl git nano ufw \ ca-certificates gnupg2 \ apt-transport-https net-tools \ openssh-server echo "✅ System aktualisiert" # ═══════════════════════════════════════ # SCHRITT 2 — User anlegen # ═══════════════════════════════════════ USER="nexxo" if id "$USER" &>/dev/null; then echo "→ User $USER existiert bereits" else echo "→ User '$USER' wird erstellt..." adduser --gecos "" $USER usermod -aG sudo $USER echo "✅ User $USER erstellt" fi # ═══════════════════════════════════════ # SCHRITT 3 — Docker installieren # ═══════════════════════════════════════ if command -v docker &>/dev/null; then echo "→ Docker bereits installiert" else echo "→ Docker wird installiert..." curl -fsSL https://get.docker.com | sh echo "✅ Docker installiert" fi usermod -aG docker $USER # ═══════════════════════════════════════ # SCHRITT 4 — Firewall # ═══════════════════════════════════════ echo "→ Firewall wird konfiguriert..." ufw allow OpenSSH ufw allow 80/tcp ufw allow 443/tcp ufw allow 8080/tcp ufw --force enable echo "✅ Firewall konfiguriert" # ═══════════════════════════════════════ # SCHRITT 5 — Git konfigurieren # ═══════════════════════════════════════ echo "→ Git wird konfiguriert..." sudo -u $USER git config \ --global credential.helper store sudo -u $USER git config \ --global user.name "Aziros Deploy" sudo -u $USER git config \ --global user.email "deploy@aziros.com" # ═══════════════════════════════════════ # SCHRITT 6 — Git Token + Repo clonen # ═══════════════════════════════════════ echo "→ Gitea Access Token eingeben:" echo " (Gitea → Einstellungen → Anwendungen → Token erstellen)" read -sp "Token: " GIT_TOKEN echo "" # Credentials speichern: echo "https://token:$GIT_TOKEN@git.nexlab.at" > \ /home/$USER/.git-credentials chmod 600 /home/$USER/.git-credentials chown $USER:$USER /home/$USER/.git-credentials # Git credential helper setzen: sudo -u $USER git config \ --global credential.helper store # Repo URL mit Token: REPO="https://token:$GIT_TOKEN@git.nexlab.at/boban/aziros.git" echo "→ Repository wird geklont..." if [ -d "/home/$USER/aziros/.git" ]; then echo "→ Repo existiert — pull" git config --global --add safe.directory \ /home/$USER/aziros sudo -u $USER git -C \ /home/$USER/aziros pull origin main else rm -rf /home/$USER/aziros sudo -u $USER git clone \ $REPO /home/$USER/aziros git config --global --add safe.directory \ /home/$USER/aziros fi echo "✅ Repository bereit" # ═══════════════════════════════════════ # SCHRITT 7 — .env vom lokalen Server holen # ═══════════════════════════════════════ ENV_FILE="/home/$USER/aziros/src/.env" if [ ! -f "$ENV_FILE" ]; then echo "" echo "→ .env wird vom lokalen Server geholt..." echo "" read -p "Lokale Server IP: " LOCAL_IP read -p "Lokaler User (z.B. nexxo): " LOCAL_USER read -sp "Passwort von $LOCAL_USER@$LOCAL_IP: " \ LOCAL_PASS echo "" if [ "$MODE" = "staging" ]; then SRC_ENV=".env.staging" elif [ "$MODE" = "development" ]; then SRC_ENV=".env.development" else SRC_ENV=".env.production" fi # sshpass installieren: apt install -y sshpass -q # SSH Key erstellen falls nicht vorhanden: if [ ! -f "/home/$USER/.ssh/id_ed25519" ]; then echo "→ SSH Key wird erstellt..." sudo -u $USER ssh-keygen -t ed25519 \ -f /home/$USER/.ssh/id_ed25519 \ -N "" -C "$MODE@aziros" fi # Key auf lokalem Server eintragen: echo "→ SSH Key wird eingetragen..." sshpass -p "$LOCAL_PASS" ssh-copy-id \ -i /home/$USER/.ssh/id_ed25519.pub \ -o StrictHostKeyChecking=no \ $LOCAL_USER@$LOCAL_IP # .env holen: echo "→ .env wird kopiert..." sudo -u $USER scp \ -o StrictHostKeyChecking=no \ $LOCAL_USER@$LOCAL_IP:~/aziros/src/$SRC_ENV \ $ENV_FILE if [ ! -f "$ENV_FILE" ]; then echo "❌ .env konnte nicht geholt werden" exit 1 fi echo "✅ .env kopiert" fi echo "✅ .env vorhanden" # ═══════════════════════════════════════ # SCHRITT 8 — Compose File wählen # ═══════════════════════════════════════ if [ "$MODE" = "development" ]; then COMPOSE="docker-compose.development.yml" elif [ "$MODE" = "staging" ]; then COMPOSE="docker-compose.staging.yml" else COMPOSE="docker-compose.yml" fi # ═══════════════════════════════════════ # SCHRITT 9 — Docker Stack starten # ═══════════════════════════════════════ echo "→ Docker Stack wird gestartet..." cd /home/$USER/aziros # Variablen für Docker Compose exportieren: set -a source /home/$USER/aziros/src/.env set +a sudo -u $USER docker compose \ -f $COMPOSE up -d --build echo "→ Warte bis DB bereit ist..." sleep 20 # ═══════════════════════════════════════ # SCHRITT 10 — DB User anlegen # ═══════════════════════════════════════ echo "→ DB wird konfiguriert..." DB_NAME=$(grep "^DB_DATABASE=" $ENV_FILE \ | cut -d= -f2) DB_USER=$(grep "^DB_USERNAME=" $ENV_FILE \ | cut -d= -f2) DB_PASS=$(grep "^DB_PASSWORD=" $ENV_FILE \ | cut -d= -f2) DB_ROOT=$(grep "^DB_ROOT_PASSWORD=" $ENV_FILE \ | cut -d= -f2) sudo -u $USER docker compose \ -f $COMPOSE exec -T db \ mariadb -u root -p"$DB_ROOT" \ -e " CREATE DATABASE IF NOT EXISTS \`$DB_NAME\`; CREATE USER IF NOT EXISTS '$DB_USER'@'%' IDENTIFIED BY '$DB_PASS'; GRANT ALL PRIVILEGES ON \`$DB_NAME\`.* TO '$DB_USER'@'%'; FLUSH PRIVILEGES; " echo "✅ DB konfiguriert" # ═══════════════════════════════════════ # SCHRITT 11 — Laravel Setup # ═══════════════════════════════════════ echo "→ Verzeichnisse erstellen..." sudo -u $USER docker compose \ -f $COMPOSE exec -T app \ mkdir -p \ bootstrap/cache \ storage/framework/cache \ storage/framework/sessions \ storage/framework/views \ storage/logs sudo -u $USER docker compose \ -f $COMPOSE exec -T app \ chmod -R 775 bootstrap/cache storage echo "→ Composer install..." sudo -u $USER docker compose \ -f $COMPOSE exec -T app \ composer install --no-dev \ --optimize-autoloader echo "→ Migrationen..." sudo -u $USER docker compose \ -f $COMPOSE exec -T app \ php artisan migrate --force echo "→ Storage Link..." sudo -u $USER docker compose \ -f $COMPOSE exec -T app \ php artisan storage:link echo "→ Services neu starten..." sudo -u $USER docker compose \ -f $COMPOSE restart \ worker mail-worker reverb scheduler echo "→ Cache aufbauen..." sudo -u $USER docker compose \ -f $COMPOSE exec -T app \ php artisan config:cache sudo -u $USER docker compose \ -f $COMPOSE exec -T app \ php artisan route:cache sudo -u $USER docker compose \ -f $COMPOSE exec -T app \ php artisan view:cache echo "✅ Laravel konfiguriert" # ═══════════════════════════════════════ # SCHRITT 12 — Status # ═══════════════════════════════════════ echo "" echo "╔══════════════════════════════════════╗" echo "║ Setup abgeschlossen ✅ ║" echo "╚══════════════════════════════════════╝" echo "" sudo -u $USER docker compose \ -f $COMPOSE ps echo "" if [ "$MODE" = "staging" ]; then echo "URL: https://app.staging.aziros.com" elif [ "$MODE" = "development" ]; then echo "URL: http://app.aziros.local" else echo "URL: https://app.aziros.com" fi echo "" echo "Neu einloggen damit Docker aktiv:" echo " su - $USER" echo ""