# How To Install Chat App

## 1. Backend launch

To start the backend you need to install `docker` and `docker-compose` \
[How to install docker](https://docs.docker.com/v17.09/engine/installation/) and [How to install docker-compose](https://docs.docker.com/compose/install/)&#x20;

The entire backend is launched with a single command. Run the command in the root directory

```bash
$ docker-compose -f docker-compose.development.yml up --build
```

And then you need to wait until all the images are downloaded and build After executing this command, will run `redis`, `mongodb`, `socker server` and api server

After launch, you will have available services \
<http://localhost:5000/graphql> (api) \
&#x20;<http://localhost:4000> (socket server)

{% hint style="info" %}
By executing this command you start all services with development configuration
{% endhint %}

#### For start with production configuration use command

```bash
$ docker-compose -f docker-compose.production.yml up --build
```

#### To run only `redis` and `mongodb` use command

```bash
$ docker-compose -f docker-compose.environment.yml up --build
```

{% hint style="info" %}
In this case, you need to perform some actions:&#x20;
{% endhint %}

1. Go to `messenger-api/src/config.ts`  and change development configuration.(replace `mongoURI` with `mongodb://localhost:27017/messenger` and `redis.host` with `localhost`)
2. Go to `messenger-socket/src/config.js`  and change development configuration. (replace `redis.host` with `localhost`)
3. In `messenger-api` directory run command:
   1. `$ yarn install`&#x20;
   2. `$ yarn start`
4. In `messenger-socket` directory run command:
   1. `$ yarn install`&#x20;
   2. `$ yarn start`

{% hint style="info" %}
Before the deployment, make sure the data in the configuration files is correct, specify the correct hosts.
{% endhint %}

## 2. Messenger App launch

In `messenger-app` directory run command&#x20;

```bash
$ yarn install
$ yarn start
```

And in terminal press **`i`** for run on iOS Simulator or press **`a`** for run on Android Emulator (make sure you are already running emulator)&#x20;

> Note: If you run API Server in development configuration you can login and register with any phone number and with any code from SMS, in this mode the twilio does not work

For launch with a production configuration see [here](https://docs.expo.io/versions/latest/workflow/development-mode/). And [How to build](https://docs.expo.io/versions/latest/distribution/building-standalone-apps/)

You can also use applications without an expo, [more details here](https://docs.expo.io/versions/latest/expokit/eject/).

## 3. Configure AWS S3 for upload photo

[How to create bucket ](<https://medium.com/@shamnad.p.s/how-to-create-an-s3-bucket-and-aws-access-key-id-and-secret-access-key-for-accessing-it-5653b6e54337 >)

Go to `messenger-api/src/config.ts` and put your AWS Account data

```bash
const AWS = {
  bucket: '',
  accessKey: '',
  secretKey: '',
  region: ''
};
```

{% hint style="info" %}
You need add policy to your bucket. [How to add Policy](https://docs.aws.amazon.com/en_us/AmazonS3/latest/user-guide/add-bucket-policy.html)&#x20;
{% endhint %}

Paste this policy

```bash
{
  "Version": "2012-10-17",
  "Id": "Policy1478209136055",
  "Statement": [
    {
      "Sid": "Stmt1478209120479",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": "arn:aws:s3:::<your-bucket-name>/*"
    }
  ]
}
```

Replace `<your-bucket-name>`

## 4. Configure Twilio for send SMS Authentication

Go to `messenger-api/src/config.ts` and put your twilio data. [See more](https://www.twilio.com/docs/sms/quickstart/node)

```bash
production: {
  ...
  twilio: {
    sid: '<sid>',
    token: '<token>',
    from: '<phone number>' // From which number will SMS be sent
  },
  ... 
},
```

{% hint style="info" %}
SMS sending only works when API in production mode
{% endhint %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://weeego.gitbook.io/chat-app/master.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
