316 lines
10 KiB
Bash
Executable File
316 lines
10 KiB
Bash
Executable File
#!/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:
|
|
sudo -u $USER bash -c "
|
|
set -a
|
|
source /home/$USER/aziros/src/.env
|
|
set +a
|
|
cd /home/$USER/aziros
|
|
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 "→ Assets bauen..."
|
|
if [ "$MODE" = "staging" ]; then
|
|
BUILD_CMD="npm run build:staging"
|
|
elif [ "$MODE" = "development" ]; then
|
|
BUILD_CMD="npm run build"
|
|
else
|
|
BUILD_CMD="npm run build:prod"
|
|
fi
|
|
|
|
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 ""
|