| #!/usr/bin/env bash |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| set -euo pipefail |
|
|
| REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" |
| cd "$REPO_DIR" |
|
|
| echo "" |
| echo "βββββββββββββββββββββββββββββββββββββββββββββββββββ" |
| echo " URAAS Deployment β $(date +%Y-%m-%d)" |
| echo "βββββββββββββββββββββββββββββββββββββββββββββββββββ" |
|
|
| |
| 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 |
|
|
| |
| if [ ! -f .env.prod ]; then |
| echo "" |
| echo "βΆ Creating .env.prod from example..." |
| cp .env.prod.example .env.prod |
|
|
| |
| 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 |
|
|
| |
| 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 |
|
|
| |
| 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 |
|
|
| |
| mkdir -p storage/pdfs data logs backups nginx/ssl |
|
|
| |
| echo "" |
| echo "βΆ Building and starting containers (this takes ~3 min first time)..." |
| echo "" |
| |
| |
| docker compose --env-file .env.prod -f docker-compose.demo.yml up --build -d |
|
|
| |
| 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 |
|
|
| |
| 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 "βββββββββββββββββββββββββββββββββββββββββββββββββββ" |
|
|