Clone Django App จาก Heroku มา Run ที่ Local

pwpk
3 min readDec 26, 2020

--

เมื่อนานมาแล้วเคยเขียนวิธีการ deploy django app ขึ้นไปบน heroku วันนี้เขียนวิธีการ clone django app ลงมา run ที่ local บ้าง

1. สิ่งที่ต้องมี

1. Heroku CLI

2. Python Virtualenv

3. Docker Engine

4. Postgres Image

2. Clone Django App ลงมา

ในที่นี้จะ clone pizza999 ลงมานะ

heroku git:clone -a pizza999

3. Backup Database และ Download ลงมา

heroku pg:backups:capture -a pizza999
heroku pg:backups:download -a pizza999
จะได้ไฟล์ latest.dump

4. สร้าง Virtualenv เพื่อลง Python Packages

virtualenv venv
source venv/bin/active
สร้าง Virtualenv แล้ว active จะได้ (venv) นำหน้า shell

หลังจากนั้นลง Python Packages ตามที่ระบุในไฟล์ requirements.txt

pip install -r ./pizza999/requirements.txt

5. สร้างไฟล์ .env เพื่อเป็น Key-Value เช่นเดียวกับที่อยู่ใน Heroku App Config Vars

cd pizza999
touch .env
nano .env

เปิดเวบแล้วเข้าไปดูใน Settings > Config Vars แล้วก๊อปมาวางใน .env

แต่!!

  1. DATABASE_URL ไม่จำเป็นต้องเหมือนกับ Production
  2. เพิ่ม DEBUG=True

จะได้ประมาณนี้

ไฟล์ .env ต้องอยู่ใน level เดียวกับไฟล์ Profile

ให้จำไว้ว่า Database ที่เราตั้งมี User , Password , DB อะไร

ในที่นี้ ที่เราตั้งตามใจสำหรับ Local คือ

user = root
password = admin
db = pizzadb

สำหรับ DEBUG=True จะเอาไว้ใช้กับ Settings.py ตรงบรรทัด
DEBUG = os.environ.get(‘DEBUG’, False)
อธิบายว่าได้ว่า ถ้าเจอ Key DEBUG ก็ให้อ่าน Value มา แต่ถ้าไม่เจอก็จะได้ False เป็น default , ซึ่งใน Config Vars เราไม่ได้มีไว้ มันจึงเป็น False สำหรับ Production เสมอ

  • **** แก้ไข *****
  • settings.py ตรงบรรทัด DEBUG ให้แก้เป็นตามนี้
DEBUG = (os.environ.get('DEBUG', False) == 'True')เพราะ os.environ.get จะคืนค่าเป็น String แต่ตัวแปร DEBUG ต้องการค่า boolean ดังนั้นจึงใช้ == 'True' เพื่อช่วยดำเนินการ

6. Run Postgres Docker Container

รันจากไฟล์ docker-compose.yml ง่ายดีนะ ไม่ต้องพิมพ์คำสั่งยาวๆ ทุกครั้ง ดังนั้นก็สร้างไฟล์เลย

touch docker-compose.yml
nano docker-compose.yml

****** ต้องให้ user, password, db ให้เหมือนกับในไฟล์ .env ในข้อ 5. *****

แล้วก็ up เลย!

docker-compose up -d
เช็คด้วย docker ps แล้วจะเห็นว่า status เป็น up time

7. ทดสอบการเชื่อมต่อด้วย psql แล้ว import dump

psql -h localhost -U root -p 5432 -d pizzadb

ใช้คำสั่งต่างๆ ใน psql shell

\l # list dbs
\c pizzadb # swith to db
\dt # list tables
\q # exit

\q ออกมาจาก psql shell ก่อน แล้วใช้คำสั่ง import dump file ดังนี้

pg_restore --verbose --clean --no-acl --no-owner -h localhost -U root -d pizzadb latest.dump

8. Locally RUN!!

heroku local web

ใช้คำว่า web ตามที่ระบุใน Profile

ถ้าไม่ระบุ port จะได้ http ที่ port 5000

ได้แล้ว !!!! ไหนลองเข้าหน้า admin ซิ …

OK! แสดงว่า ทุกอย่าง ผ่านได้ด้วยดี สบายๆ :)

ปล. ถ้ารูปไม่ขึ้นอาจจะต้อง python manage.py collectstatic

ถ้าเป็นการ clone จาก github repo ก็อาจจะเพิ่ม
git remote add heroku https://git.heroku.com/YourAppName.git
เข้าไปด้วยจะได้ เผื่อว่าอยากจะ deploy ไป heroku ก็จะได้สั่ง
git push heroku master ได้นั่นเอง

--

--

No responses yet