Flask Projesini Ubuntu Server Üzerinde Yayınlamak

emregeldegul

Yunus Emre Geldegül

Posted on March 28, 2022

Flask Projesini Ubuntu Server Üzerinde Yayınlamak

Herkese selam!
Flask ile geliştirilmiş bir web uygulamasının bir Ubuntu server üzerinde nasıl yayına alınacağını bu yazıda detaylı anlatacağım. İlk konfigürasyon süreci biraz uzun ve sıkıcı olsa da sunucuyu bir kez konfigüre edince yeni projeler eklemek oldukça kolay olacaktır.

Haydi başlayalım o zaman!

Proje Yapısı ve Gereksinimler

Genel manada bir web uygulaması birkaç servisten oluşur ve bu servislerin yönetimi ise çeşitli uygulamalar ile sağlanabilir. Kabaca servisler ve bizim bu servisleri yöneteceğim uygulamalar ise aşağıdaki gibidir.

  • Web Servisi (Flask uygulamasının kendisi): Flask APP
  • WSGI Servisi (Projemizi yayınlayacak servis): Gunicorn
  • Process Control Servisi (Uygulamamızı çalışır durumda tutacak ve loglayacak servis): Supervisord
  • HTTP Server (Proxy görevi görecek ve statik dosyalarımızı yayınlayacak servis): Nginx

Deploy Schema

Flask APP olarak, daha önce günlük yazmak için geliştirdiğim Confidant uygulamasını kullanacağım. Bu uygulama Application Factory modeli ile geliştirildi ve deploy etmek için oldukça uygun.

Son olarak, port yönetimi için ise UFW uygulamasını kullanacağız. Haydi başlayalım.

Kurulum

İlk İşlemler

Not: Kurulumu root kullanıcısı dışında bir kullanıcı ile yapılması önerilir. (bknz: ubuntu kullanıcı oluşturma)

SSH bağlantısı ile sunucumuza bağlandıktan sonra paketlerimizi güncelleyerek kuruluma başlıyoruz.

~$ sudo apt update && apt upgrade

Daha sonra Python, PIP, GIT ve virtualenv kurulumlarını gerçekleştiriyoruz.

~$ sudo apt install python3 python3-pip git
~$ pip3 install virtualenv

Flask APP Kurulumu

Artık flask uygulamamızı kurabiliriz. Ev dizinine (/user/home/) Flask uygulamamızı git ile klonluyoruz ve uygulama dizinine giriyoruz.

~$ git clone https://github.com/emregeldegul/confidant && cd confidant

Daha sonra python uygulamamızı sistemden izole çalıştırabilmek için virtualenv ile sanal bir ortam oluşturuyoruz ve bu ortamı aktif ediyoruz.

~$ python3 -m virtualenv venv && source venv/bin/active

Artık uygulamamız için gerekli olan paketleri requirements.txt dosyasından yüklüyoruz.

(venv) ~$ pip install -r requirements.txt

Burada, requirements.txt dosyası içerisinde gunicorn modülünün de olduğunu unutmayın. Böylece WSGI uygulamasını da aradan çıkartmış olduk.

Uygulama migration dosyaları içerdiğinden küçük bir migration işlemi de yapıyoruz (yoksa, bu adımı geçebiliriz).

(venv) ~$ flask db migrate

Uygulamamızın kurulumu tamam.

UFW Kurulum ve Kullanımı

UFW, basit bir güvenlik duvarı yönetim aracıdır. UFW kullanarak portları güvenli bir şekilde açıp kapatabiliriz.

UFW aracını kurduktan sonra default olarak bir kaç ayar giriyoruz. Ayrıca SSH erişimine izin vermek için SSH portuna erişim izni veriyoruz. Birde flask uygulamamızı test etmek için kısa süreliğine 5000 portunu da aktif ediyoruz. Bu portu daha sonra sileceğiz.

~$ sudo apt install ufw
~$ sudo ufw default allow outgoing
~$ sudo ufw default deny incoming
~$ sudo ufw allow ssh
~$ sudo ufw allow 5000
~$ sudo ufw enabled
Enter fullscreen mode Exit fullscreen mode

UFW enabled demeden önce ssh'a erişim vermeyi unutmayın. Yoksa sunucu erişimini kaybedersiniz.

Şimdi Flask uygulamamızı uygulama dizini içerisinde sanal ortam ile çalıştırıp erişim sağlamaya çalışıyoruz.

(venv) ~$ flask run --host=0.0.0.0 --port=5000

Sunucu IP Adresi ve 5000 portu ile tarayıcı üzerinden bağlanmaya çalışıyoruz.

http://sunucu_ip_adresi:5000

Her şey tamam ise uygulamamız bizi düzgün bir şekilde karşılayacaktır. Aksi durumda adımlardan birinde bir hata yapmışız demektir.

CTRL + C diyerek flask uygulamasını durduruyoruz ve supervisor ile çalışır hale getirmek için sonraki adıma geçiyoruz.

Supervisor Kurulumu

Supervisor uygulamamızı sürekli ayakta tutacak ve süreci yönetecek güzel bir araç olarak karşımıza çıkıyor.

Supervisor Web Interface

Hemen kuruluma başlayalım.

~$ sudo apt install supervisor

Supervisor, /etc/supervisor/conf.d/ içerisinde ayar dosyalarını arayarak süreçleri yönetir. Bizde bu klasör içerisine uygulamalarımızı nasıl çalıştırılacağını beliren*.conf dosyaları oluşturarak supervisor'e uygulamamızı tanıtacağız.

~$ sudo nano /etc/supervisor/conf.d/confidant.conf

Uygulama ismi ile .conf dosyası oluşturuyorum Nano editör yardımı ile. İçerisine aşağıdaki şekilde ayarları giriyorum.

[program:confidant]
directory=/home/user/confidant
command=/home/user/confidant/venv/bin/gunicorn -w 3 run:app -b 0.0.0.0:13001
user=<USER>
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
stderr_logfile=/home/user/logs/confidant/confidant.err.log
stdout_logfile=/home/user/logs/confidant/confidant.out.log
Enter fullscreen mode Exit fullscreen mode

Kaydetmek için CTRL + X diyorum ve enter diyerek değişiklikleri kaydediyorum.

[program:APP_NAME]: uygulamamızın ismi. Uygulamamızı yönetirken bu isim ile yöneteceğiz.
directory: uygulama dizinimiz.
command: uygulamamızı nasıl çalıştıracağını belirttiğimiz komut. Kabaca gunicorn ile uygulamamızda ki run.py dosyasında bulunan app değişkenini işaret ediyoruz (app değişkeni, create_app ile oluşturulmuş uygulamayı içerir).
user: root yada aktif oturuma sahip kullanıcı adı.
stderr_logfile: flask app hata loglarının tutulduğu dosya.
stdout_logfile: program çıktılarının kaydedildiği log dosyası.

Burada 13001 portunu belirttiğimizi unutmayın, bunu ilerde kullanacağız.

Eğer Application Factory kullanmıyorsanız, uygulamanın tanımlı olduğu dosya ve değişkeni işaret etmeniz gerekiyor.

app = Flask(__name__)
Enter fullscreen mode Exit fullscreen mode

Burada ki app değişkeni, uygulamamız oluyor.

Log dosyalarını oluşturalım şimdi de;

~$ mkdir -p logs/confidant
~$ sudo touch /logs/confidant/confidant.err.log
~$ sudo touch /logs/confidant/confidant.out.log
Enter fullscreen mode Exit fullscreen mode

Ve konfigürasyon dosyamızı supervisor'a yükleyelim.

~$ sudo supervisorctl reload

Supervisor, uygulamamızı çalıştırıyor mu diye küçük bir kontrol sağlayalım;

~$ sudo supervisorctl status

confidant uygulamamız running ise sıkıntı yok demektir.

Şimdi UFW ile 5000 portunu kapatıp 13001 portunu açalım. Bakalım programımız aktif olarak çalışıyor mu.

~$ sudo ufw delete allow 5000
~# sudo ufw allow 13001
Enter fullscreen mode Exit fullscreen mode

Tarayıcıdan 13001 numaralı porta giderek çalışıp çalışmadığını kontrol edeceğiz.

http://<sunucu_ip_adres>:13001

Eğer sayfaya ulaşabiliyorsak supervisor konfigürasyonu tamam demektir. 13001 protunu dışarıya kapatabiliriz tekrar.

~$ sudo ufw delete allow 13001

Bir kaç küçük supervisor komutu;

~$ sudo supervisorctl reload # yeni konfigürasyon dosyalarını içeri aktarır.
~$ sudo supervisorctl restart <APP_NAME> # Belirtilen uygulamayı yeniden başlatır.
~$ sudo supervisorctl start/stop <APP_NAME> # Belirtilen uygulamayı başlatır/durdurur başlatır.
Enter fullscreen mode Exit fullscreen mode

Artık Nginx kurulumu ile devam edebiliriz.

NGINX Kurulumu

Nginx sadece bir web sunucusu değil aynı zamanda ters vekil sunucusu ve yük dengeleyici gibi çeşitli alanlarda kullanılan oldukça gelişmiş bir uygulamadır. Ayrıca flask uygulamamızı sanal olarak host edebilmemize olanak sağlarken statik dosyalarımızı da yayınlayacak kendisi. Hemen kurulumunu yapalım.

~$ sudo apt install nginx

Hemen arından Ngnix default yapılandırmasını siliyoruz.

~$ sudo rm /etc/nginx/sites-enabled/default

Ve kendi yapılandırma dosyamızı oluşturuyoruz.

~$ sudo nan /etc/nginx/site-enabled/confidant

İçerisini aşağıdaki gibi dolduruyoruz.

server {
    server_name <domain_name_or_server_ip_address>;

    location /static {
        alias /home/<folder>/<project>/app/static;
    }

    location / {
        proxy_pass http://localhost:<port>;
        include /etc/nginx/proxy_params;
        proxy_redirect off;
    }
}
Enter fullscreen mode Exit fullscreen mode

Hepsi bu kadar. Port olarak supervisor ayarlarını yaptığımız sırada girdiğimiz port numarasını giriyoruz. Artık Nginx servisini yeniden başlatabiliriz.

sudo systemctl restart nginx.service

UFW ile http/tcp portlarına da izin veriyoruz (80 portu).

~$ sudo ufw allow http/tcp

Artık tarayıcıdan sunucu ip adresine giderek çalışıp çalışmadığını kontrol edebiliriz. Her şey tamamsa uygulamamız düzgün bir şekilde çalışıyor demektir.

http://<server_ip_address>

Hepsi bu kadar! Yorucu oldu ama uygulamamızı deploy etmeyi başardık.

Hayırlı olsun!

Sonraki yazıda nasıl kendi alan adımızı sunucuya bağlarız, bundan bahsedeceğim. O zaman kadar, iyi çalışmalar!

💖 💪 🙅 🚩
emregeldegul
Yunus Emre Geldegül

Posted on March 28, 2022

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related