# Installation

## Requirements

Before proceeding with the installation, you should make sure the following requirements are installed on your machine:

* Git
* Docker
* MySQL

## Cloning the repository

The first step is to clone the repository via HTTPS or SSH.

```
git clone git@bitbucket.org:venuzle/venuzle-manager-api.git
```

## Install Composer dependencies and create the .env file

Move to the directory in which the project was cloned

```bash
cd venuzle-manager-api
```

Install the Composer dependencies

```bash
sudo docker-compose run --rm -w /var/www/html/venuzle-manager-api app composer install
```

Create the .env file

```bash
sudo docker-compose run --rm -w /var/www/html/venuzle-manager-api app cp .env.example .env
```

## Generate the application key

Each Laravel application must have a secret key that is used to encrypt and decrypt passwords, cookies, etc. Generate one by running the following command:

```bash
sudo docker-compose run --rm -w /var/www/html/venuzle-manager-api app php artisan key:generate
```

## Create the Database and add the details to the .env file

The Manager API is built around a central database and one separate database for each partner. You only need to create the central database. The default name should be `manager` but you are free to choose any name you want. Run the following command from the MySQL command line (or your MySQL client) to create the database:

```sql
create database manager;
```

Next, open the `.env` file and replace the database details with your valid details.

{% code title=".env" %}

```sql
MANAGER_DB_HOST=host.docker.internal
MANAGER_DB_PORT=3306
MANAGER_DB_DATABASE=manager
MANAGER_DB_USERNAME=root
MANAGER_DB_PASSWORD=secret
```

{% endcode %}

{% hint style="info" %}
Since the database is running on your machine and the API in a Docker container, you need to be able to access the host of your machine from the docker container. For macOS this can be done using `host.docker.internal`
{% endhint %}

## Set the session driver

The API is using Laravel Sanctum for authentication which requires a cookie session driver. Open the `.env` file and change the session driver:

{% code title=".env" %}

```bash
SESSION_DRIVER=cookie
```

{% endcode %}

## Running the migrations

At this point, if the database details are ok, you should be able to run the migrations. To do so, execute the following command:

```bash
sudo docker-compose run --rm -w /var/www/html/venuzle-manager-api app php artisan migrate --path=database/migrations/manager
```

This will create all the required tables in the main database.

## Starting and stopping the container

In order to have the API running, you must start the container. To do so, run:

```bash
sudo docker-compose up -d
```

In order to stop the container, run:

```bash
sudo docker-compose down
```

## Port binding

By default, the docker container binds the port `80` on your machine. This means that you can access the API by using the URL `localhost:80` . Often, this port is already taken by something else (the frontend instance for example). In order to solve the problem, from the `docker-compose.yml` file you can bind any port you want. As an example, let's bind the port `8084` (line 13)

{% code title="docker-compose.yml" %}

```bash
version: '2'
services:
  app:
    build:
      context: ./docker/app
      dockerfile: Dockerfile
    image: manager.venuzle.com/app
    restart: always
    volumes:
     - .:/var/www/html/venuzle-manager-api:cached
     - ./storage/logs/nginx:/var/log/nginx:cached
    ports:
     - "8084:80" # port is binded here
    networks:
     - sdnet
networks:
  sdnet:
    driver: "bridge"

```

{% endcode %}

After that change, you are able to access the API via the URL `localhost:8084`


---

# 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://docs.venuzle.com/manager-api/installation.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.
