Cara Deploy Aplikasi Laravel ke VPS Ubuntu (EC2 AWS)
Tags: laravel, deployment, webdev, ubuntu
Published: 2023-04-23 16:42:21

[**Cara Deploy Laravel, nginx, mysql ke VPS full dengan SSL Domain**](https://www.youtube.com/watch?v=tEKwtzOuNQs)

Mendeploy app ke VPS merupakan suatu pekerjaan yang susah-susah mudah. Apalagi kalau kita kurang familiar dengan linux, mendeply aplikasi ke VPS merupakan suatu pekerjaan yang menakutkan (curhat). Maka dari itu aku mendokumentasikan apa yang telah ku pelajari dalam mendeploy app ke VPS. Dalam hal ini aku mendeploy aplikasi laravel ke VPS EC2 AWS.

Hal pertama yang harus kita lakukan adalah masuk ke dalam ssh vps kita dengan perintah

```
ssh user@host.com
```
Setelah masuk lakukan update vps ubuntu kita dengan mengetikkan perintah

```
sudo apt update
```
1. Install Web Server (Nginx)
Setelah update selesai kita lanjutkan dengan install webserver. Dalam hal ini aku menggunakan nginx. Nginx selain bisa menjadi web server,bisa juga berfungsi menjadi load balancer, reverse proxy dan reverse email. Untuk install nginx ini cukup mudah yaitu dengan menjalankan perintah

```
sudo apt install nginx -y
```

![nginx](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p6opywzc9kli1y40bwju.png)


flag -y merupakan opsi untuk menjawab yes pada pertanyaan ketika instalasi. Setelah instalasi selesai kita bisa mengecek dengan mengetikkan IP public kita di browser maka akan muncul halaman nginx. Selain itu kita juga bisa melihat status nginx dengan perintah

```
sudo systemctl status nginx
```

2. Install PHP
Selanjutnya kita harus menginstall php pada vps kita. Dalam hal ini aku menginstall php versi 8.2. Berikut adalah perintah perintah yang perlu dijalankan.

```
sudo apt install software-properties-common -y
sudo add-apt-repository ppa:ondrej/php
sudo apt install php8.2-fpm php8.2-common php8.2-dom php8.2-intl php8.2-mysql php8.2-xml php8.2-xmlrpc php8.2-curl php8.2-gd php8.2-imagick php8.2-cli php8.2-dev php8.2-imap php8.2-mbstring php8.2-soap php8.2-zip php8.2-bcmath -y
```
Setelah dirun semua untuk memastikan php telah terinstall, anda bisa jalankan perintah

```
sudo systemctl status php8.2-fpm
```

![php fpm](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dn8nkb9tatskbp6bl31g.png)



Untuk keluar tekan ctrl + c.

3. Install MYSQL
Selanjutnya kita install database management system dalam hal ini kita menggunakan mysql. Langsung saja

```
sudo apt install mysql-server -y
```
Seperti biasa check apakah mysql sudah berjalan atau belum dengan perintah

```
sudo systemctl status mysql
```
Selanjutnya akses mysql dan buat database yang akan digunakan untuk aplikasi laravel. Pada defaultnya user root tidak mempunyai password.

```
sudo mysql -u root
```
Buat database dan user password untuk aplikasi laravel kita

```
CREATE DATABASE laravel;
CREATE USER 'admin'@'localhost' IDENTIFIED BY 'adminspassword';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';
FLUSH PRIVILEGES;
```
4. Install Composer
Selanjutnya install composer untuk mendukung aplikasi laravel kita dengan perintah

```
sudo apt install composer -y
```

![composer version](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mzgxv04jofn15peft4dz.png)


untuk mengecek version composer silahkan jalankan command

composer — version

5. Deploy Laravel ke VPS
Nah lengkap sudah persiapan deploy kita, sekarang tinggal up web app laravel kita. Langsung saja clone project anda dari repository anda ke VPS anda. Oh iya pastikan anda masuk ke /var/www/html untuk lokasi clone laravelnya. Setelah itu jalankan

```
sudo composer install
sudo cp .env.example .env
sudo nano .env
```
Edit .env anda dengan menggunakan nano

![.env example](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9u7eqak45j8qc6jb6ez0.png)




Setelah itu jalankan migrate dan key:generate

```
sudo php artisan migrate
sudo php artisan key:generate
```
selanjutnya yaitu setting configurasi nginx

```
sudo nano /etc/nginx/sites-available/laravel
```

```
server {
    listen 80;
    listen [::]:80;
    server_name 13.229.120.244;
    root /var/www/html/laravel-10/public;
 
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";
 
    index index.php;
 
    charset utf-8;
 
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
 
    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }
 
    error_page 404 /index.php;
 
    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }
 
    location ~ /\.(?!well-known).* {
        deny all;
    }
}
```
Setelah itu buat sym link ke /etc/nginx/sites-enabled dan restart nginx

```
sudo ln -s /etc/nginx/sites-available/laravel /etc/nginx/sites-enabled/
sudo systemctl restart nginx
```
refresh halaman public ip kita dan kita akan mendapatkan error seperti berikut.


![public IP](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qqwh7if6tzc0fnhlyaiq.png)


setelah itu ubah mode untuk folder public storage dan bootstrap dengan cara

```
sudo chmod -R 777 public/ storage/ bootstrap/
```
lalu refresh lagi halaman tersebut dan kita akan mendapatkan halaman aplikasi laravel kita

![web app laravel](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ccd3eetqf2zgpss2qybq.png)


dan app laravel pun berhasil di deploy di vps

6. Setting Domain
Selanjutnya yaitu kita assign IP public kita ke sebuah domain. Dalam hal ini kita gunakan domain gratisan fitur dari dcdg.xyz. Caranya cukup mudah kita tinggal assign mengguanakn command line (cli) saja.

```
curl -X POST -H "Content-type: application/json" -d "{ \"ip\": \"<public IP VPS>\" }" "https://sub.dcdg.xyz/dns/records"
```

![domain](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z0ftx4n21ctfe7qmchmx.png)


setelah berhasil kita akan mendapatkan response json yang berisi nama domain kita dan IP.

```
{
  "status":"success",
  "message":"Record berhasil dibuat. Bila hostname belum bisa digunakan tunggu 1 jam untuk proses propagate.",
  "data":
        {
          "addedDNS":
                    [{
                      "hostname":"upset-worlds-stare-truly.a276.dcdg.xyz",
                      "ip":"13.212.27.100"
                    },
                    {
                      "hostname":"www.upset-worlds-stare-truly.a276.dcdg.xyz",
                      "ip":"13.212.27.100"
                    }]
        }
}
```
Selanjutnya kita adjust lagi untuk configurasi nginx nya. Pada bagian servername nya kita rubah dengan nama domain hasil dari generate tadi.

```
sudo nano /etc/nginx/sites-available/laravel
```

![laravel nginx config](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sq60w1r73xwk44r1b3mw.png)


Kemudian akses alamat domain tersebut dan hasilnya akan sama seperti kita mengakses IP public sebelumnya.


![nginx config](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9bt2hpo7sbrgliskgsbp.png)


7. Enkripsi Domain (SSL) dengan Let’s Encrypt
Kita sudah bisa mengakses web app via subdomain gratisan dari dcdg.xyz, namun masih ada tanda not secure yang berarti domain tersebut belum terenkripsi. Nah kita akan gunakan fitur enkripsi (SSL) gratisan dari let’s encrypt. Langsung saja kita eksekusi perintah perintahnya.

```
sudo apt-get install python3-certbot-nginx -y
sudo certbot --nginx -d <yourdomain.com> -d <www.yourdomain.com>
```
Catatan: Ganti <yourdomain.com> dan <www.yourdomain.com> dengan subdomain yang Anda miliki. Pada pertanyaan terbut jawan saja yes semua dan isi dengan nama email anda pada pertanyaan email.


![SSL let's encrypt](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/inrpnbzojlwwx16788h1.png)


penampakan setelah berhasil enkripsi
Setelah itu refresh halaman web anda maka yang sebelumnya not secure akan menjadi secure dengan ditandai gambar gembok. Selamat domain anda telah terenkripsi via let’s encrypt. Perlu diingat enkripsi ini berlaku untuk 3 bulan jadi setelah 3 bulan anda harus me renewal lagi. Kalau mau auto renewat anda bisa menggunakan cron.


![laravel web](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aq1mm8cdqghq2tktjw43.png)


akhir aplikasi laravel kita sudah terenkripsi.