#!/usr/bin/env bash
set -euo pipefail
############################
# EDIT THESE FIRST #
############################
DOMAIN="espressocafebar.eu"
REPO="https://github.com/youruser/your-vite-repo.git"
EMAIL="your-email@example.com"
# Supabase / Vite env
SUPABASE_URL="https://dagnscrjrktrrspyamwu.supabase.co"
SUPABASE_ANON_KEY="YOUR_SUPABASE_ANON_KEY"
# n8n settings
N8N_SUBDOMAIN="n8n"
N8N_BASIC_AUTH_USER="development@automationaid.eu"
N8N_BASIC_AUTH_PASSWORD="Savata619"
# GitHub auto‐deploy (private repo)
GITHUB_USER="your-github-username"
GITHUB_PAT="your_personal_access_token"
# Discord webhook for deployment notifications
DISCORD_WEBHOOK="https://discord.com/api/webhooks/1365978148205891604/B05kJCQW5w9stkSnGZi-qdIreE6o9fCoNsWHuaxzCIJnCDERB0EYBcrjoUwQ_RlZFt3t"
############################
echo "=== 1) Install Docker, Docker Compose, Node.js & Git ==="
apt update && apt upgrade -y
apt install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release \
software-properties-common
# Docker repo & engine
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
systemctl enable --now docker
# Node.js for building the Vite app
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
apt install -y nodejs git
echo
echo "=== 2) Clone & build your Vite app ==="
mkdir -p /opt/$DOMAIN
cd /opt/$DOMAIN
git clone --depth 1 "$REPO" frontend
cd frontend
cat > .env <<EOF
VITE_SUPABASE_URL=$SUPABASE_URL
VITE_SUPABASE_ANON_KEY=$SUPABASE_ANON_KEY
EOF
npm install
npm run build
cd ..
echo
echo "=== 3) Write nginx.conf ==="
cat > nginx.conf <<'EOF'
server {
listen 80 default_server;
root /usr/share/nginx/html;
index index.html;
gzip on;
gzip_min_length 256;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml+rss text/javascript;
location / {
try_files $uri /index.html;
}
}
EOF
echo
echo "=== 4) Create docker-compose.yml with Traefik auto-SSL ==="
cat > docker-compose.yml <<EOF
version: "3.8"
services:
traefik:
image: traefik:v2.11
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- letsencrypt:/letsencrypt
command:
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- --entrypoints.web.address=:80
- --entrypoints.web.http.redirections.entrypoint.to=websecure
- --entrypoints.web.http.redirections.entrypoint.scheme=https
- --entrypoints.websecure.address=:443
- --certificatesresolvers.le.acme.httpchallenge=true
- --certificatesresolvers.le.acme.httpchallenge.entrypoint=web
- --certificatesresolvers.le.acme.email=${EMAIL}
- --certificatesresolvers.le.acme.storage=/letsencrypt/acme.json
networks:
- web
frontend:
image: nginx:latest
restart: unless-stopped
volumes:
- ./frontend/dist:/usr/share/nginx/html:ro
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
labels:
- "traefik.enable=true"
- "traefik.http.routers.front.rule=Host(\`${DOMAIN}\`)"
- "traefik.http.routers.front.entrypoints=websecure"
- "traefik.http.routers.front.tls.certresolver=le"
- "traefik.http.services.front.loadbalancer.server.port=80"
networks:
- web
n8n:
image: n8nio/n8n
restart: unless-stopped
environment:
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=${N8N_BASIC_AUTH_USER}
- N8N_BASIC_AUTH_PASSWORD=${N8N_BASIC_AUTH_PASSWORD}
- WEBHOOK_URL=https://${N8N_SUBDOMAIN}.${DOMAIN}
- N8N_HOST=${N8N_SUBDOMAIN}.${DOMAIN}
- N8N_PORT=5678
- NODE_ENV=production
volumes:
- n8n_data:/home/node/.n8n
labels:
- "traefik.enable=true"
- "traefik.http.routers.n8n.rule=Host(\`${N8N_SUBDOMAIN}.${DOMAIN}\`)"
- "traefik.http.routers.n8n.entrypoints=websecure"
- "traefik.http.routers.n8n.tls.certresolver=le"
- "traefik.http.services.n8n.loadbalancer.server.port=5678"
networks:
- web
volumes:
n8n_data:
letsencrypt:
networks:
web:
driver: bridge
EOF
echo
echo "=== 5) Start Docker stack ==="
docker compose up -d
echo
echo "✅ Initial deployment complete!"
echo " • Frontend ➜ https://${DOMAIN}"
echo " • n8n ➜ https://${N8N_SUBDOMAIN}.${DOMAIN}"
# Notify Discord
curl -H "Content-Type: application/json" \
-d "{\"content\": \"✅ Initial deployment successful for https://${DOMAIN}\"}" \
"$DISCORD_WEBHOOK"
echo
echo "=== 6) Create auto-deploy script (/root/auto-deploy.sh) ==="
cat > /root/auto-deploy.sh <<EOF
#!/usr/bin/env bash
set -euo pipefail
GITHUB_USER="${GITHUB_USER}"
GITHUB_PAT="${GITHUB_PAT}"
REPO_DIR="/opt/${DOMAIN}/frontend"
DISCORD_WEBHOOK="${DISCORD_WEBHOOK}"
DOMAIN="${DOMAIN}"
REBUILD_CMD="
npm install &&
npm run build &&
docker compose exec frontend nginx -s reload
"
# Ensure GitHub auth
if [ ! -f "\$HOME/.netrc" ]; then
cat > "\$HOME/.netrc" <<EONETRC
machine github.com
login \$GITHUB_USER
password \$GITHUB_PAT
EONETRC
chmod 600 "\$HOME/.netrc"
fi
cd "\$REPO_DIR"
git fetch origin main
LOCAL=\$(git rev-parse HEAD)
REMOTE=\$(git rev-parse origin/main)
if [ "\$LOCAL" = "\$REMOTE" ]; then
echo "[\$(date)] No new commits."
exit 0
fi
echo "[\$(date)] New commits detected—deploying!"
git pull origin main
eval "\$REBUILD_CMD"
echo "[\$(date)] Deploy done."
# Notify Discord
curl -H "Content-Type: application/json" \\
-d "{\"content\": \"🔄 Auto-deploy: changes deployed to https://${DOMAIN}\"}" \\
"\$DISCORD_WEBHOOK"
EOF
chmod +x /root/auto-deploy.sh
echo
echo "=== 7) Schedule auto-deploy in cron ==="
CRON_CMD="*/5 * * * * /root/auto-deploy.sh >> /var/log/auto-deploy.log 2>&1"
( crontab -l 2>/dev/null | grep -F "$CRON_CMD" ) || \
( crontab -l 2>/dev/null; echo "$CRON_CMD" ) | crontab -
echo
echo "🎉 All set! Your server is fully Dockerized, SSL-enabled, and will auto-deploy on new merges."