Add start-all script

This commit is contained in:
2026-05-26 19:43:14 +00:00
parent a7b52614c6
commit bd76824c2a
+134
View File
@@ -0,0 +1,134 @@
#!/bin/bash
# Start all AfakZaid RAG containers
# Run after: bash scripts/gen-secrets.sh
set -e
source /opt/rag/.secrets
# Detect Docker gateway IP (host IP from inside containers)
HOST_IP=$(docker network inspect rag-net --format='{{range .IPAM.Config}}{{.Gateway}}{{end}}' 2>/dev/null | head -1)
if [ -z "$HOST_IP" ]; then
docker network create rag-net
HOST_IP=$(docker network inspect rag-net --format='{{range .IPAM.Config}}{{.Gateway}}{{end}}' | head -1)
fi
echo "Host IP: $HOST_IP"
# PostgreSQL
docker run -d --name rag-postgres --network rag-net \
-e POSTGRES_DB=ragdb -e POSTGRES_USER=raguser \
-e POSTGRES_PASSWORD=rag_secure_2025 \
-v rag-pgdata:/var/lib/postgresql/data \
--restart unless-stopped postgres:15-alpine
echo "PostgreSQL started"
sleep 8
# Restore DB if dump exists
if [ -f /tmp/ragdb.sql ]; then
cat /tmp/ragdb.sql | docker exec -i rag-postgres psql -U raguser -d ragdb
echo "Database restored from /tmp/ragdb.sql"
fi
# Redis
docker run -d --name rag-redis --network rag-net \
--restart unless-stopped redis:7-alpine \
redis-server --requirepass "${REDIS_PASSWORD}" --appendonly yes
echo "Redis started"
sleep 3
# Qdrant
mkdir -p /opt/qdrant/storage
docker run -d --name qdrant --network rag-net \
-e QDRANT__SERVICE__API_KEY="${QDRANT_API_KEY}" \
-v /opt/qdrant/storage:/qdrant/storage \
--restart unless-stopped qdrant/qdrant:latest
echo "Qdrant started"
sleep 8
# Restore Qdrant snapshots if they exist
if [ -f /tmp/qdrant_chunks.snapshot ]; then
curl -s -X PUT "http://localhost:6333/collections/rag_chunks/snapshots/upload?priority=snapshot" \
-H "api-key: ${QDRANT_API_KEY}" \
-H "Content-Type: multipart/form-data" \
-F "snapshot=@/tmp/qdrant_chunks.snapshot"
echo "Qdrant chunks restored"
fi
# Typesense
mkdir -p /opt/typesense/data
docker run -d --name typesense --network rag-net \
-e TYPESENSE_API_KEY="${TYPESENSE_API_KEY}" \
-e TYPESENSE_DATA_DIR=/data \
-v /opt/typesense/data:/data \
--restart unless-stopped typesense/typesense:0.25.2 \
--data-dir /data --api-key "${TYPESENSE_API_KEY}" --enable-cors
echo "Typesense started"
sleep 5
PG_URL="postgresql://raguser:rag_secure_2025@rag-postgres:5432/ragdb"
COMMON_ENV="-e POSTGRES_URL=${PG_URL}
-e REDIS_URL=redis://rag-redis:6379
-e REDIS_PASSWORD=${REDIS_PASSWORD}
-e QDRANT_URL=http://qdrant:6333
-e QDRANT_API_KEY=${QDRANT_API_KEY}
-e OLLAMA_URL=http://${HOST_IP}:11434
-e RAG_API_KEY=${RAG_API_KEY}
-e ADMIN_KEY=${ADMIN_KEY}
-e JWT_SECRET=${JWT_SECRET}
-e TYPESENSE_HOST=typesense
-e TYPESENSE_PORT=8108
-e TYPESENSE_API_KEY=${TYPESENSE_API_KEY}
-e CELERY_BROKER_URL=${CELERY_BROKER_URL}
-e R2_ENDPOINT=${R2_ENDPOINT}
-e R2_ACCESS_KEY=${R2_ACCESS_KEY}
-e R2_SECRET_KEY=${R2_SECRET_KEY}
-e R2_BUCKET=${R2_BUCKET}
-e R2_PUBLIC_URL=${R2_PUBLIC_URL}"
# RAG API
docker run -d --name rag-api --network rag-net \
-v /opt/rag:/opt/rag -v /mnt/rag-media:/mnt/rag-media \
$COMMON_ENV -p 8100:8100 --restart unless-stopped \
rag-api-img:secure
echo "RAG API started"
sleep 20
# Celery worker
docker run -d --name rag-celery --network rag-net \
-v /opt/rag:/opt/rag -v /mnt/rag-media:/mnt/rag-media \
$COMMON_ENV -w /opt/rag --restart unless-stopped \
rag-api-img:secure \
python3 -m celery -A tasks worker --loglevel=info --concurrency=2
echo "Celery started"
# Flower
docker run -d --name rag-flower --network rag-net \
-v /opt/rag:/opt/rag $COMMON_ENV -w /opt/rag \
--restart unless-stopped \
rag-api-img:secure \
python3 -m celery -A tasks flower --port=5555 \
--basic_auth="${FLOWER_USER}:${FLOWER_PASSWORD}"
echo "Flower started"
# Firewall: block internal service ports
EXT_IF=$(ip route get 8.8.8.8 2>/dev/null | grep -o 'dev [^ ]*' | cut -d' ' -f2)
for PORT in 5432 6333 6379 8108 5555; do
iptables -I DOCKER-USER -i $EXT_IF -p tcp --dport $PORT -j DROP 2>/dev/null || true
done
iptables-save > /etc/iptables/rules.v4 2>/dev/null || true
# Rebuild Typesense index
sleep 10
docker exec rag-api python3 -c "
import sys; sys.path.insert(0,'/opt/rag')
from typesense_client import index_all_books
n = index_all_books()
print(f'Typesense: {n} books indexed')
" 2>/dev/null || true
echo ""
echo "=== All services started ==="
docker ps --format "{{.Names}}: {{.Status}}" | grep -E "rag|qdrant|typesense"
echo ""
echo "Health check:"
sleep 5
curl -s http://localhost:8100/stats || echo "API warming up..."