From 0207e147f17e2ba8f18675746766b46bc65da879 Mon Sep 17 00:00:00 2001 From: timothycarambat <rambat1010@gmail.com> Date: Fri, 14 Jul 2023 09:56:04 -0700 Subject: [PATCH] update CFW launch with no credential option --- aws/cloudformation/DEPLOY.md | 12 +- aws/cloudformation/aws_no_creds.json | 263 +++++++++++++++++++++++++++ 2 files changed, 274 insertions(+), 1 deletion(-) create mode 100644 aws/cloudformation/aws_no_creds.json diff --git a/aws/cloudformation/DEPLOY.md b/aws/cloudformation/DEPLOY.md index 4b0d21e1b..9d739d883 100644 --- a/aws/cloudformation/DEPLOY.md +++ b/aws/cloudformation/DEPLOY.md @@ -2,6 +2,16 @@ With an AWS account you can easily deploy a private AnythingLLM instance on AWS. This will create a url that you can access from any browser over HTTP (HTTPS not supported). This single instance will run on your own keys and they will not be exposed - however if you want your instance to be protected it is highly recommend that you set the `AUTH_TOKEN` and `JWT_SECRET` variables in the `docker/` ENV. +**Quick Launch** +2. Log in to your AWS account +3. Open [CloudFormation](https://us-west-1.console.aws.amazon.com/cloudformation/home) +4. Ensure you are deploying in a geographic zone that is nearest to your physical location to reduce latency. +5. Click `Create Stack` +6. Use the file `aws_no_creds.json` as your JSON template. +7. Launch. On first boot fill out your ENV keys and you are fully live. +Done. + +**Custom Launch** [Refer to .env.example](../../docker/HOW_TO_USE_DOCKER.md) for data format. The output of this cloudformation stack will be: @@ -41,7 +51,7 @@ The output of this cloudformation stack will be: **Note:** Your instance will not be available instantly. Depending on the instance size you launched with it can take anywhere from 10-20 minutes to fully boot up. -If you want to check the instances progress, navigate to [your deployed EC2 instances](https://us-west-1.console.aws.amazon.com/ec2/home) and connect to your instance via SSH in browser. +If you want to check the instance's progress, navigate to [your deployed EC2 instances](https://us-west-1.console.aws.amazon.com/ec2/home) and connect to your instance via SSH in browser. Once connected run `sudo tail -f /var/log/cloud-init-output.log` and wait for the file to conclude deployment of the docker image. You should see an output like this diff --git a/aws/cloudformation/aws_no_creds.json b/aws/cloudformation/aws_no_creds.json new file mode 100644 index 000000000..a96413774 --- /dev/null +++ b/aws/cloudformation/aws_no_creds.json @@ -0,0 +1,263 @@ +{ + "AWSTemplateFormatVersion": "2010-09-09", + "Description": "Create a stack that runs AnythingLLM on a single instance", + "Parameters": { + "InstanceType": { + "Description": "EC2 instance type", + "Type": "String", + "Default": "t2.small" + }, + "InstanceVolume": { + "Description": "Storage size of disk on Instance in GB", + "Type": "Number", + "Default": 10, + "MinValue": 4 + } + }, + "Resources": { + "AnythingLLMInstance": { + "Type": "AWS::EC2::Instance", + "Properties": { + "ImageId": { + "Fn::FindInMap": [ + "Region2AMI", + { + "Ref": "AWS::Region" + }, + "AMI" + ] + }, + "InstanceType": { + "Ref": "InstanceType" + }, + "SecurityGroupIds": [ + { + "Ref": "AnythingLLMInstanceSecurityGroup" + } + ], + "BlockDeviceMappings": [ + { + "DeviceName": { + "Fn::FindInMap": [ + "Region2AMI", + { + "Ref": "AWS::Region" + }, + "RootDeviceName" + ] + }, + "Ebs": { + "VolumeSize": { + "Ref": "InstanceVolume" + } + } + } + ], + "UserData": { + "Fn::Base64": { + "Fn::Join": [ + "", + [ + "Content-Type: multipart/mixed; boundary=\"//\"\n", + "MIME-Version: 1.0\n", + "\n", + "--//\n", + "Content-Type: text/cloud-config; charset=\"us-ascii\"\n", + "MIME-Version: 1.0\n", + "Content-Transfer-Encoding: 7bit\n", + "Content-Disposition: attachment; filename=\"cloud-config.txt\"\n", + "\n", + "\n", + "#cloud-config\n", + "cloud_final_modules:\n", + "- [scripts-user, always]\n", + "\n", + "\n", + "--//\n", + "Content-Type: text/x-shellscript; charset=\"us-ascii\"\n", + "MIME-Version: 1.0\n", + "Content-Transfer-Encoding: 7bit\n", + "Content-Disposition: attachment; filename=\"userdata.txt\"\n", + "\n", + "\n", + "#!/bin/bash\n", + "# check output of userdata script with sudo tail -f /var/log/cloud-init-output.log\n", + "sudo yum install docker -y\n", + "sudo usermod -a -G docker ec2-user\n", + "curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose\n", + "sudo chmod +x /usr/local/bin/docker-compose\n", + "sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose\n", + "sudo systemctl enable docker\n", + "sudo systemctl start docker\n", + "sudo yum install git -y\n", + "git clone https://github.com/Mintplex-Labs/anything-llm.git /home/ec2-user/anything-llm\n", + "cd /home/ec2-user/anything-llm/docker\n", + "cat >> .env << \"END\"\n", + "SERVER_PORT=3001\n", + "OPEN_AI_KEY=\n", + "OPEN_MODEL_PREF='gpt-3.5-turbo'\n", + "CACHE_VECTORS=\"true\"\n", + "VECTOR_DB=\"pinecone\"\n", + "PINECONE_ENVIRONMENT=\n", + "PINECONE_API_KEY=\n", + "PINECONE_INDEX=\n", + "STORAGE_DIR=\"./server/storage\"\n", + "GOOGLE_APIS_KEY=\n", + "UID=\"1000\"\n", + "GID=\"1000\"\n", + "END\n", + "cd ../frontend\n", + "rm -rf .env.production\n", + "cat >> .env.production << \"END\"\n", + "GENERATE_SOURCEMAP=true\n", + "VITE_API_BASE=\"/api\"\n", + "END\n", + "sudo docker-compose -f /home/ec2-user/anything-llm/docker/docker-compose.yml up -d\n", + "echo \"Container ID: $(sudo docker ps --latest --quiet)\"\n", + "sudo docker container exec -u 0 -t $(sudo docker ps --latest --quiet) mkdir -p /app/server/storage /app/server/storage/documents /app/server/storage/vector-cache /app/server/storage/lancedb\n", + "echo \"Placeholder folders in storage created.\"\n", + "sudo docker container exec -u 0 -t $(sudo docker ps --latest --quiet) touch /app/server/storage/anythingllm.db\n", + "echo \"SQLite DB placeholder set.\"\n", + "sudo docker container exec -u 0 -t $(sudo docker ps --latest --quiet) chown -R anythingllm:anythingllm /app/collector /app/server\n", + "echo \"File permissions corrected.\"\n", + "export ONLINE=$(curl -Is http://localhost:3001/api/ping | head -n 1|cut -d$' ' -f2)\n", + "echo \"Health check: $ONLINE\"\n", + "if [ \"$ONLINE\" = 200 ] ; then echo \"Running migrations...\" && curl -Is http://localhost:3001/api/migrate | head -n 1|cut -d$' ' -f2; fi\n", + "echo \"Setup complete! AnythingLLM instance is now online!\"\n", + "\n", + "--//--\n" + ] + ] + } + } + } + }, + "AnythingLLMInstanceSecurityGroup": { + "Type": "AWS::EC2::SecurityGroup", + "Properties": { + "GroupDescription": "AnythingLLm Instance Security Group", + "SecurityGroupIngress": [ + { + "IpProtocol": "tcp", + "FromPort": "22", + "ToPort": "22", + "CidrIp": "0.0.0.0/0" + }, + { + "IpProtocol": "tcp", + "FromPort": "3001", + "ToPort": "3001", + "CidrIp": "0.0.0.0/0" + }, + { + "IpProtocol": "tcp", + "FromPort": "3001", + "ToPort": "3001", + "CidrIpv6": "::/0" + } + ] + } + } + }, + "Outputs": { + "ServerIp": { + "Description": "IP address of the AnythingLLM instance", + "Value": { + "Fn::GetAtt": [ + "AnythingLLMInstance", + "PublicIp" + ] + } + }, + "ServerURL": { + "Description": "URL of the AnythingLLM server", + "Value": { + "Fn::Join": [ + "", + [ + "http://", + { + "Fn::GetAtt": [ + "AnythingLLMInstance", + "PublicIp" + ] + }, + ":3001" + ] + ] + } + } + }, + "Mappings": { + "Region2AMI": { + "ap-south-1": { + "AMI": "ami-0e6329e222e662a52", + "RootDeviceName": "/dev/xvda" + }, + "eu-north-1": { + "AMI": "ami-08c308b1bb265e927", + "RootDeviceName": "/dev/xvda" + }, + "eu-west-3": { + "AMI": "ami-069d1ea6bc64443f0", + "RootDeviceName": "/dev/xvda" + }, + "eu-west-2": { + "AMI": "ami-06a566ca43e14780d", + "RootDeviceName": "/dev/xvda" + }, + "eu-west-1": { + "AMI": "ami-0a8dc52684ee2fee2", + "RootDeviceName": "/dev/xvda" + }, + "ap-northeast-3": { + "AMI": "ami-0c8a89b455fae8513", + "RootDeviceName": "/dev/xvda" + }, + "ap-northeast-2": { + "AMI": "ami-0ff56409a6e8ea2a0", + "RootDeviceName": "/dev/xvda" + }, + "ap-northeast-1": { + "AMI": "ami-0ab0bbbd329f565e6", + "RootDeviceName": "/dev/xvda" + }, + "ca-central-1": { + "AMI": "ami-033c256a10931f206", + "RootDeviceName": "/dev/xvda" + }, + "sa-east-1": { + "AMI": "ami-0dabf4dab6b183eef", + "RootDeviceName": "/dev/xvda" + }, + "ap-southeast-1": { + "AMI": "ami-0dc5785603ad4ff54", + "RootDeviceName": "/dev/xvda" + }, + "ap-southeast-2": { + "AMI": "ami-0c5d61202c3b9c33e", + "RootDeviceName": "/dev/xvda" + }, + "eu-central-1": { + "AMI": "ami-004359656ecac6a95", + "RootDeviceName": "/dev/xvda" + }, + "us-east-1": { + "AMI": "ami-0cff7528ff583bf9a", + "RootDeviceName": "/dev/xvda" + }, + "us-east-2": { + "AMI": "ami-02238ac43d6385ab3", + "RootDeviceName": "/dev/xvda" + }, + "us-west-1": { + "AMI": "ami-01163e76c844a2129", + "RootDeviceName": "/dev/xvda" + }, + "us-west-2": { + "AMI": "ami-0ceecbb0f30a902a6", + "RootDeviceName": "/dev/xvda" + } + } + } +} \ No newline at end of file