@@ -44,40 +44,33 @@ jobs:
4444
4545 - name : SSH into EC2 and restart Docker
4646 run : |
47- ssh -o StrictHostKeyChecking=no -i ec2-key.pem ec2-user@ec2-${{ secrets.AWS_EC2_PUBLIC_IP_WITH_DASHES }}.compute-1.amazonaws.com << 'EOF'
47+ ssh -o StrictHostKeyChecking=no -i ec2-key.pem ec2-user@ec2-${{ secrets.AWS_EC2_PUBLIC_IP_WITH_DASHES }}.compute-1.amazonaws.com <<'REMOTE'
48+ set -euo pipefail
4849
49- # Stop and remove everything
50- docker stop $(docker ps -aq)
51- docker rm $(docker ps -aq)
50+ docker ps -aq | xargs -r docker stop
51+ docker ps -aq | xargs -r docker rm
52+ docker network rm failures-prod || true
5253
53- # Setup environment variables
54- export DJANGO_ALLOWED_HOSTS="softwarefailures.com,$(ifconfig enX0 | grep 'inet ' | awk '{print $2}'),$(curl -s http://checkip.amazonaws.com)"
55- export REDIS_URL=redis://redis:6379/0
54+ export DJANGO_ALLOWED_HOSTS="softwarefailures.com,ec2-${{ secrets.AWS_EC2_PUBLIC_IP_WITH_DASHES }}.compute-1.amazonaws.com,localhost,127.0.0.1"
55+ export REDIS_URL="redis://redis:6379/0"
5656 export CELERY_BROKER_URL="${REDIS_URL}"
57- export $(aws secretsmanager get-secret-value --secret-id prod/failure/postgres --region us-east-1 --query SecretString --output text | jq -r '. as $secret | "POSTGRES_HOST=\($secret | .host)\nPOSTGRES_PORT=5432\nPOSTGRES_DB=\($secret | .dbname)\nPOSTGRES_USER=\($secret | .username)\nPOSTGRES_PASSWORD=\($secret | .password)\nDATABASE_URL=postgres://\($secret | .username):\($secret | .password)@\($secret | .host):5432/\($secret | .dbname)"')
57+ export DJANGO_SECRET_KEY='${{ secrets.DJANGO_SECRET_KEY }}'
58+ export DJANGO_ADMIN_URL='${{ secrets.DJANGO_ADMIN_URL }}'
5859 export OPENAI_API_KEY='${{ secrets.OPENAI_API_KEY }}'
59- export CHAINLIT_DB_URI="${DATABASE_URL}"
60+ export CHAINLIT_AUTH_SECRET='${{ secrets.CHAINLIT_AUTH_SECRET }}'
61+
62+ export $(aws secretsmanager get-secret-value --secret-id prod/failure/postgres --region us-east-1 --query SecretString --output text | jq -r '. as $s | "POSTGRES_HOST=\($s.host)\nPOSTGRES_PORT=5432\nPOSTGRES_DB=\($s.dbname)\nPOSTGRES_USER=\($s.username)\nPOSTGRES_PASSWORD=\($s.password)\nDATABASE_URL=postgres://\($s.username):\($s.password)@\($s.host):5432/\($s.dbname)"')
6063 export CHAINLIT_DATABASE_URL="${DATABASE_URL/postgres:\/\//postgresql://}"
61- export DJANGO_SECRET_KEY='test'
62- export DJANGO_ADMIN_URL='admin/'
63- export CHAINLIT_AUTH_SECRET="0,uZEoYlN7auIrSf1F%7mm/6@n9:ubHDb36Z31L9vhY^2uzr4eiZGzQpMpK:%K,I"
64- export FAILBOT_REDIRECT_URL='${{ secrets.FAILBOT_REDIRECT_URL }}'
6564
66- # Pull the latest image
6765 aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin ${{ secrets.AWS_ECR_REPOSITORY_URL }}
6866 docker pull ${{ secrets.AWS_ECR_REPOSITORY_URL }}:latest
6967
70- cat > /tmp/failures-nginx.conf << 'NGINX'
68+ cat >/tmp/failures-nginx.conf <<'NGINX'
7169 server {
7270 listen 80;
7371 server_name _;
7472
75- client_max_body_size 50m;
76-
77- location = /failbot {
78- return 301 /failbot/;
79- }
80-
73+ location = /failbot { return 301 /failbot/; }
8174 location /failbot/ {
8275 proxy_pass http://chainlit-prod:8501;
8376 proxy_http_version 1.1;
@@ -101,26 +94,31 @@ jobs:
10194 }
10295 NGINX
10396
104- # Start the container with the new image
105- docker network create failures-prod || true
106- docker volume create failures_chroma_data || true
107- docker run -d --name redis --network failures-prod redis:alpine
108- docker run -d --name chroma --network failures-prod -v failures_chroma_data:/var/lib/chroma/data ghcr.io/chroma-core/chroma:1.0.9 run --host 0.0.0.0 --port 8001 --path /var/lib/chroma/data
109- docker run -d --name django-prod --network failures-prod -e POSTGRES_HOST -e POSTGRES_PORT -e POSTGRES_DB -e POSTGRES_USER -e POSTGRES_PASSWORD -e DATABASE_URL -e REDIS_URL -e CELERY_BROKER_URL -e DJANGO_ALLOWED_HOSTS -e DJANGO_SECRET_KEY -e DJANGO_ADMIN_URL -e FAILBOT_REDIRECT_URL -e OPENAI_API_KEY -e DJANGO_SETTINGS_MODULE=config.settings.production ${{ secrets.AWS_ECR_REPOSITORY_URL }}:latest /start
97+ docker network create failures-prod
98+ docker volume create failures_chroma_data
99+
100+ docker run -d --name redis --restart unless-stopped --network failures-prod redis:alpine
101+ docker run -d --name chroma --restart unless-stopped --network failures-prod -v failures_chroma_data:/var/lib/chroma/data ghcr.io/chroma-core/chroma:1.0.9 run --host 0.0.0.0 --port 8001 --path /var/lib/chroma/data
102+ docker run -d --name django-prod --restart unless-stopped --network failures-prod \
103+ -e POSTGRES_HOST -e POSTGRES_PORT -e POSTGRES_DB -e POSTGRES_USER -e POSTGRES_PASSWORD -e DATABASE_URL \
104+ -e REDIS_URL -e CELERY_BROKER_URL -e DJANGO_ALLOWED_HOSTS -e DJANGO_SECRET_KEY -e DJANGO_ADMIN_URL -e OPENAI_API_KEY \
105+ -e DJANGO_SETTINGS_MODULE=config.settings.production \
106+ ${{ secrets.AWS_ECR_REPOSITORY_URL }}:latest /start
110107
111- # Initial backfill only when collection is empty
112108 sleep 10
113- CHROMA_COUNT=$(docker exec django-prod /bin/sh -lc 'python -c "import sys,pysqlite3; sys.modules[\"sqlite3\"]=sys.modules.pop(\"pysqlite3\"); import chromadb; c=chromadb.HttpClient(host=\"chroma\", port=8001); col= c.get_or_create_collection(\"articlesVDB\"); print(col .count())"')
114- if [ "$CHROMA_COUNT" = "0" ]; then
109+ CHROMA_COUNT=$(docker exec django-prod /bin/sh -lc 'python -c "import sys,pysqlite3; sys.modules[\"sqlite3\"]=sys.modules.pop(\"pysqlite3\"); import chromadb; c=chromadb.HttpClient(host=\"chroma\", port=8001); print( c.get_or_create_collection(\"articlesVDB\").count())"')
110+ if [ "${ CHROMA_COUNT} " = "0" ]; then
115111 docker exec django-prod python -m failures backfillchroma
116112 fi
117113
118- # Start Chainlit after backfill to avoid stale collection handles
119- docker run -d --name chainlit-prod --network failures-prod --cpus 1.0 --memory 2g --memory-swap 2g -w /app/failbot -e POSTGRES_HOST -e POSTGRES_PORT -e POSTGRES_DB -e POSTGRES_USER -e POSTGRES_PASSWORD -e DATABASE_URL="${CHAINLIT_DATABASE_URL}" -e REDIS_URL -e CELERY_BROKER_URL -e DJANGO_SECRET_KEY -e DJANGO_ADMIN_URL -e CHAINLIT_DB_URI="${CHAINLIT_DATABASE_URL}" -e CHAINLIT_AUTH_SECRET -e OPENAI_API_KEY -e DJANGO_SETTINGS_MODULE=config.settings.production -e PYTHONPATH=/app ${{ secrets.AWS_ECR_REPOSITORY_URL }}:latest chainlit run failbotUI.py --port 8501 --host 0.0.0.0 --root-path /failbot
120- docker run -d --name nginx-proxy --network failures-prod -p 80:80 -v /tmp/failures-nginx.conf:/etc/nginx/conf.d/default.conf:ro nginx:alpine
121-
122- # Clean up
123- docker image prune -f --all
124- docker network prune -f
125-
126- EOF
114+ docker run -d --name chainlit-prod --restart unless-stopped --network failures-prod --cpus 1.0 --memory 2g --memory-swap 2g \
115+ -w /app/failbot \
116+ -e POSTGRES_HOST -e POSTGRES_PORT -e POSTGRES_DB -e POSTGRES_USER -e POSTGRES_PASSWORD \
117+ -e DATABASE_URL="${CHAINLIT_DATABASE_URL}" -e REDIS_URL -e CELERY_BROKER_URL \
118+ -e DJANGO_SECRET_KEY -e DJANGO_ADMIN_URL -e CHAINLIT_AUTH_SECRET -e OPENAI_API_KEY \
119+ -e DJANGO_SETTINGS_MODULE=config.settings.production -e PYTHONPATH=/app \
120+ ${{ secrets.AWS_ECR_REPOSITORY_URL }}:latest chainlit run failbotUI.py --port 8501 --host 0.0.0.0 --root-path /failbot
121+
122+ docker run -d --name nginx-proxy --restart unless-stopped --network failures-prod -p 80:80 -v /tmp/failures-nginx.conf:/etc/nginx/conf.d/default.conf:ro nginx:alpine
123+ docker image prune -f
124+ REMOTE
0 commit comments