Skip to content

Commit 00d8a8e

Browse files
committed
#deploy-to-prod
1 parent 1ba4b6e commit 00d8a8e

1 file changed

Lines changed: 37 additions & 39 deletions

File tree

.github/workflows/deploy_to_aws.yml

Lines changed: 37 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)