Deploy Flask Application to PythonAnywhere or Heroku (without database)
Tags: flask, heroku, pythonanywhere, deploy
Published: 2021-03-13 05:21:46

language: Bahasa Indonesia

Contoh project: http://nyc311-azka.herokuapp.com/

Source code: [github](https://github.com/azukacchi/nyc311_housing_buildings_analysis)

## PythonAnywhere (paling mudah)

tutorial: https://help.pythonanywhere.com/pages/Flask/

Deploy di PYAW paling mudah karena tidak membutuhkan kita untuk menginstall aplikasi tertentu di komputer, tidak seperti Heroku yang membutuhkan aplikasi Heroku dan Git. 

Catatan:

1. Kalau aplikasinya tidak perlu memakai *package dengan versi tertentu*, saran saya tidak perlu membuat virtualenv karena memori yang disediakan sangat terbatas (500 MB). Ketika menggunakan virtualenv memori akan termakan banyak untuk install package.

1. File yang dibutuhkan untuk project kita tinggal di-upload ke PYAW. Jika project terdiri dari beberapa folder dan file (seperti project pada umumnya), akan lebih mudah jika satu kesatuan folder project kita (atau folder tertentu, misal hanya folder static) di-zip terlebih dahulu lalu di-upload di lokasi yang diinginkan.

1. Contoh: untuk project nyc311 yang membutuhkan file static dalam folder static, upload folder static yang sudah di-zip ke direktori /home/azukacchi/nyc311. File zip dapat di-unzip dengan cara: (1) membuka folder tempat file zip berada lalu "Open Bash console here", atau (2) buka bash console dimana pun lalu ubah direktori ke tempat file zip berada `cd /home/azukacchi/nyc311`. Setelah bash console terbuka, ketik `unzip namafile.zip` (dalam kasus ini namafile adalah `static`). File zip yang terekstrak akan menjadi folder berisi file-file.

    ![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q9fezg6pdtp00s5u8mcu.png)

1. Jangan lupa isi detail aplikasi di halaman Web. 

    ![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b6lp6mlh6ndwmudxowky.png)

    ![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tpci6lghhzl3trwbonz8.png)

## Heroku

diadaptasi dari tutorial resmi: [Getting Started on Heroku with Python](https://devcenter.heroku.com/articles/getting-started-with-python#set-up)

Asumsi:

- Heroku dan Git sudah ter-install (jika belum, lihat link tutorial)
- folder project sudah tersedia dengan (dengan atau tanpa menggunakan virtual environment), aplikasi Flask sudah berjalan OK di komputer dan siap di-deploy

Langkah-langkah:

1. Di dalam folder project, buat beberapa file dengan menggunakan Notepad bernama `Procfile`, `requirements.txt`, `runtime.txt`, `.gitignore` dengan rincian isi file sebagai berikut:

    1. Procfile 
          ```
          web: gunicorn app:app
          ``` 

    1. requirements.txt
    
          Semua package yang dibutuhkan untuk project kita. Tambah juga `gunicorn` untuk webserver (install dengan pip terlebih dahulu). Contoh untuk project saya
          ```
          gunicorn
          flask==1.1.2
          imblearn
          plotly==4.14.3
          pandas==1.2.2
          numpy==1.19.2
          sklearn
          ```

    1. runtime.txt
    
          Isi dengan versi python yang digunakan untuk project. Misal untuk project ini saya menggunakan virtual environment dengan python versi 3.8.5, maka isi file sebagai berikut.
          ```
          python-3.8.5
          ```

    1. .gitignore

          Sesuaikan dengan project. Misal:
          ```
          ## Cache
          __pycache__/
          ```

1. Dengan asumsi seluruh file sudah final, langkah selanjutnya adalah menjadikan folder project kita menjadi repository git. Buka command prompt lalu buka direktori folder project kita dan ubah folder menjadi repository git. Lalu buat aplikasi heroku baru di folder tersebut. Contoh:
    ```
    cd "C:\Users\azuka\Drive Folder\Dash\311-nyc"
    git init
    heroku create
    ```

1. Commit dan push. Perhatikan baik-baik log pada command prompt jika terdapat error pada langkah terakhir. Error bisa datang dari versi python yang tidak sesuai di file `runtime.txt` atau ada package yang tidak tertera di file `requirements.txt`.
    ```
    git add .
    git commit -m "lalalayeyeye isi bebas"
    git push heroku master
    ```

1. Jika deploy sudah berhasil, pastikan satu instance app berjalan
    ```
    heroku ps:scale web=1
    ``` 

1. Ganti nama app lama (secara default di-generate random oleh Heroku) dengan nama yang diinginkan
    ```
    heroku apps:rename newname
    ```

1. Jika kita membuat perubahan pada aplikasi, cukup ulangi deploy dengan mengulangi langkah nomor 3.