ลอง Deploy Symfony 7 ไปยัง DigitalOcean (ต่อ Part 2)

Web Development

ลอง Deploy Symfony 7 ไปยัง DigitalOcean (ต่อ Part 2)

บทความนี้แนะนำการ Deploy แอปพลิเคชัน Symfony บน DigitalOcean โดยใช้ Ubuntu และ Nginx

ประมาณ 1 เดือนที่ผ่านมา

3 min read

ก่อนอื่นก่อนใด ก่อนที่จะ Deploy Symfony สิ่งที่เราจำเป็นต้องมีเลยคือ Composer

Install Composer

สำหรับการติดตั้ง composer สามาดูได้จากบทความที่ผมเคยเขียนไปครั้งก่อนได้เลย การติดตั้ง Composer ใน Linux โดยเราจำเป็นต้องใช้ composer ในการติดตั้ง dependencies ต่างๆ ใน project ของเรา

Example Project

ผมมี Symfony Project เปล่าๆ ที่จะเอามาลอง Deploy https://github.com/bdsach/hello-symfony ให้เรา Clone repo นี้ไปไว้ใน directory html

Clone

ให้ทำการ Clone โดยใช้คําสั่ง git clone

git clone https://github.com/bdsach/hello-symfony.git html
Clone Project
Clone Project

หากใครติดปัญหาเรื่อง permission แบบนี้ ให้เปลี่ยน owner ก่อน ด้วยคำสั่ง chown

Clone Project With Permission Denied
Clone Project With Permission Denied
sudo chown -R bandit:bandit /var/www

ถ้าขึ้นแบบนี้ ก็ถือ เป็นการ Clone สําเร็จ

Clone Project
Clone Project

Install Dependencies

เมื่อ Clone project สำเร็จ ก็มาถึงการติดตั้ง dependencies โดยใช้คําสั่ง composer install

Composer Install
Composer Install

แล้วก็รอ

Composer Install
Composer Install

Sites config

หลังจากที่ติดตั้ง dependencies เสร็จแล้ว ก็ก็จะมาแก้ไฟล์ sites-available ของเราเล็กน้อย

Edit Sites Available
Edit Sites Available

สาเหตุที่เราจะต้องแก้ เพราะว่า symfony จะต้องชี้ไปที่ directory public เราก็แค่เติม public ไว้ด้านหลัง ตรงบรรทัด root เสร็จแล้วก็กดบันทึก

Edit Sites Available
Edit Sites Available

จากนั้นทำการ reload nginx ด้วยคำสั่ง

sudo systemctl reload nginx
systemctl reload nginx
systemctl reload nginx

Setup Database

สำหรับ Database ผมจะใช้ MariaDB

Install MariaDB

มาเริ่มด้วยการติดตั้ง MariaDB ก่อนเลย ตามคำสั่งด้านล่างนี้ได้เลย

ว่าแล้วก็ update apt สักรอบ

sudo apt update
update apt
update apt

จากนั้นก็ได้เวลาทำการติดตั้ง MariaDB

sudo apt install mariadb-server
Install MariaDB
Install MariaDB

จากนั้นก็ start service MariaDB

sudo systemctl start mariadb.service

Config MariaDB

ทีนี้ก็ได้เวลาตั้งค่า MariaDB โดยผมจะตั้งค่าแบบง่ายๆ เลย คือ set password ให้ root แล้วใช้ root ในการ connect (ไม่ใช่วิธีที่ดี จริงๆ ควรจะสร้าง user ขึ้นมาใหม่ เพราะฉะนั้น ถ้าใช้งานจริง อย่าทำตาม 🤪)

sudo mysql_secure_installation

เมื่อพิมพ์คำสั่งเสร็จ ก็จะแสดงผลดังนี้ โดยผมจะ enter ไปเลย

mysql_secure_installation - enter current root password
mysql_secure_installation - enter current root password

เพราะเริ่มต้น root จะยังไม่มี password

ตอบ n

mysql_secure_installation - unix socket authentication
mysql_secure_installation - unix socket authentication

ตรงนี้ตอบ n

mysql_secure_installation - change root password?
mysql_secure_installation - change root password?

ตรงนี้ตอบ Y จากนั้นกรอก password สำหรับ root

ในตัวอย่างนี้ผมจะตั้ง password คือ example ให้จำ password ไว้ด้วย เพราะเราต้องใช้ user และ password ในการกำหนดใน .env.local เพื่อเชื่อมต่อกับ Database

mysql_secure_installation - new password
mysql_secure_installation - new password

กรอก password อีกครั้งเพื่อยืนยัน

mysql_secure_installation - re-type new password
mysql_secure_installation - re-type new password

ตอบ y เพื่อลบการใช้งาน anonymous users

mysql_secure_installation - remove anonymous users?
mysql_secure_installation - remove anonymous users?

ตอบ y เพื่อ disallow root login remotely

mysql_secure_installation - disallow root login remotely?
mysql_secure_installation - disallow root login remotely?

ตอบ y เพื่อลบ database test

mysql_secure_installation - remove test database and access to it?
mysql_secure_installation - remove test database and access to it?

ตอบ y เพื่อ reload สิทธ์การใช้งาน

mysql_secure_installation - reload privilege tables now?
mysql_secure_installation - reload privilege tables now?

เสร็จแล้วลองเช็ค status ดูหน่อยเพื่อความชัวร์ ด้วยคำสั่ง

sudo systemctl status mariadb.service
mariadb service status
mariadb service status

ถ้าขึ้นหน้าจอแบบนี้ก็เป็นอันใช้ได้

mariadb service status
mariadb service status

Set .env

ทำการสร้างไฟล์ .env.local แล้วเพิ่ม DATABASE_URL ในไฟล์ .env.local

โดย user จะเป็น root และ password จะเป็น example ตามที่เรากำหนดไว้ตอนที่เราติดตั้ง MariaDB (สำหรับใครตั้ง password เป็นอะไรก็ใส่ให้ถูก)

DATABASE_URL="mysql://root:[email protected]/hello-symfony-db?serverVersion=10.5.19-MariaDB&charset=utf8mb4"
create .env.local file and add DATABASE_URL
create .env.local file and add DATABASE_URL

สร้าง Database ด้วยคําสั่ง

php bin/console doctrine:database:create
Create Database
Create Database

Migrate Database ด้วยคําสั่ง

php bin/console doctrine:migrations:migrate
Migrate Database
Migrate Database

เสร็จไปเรียบร้อยสำหรับ Database

Try CRUD

เราลองมาเปิดดูที่หน้าเว็บสักหน่อย ว่าหน้าตาจะเป็นยังไง สำหรับ Project ก็จะเป็น CRUD ง่ายๆ

คือเป็นเว็บสำหรับบันทึกข้อมูลพนักงานแบบง่ายๆ ส่วนทำอะไรได้บ้างนั้น ก็สามารถ แสดง เพิ่ม แก้ไข ลบ พนักงานได้

Homepage of Project
Homepage of Project

สามารถกดปุ่ม Create new เพื่อเพิ่มข้อมูลพนักงานได้

Create new employee
Create new employee

หลังจากบันทึก มีข้อมูลขึ้นมา ก็เป็นอันใช้ได้

Homepage of Project with data
Homepage of Project with data

Set Domain

ในตัวอย่างนี้ ผมจด Domain อยู่ที่ Cloudflare ผมก็แค่เอาเลข IP Address ที่ได้จาก DigitalOcean มาใส่ ตามรูปนี้ ก็เป็นอันใช้ได้

Add Domain
Add Domain

ปกติแล้วขั้นตอนการ set domain จะใช้ เวลา 1 - 2 วัน อย่างช้า แต่ปกติจากที่ผม set ไม่เกินชั่วโมงก็ใช้ได้ละ

ลองเข้าเว็บเราผ่าน Domain ก็เป็นอันใช้ได้ แต่จะเห็นว่าหน้าชื่อเว็บเราขึ้น Not Secure เพราะเรายังไม่มี SSL นั่นเอง

Visit homepage with Domain
Visit homepage with Domain

Add SSL certificate

ถือว่าเป็นเรื่องที่ดี ที่เราสามารถใช้ SSL ได้แบบฟรีจาก letsencrypt ว่าแล้วก็มาลองติดตั้งกันเลย

โดยเราจะใช้ certbot ในการใส่ SSL Certificate ให้เรา

Install

เริ่มจากการติดตั้ง certbot กันก่อนเลย

sudo apt install certbot python3-certbot-nginx

ตอบ y เพื่อยืนยันการติดตั้ง

Install certbot
Install certbot

Allowing HTTPS Through the Firewall

ทำการ allow Nginx Full และลบการ allow Nginx HTTP ด้วยคําสั่ง

sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'
allow Nginx Full and delete allow Nginx HTTP
allow Nginx Full and delete allow Nginx HTTP

ลองเช็ค status อีกครั้ง ด้วยคําสั่ง

sudo ufw status

จะเห็นว่า Nginx HTTP จะหายไป และแทนที่ด้วย Nginx Full

ufw status
ufw status

Obtaining an SSL Certificate

ต่อมาใช้ certbot เพื่อตั้งค่า SSL ด้วยคำสั่ง

ตรงนี้ใครใช้ domain ไหน ก็ใส่ domain ของตัวเองได้เลย

sudo certbot --nginx -d demo-symfony.9mza.net

จากนั้นกรอก email address เสร็จแล้วกด Enter

register SSL certificate with email address
register SSL certificate with email address

ตอบ y เพื่อยอมรับเงื่อนไขการใช้งาน

ตอบ y อีกครั้ง

Request SSL Certificate
Request SSL Certificate

ถ้าขึ้นแบบนี้ ก็เป็นอันเรียบร้อยสำหรับการใส่ SSL Certificate

Register SSL Certificate Successful
Register SSL Certificate Successful
Review SSL Certificate
Review SSL Certificate

จากนั้นลองเข้ามาดูเว็บของเราใหม่ จะเห็นว่าข้อความ not secure จะหายไปแล้ว พร้อมมีรูปกุญแจ ก็เป็นอันเรียบร้อยสำหรับการใส่ SSL Certificate แล้ว

Homepage with SSL Certificate
Homepage with SSL Certificate

Production Environment

มาถึงขั้นตอนสุดท้ายละ ก็คือการทำให้ Symfony อยู่บน Production Environment ถ้าสั่งเกตจะเห็นแทบ Debug ด้านล่าง ซึ่งเราจะเอามันออกไปด้วยการเปลี่ยนเป็น Production Environment นั่นเอง

ก่อนอื่นเลยเรามาเช็ค symfony-requirements กันก่อน (ซึ่งจริงๆ เราควรจะทำเป็นอันดับแรก แต่ผมลืม 😅 ก็เลยเอาไว้ท้ายๆ เลยละกัน)

โดยเราจะ cd เข้าไปที่ project ของเรา แล้วต้องติดตั้ง symfony-requirements

composer require symfony/requirements-checker

จากนั้น ใช้คําสั่ง

php vendor/bin/requirements-checker

เพื่อเช็ค requirements ของ Symfony ว่าทุกอย่างติดตั้งครบตามที่ Symfony ต้องการ

Symfony Requirements Checker
Symfony Requirements Checker

จากนั้นทำการ dump env เป็น prod ด้วยคำสั่งนี้

ขั้นตอนนี้ก็คือการเปลี่ยนเปลี่ยน environment ของ Symfony เป็น Production นั่นเอง

composer dump-env prod

ถ้าสำเร็จจะขึ้นข้อความแบบนี้

dump .env prod
dump .env prod

จากนั้นทำการ install dependencies ใหม่ โดยรอบนี้เราจะไม่ติดตั้ง dev dependencies แล้ว

composer install --no-dev --optimize-autoloader
dump .env prod
dump .env prod

ลองเข้าเว็บจะขึ้นหน้าจอ error แบบนี้

Symfony Error 500
Symfony Error 500

ก็ไม่ต้องตกใจไป

ให้พิมพ์คำสั่งนี้เพื่อ ล้าง cache

APP_ENV=prod APP_DEBUG=0 php bin/console cache:clear
clear prod cache
clear prod cache

จากนั้นเพิ่ม permission ใน var/prod ด้วยคำสั่ง

sudo chmod -R 777 var/cache/prod/
Add Permission to var/cache/prod/
Add Permission to var/cache/prod/

ลองเข้าเว็บดูอีกที

Symfony with Production
Symfony with Production

ก็เป็นอันใช้ได้ ก็จะเห็นว่าไม่ error และ แถบ debug ได้หายไปแล้ว

ก็หวังว่าบทความนี้จะช่วยสำหรับใครที่กำลังมองหาวิธีการ deploy Symfony บน Digital Ocean กันนะครับ สงสัยตรงไหนพิมพ์ไว้ด้านล่างได้เลยนะครับ

Reference

Tags:

Symfony PHP Ubuntu Nginx DigitalOcean

บทความอื่นๆ

ดูความที่คุณอาจจะสนใจ ได้จากบทความข้างใต้นี้