Saturday, October 25, 2025

เริ่มต้นเรียนรู้ Laravel 12.x

  • มีโปรเจที่เขียนด้วย Laravel 12.x ที่ localhost ที่ push ขึ้น github.com อยากนำขึ้น production โดย ใช้ container
  • โดย download clone file.zip ลงมา นำไปวางไว้ linux server ที่มี docker service
  • สร้าง Dockerfile และ docker-compose.yml (โดยใช้  จาก Project อื่นๆ ที่ทำไว้สำหรับ Codeignitor)
  • ทำการ build image และสร้าง container แล้วเปิด browser รัน url ตามที่ map port
  • http://ip:port มันได้ 403 Forbidden ซะงั้น

ปัญหาคือ

  • เราไม่เข้าใจวิธีการ run project ของเค้าหว่า
  • มันต้องไปรัน http://host-ip/public แบบนี้ทั้ง Codeignitor, และ Laravel
  • เมื่อรัน http://host:port/public ได้ ERROR 500 ซะงั้น
  • ตรวจสอบโดยดู LOG ของ container

$ docker logs my-docker-name

  • เห็นปัญหาคือ  ใน /public/index.php มันจะเรียก vender/autoload.php ประมาณนี้
  • ซึ่ง vender folder ที่ clone ระบบมาไม่มีซะงั้น ต้องติดตั้งตาม composer.json (เข้าไปใน project folder ที่จะมีไฟล์ composer.json อยู่ ก่อนรันคำสั่ง)

$ compose install

  • รันไม่ได้ซะงั้น ยังไม่ติดตั้ง  ก็ติดตั้งสิคับ (recommended)

$ curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

  • หรือ

   $ curl -sS https://getcomposer.org/installer | php

   $ sudo mv composer.phar /usr/local/bin/composer 

  • รันคำสั่งติดตั้ง  dependency อีกรอบ

$ compose install

  • จากนั้นรัน host อีกรอบ http://host:port/public
  • ได้ storage error ซะงั้น (folder นี้คล้ายกับ writeable ของ codeignitor ต้องเปิดสิทธิ์ให้เขียนได้)

$ chmod -R 707 storage

  • สุดท้ายแก้ไข path url ใน .env ให้ถูกต้องตามที่ใช้งาน

เพิ่มเติม

  • ในกรณีที่เราไม่อยากรันแบบ http://host/public อยากรันแค่ http://host เท่านี้แหละ

วิธีแรก

$ docker exec -it my-docker-name bash

# apt install nano

# nano /etc/apache2/sites-available/000-default.conf

  • แก้ไข DocumentRoot /var/www/html เป็น DocumentRoot /var/www/html/public

# /etc/init.d/apache2 reload

วิธีที่ 2

  • คัดลอง index.php และ .htaccess ใน public folder ออกมาที่ root project แล้วแก้ไข พาธใน index.php จาก .. แก้เป็น / เฉย เช่น

$app = require_once __DIR__.'/../bootstrap/app.php';

  • ก็แก้ไขเป็น

$app = require_once __DIR__.'/bootstrap/app.php';


No comments:

Post a Comment

Popular Posts