From f1fc2d90fa27fe016c34e0aa36a6194789cc91ba Mon Sep 17 00:00:00 2001
From: Timothy Carambat <rambat1010@gmail.com>
Date: Tue, 19 Dec 2023 13:24:50 -0800
Subject: [PATCH] Readme updates (#475)

* wip

* btn links

* button updates

* update dev instructions

* typo
---
 README.md                    | 100 ++++++++++++++++++-----------------
 docker/HOW_TO_USE_DOCKER.md  |  34 +++++++-----
 images/deployBtns/aws.png    | Bin 0 -> 3560 bytes
 images/deployBtns/docker.png | Bin 0 -> 2746 bytes
 4 files changed, 74 insertions(+), 60 deletions(-)
 create mode 100644 images/deployBtns/aws.png
 create mode 100644 images/deployBtns/docker.png

diff --git a/README.md b/README.md
index e91520ab4..879cf2dd7 100644
--- a/README.md
+++ b/README.md
@@ -26,10 +26,13 @@ A full-stack application that enables you to turn any document, resource, or pie
 
 ![Chatting](/images/screenshots/chatting.gif)
 
-### Watch the demo!
+<details>
+<summary><kbd>Watch the demo!</kbd></summary>
 
 [![Watch the video](/images/youtube.png)](https://youtu.be/f95rGD9trL0)
 
+</details>
+
 
 ### Product Overview
 AnythingLLM is a full-stack application where you can use commercial off-the-shelf LLMs or popular open source LLMs and vectorDB solutions to build a private ChatGPT with no compromises that you can run locally as well as host remotely and be able to chat intelligently with any documents you provide it.
@@ -79,64 +82,28 @@ This monorepo consists of three main sections:
 - `docker`: Docker instructions and build process + information for building from source.
 - `collector`: NodeJS express server that process and parses documents from the UI.
 
-### Minimum Requirements
-> [!TIP]
-> Running AnythingLLM on AWS/GCP/Azure? 
-> You should aim for at least 2GB of RAM. Disk storage is proportional to however much data
-> you will be storing (documents, vectors, models, etc). Minimum 10GB recommended.
-
-- `yarn` and `node` on your machine
-- access to an LLM running locally or remotely.
-
-*AnythingLLM by default uses a built-in vector database powered by [LanceDB](https://github.com/lancedb/lancedb)
-
-*AnythingLLM by default embeds text on instance privately [Learn More](/server/storage/models/README.md)
-
-## Recommended usage with Docker (easy!)
-> [!IMPORTANT]
-> If you are running another service on localhost like Chroma, LocalAi, or LMStudio
-> you will need to use http://host.docker.internal:xxxx to access the service from within
-> the docker container using AnythingLLM as `localhost:xxxx` will not resolve for the host system.
-> eg: Chroma host URL running on localhost:8000 on host machine needs to be http://host.docker.internal:8000
-> when used in AnythingLLM.
-
-> [!TIP]
-> It is best to mount the containers storage volume to a folder on your host machine
-> so that you can pull in future updates without deleting your existing data!
-
-`docker pull mintplexlabs/anythingllm:master`
-
-```shell
-export STORAGE_LOCATION=$HOME/anythingllm && \
-mkdir -p $STORAGE_LOCATION && \
-touch "$STORAGE_LOCATION/.env" && \
-docker run -d -p 3001:3001 \
---cap-add SYS_ADMIN \
--v ${STORAGE_LOCATION}:/app/server/storage \
--v ${STORAGE_LOCATION}/.env:/app/server/.env \
--e STORAGE_DIR="/app/server/storage" \
-mintplexlabs/anythingllm:master
-```
-
-Open [http://localhost:3001](http://localhost:3001) and you are now using AnythingLLM! 
-All your data and progress will now persist between container rebuilds or pulls from Docker Hub.
+## 🛳 Self Hosting
+Mintplex Labs & the community maintain a number of deployment methods, scripts, and templates that you can use to run AnythingLLM locally. Refer to the table below to read how to deploy on your preferred environment or to automatically deploy.
+| Docker                                 | AWS | GCP | Digital Ocean | Render.com |
+|----------------------------------------|----:|-----|---------------|------------|
+| [![Deploy on Docker][docker-btn]][docker-deploy] |  [![Deploy on AWS][aws-btn]][aws-deploy] | [![Deploy on GCP][gcp-btn]][gcp-deploy]  | [![Deploy on DigitalOcean][do-btn]][aws-deploy]  |  [![Deploy on Render.com][render-btn]][render-deploy] |
 
-[Learn more about running AnythingLLM with Docker](./docker/HOW_TO_USE_DOCKER.md)
 
-### How to get started (Development environment)
+## How to setup for development
 - `yarn setup` from the project root directory.
   - This will fill in the required `.env` files you'll need in each of the application sections. Go fill those out before proceeding or else things won't work right.
 - `yarn prisma:setup` To build the Prisma client and migrate the database.
 
-To boot the server locally (run commands from root of repo):
+To boot the server locally (from root of repo):
 - ensure `server/.env.development` is set and filled out.
 `yarn dev:server`
  
-To boot the frontend locally (run commands from root of repo):
-- ensure `frontend/.env` is set and filled out.
-- ensure `VITE_API_BASE="http://localhost:3001/api"`
+To boot the frontend locally (from root of repo):
 `yarn dev:frontend`
 
+To then run the document collector (from root of repo)
+`yarn dev:collector`
+
 [Learn about documents](./server/storage/documents/DOCUMENTS.md)
 
 [Learn about vector caching](./server/storage/vector-cache/VECTOR_CACHE.md)
@@ -146,6 +113,9 @@ To boot the frontend locally (run commands from root of repo):
 - create PR with branch name format of `<issue number>-<short name>`
 - yee haw let's merge
 
+<details>
+<summary><kbd>Telemetry for AnythingLLM</kbd></summary>
+
 ## Telemetry
 AnythingLLM by Mintplex Labs Inc contains a telemetry feature that collects anonymous usage information.
 
@@ -168,3 +138,37 @@ We will only track usage details that help us make product and roadmap decisions
 - Chat is sent. This is the most regular "event" and gives us an idea of the daily-activity of this project across all installations. Again, only the event is sent - we have no information on the nature or content of the chat itself.
 
 You can verify these claims by finding all locations `Telemetry.sendTelemetry` is called. Additionally these events are written to the output log so you can also see the specific data which was sent - if enabled. No IP or other identifying information is collected. The Telemetry provider is [PostHog](https://posthog.com/) - an open-source telemetry collection service.
+
+</details>
+
+## 🔗 More Products
+
+- **[VectorAdmin][vector-admin]:** An all-in-one GUI & tool-suite for managing vector databases.
+- **[OpenAI Assistant Swarm][assistant-swarm]:** Turn your entire library of OpenAI assistants into one single army commanded from a single agent.
+
+<div align="right">
+
+[![][back-to-top]](#readme-top)
+
+</div>
+
+---
+
+Copyright © 2023 [Mintplex Labs][profile-link]. <br />
+This project is [MIT](./LICENSE) licensed.
+
+<!-- LINK GROUP -->
+[back-to-top]: https://img.shields.io/badge/-BACK_TO_TOP-222628?style=flat-square
+[profile-link]: https://github.com/mintplex-labs
+[vector-admin]: https://github.com/mintplex-labs/vector-admin
+[assistant-swarm]: https://github.com/Mintplex-Labs/openai-assistant-swarm
+[docker-btn]: ./images/deployBtns/docker.png
+[docker-deploy]: ./docker/HOW_TO_USE_DOCKER.md
+[aws-btn]: ./images/deployBtns/aws.png
+[aws-deploy]: ./cloud-deployments/aws/cloudformation/DEPLOY.md
+[gcp-btn]: https://deploy.cloud.run/button.svg
+[gcp-deploy]: ./cloud-deployments/gcp/deployment/DEPLOY.md
+[do-btn]: https://www.deploytodo.com/do-btn-blue.svg
+[do-deploy]: ./cloud-deployments/digitalocean/terraform/DEPLOY.md
+[render-btn]: https://render.com/images/deploy-to-render-button.svg
+[render-deploy]: https://render.com/deploy?repo=https://github.com/Mintplex-Labs/anything-llm&branch=render
diff --git a/docker/HOW_TO_USE_DOCKER.md b/docker/HOW_TO_USE_DOCKER.md
index a74b11d45..5b5a58067 100644
--- a/docker/HOW_TO_USE_DOCKER.md
+++ b/docker/HOW_TO_USE_DOCKER.md
@@ -2,8 +2,20 @@
 
 Use the Dockerized version of AnythingLLM for a much faster and complete startup of AnythingLLM.
 
-## Requirements
-- Install [Docker](https://www.docker.com/) on your computer or machine.
+
+### Minimum Requirements
+> [!TIP]
+> Running AnythingLLM on AWS/GCP/Azure? 
+> You should aim for at least 2GB of RAM. Disk storage is proportional to however much data
+> you will be storing (documents, vectors, models, etc). Minimum 10GB recommended.
+
+- `docker` installed on your machine
+- `yarn` and `node` on your machine
+- access to an LLM running locally or remotely
+
+*AnythingLLM by default uses a built-in vector database powered by [LanceDB](https://github.com/lancedb/lancedb)
+
+*AnythingLLM by default embeds text on instance privately [Learn More](../server/storage/models/README.md)
 
 ## Recommend way to run dockerized AnythingLLM!
 > [!IMPORTANT]
@@ -34,7 +46,13 @@ mintplexlabs/anythingllm:master
 Go to `http://localhost:3001` and you are now using AnythingLLM! All your data and progress will persist between
 container rebuilds or pulls from Docker Hub.
 
-## Build locally from source
+## How to use the user interface
+- To access the full application, visit `http://localhost:3001` in your browser.
+
+## About UID and GID in the ENV
+- The UID and GID are set to 1000 by default. This is the default user in the Docker container and on most host operating systems. If there is a mismatch between your host user UID and GID and what is set in the `.env` file, you may experience permission issues.
+
+## Build locally from source _not recommended for casual use_
 - `git clone` this repo and `cd anything-llm` to get to the root directory.
 - `touch server/storage/anythingllm.db` to create empty SQLite DB file.
 - `cd docker/`
@@ -43,12 +61,6 @@ container rebuilds or pulls from Docker Hub.
 
 Your docker host will show the image as online once the build process is completed. This will build the app to `http://localhost:3001`.
 
-## How to use the user interface
-- To access the full application, visit `http://localhost:3001` in your browser.
-
-## About UID and GID in the ENV
-- The UID and GID are set to 1000 by default. This is the default user in the Docker container and on most host operating systems. If there is a mismatch between your host user UID and GID and what is set in the `.env` file, you may experience permission issues.
-
 ## ⚠️ Vector DB support ⚠️
 Out of the box, all vector databases are supported. Any vector databases requiring special configuration are listed below.
 
@@ -80,6 +92,4 @@ VITE_API_BASE="http://<YOUR_REACHABLE_IP_ADDRESS>:3001/api"
 For example, if the docker instance is available on `192.186.1.222` your `VITE_API_BASE` would look like `VITE_API_BASE="http://192.186.1.222:3001/api"` in `frontend/.env.production`.
 
 ### Still not working?
-[Ask for help on Discord](https://discord.gg/6UyHPeGZAC)
-
-
+[Ask for help on Discord](https://discord.gg/6UyHPeGZAC)
\ No newline at end of file
diff --git a/images/deployBtns/aws.png b/images/deployBtns/aws.png
new file mode 100644
index 0000000000000000000000000000000000000000..fde4a2a8d836ad6393e5e5188b173889894f071d
GIT binary patch
literal 3560
zcmeAS@N?(olHy`uVBq!ia0y~yVB}+9U@+ofV_;xdTW5Nlfq{XsILO_J@#aaLdIkmt
z&H|6fVg?3oVGw3ym^DX&fq}Qz)5S5QV$Rzb_8B6sV(V13n;IG#Bsi*AjuuoYaIgjV
z1z1}0e|_L^-r2>Kvx_tE!xM*z3R)amo<)6LY!l}MIu!9uTAVWPZ}9Ds(9-X3uDn@e
zUGTp4{{GFEzwTPLZ1?N+)3aD=HRZ}T9AY$-;Bn((2)9w2V=pb7V8Fxn_|d_ti44sN
z1`^_uGb|){+DxfMCMosJzbAa<jicjKZ;oA$t$zNxdAX^tUhTz+<xNqxS{YBe=l$EL
z*JQUsamDA!P3Ou!_m!_#Ug2u$*lx{z>*K^f{}%=|Y2DRWk!R^B9OwI=yTtRs>KvED
zdFoO@$9~#p|LRxQ{qWY*MfsHF`qs<!IxidJc6PE&SCWdHmvLc!M^)U+W%I>_3vGhj
zF2v^vTv;$lWrFp3@hO_k3;edKREnI}Us0myxP0G)U&Z$Xrd-TCU%GQa{O!}p3f<X7
zoLbQ?7w+*jt(qb-<#uNM!Iz)!zM5o_bx-cGxOMd;6U*{xFMi}LV%F{~^HGnwJwL-!
zI$i0m(9Zd5?+0Ho+TB_A?%2eKyVCsxWN-Rx$rih~CcH`gv;W+$#UJiHllr3TvZc=8
z;>Fy5=k0e*&A7|3$S(Z#^P2FxJMz+H4((Ll@xRgB^7_v$>+JvDJdu3MPW9L8%v0BI
z{{4IQ2mi%+N6&q=$&0!F_>;x0$EJ~WKX2JD>s4+lExa50^PS-Sb7#a$WqZt5tQY=m
zBO8;i!*t8G_}9JdHa}*~wRvLm-nb*Iq_kx6rTG?SH5xBoEWcMB!R`8qYuEA}3+~H2
zS`i#};b|mGZl?C_XnQq{cs|FQM%=URxX3kMW!jYavqNPXkLM(lbE?rQ6}A@)kLjlg
zxvSi?IX2Vb=l_UD22XF4?Myn>ZL#eC?aB<kWq)?6e-rjyxpw~Uyanqv|4(1^PO|rW
zf!v|^=P#;mt1Y)#S0TvGk$-#1i*wEMJSS{BkYZbU<o@@Y!RJoRJH6h1^~81CzbNnL
z>xdTB$-5u3@b!VBfT!0htA4*Zb}@ecJIPD)En*HVVlX%<U!v0{#QG#f{_~^-OH_Vx
z?OnB$b#GK;z{Z-USz!~8?^~s<k*(&qI*K#u=e`A}Wr8$A11|j8&NBDitW)}F&N34o
zS9h?9bn6%9NTr&$y}kU%S?2P*kKcP=Z!GUrVT`a|=Ck(k-22-7`%XDN+q10x*qOE}
zYqhDKHJPq5wwnZGW8UW5ZwsDubEE9PZO*TQo-ca%tA*3!&=vWr+3T7MXIeQvmifP7
zo$=y*_x7#X>!hWsa&tvfYr=h_MRz|x{kotyE?Ox<Cfi=%%l6wWqGz>rdy8CIpO))%
zO=49oeDhvIw?{2BrRMQ2n@KLO!bL(B&QO^pwVg{VIAYQfN%pr{UfnDQK0XUgwJ%ic
zYcxN_eSQ0a$L!Npqwe0Wzg%$e?9{6&d^4tB>^r!{LQlYZQq6|CcaP)`Ke)6~x$j>1
zPhH*!fmcg@{xVv`d$>eaVEL{hzg0`O&;NI}TQ=dVS@``cJ6O~>bLUD#)<3M?_3tFJ
zOS0UB(hvWB#Kq=6{JpWi@HNX`{RpXbZz5k@KmKZ6obnEd9q;n0|0`9^*6y~y@;maf
z`~N$frhCkGw60<ilz3<T$nLb=!V+~ppJ&;{+`FunFIcyg)i+lw!-LuKX6&N^U4cFE
z_ksfYa+=Jx37Tx!r!vDg_sP%o_D{ZcFVNKK@7v09x3syZQ{h9^qt6wB?F)^cW_~((
zM!bhzO}E3jQL;YZZd*i0^4smdEZOTgFZxbey+LdBzDuQM{a0@rRu<gZvSd+VpwhuM
zivszxJ5D`W-c+joFZTN3l=heT)^-s=uTJgF-u7QA;j8)i+eUHM15f5g#lGL+#b;fA
z;kUtBp@`<Z+n36!Zm*~gDwo$u^p#1DFY^;>x>t9@nr+dJ_iFtX1#3<RU;0~dR<T|B
zGq=@Cfdj9uU9xp#V_Sdv9`8S%7yCXnl$1Z%6;Z!2ql4KXJnr+crKW{%BA2{Allf}v
zO(FMwpCz^rCU{J1keqY4B_v$+NNvKeRhxEA|0lOPYkzj|cY#|1$D5|@(renY?}xY1
zhF9`8m%M&lbNl1j>frZ}k55;PTqz`Sc*gf>>lR1Ztgfm!emv}3jPo7lJMJ&O?2fbl
ze_+*#zw%N3U!0rmb+XfZWhP6V=Hv}$&EvS!^HASo^`lj9n#}(DzdE?;#Jtb|x#u@N
zi#|2Hp4)h|sp7=Rl<cJJ=!Y@vGbbLbW{I1xtIxcwpnJ{!h%HAFXH{GH=Wg#TJn%j2
zyl<z)2B#U1Wxh|ip64wy<G`{5s$7@l>!!!=FOQ357Yk4^)ZG%1;4GuP|4Qk`Pwuaz
zBl$za$~Md2f5?09=LsXlx19+qXPtCBc233MPJHM#|F5_1Nbn|!yvY75;GZAjy3+V-
z{I8#@cfJ1Gzf=FmyazLxPBuK*Uw`F)%rVYuM;cGomIr#udF(!PYRAqAb6(6e_7ZB8
z<6vFKwq~;9*S(*!r%yee5V+&`F>|33*Dz15g31qF`|hoLmKwPxVb<nEwO1>+{&DxS
zAI|MpFI=F%#;Q9?b@r~d(hc>k_u6#}4^01BJKg5tua3|eMqk4A&wIIP$EM=68aXHF
zM+V0?J^Fm2c6Omk%7vU`X>q}KoVVxZ+V9Q%6aTe1(Q?Ik#SXUP1^zKN_d2{%Qhk5w
zPx%wWt6Gf*_8J~fKjzTH@@~T}g`=E?tnLr{7A)XSx%iLMakt&HFs4Vcd2iV^Tq$&Q
zGnry4{m$@+m4n{y+ttS%j0!v_%&J|shi8>vwp#!3FGqzMEpj$#MO2>g%=VU9;c3Wv
z@RGsbdq4mDYWDi|^}(hYjNvTaiC)JaD{fKj``TP`S2W(`-R(VX1-`k*+J3QzUOAb4
zZI8m<ta<#`!>3Lx7xt|>RK0)C;w#RD_gdf2_wh@6#=#hRUt)5Kmzjoh@~InIA9u!|
z++pH<ZgFX-0CNB<qsi6t=AF#uQff&8XI7Mk9C;WaE8Wg6zUZb9drfq3lMaXY;eR<i
zPjf2P)mO5|Ugue|jLqx_W47;9-^I$`b9ZTV+jZ2%*czSg>DAsKam9*zhgufTi5zyZ
z|Kb1t>|Fo)duh_yC;KL}TI%#G=CMo<6cupxdi=J&`Lm6^`dTfKx|u>#{(7>m>0mw@
zYq*n7tl_KCkII+JOm@Ww+@5vGYvU_*scz;p<)96#W;`pmX<mH7>p&>u2Ctr-^H-#w
z`|vsW<SGS+WnEG^riR;huIpZP%OIBJe~9B6#klWx+APlaNT_*47zlj7?sL-bXZn}N
zM!}aZa=g;JVs|X`>TSc7fr_uXUU}vHJZIgvWsR2OH6N9R4xdX-fBj^huM{m@AjW)k
zZgvu9gj-|oTb8T4qr>Leg*yg(jZSG0sg7Us%j@K$1BcrjW@=V+gzmi}(4JZ7GV6$A
zN2`T{*D9GP=|!_uyzhlNep6U;-$jv6VC~G8jsk`r;wlTd&iz(%|MK{j&AI<IOH{1u
zul#OcU36^IgHJnMqYGR^?*7bwUA2nEwtSVhtQG$hR*`q9GOOL!#)?j0@7lLvdP-Qa
zzOaz~f_coUZ*M$k`(K<Ud}Z^zRC~3;1)un}ZNk=6=Kr`{G9iQOfYMH_tdC+7vL3xy
zGJk(!#*cJm=cZzZ4vqM5)fEh9bhOz!518;vdoL0=URkT$E0fDOW2c4-(<A#63yvtI
z={RjQ2swC9JT$*#=?A;!7{8Fui<YshOx(KT%--WC9<6N3x@2+g@{A;z8_hv)(;}BQ
zp3Nyx7u!C;Iyw0zKjT&3ldMS_jJTeNT-mWnNAC0_&ux)kCB08p27EZFW|75q?@?}{
zi_nxwyPva8bzdG*^zPTKL=Tlm3_BlJ&nQ~>q-Od4-246yzsfnzxa?zJ?|Z)>R!41>
zPL}N5S`%{?CEe^@Hw2E@HR-Slv}-Hu-0S_6&F_d&lgIgz#X+4jnisD)_~P@LHJ^^8
znfeqgiGP?>@}qshMSV{r$C{*SYsuX=er{Be4e3zI{^V;LY1_3|X9c6<PRngq{d07Z
zH9Lw;_L#SQyeYuWlvB&i^1awlh`r&j*2TOcZm-X(MuiL>s<WrgOl<PayP=t5tain5
zMH7$L483g|S2ulGE~OE^Sz{HC#=H02yO;VN{Lb?$W~xQdq|c2PS#GRe#1zKH!6L@7
z?dalt%%xHc|BmZLPMMj^U3*ab>9wjUlXt&mICXyhp5R@MSytkiH*M!1G0-d3Z`90a
zzR4D@Fz@y&;Z6$%AF&<g3va(-KegBTVvp*@j>D{LR(srj6@2TNJj<V+1}%l_Q`U%H
zK4m#S)jKcvwVB?Ro%%cGtLFaQ)ltjxvZ>+&&*4iP(Hakr>1GI8a>y$`n$~AKeb4nJ
z(YcZL8NHVj<avrH@J9$&u<l%NV0De*&uY27^El7XIudjI;Dy46?KOEn?SClF*C=}#
zm(`%%%)-Et{blbb_SxtDPjRSO%Ojc@cAQb^=5@zOC-0c2Du|{&z2R2BA($y9hpk!A
zSnn*80bBFLWeJZG3?!~mPBIkc_`Y{Ekm%{=dhICFZyhm}p*hh&qO)I=Pwubm<FFpZ
Vd&1MUFfcGMc)I$ztaD0e0s!5ltgrw8

literal 0
HcmV?d00001

diff --git a/images/deployBtns/docker.png b/images/deployBtns/docker.png
new file mode 100644
index 0000000000000000000000000000000000000000..e79604afd1e6d9f80c4efc7845aecaa47e812ff3
GIT binary patch
literal 2746
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
bU-tX&^lV#Rm+r>Ez`)??>gTe~DWM4fgs48a

literal 0
HcmV?d00001

-- 
GitLab