2018年8月6日 星期一

[django] 將Django專案部署到Heroku

首先安裝相關套件
sudo apt-get install snapd
# 安裝heroku cli(Linunx)
# https://devcenter.heroku.com/articles/heroku-cli#download-and-install
sudo snap install heroku --classic

# 安裝django-heroku
pip install django-heroku
# 安裝gunicorn
pip install gunicorn # 安裝git
sudo apt install git

若成功安裝就可以登入Heroku開始建立專案囉! 尚未有Heroku帳號的,請按註冊Heroku會員。
# 登入Heroku
heroku login

先建立一個空白的專案
mkdir heroku-python
cd heroku-python
# create project
django-admin startproject mysite .
打開mysite/settings.py,先將IP加到ALLOWED_HOSTS,'*'是允許所有的Hostname,比較偷懶的方式。再來加入heroku的套件,套用這個檔案內的設定。
# mysite/settings.py
import django_heroku

ALLOWED_HOSTS = ['*']
...

# end of file
django_heroku.settings(locals())
為了讓Heroku知道專案需要的環境,有兩個必要的檔案Procfilerequirements.txt必須手動加入,請注意Procfile沒有副檔名。
# Procfile
web: gunicorn mysite.wsgi

requirements.txt可以透過pip freeze自動生成,內容可以參考下面。
# requirements.txt
Django==2.1
django-heroku==0.3.1
gunicorn==19.9.0

接著,新增一個Heroku專案,一種由系統自動產生,一種直接在create後面加上你想要的名稱。 之後這個專案網址是[project_name].herokuapp.com,因此如果顯示"Name [project-name] is already taken",可能是你想要的名稱已經先被佔用了。
# 由Heroku自動產生專案名稱
heroku create
# 使用者指定專案名稱
heroku create [project_name]
執行heroku create自動產生的結果,可以參考下面,intense-river-54924就是Heroku隨機產生的專案名稱。
Creating app... done, ⬢ intense-river-54924
https://intense-river-54924.herokuapp.com/ | https://git.heroku.com/intense-river-54924.git
新增一個 git repository
git init
git add .
git commit -m "initial commit"

# 設定遠端伺服器/設定專案的上傳目標
heroku git:remote -a intense-river-54924
# 確認是否設定成功
git remote -v
執行git remote -v的顯示範例
heroku https://git.heroku.com/intense-river-54924.git (fetch)
heroku https://git.heroku.com/intense-river-54924.git (push)

因為staticfiles設定要調整,所以先取消執行collectstatic的部分,才不會有錯誤喔!
# 設定參數
# heroku config:set [key]=[value]
heroku config:set DISABLE_COLLECTSTATIC=1
設定完成後就上傳至遠端Heroku的伺服器
# git push [remote-name] [branch-name]
git push heroku master
執行網站,此時就可以打開瀏覽器查看網頁囉!
heroku ps:scale web=1

專案名稱是intense-river-54924,只要打開https://intense-river-54924.herokuapp.com/,就可以看到結果囉!如果不記得專案名稱,可以透過指令顯示執行網站url。
heroku open


部署到這邊告一段落,底下有些指令可以參考使用,像是有錯誤無法正常顯示網站,可以查看Log來排除錯誤。
heroku logs --tail
heroku logs --tail --app [HEROKU_APP_NAME]
其他Django的指令執行範例,不是本地端而是在遠端伺服器執行。
heroku run python mysite/manage.py migrate
heroku run python mysite/manage.py createsuperuser
在編輯你的專案時,小幅度的修改可以透過以下指令在本地端執行,確定沒有問題時再推到遠端去。
# Procfile is required.
# 效果如同 "python manage.py runserver 0.0.0.0:5000"
heroku local
當你想要執行已有的專案時,可以自遠端伺服器取得專案
heroku git:clone -a [project-name]

參考資料:
https://devcenter.heroku.com/articles/getting-started-with-python

沒有留言:

張貼留言