mirror of
https://github.com/dograh-hq/dograh.git
synced 2026-06-10 08:05:22 +02:00
chore: refactor setup scrpts (#288)
* refactor setup scrpts * update docker compose to use dograh-init * avoid creating unnecessary conf files * fix local setup script * add agents.md
This commit is contained in:
parent
4ff1f576f0
commit
87699f2dee
18 changed files with 1321 additions and 1178 deletions
|
|
@ -1,5 +1,5 @@
|
|||
#!/bin/bash
|
||||
set -e
|
||||
set -euo pipefail
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
|
|
@ -8,6 +8,26 @@ YELLOW='\033[1;33m'
|
|||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
LIB_PATH="$SCRIPT_DIR/lib/setup_common.sh"
|
||||
BOOTSTRAP_LIB=""
|
||||
|
||||
if [[ ! -f "$LIB_PATH" ]]; then
|
||||
BOOTSTRAP_LIB="$(mktemp)"
|
||||
curl -fsSL -o "$BOOTSTRAP_LIB" "https://raw.githubusercontent.com/dograh-hq/dograh/main/scripts/lib/setup_common.sh"
|
||||
LIB_PATH="$BOOTSTRAP_LIB"
|
||||
fi
|
||||
|
||||
cleanup() {
|
||||
if [[ -n "$BOOTSTRAP_LIB" ]]; then
|
||||
rm -f "$BOOTSTRAP_LIB"
|
||||
fi
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
# shellcheck disable=SC1090
|
||||
. "$LIB_PATH"
|
||||
|
||||
echo -e "${BLUE}"
|
||||
echo "╔══════════════════════════════════════════════════════════════╗"
|
||||
echo "║ Dograh Remote Setup ║"
|
||||
|
|
@ -16,24 +36,21 @@ echo "╚═══════════════════════
|
|||
echo -e "${NC}"
|
||||
|
||||
# Get the public IP address (skip prompt if SERVER_IP is already set)
|
||||
if [[ -z "$SERVER_IP" ]]; then
|
||||
if [[ -z "${SERVER_IP:-}" ]]; then
|
||||
echo -e "${YELLOW}Enter your server's public IP address:${NC}"
|
||||
read -p "> " SERVER_IP
|
||||
fi
|
||||
|
||||
if [[ -z "$SERVER_IP" ]]; then
|
||||
echo -e "${RED}Error: IP address cannot be empty${NC}"
|
||||
exit 1
|
||||
dograh_fail "IP address cannot be empty"
|
||||
fi
|
||||
|
||||
# Validate IP address format (basic validation)
|
||||
if ! [[ "$SERVER_IP" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
||||
echo -e "${RED}Error: Invalid IP address format${NC}"
|
||||
exit 1
|
||||
if ! dograh_is_ipv4 "$SERVER_IP"; then
|
||||
dograh_fail "Invalid IP address format"
|
||||
fi
|
||||
|
||||
# Get the TURN secret (skip prompt if TURN_SECRET is already set)
|
||||
if [[ -z "$TURN_SECRET" ]]; then
|
||||
if [[ -z "${TURN_SECRET:-}" ]]; then
|
||||
echo -e "${YELLOW}Enter a shared secret for the TURN server (press Enter to generate a random one):${NC}"
|
||||
read -sp "> " TURN_SECRET
|
||||
echo ""
|
||||
|
|
@ -45,10 +62,8 @@ if [[ -z "$TURN_SECRET" ]]; then
|
|||
fi
|
||||
|
||||
# Deployment mode. Skip prompt if DEPLOY_MODE is already set. Non-interactive
|
||||
# callers (cloud-init, CI, terraform) without a TTY default to "prebuilt" so
|
||||
# existing automation keeps working without changes - explicitly set
|
||||
# DEPLOY_MODE=build to opt into source builds from a non-interactive context.
|
||||
if [[ -z "$DEPLOY_MODE" ]]; then
|
||||
# callers without a TTY default to "prebuilt" to keep automation stable.
|
||||
if [[ -z "${DEPLOY_MODE:-}" ]]; then
|
||||
if [[ -t 0 ]]; then
|
||||
echo ""
|
||||
echo -e "${YELLOW}Deployment mode:${NC}"
|
||||
|
|
@ -58,19 +73,16 @@ if [[ -z "$DEPLOY_MODE" ]]; then
|
|||
mode_choice="${mode_choice:-1}"
|
||||
case "$mode_choice" in
|
||||
1|prebuilt) DEPLOY_MODE="prebuilt" ;;
|
||||
2|build) DEPLOY_MODE="build" ;;
|
||||
*) echo -e "${RED}Error: invalid choice '$mode_choice'${NC}"; exit 1 ;;
|
||||
2|build) DEPLOY_MODE="build" ;;
|
||||
*) dograh_fail "invalid choice '$mode_choice'" ;;
|
||||
esac
|
||||
else
|
||||
DEPLOY_MODE="prebuilt"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Build mode needs source code - either use existing repo or clone fresh.
|
||||
# Same TTY rule: prompt interactively, otherwise pick sensible defaults so
|
||||
# automation that sets DEPLOY_MODE=build doesn't need to spell everything out.
|
||||
if [[ "$DEPLOY_MODE" == "build" ]]; then
|
||||
if [[ -z "$REPO_SOURCE" ]]; then
|
||||
if [[ -z "${REPO_SOURCE:-}" ]]; then
|
||||
if [[ -d ".git" ]] && [[ -f "docker-compose.yaml" ]]; then
|
||||
if [[ -t 0 ]]; then
|
||||
echo ""
|
||||
|
|
@ -91,7 +103,7 @@ if [[ "$DEPLOY_MODE" == "build" ]]; then
|
|||
fi
|
||||
|
||||
if [[ "$REPO_SOURCE" == "clone" ]]; then
|
||||
if [[ -z "$FORK_REPO" ]]; then
|
||||
if [[ -z "${FORK_REPO:-}" ]]; then
|
||||
if [[ -t 0 ]]; then
|
||||
echo ""
|
||||
echo -e "${YELLOW}GitHub repo to clone (format: owner/name):${NC}"
|
||||
|
|
@ -101,7 +113,8 @@ if [[ "$DEPLOY_MODE" == "build" ]]; then
|
|||
FORK_REPO="dograh-hq/dograh"
|
||||
fi
|
||||
fi
|
||||
if [[ -z "$BRANCH" ]]; then
|
||||
|
||||
if [[ -z "${BRANCH:-}" ]]; then
|
||||
if [[ -t 0 ]]; then
|
||||
echo -e "${YELLOW}Branch:${NC}"
|
||||
read -p "[main]: " BRANCH
|
||||
|
|
@ -113,13 +126,9 @@ if [[ "$DEPLOY_MODE" == "build" ]]; then
|
|||
fi
|
||||
fi
|
||||
|
||||
# Telemetry opt-out (default: true)
|
||||
ENABLE_TELEMETRY="${ENABLE_TELEMETRY:-true}"
|
||||
FASTAPI_WORKERS="${FASTAPI_WORKERS:-}"
|
||||
|
||||
# Number of uvicorn worker processes. Each runs as its own process on a
|
||||
# distinct port (8000, 8001, ...) and nginx balances across them with
|
||||
# least_conn. Better than uvicorn --workers for long-lived WebSocket
|
||||
# connections, which would otherwise stick to whichever worker accepted them.
|
||||
if [[ -z "$FASTAPI_WORKERS" ]]; then
|
||||
if [[ -t 0 ]]; then
|
||||
echo ""
|
||||
|
|
@ -131,26 +140,15 @@ if [[ -z "$FASTAPI_WORKERS" ]]; then
|
|||
fi
|
||||
fi
|
||||
|
||||
if ! [[ "$FASTAPI_WORKERS" =~ ^[1-9][0-9]*$ ]]; then
|
||||
echo -e "${RED}Error: FASTAPI_WORKERS must be a positive integer (got: $FASTAPI_WORKERS)${NC}"
|
||||
exit 1
|
||||
fi
|
||||
[[ "$FASTAPI_WORKERS" =~ ^[1-9][0-9]*$ ]] || dograh_fail "FASTAPI_WORKERS must be a positive integer (got: $FASTAPI_WORKERS)"
|
||||
|
||||
# Where setup artifacts (.env, certs, nginx.conf, etc.) will land. Build mode
|
||||
# with an existing repo writes them next to docker-compose.yaml in cwd;
|
||||
# everything else writes into a fresh dograh/ subdirectory.
|
||||
if [[ "$DEPLOY_MODE" == "build" && "$REPO_SOURCE" == "existing" ]]; then
|
||||
if [[ "$DEPLOY_MODE" == "build" && "${REPO_SOURCE:-}" == "existing" ]]; then
|
||||
TARGET_DIR="."
|
||||
else
|
||||
TARGET_DIR="dograh"
|
||||
fi
|
||||
|
||||
# Refuse to overwrite an existing install - re-running this script would
|
||||
# regenerate OSS_JWT_SECRET (invalidating logged-in sessions), reset the
|
||||
# TURN secret (breaking WebRTC auth), and overwrite nginx.conf customizations.
|
||||
# Set DOGRAH_FORCE_OVERWRITE=1 to bypass; DOGRAH_SKIP_DOWNLOAD=1 (used by e2e)
|
||||
# also bypasses since those flows manage state themselves.
|
||||
if [[ "$DOGRAH_FORCE_OVERWRITE" != "1" && "$DOGRAH_SKIP_DOWNLOAD" != "1" ]]; then
|
||||
if [[ "${DOGRAH_FORCE_OVERWRITE:-}" != "1" && "${DOGRAH_SKIP_DOWNLOAD:-}" != "1" ]]; then
|
||||
if [[ -f "$TARGET_DIR/.env" ]]; then
|
||||
if [[ "$TARGET_DIR" == "." ]]; then
|
||||
existing_path="$(pwd)/.env"
|
||||
|
|
@ -164,7 +162,7 @@ if [[ "$DOGRAH_FORCE_OVERWRITE" != "1" && "$DOGRAH_SKIP_DOWNLOAD" != "1" ]]; the
|
|||
echo -e "${RED}Refusing to continue - re-running setup would:${NC}"
|
||||
echo -e "${RED} - overwrite .env (invalidates sessions, breaks TURN auth)${NC}"
|
||||
echo -e "${RED} - regenerate SSL certificates${NC}"
|
||||
echo -e "${RED} - reset nginx.conf and turnserver.conf customizations${NC}"
|
||||
echo -e "${RED} - replace the validated remote deployment bundle${NC}"
|
||||
echo ""
|
||||
echo -e "${BLUE}To upgrade an existing install, follow:${NC}"
|
||||
echo -e " ${BLUE}https://docs.dograh.com/deployment/update${NC}"
|
||||
|
|
@ -176,11 +174,10 @@ if [[ "$DOGRAH_FORCE_OVERWRITE" != "1" && "$DOGRAH_SKIP_DOWNLOAD" != "1" ]]; the
|
|||
fi
|
||||
fi
|
||||
|
||||
# Total step count depends on mode (build adds the override-file step)
|
||||
if [[ "$DEPLOY_MODE" == "build" ]]; then
|
||||
TOTAL=7
|
||||
else
|
||||
TOTAL=6
|
||||
else
|
||||
TOTAL=5
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
|
@ -190,24 +187,20 @@ echo -e " TURN Secret: ${BLUE}********${NC}"
|
|||
echo -e " Deploy mode: ${BLUE}$DEPLOY_MODE${NC}"
|
||||
echo -e " FastAPI workers: ${BLUE}$FASTAPI_WORKERS${NC} (ports 8000..$((8000 + FASTAPI_WORKERS - 1)))"
|
||||
if [[ "$DEPLOY_MODE" == "build" ]]; then
|
||||
if [[ "$REPO_SOURCE" == "clone" ]]; then
|
||||
echo -e " Source: ${BLUE}clone $FORK_REPO@$BRANCH${NC}"
|
||||
if [[ "${REPO_SOURCE:-}" == "clone" ]]; then
|
||||
echo -e " Source: ${BLUE}clone $FORK_REPO@$BRANCH${NC}"
|
||||
else
|
||||
echo -e " Source: ${BLUE}existing repo at $(pwd)${NC}"
|
||||
echo -e " Source: ${BLUE}existing repo at $(pwd)${NC}"
|
||||
fi
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# Step 1: get the source - either the standalone compose file (prebuilt mode)
|
||||
# or the full repo (build mode). Skip the download/clone when
|
||||
# DOGRAH_SKIP_DOWNLOAD=1 (e.g. e2e tests that already have everything in place).
|
||||
if [[ "$DEPLOY_MODE" == "build" ]]; then
|
||||
if [[ "$DOGRAH_SKIP_DOWNLOAD" == "1" ]]; then
|
||||
if [[ "${DOGRAH_SKIP_DOWNLOAD:-}" == "1" ]]; then
|
||||
echo -e "${BLUE}[1/$TOTAL] Using existing repo in current directory${NC}"
|
||||
elif [[ "$REPO_SOURCE" == "clone" ]]; then
|
||||
elif [[ "${REPO_SOURCE:-}" == "clone" ]]; then
|
||||
if [[ -e "dograh" ]]; then
|
||||
echo -e "${RED}Error: 'dograh' directory already exists. Remove it or re-run with REPO_SOURCE=existing from inside it.${NC}"
|
||||
exit 1
|
||||
dograh_fail "'dograh' directory already exists. Remove it or re-run with REPO_SOURCE=existing from inside it."
|
||||
fi
|
||||
echo -e "${BLUE}[1/$TOTAL] Cloning $FORK_REPO (branch: $BRANCH)...${NC}"
|
||||
git clone --branch "$BRANCH" --recurse-submodules "https://github.com/$FORK_REPO.git" dograh
|
||||
|
|
@ -217,123 +210,26 @@ if [[ "$DEPLOY_MODE" == "build" ]]; then
|
|||
echo -e "${BLUE}[1/$TOTAL] Using existing repo at $(pwd)${NC}"
|
||||
fi
|
||||
else
|
||||
if [[ "$DOGRAH_SKIP_DOWNLOAD" != "1" ]]; then
|
||||
if [[ "${DOGRAH_SKIP_DOWNLOAD:-}" != "1" ]]; then
|
||||
mkdir -p dograh 2>/dev/null || true
|
||||
cd dograh
|
||||
|
||||
echo -e "${BLUE}[1/$TOTAL] Downloading docker-compose.yaml...${NC}"
|
||||
curl -sS -o docker-compose.yaml https://raw.githubusercontent.com/dograh-hq/dograh/main/docker-compose.yaml
|
||||
echo -e "${GREEN}✓ docker-compose.yaml downloaded${NC}"
|
||||
echo -e "${BLUE}[1/$TOTAL] Downloading deployment bundle...${NC}"
|
||||
curl -fsSL -o docker-compose.yaml "https://raw.githubusercontent.com/dograh-hq/dograh/main/docker-compose.yaml"
|
||||
dograh_download_remote_support_bundle "$(pwd)" "main"
|
||||
echo -e "${GREEN}✓ Deployment bundle downloaded${NC}"
|
||||
else
|
||||
echo -e "${BLUE}[1/$TOTAL] Using docker-compose.yaml in current directory${NC}"
|
||||
echo -e "${BLUE}[1/$TOTAL] Using deployment files in current directory${NC}"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo -e "${BLUE}[2/$TOTAL] Creating nginx.conf...${NC}"
|
||||
# Build the upstream block first (needs shell interpolation for the server
|
||||
# lines), then append the static server blocks via a quoted heredoc. The
|
||||
# SERVER_IP_PLACEHOLDER gets replaced by sed below.
|
||||
{
|
||||
echo "# Backend API workers — one uvicorn process per port, balanced by least_conn."
|
||||
echo "# Generated by setup_remote.sh; regenerate to change worker count."
|
||||
echo "upstream dograh_api {"
|
||||
echo " least_conn;"
|
||||
for ((i=0; i<FASTAPI_WORKERS; i++)); do
|
||||
port=$((8000 + i))
|
||||
echo " server api:$port max_fails=3 fail_timeout=10s;"
|
||||
done
|
||||
echo " keepalive 32;"
|
||||
echo "}"
|
||||
echo ""
|
||||
cat << 'NGINX_EOF'
|
||||
server {
|
||||
listen 80;
|
||||
server_name SERVER_IP_PLACEHOLDER;
|
||||
DOGRAH_DEPLOY_PROJECT_DIR="$(pwd)"
|
||||
|
||||
# Redirect all HTTP to HTTPS
|
||||
return 301 https://$host$request_uri;
|
||||
}
|
||||
if [[ "$DEPLOY_MODE" != "prebuilt" ]]; then
|
||||
chmod +x remote_up.sh
|
||||
fi
|
||||
|
||||
server {
|
||||
listen 443 ssl;
|
||||
server_name SERVER_IP_PLACEHOLDER;
|
||||
|
||||
ssl_certificate /etc/nginx/certs/local.crt;
|
||||
ssl_certificate_key /etc/nginx/certs/local.key;
|
||||
|
||||
# Basic TLS settings
|
||||
ssl_protocols TLSv1.2 TLSv1.3;
|
||||
ssl_prefer_server_ciphers on;
|
||||
|
||||
# Backend API and WebSockets - bypass the UI, go straight to the
|
||||
# api workers via the least_conn upstream defined above.
|
||||
location /api/v1/ {
|
||||
proxy_pass http://dograh_api;
|
||||
proxy_http_version 1.1;
|
||||
|
||||
# Retry on a dead/restarting worker
|
||||
proxy_next_upstream error timeout http_502 http_503 http_504;
|
||||
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto https;
|
||||
|
||||
# Long-lived WebSockets (audio streaming, signaling)
|
||||
proxy_read_timeout 3600s;
|
||||
proxy_send_timeout 3600s;
|
||||
|
||||
# Don't buffer streamed responses
|
||||
proxy_buffering off;
|
||||
client_max_body_size 100M;
|
||||
}
|
||||
|
||||
location / {
|
||||
proxy_pass http://ui:3010;
|
||||
proxy_http_version 1.1;
|
||||
|
||||
# Important for WebSockets / hot reload etc.
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto https;
|
||||
|
||||
# Rewrite localhost MinIO URLs in API responses to use current domain
|
||||
sub_filter 'http://localhost:9000/voice-audio/' 'https://$host/voice-audio/';
|
||||
sub_filter_once off;
|
||||
sub_filter_types application/json text/html;
|
||||
}
|
||||
|
||||
location /voice-audio/ {
|
||||
proxy_pass http://minio:9000/voice-audio/;
|
||||
|
||||
proxy_http_version 1.1;
|
||||
|
||||
# Headers for file downloads from MinIO
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto https;
|
||||
|
||||
# Allow large file downloads
|
||||
proxy_buffering off;
|
||||
client_max_body_size 100M;
|
||||
}
|
||||
}
|
||||
NGINX_EOF
|
||||
} > nginx.conf
|
||||
|
||||
# Replace placeholder with actual IP
|
||||
sed -i.bak "s/SERVER_IP_PLACEHOLDER/$SERVER_IP/g" nginx.conf && rm -f nginx.conf.bak
|
||||
echo -e "${GREEN}✓ nginx.conf created${NC}"
|
||||
|
||||
echo -e "${BLUE}[3/$TOTAL] Creating SSL certificate generation script...${NC}"
|
||||
echo -e "${BLUE}[2/$TOTAL] Creating SSL certificate generation script...${NC}"
|
||||
cat > generate_certificate.sh << CERT_EOF
|
||||
#!/bin/bash
|
||||
mkdir -p certs
|
||||
|
|
@ -346,50 +242,22 @@ CERT_EOF
|
|||
chmod +x generate_certificate.sh
|
||||
echo -e "${GREEN}✓ generate_certificate.sh created${NC}"
|
||||
|
||||
echo -e "${BLUE}[4/$TOTAL] Generating SSL certificates...${NC}"
|
||||
echo -e "${BLUE}[3/$TOTAL] Generating SSL certificates...${NC}"
|
||||
./generate_certificate.sh
|
||||
echo -e "${GREEN}✓ SSL certificates generated${NC}"
|
||||
|
||||
echo -e "${BLUE}[5/$TOTAL] Creating TURN server configuration...${NC}"
|
||||
cat > turnserver.conf << TURN_EOF
|
||||
# Coturn TURN Server - Docker Configuration
|
||||
# Auto-generated by setup_remote.sh
|
||||
|
||||
# Listener ports
|
||||
listening-port=3478
|
||||
tls-listening-port=5349
|
||||
|
||||
# Relay port range
|
||||
min-port=49152
|
||||
max-port=49200
|
||||
|
||||
# Network - external IP for NAT traversal
|
||||
external-ip=$SERVER_IP
|
||||
|
||||
# Realm
|
||||
realm=dograh.com
|
||||
|
||||
# Authentication (TURN REST API with time-limited credentials)
|
||||
use-auth-secret
|
||||
static-auth-secret=$TURN_SECRET
|
||||
|
||||
# Security
|
||||
fingerprint
|
||||
no-cli
|
||||
no-multicast-peers
|
||||
|
||||
# Logging
|
||||
log-file=stdout
|
||||
TURN_EOF
|
||||
echo -e "${GREEN}✓ turnserver.conf created${NC}"
|
||||
|
||||
echo -e "${BLUE}[6/$TOTAL] Creating environment file...${NC}"
|
||||
echo -e "${BLUE}[4/$TOTAL] Creating environment file...${NC}"
|
||||
OSS_JWT_SECRET=$(openssl rand -hex 32)
|
||||
|
||||
cat > .env << ENV_EOF
|
||||
# Change environment from local to production so that coturn filters local IPs
|
||||
ENVIRONMENT=production
|
||||
|
||||
# Canonical public host/base URL for this install.
|
||||
SERVER_IP=$SERVER_IP
|
||||
PUBLIC_HOST=$SERVER_IP
|
||||
PUBLIC_BASE_URL=https://$SERVER_IP
|
||||
|
||||
# Backend API endpoint (public URL the backend uses to build webhook/embed links)
|
||||
BACKEND_API_ENDPOINT=https://$SERVER_IP
|
||||
|
||||
|
|
@ -407,18 +275,16 @@ OSS_JWT_SECRET=$OSS_JWT_SECRET
|
|||
ENABLE_TELEMETRY=$ENABLE_TELEMETRY
|
||||
|
||||
# Number of uvicorn worker processes; nginx load-balances across them
|
||||
# (ports 8000..$((8000 + FASTAPI_WORKERS - 1))) with least_conn.
|
||||
# Must match the upstream block in nginx.conf — re-run setup_remote.sh
|
||||
# (with DOGRAH_FORCE_OVERWRITE=1) to change.
|
||||
FASTAPI_WORKERS=$FASTAPI_WORKERS
|
||||
ENV_EOF
|
||||
echo -e "${GREEN}✓ .env file created${NC}"
|
||||
|
||||
# In build mode, write the override file that swaps prebuilt images for
|
||||
# local builds. Compose auto-loads docker-compose.override.yaml, so no -f flag
|
||||
# is needed at runtime.
|
||||
echo -e "${BLUE}[5/$TOTAL] Validating remote init configuration...${NC}"
|
||||
dograh_prepare_remote_install "$(pwd)"
|
||||
echo -e "${GREEN}✓ Remote init configuration validated${NC}"
|
||||
|
||||
if [[ "$DEPLOY_MODE" == "build" ]]; then
|
||||
echo -e "${BLUE}[7/$TOTAL] Creating docker-compose.override.yaml...${NC}"
|
||||
echo -e "${BLUE}[6/$TOTAL] Creating docker-compose.override.yaml...${NC}"
|
||||
cat > docker-compose.override.yaml << 'OVERRIDE_EOF'
|
||||
# Auto-generated by setup_remote.sh (build mode).
|
||||
# Overrides docker-compose.yaml to build api and ui images from local source
|
||||
|
|
@ -452,8 +318,9 @@ echo " - docker-compose.yaml"
|
|||
if [[ "$DEPLOY_MODE" == "build" ]]; then
|
||||
echo " - docker-compose.override.yaml (build directives)"
|
||||
fi
|
||||
echo " - nginx.conf"
|
||||
echo " - turnserver.conf"
|
||||
echo " - remote_up.sh"
|
||||
echo " - scripts/run_dograh_init.sh"
|
||||
echo " - deploy/templates/"
|
||||
echo " - generate_certificate.sh"
|
||||
echo " - certs/local.crt"
|
||||
echo " - certs/local.key"
|
||||
|
|
@ -461,28 +328,17 @@ echo " - .env"
|
|||
echo ""
|
||||
echo -e "${YELLOW}To start Dograh, run:${NC}"
|
||||
echo ""
|
||||
# The script's own cd into dograh/ doesn't persist to the user's shell, so
|
||||
# remind them to cd themselves — except when they're already there (build mode
|
||||
# with REPO_SOURCE=existing, which writes into cwd).
|
||||
if [[ "$DEPLOY_MODE" != "build" || "$REPO_SOURCE" != "existing" ]]; then
|
||||
if [[ "$DEPLOY_MODE" != "build" || "${REPO_SOURCE:-}" != "existing" ]]; then
|
||||
echo -e " ${BLUE}cd $(pwd)${NC}"
|
||||
fi
|
||||
if [[ "$DEPLOY_MODE" == "build" ]]; then
|
||||
echo -e " ${BLUE}sudo docker compose --profile remote up -d --build${NC}"
|
||||
echo -e " ${BLUE}./remote_up.sh --build${NC}"
|
||||
echo ""
|
||||
echo -e "${YELLOW}A docker-compose.override.yaml has been created alongside${NC}"
|
||||
echo -e "${YELLOW}docker-compose.yaml. Compose auto-loads it, so no -f flag is${NC}"
|
||||
echo -e "${YELLOW}needed — it swaps the prebuilt images for local builds.${NC}"
|
||||
echo ""
|
||||
echo -e "${YELLOW}The first build can take several minutes${NC}"
|
||||
echo -e "${YELLOW}(downloading base images, installing dependencies).${NC}"
|
||||
echo -e "${YELLOW}If you know how to speed this up, we would love a pull request.${NC}"
|
||||
echo ""
|
||||
echo -e "${YELLOW}To rebuild after editing api/ or ui/ code:${NC}"
|
||||
echo ""
|
||||
echo -e " ${BLUE}sudo docker compose --profile remote build && sudo docker compose --profile remote up -d${NC}"
|
||||
else
|
||||
echo -e " ${BLUE}sudo docker compose --profile remote up --pull always${NC}"
|
||||
echo -e " ${BLUE}./remote_up.sh${NC}"
|
||||
fi
|
||||
echo ""
|
||||
echo -e "${YELLOW}Your application will be available at:${NC}"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue