- มีโปรเจที่เขียนด้วย 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