File size: 5,932 Bytes
74bf532 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | #!/usr/bin/env bash
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# URAAS β One-shot deployment script for Ubuntu 22.04 / Debian 12
#
# Run on a fresh VPS as root or a sudo user:
# curl -sSL https://raw.githubusercontent.com/YOUR/repo/main/scripts/deploy.sh | bash
# OR after cloning:
# bash scripts/deploy.sh
#
# What it does:
# 1. Install Docker + Docker Compose plugin
# 2. Generate password hashes interactively
# 3. Build and start all containers (postgres, redis, app, nginx)
# 4. Print the URL to reach the dashboard
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
set -euo pipefail
REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$REPO_DIR"
echo ""
echo "βββββββββββββββββββββββββββββββββββββββββββββββββββ"
echo " URAAS Deployment β $(date +%Y-%m-%d)"
echo "βββββββββββββββββββββββββββββββββββββββββββββββββββ"
# ββ 1. Docker βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
if ! command -v docker &>/dev/null; then
echo ""
echo "βΆ Installing Docker..."
curl -fsSL https://get.docker.com | sh
usermod -aG docker "$USER" || true
echo " Docker installed. You may need to log out and back in."
fi
if ! docker compose version &>/dev/null 2>&1; then
echo ""
echo "βΆ Installing Docker Compose plugin..."
apt-get install -y docker-compose-plugin 2>/dev/null || \
pip install docker-compose 2>/dev/null || \
echo " Install docker-compose manually from docs.docker.com/compose/install/"
fi
# ββ 2. .env.prod ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
if [ ! -f .env.prod ]; then
echo ""
echo "βΆ Creating .env.prod from example..."
cp .env.prod.example .env.prod
# Get server IP
SERVER_IP=$(curl -s https://ifconfig.me || curl -s https://api.ipify.org || echo "YOUR_SERVER_IP")
sed -i "s/YOUR_SERVER_IP/$SERVER_IP/g" .env.prod
# Generate secret key
SECRET_KEY=$(python3 -c "import secrets; print(secrets.token_hex(32))" 2>/dev/null || \
openssl rand -hex 32)
sed -i "s/REPLACE_WITH_STRONG_RANDOM_KEY/$SECRET_KEY/" .env.prod
# Generate password hashes
echo ""
echo "Enter the ADMIN password (for dashboard login):"
read -rs ADMIN_PASS
ADMIN_HASH=$(python3 -c "from werkzeug.security import generate_password_hash as g; print(g('$ADMIN_PASS'))" 2>/dev/null || \
python3 -c "import hashlib, os; print('pbkdf2:sha256:' + hashlib.pbkdf2_hmac('sha256', b'$ADMIN_PASS', os.urandom(16), 150000).hex())")
sed -i "s|REPLACE_WITH_WERKZEUG_HASH|$ADMIN_HASH|g" .env.prod
echo ""
echo " .env.prod created. Edit it to add SMTP_PASSWORD and API keys before running."
echo ""
echo " IMPORTANT: Set these in .env.prod before the demo:"
echo " SMTP_PASSWORD=<your-gmail-app-password>"
echo " S2_API_KEY=<from semanticscholar.org>"
echo " CORE_API_KEY=<from core.ac.uk/api-keys>"
fi
# ββ 3. Required directories βββββββββββββββββββββββββββββββββββββββββββββββββββ
mkdir -p storage/pdfs data logs backups nginx/ssl
# ββ 4. Build + Start ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
echo ""
echo "βΆ Building and starting containers (this takes ~3 min first time)..."
echo ""
# docker-compose.demo.yml = HTTP-only, works on bare IP (no SSL cert needed).
# Switch to docker-compose.prod.yml once you have a domain + SSL certificate.
docker compose --env-file .env.prod -f docker-compose.demo.yml up --build -d
# ββ 5. Wait for health ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
echo ""
echo "βΆ Waiting for app to become healthy..."
for i in $(seq 1 20); do
STATUS=$(docker inspect --format='{{.State.Health.Status}}' uraas-app 2>/dev/null || echo "starting")
if [ "$STATUS" = "healthy" ]; then
echo " App is healthy!"
break
fi
echo " [$i/20] Status: $STATUS β waiting 5s..."
sleep 5
done
# ββ 6. Done βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
SERVER_IP=$(curl -s https://ifconfig.me 2>/dev/null || echo "YOUR_SERVER_IP")
echo ""
echo "βββββββββββββββββββββββββββββββββββββββββββββββββββ"
echo " URAAS is running!"
echo ""
echo " Dashboard (direct): http://$SERVER_IP:8080"
echo " Dashboard (nginx): http://$SERVER_IP"
echo ""
echo " Logs: docker compose -f docker-compose.prod.yml logs -f app"
echo " Stop: docker compose -f docker-compose.prod.yml down"
echo "βββββββββββββββββββββββββββββββββββββββββββββββββββ"
|