# Installation - Server

### Keep in mind

1. The server steps assume you have a clean **Ubuntu** server running LAMP already with **root** (*SSH*) access to it (LAMP/LEMP only, not applicable to cPanel install).
2. You web server runs under **www-data** user (LAMP/LEMP only, not applicable to cPanel install).
3. You have pointed your domain e.g., **yourapp.com** to your server IP address (via A record at your domain registrar). Throughout these steps, I will use **yourapp.com** as a placeholder for your website address that *you must replace* with yours.

### cPanel

To install the script on cPanel, we have made an easy to follow video available in our [YouTube](https://bit.ly/muly-youtube) channel on [https://bit.ly/muly-cpanel-install-2](http://bit.ly/muly-cpanel-install-2) link.

### LAMP or LEMP

Below instructions assume that you are familiar with command line and cloud deployments. The steps are inclined towards standard LAMP distribution offered by [DigitalOcean](https://m.do.co/c/435d66e92700) [here](https://marketplace.digitalocean.com/apps/lamp). These would not differ much for any other LAMP distribution on **Ubuntu** or other *Debian* derived distros. For LEMP, only the virtual host configuration may differ and rest steps can be easily adapted.

Before getting started, upload the *server.zip* archive to your server using below command:

```bash
scp server.zip root@yourapp.com:/var/www/html/server.zip
```

Then *SSH* into the server and proceed with installing dependencies.

```bash
ssh root@yourapp.com
```

```bash
# update index with latest packages
sudo apt update

# required to extract the uploaded archive
sudo apt install unzip

# the extensions that do not come by default
sudo apt install php-bcmath php-curl php-mbstring php-redis php-xml

# needed for sending forgot password emails (optional)
sudo apt install sendmail

# needed for background job processing (optional)
sudo apt install redis-server supervisor

# needed for uploading clips from admin panel (optional)
sudo apt install ffmpeg
```

Now you can extract the uploaded ZIP archive and setup file/folder permissions.

```bash
# change to server's document root
cd /var/www/html

# remove the default page
rm index.html

# unzip the archive, symlink storage and setup permissions
unzip server.zip
php artisan storage:link
chown -R www-data:www-data bootstrap/cache storage .env
chmod -R 755 bootstrap/cache storage
chmod -R 664 .env
```

Now create a copy of apache's default vhost for our app.

```bash
# copy the default web host
cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/muly.conf

# open it for editing
nano /etc/apache2/sites-available/muly.conf
```

Then we must update the vhost configuration similar to below example. Being specific, you need to add a `ServerName` directive to match your domain e.g., **yourapp.com**. You need to suffix `DocumentRoot` with `/public_html` and do similar with the `<Directory .../>` directive as well.

{% tabs %}
{% tab title="muly.conf" %}

```bash
<VirtualHost *:80>
    ServerName yourapp.com
    ServerAdmin admin@yourapp.com
    DocumentRoot /var/www/html/public_html

    <Directory /var/www/html/public_html/>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    <IfModule mod_dir.c>
        DirectoryIndex index.php index.pl index.cgi index.html index.xhtml index.htm
    </IfModule>
</VirtualHost>
```

{% endtab %}
{% endtabs %}

Then you must disable the default vhost, enable your created vhost and enable the **rewrite** module of apache2. Please run below commands to achieve it.

```bash
sudo a2dissite 000-default
sudo a2ensite muly
sudo a2enmod rewrite
sudo systemctl restart apache2
```

Some **PHP** (assuming version *7.4*, replace with yours) settings must also be tweaked to allow bigger uploads (and mostly on slower connections).

```bash
# open the file for editing
nano /etc/php/7.4/apache2/php.ini
```

Then find and update below options as shown. You can use `Ctrl+W` to quickly locate them.

{% tabs %}
{% tab title="php.ini" %}

```
max_execution_time = 300
max_input_time = 300
memory_limit = 128M
post_max_size = 100M
upload_max_filesize = 100M
```

{% endtab %}
{% endtabs %}

Then restart the apache server as below:

```bash
sudo systemctl restart apache2
```

It is not required to have **SSL** certificate but recommended to have secure your users personal data from *MITM* and similar attacks. You can also get a free **SSL** certificate using below command:

```bash
certbot --apache -d yourapp.com

# enter details and make sure to enable redirection (option 1)
```

You also need to create a **MySQL** database and an associated user to use with the script. You can run below commands to create those but please make sure to replace `12345678` with a strong password and make note of it for use later.

```sql
sudo mysql

# run below queries in the mysql prompt
mysql> CREATE DATABASE muly;
mysql> CREATE USER muly@localhost IDENTIFIED WITH mysql_native_password BY '12345678';
mysql> GRANT ALL PRIVILEGES ON muly.* TO muly@localhost;
mysql> FLUSH PRIVILEGES;
mysql> EXIT;
```

You should now open <https://yourapp.com/> in your favorite browser, provide all the required information and return here when the installation is done.

You must also setup a cron job to automatically send scheduled notifications (recommended) and update news articles (if needed). To do that, please follow below commands:

```bash
crontab -e -u www-data

# now choose your editor (1 for nano) and add below line at bottom
* * * * * cd /var/www/html && php artisan schedule:run
```

If you wish to use background job queue (highly recommended), you must also configure a process manager for your queue workers. To do that, run below command:

```bash
nano /etc/supervisor/conf.d/muly.conf
```

Put below contents in the file and save.&#x20;

{% tabs %}
{% tab title="muly.conf" %}

```
[program:muly]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/html/artisan queue:work --sleep=3 --tries=1 --timeout=300
autostart=true
autorestart=true
user=www-data
numprocs=2
redirect_stderr=true
stdout_logfile=/var/www/worker.log
stopwaitsecs=3600
```

{% endtab %}
{% endtabs %}

Then restart the **Supervisor** as follows:

```bash
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start muly:*
```

The server has now been setup and you can proceed to building the **Android** app.


---

# 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://syncloud-softech.gitbook.io/muly/installation-server.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.
