<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Yunus Emre Geldegül</title>
    <description>The latest articles on DEV Community by Yunus Emre Geldegül (@emregeldegul).</description>
    <link>https://dev.to/emregeldegul</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F412931%2F14f2e8b8-e8a4-44af-8af2-eed2aeea79bc.jpg</url>
      <title>DEV Community: Yunus Emre Geldegül</title>
      <link>https://dev.to/emregeldegul</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/emregeldegul"/>
    <language>en</language>
    <item>
      <title>Flask Projesini Ubuntu Server Üzerinde Yayınlamak</title>
      <dc:creator>Yunus Emre Geldegül</dc:creator>
      <pubDate>Mon, 28 Mar 2022 19:37:46 +0000</pubDate>
      <link>https://dev.to/emregeldegul/flask-projesini-ubuntu-server-uzerinde-yayinlamak-3g1p</link>
      <guid>https://dev.to/emregeldegul/flask-projesini-ubuntu-server-uzerinde-yayinlamak-3g1p</guid>
      <description>&lt;p&gt;Herkese selam!&lt;br&gt;
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.&lt;/p&gt;

&lt;p&gt;Haydi başlayalım o zaman!&lt;/p&gt;
&lt;h2&gt;
  
  
  Proje Yapısı ve Gereksinimler
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Web Servisi (Flask uygulamasının kendisi):&lt;/strong&gt; Flask APP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WSGI Servisi (Projemizi yayınlayacak servis):&lt;/strong&gt; &lt;a href="https://gunicorn.org" rel="noopener noreferrer"&gt;Gunicorn&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Process Control Servisi (Uygulamamızı çalışır durumda tutacak ve loglayacak servis):&lt;/strong&gt; &lt;a href="https://supervisord.org" rel="noopener noreferrer"&gt;Supervisord&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTP Server (Proxy görevi görecek ve statik dosyalarımızı yayınlayacak servis):&lt;/strong&gt; &lt;a href="https://www.nginx.com/" rel="noopener noreferrer"&gt;Nginx&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fidhmip1oqtrd56loyxba.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fidhmip1oqtrd56loyxba.png" alt="Deploy Schema"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Flask APP olarak, daha önce günlük yazmak için geliştirdiğim &lt;a href="https://github.com/emregeldegul/Confidant" rel="noopener noreferrer"&gt;Confidant&lt;/a&gt; uygulamasını kullanacağım. Bu uygulama Application Factory modeli ile geliştirildi ve deploy etmek için oldukça uygun.&lt;/p&gt;

&lt;p&gt;Son olarak, port yönetimi için ise UFW uygulamasını kullanacağız. Haydi başlayalım.&lt;/p&gt;
&lt;h2&gt;
  
  
  Kurulum
&lt;/h2&gt;
&lt;h2&gt;
  
  
  İlk İşlemler
&lt;/h2&gt;

&lt;p&gt;Not: Kurulumu root kullanıcısı dışında bir kullanıcı ile yapılması önerilir. (bknz: &lt;a href="https://www.bayramucuncu.com/ubuntu-yeni-kullanici-ekleme-islemleri/" rel="noopener noreferrer"&gt;ubuntu kullanıcı oluşturma&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;SSH bağlantısı ile sunucumuza bağlandıktan sonra paketlerimizi güncelleyerek kuruluma başlıyoruz.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;~$ sudo apt update &amp;amp;&amp;amp; apt upgrade&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Daha sonra Python, PIP, GIT ve virtualenv kurulumlarını gerçekleştiriyoruz.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;~$ sudo apt install python3 python3-pip git&lt;/code&gt;&lt;br&gt;
&lt;code&gt;~$ pip3 install virtualenv&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Flask APP Kurulumu
&lt;/h3&gt;

&lt;p&gt;Artık flask uygulamamızı kurabiliriz. Ev dizinine (&lt;code&gt;/user/home/&lt;/code&gt;) Flask uygulamamızı git ile klonluyoruz ve uygulama dizinine giriyoruz.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;~$ git clone https://github.com/emregeldegul/confidant &amp;amp;&amp;amp; cd confidant&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Daha sonra python uygulamamızı sistemden izole çalıştırabilmek için &lt;strong&gt;virtualenv&lt;/strong&gt; ile sanal bir ortam oluşturuyoruz ve bu ortamı aktif ediyoruz.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;~$ python3 -m virtualenv venv &amp;amp;&amp;amp; source venv/bin/active&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Artık uygulamamız için gerekli olan paketleri &lt;code&gt;requirements.txt&lt;/code&gt; dosyasından yüklüyoruz.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;(venv) ~$ pip install -r requirements.txt&lt;/code&gt;&lt;/p&gt;

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

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

&lt;p&gt;&lt;code&gt;(venv) ~$ flask db migrate&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Uygulamamızın kurulumu tamam.&lt;/p&gt;
&lt;h3&gt;
  
  
  UFW Kurulum ve Kullanımı
&lt;/h3&gt;

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

&lt;p&gt;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.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;ufw
~&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw default allow outgoing
~&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw default deny incoming
~&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow ssh
~&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow 5000
~&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw enabled
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;UFW enabled demeden önce ssh'a erişim vermeyi unutmayın. Yoksa sunucu erişimini kaybedersiniz.&lt;/p&gt;

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

&lt;p&gt;&lt;code&gt;(venv) ~$ flask run --host=0.0.0.0 --port=5000&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Sunucu IP Adresi ve 5000 portu ile tarayıcı üzerinden bağlanmaya çalışıyoruz.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;http://sunucu_ip_adresi:5000&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CTRL + C&lt;/code&gt; diyerek flask uygulamasını durduruyoruz ve supervisor ile çalışır hale getirmek için sonraki adıma geçiyoruz.&lt;/p&gt;

&lt;h3&gt;
  
  
  Supervisor Kurulumu
&lt;/h3&gt;

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

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo1lacttxqtk6rsvoug8e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo1lacttxqtk6rsvoug8e.png" alt="Supervisor Web Interface"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hemen kuruluma başlayalım.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;~$ sudo apt install supervisor&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Supervisor, &lt;code&gt;/etc/supervisor/conf.d/&lt;/code&gt; 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&lt;code&gt;*.conf&lt;/code&gt; dosyaları oluşturarak supervisor'e uygulamamızı tanıtacağız.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;~$ sudo nano /etc/supervisor/conf.d/confidant.conf&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Uygulama ismi ile .conf dosyası oluşturuyorum Nano editör yardımı ile. İçerisine aşağıdaki şekilde ayarları giriyorum.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[program:confidant]
directory=/home/user/confidant
command=/home/user/confidant/venv/bin/gunicorn -w 3 run:app -b 0.0.0.0:13001
user=&amp;lt;USER&amp;gt;
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
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kaydetmek için &lt;code&gt;CTRL + X&lt;/code&gt; diyorum ve &lt;code&gt;enter&lt;/code&gt; diyerek değişiklikleri kaydediyorum.&lt;/p&gt;

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

&lt;p&gt;Burada &lt;strong&gt;13001&lt;/strong&gt; portunu belirttiğimizi unutmayın, bunu ilerde kullanacağız.&lt;/p&gt;

&lt;p&gt;Eğer Application Factory kullanmıyorsanız, uygulamanın tanımlı olduğu dosya ve değişkeni işaret etmeniz gerekiyor.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Flask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Burada ki app değişkeni, uygulamamız oluyor.&lt;/p&gt;

&lt;p&gt;Log dosyalarını oluşturalım şimdi de;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; logs/confidant
~&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo touch&lt;/span&gt; /logs/confidant/confidant.err.log
~&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo touch&lt;/span&gt; /logs/confidant/confidant.out.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ve konfigürasyon dosyamızı supervisor'a yükleyelim.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;~$ sudo supervisorctl reload&lt;/code&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;code&gt;~$ sudo supervisorctl status&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;confidant uygulamamız &lt;code&gt;running&lt;/code&gt; ise sıkıntı yok demektir.&lt;/p&gt;

&lt;p&gt;Şimdi UFW ile 5000 portunu kapatıp 13001 portunu açalım. Bakalım programımız aktif olarak çalışıyor mu.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw delete allow 5000
~# &lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow 13001
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tarayıcıdan 13001 numaralı porta giderek çalışıp çalışmadığını kontrol edeceğiz.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;http://&amp;lt;sunucu_ip_adres&amp;gt;:13001&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Eğer sayfaya ulaşabiliyorsak supervisor konfigürasyonu tamam demektir. 13001 protunu dışarıya kapatabiliriz tekrar.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;~$ sudo ufw delete allow 13001&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Bir kaç küçük supervisor komutu;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~$ sudo supervisorctl reload # yeni konfigürasyon dosyalarını içeri aktarır.
~$ sudo supervisorctl restart &amp;lt;APP_NAME&amp;gt; # Belirtilen uygulamayı yeniden başlatır.
~$ sudo supervisorctl start/stop &amp;lt;APP_NAME&amp;gt; # Belirtilen uygulamayı başlatır/durdurur başlatır.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Artık Nginx kurulumu ile devam edebiliriz.&lt;/p&gt;

&lt;h3&gt;
  
  
  NGINX Kurulumu
&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;~$ sudo apt install nginx&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Hemen arından Ngnix default yapılandırmasını siliyoruz.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;~$ sudo rm /etc/nginx/sites-enabled/default&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Ve kendi yapılandırma dosyamızı oluşturuyoruz.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;~$ sudo nan /etc/nginx/site-enabled/confidant&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;İçerisini aşağıdaki gibi dolduruyoruz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;server {
    server_name &amp;lt;domain_name_or_server_ip_address&amp;gt;;

    location /static {
        alias /home/&amp;lt;folder&amp;gt;/&amp;lt;project&amp;gt;/app/static;
    }

    location / {
        proxy_pass http://localhost:&amp;lt;port&amp;gt;;
        include /etc/nginx/proxy_params;
        proxy_redirect off;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo systemctl restart nginx.service&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;UFW ile &lt;code&gt;http/tcp&lt;/code&gt; portlarına da izin veriyoruz (80 portu).&lt;/p&gt;

&lt;p&gt;&lt;code&gt;~$ sudo ufw allow http/tcp&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;http://&amp;lt;server_ip_address&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Hepsi bu kadar! Yorucu oldu ama uygulamamızı deploy etmeyi başardık.&lt;/p&gt;

&lt;p&gt;Hayırlı olsun!&lt;/p&gt;

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

</description>
      <category>flask</category>
      <category>nginx</category>
      <category>supervisor</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
