Add start-all script
This commit is contained in:
@@ -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..."
|
||||||
Reference in New Issue
Block a user