{
  "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",
                "!SUB::USER::CONTENT!",
                "UID=\"1000\"\n",
                "GID=\"1000\"\n",
                "NO_DEBUG=\"true\"\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"
      }
    }
  }
}