{"id":36985,"date":"2025-12-25T20:40:49","date_gmt":"2025-12-25T17:40:49","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=36985"},"modified":"2025-12-25T20:40:49","modified_gmt":"2025-12-25T17:40:49","slug":"ubuntu-bulut-sunucularinda-python-web-uygulamalari-kurulumu-kapsamli-bir-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/ubuntu-bulut-sunucularinda-python-web-uygulamalari-kurulumu-kapsamli-bir-rehber\/","title":{"rendered":"Ubuntu Bulut Sunucular\u0131nda Python Web Uygulamalar\u0131 Kurulumu: Kapsaml\u0131 Bir Rehber"},"content":{"rendered":"<p><body><\/p>\n<h2>Ubuntu Bulut Sunucular\u0131nda Python Web Uygulamalar\u0131 Kurulumu: Kapsaml\u0131 Bir Rehber<\/h2>\n<p>Bulut bili\u015fim, g\u00fcn\u00fcm\u00fcz web uygulamalar\u0131n\u0131n da\u011f\u0131t\u0131m\u0131 ve y\u00f6netimi i\u00e7in vazge\u00e7ilmez bir teknoloji haline gelmi\u015ftir. Esneklik, \u00f6l\u00e7eklenebilirlik ve maliyet etkinli\u011fi sunan bulut sunucular\u0131, geli\u015ftiricilere projelerini kolayca hayata ge\u00e7irme imkan\u0131 tan\u0131r. \u00d6zellikle Python tabanl\u0131 web uygulamalar\u0131 i\u00e7in Ubuntu i\u015fletim sistemi, geni\u015f topluluk deste\u011fi, zengin paket y\u00f6neticisi ve kararl\u0131 yap\u0131s\u0131yla ideal bir platform sunar. Bu makale, bir Python web uygulamas\u0131n\u0131 Ubuntu tabanl\u0131 bir bulut sunucusuna nas\u0131l da\u011f\u0131taca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ve kapsaml\u0131 bir \u015fekilde a\u00e7\u0131klamaktad\u0131r. Amac\u0131m\u0131z, uygulaman\u0131z\u0131n canl\u0131 ortama g\u00fcvenli, verimli ve profesyonel bir \u015fekilde ula\u015fmas\u0131n\u0131 sa\u011flamakt\u0131r.<\/p>\n<h3>I. Bulut Sunucusu Se\u00e7imi ve Temel Haz\u0131rl\u0131klar<\/h3>\n<p>Bir Python web uygulamas\u0131n\u0131 buluta ta\u015f\u0131mak i\u00e7in ilk ad\u0131m, uygun bir bulut sa\u011flay\u0131c\u0131s\u0131 ve sunucu yap\u0131land\u0131rmas\u0131 se\u00e7mektir. Bu b\u00f6l\u00fcm, do\u011fru se\u00e7imleri yapman\u0131z ve sunucunuzu ilk kullan\u0131ma haz\u0131rlaman\u0131z i\u00e7in gereken temel ad\u0131mlar\u0131 i\u00e7erir.<\/p>\n<h4>1.1 Bulut Sa\u011flay\u0131c\u0131 Se\u00e7imi<\/h4>\n<p>Piyasada bir\u00e7ok pop\u00fcler bulut sa\u011flay\u0131c\u0131s\u0131 bulunmaktad\u0131r ve her birinin kendine \u00f6zg\u00fc avantajlar\u0131 vard\u0131r:<br \/>\n*   <strong>Amazon Web Services (AWS):<\/strong> Kapsaml\u0131 hizmet yelpazesi, y\u00fcksek \u00f6l\u00e7eklenebilirlik ve k\u00fcresel altyap\u0131 sunar. Ancak yeni ba\u015flayanlar i\u00e7in karma\u015f\u0131k olabilir.<br \/>\n*   <strong>Google Cloud Platform (GCP):<\/strong> Makine \u00f6\u011frenimi ve veri analizi odakl\u0131 hizmetleriyle dikkat \u00e7eker, kullan\u0131c\u0131 dostu aray\u00fcze sahiptir.<br \/>\n*   <strong>Microsoft Azure:<\/strong> Kurumsal \u00e7\u00f6z\u00fcmler ve .NET entegrasyonu i\u00e7in g\u00fc\u00e7l\u00fcd\u00fcr, hibrit bulut senaryolar\u0131nda tercih edilir.<br \/>\n*   <strong>DigitalOcean, Vultr, Linode:<\/strong> Daha basit aray\u00fczler, uygun fiyatlar ve geli\u015ftirici dostu \u00f6zellikler sunarlar. K\u00fc\u00e7\u00fck ve orta \u00f6l\u00e7ekli projeler i\u00e7in idealdirler.<\/p>\n<p>Se\u00e7im yaparken uygulaman\u0131z\u0131n beklenen trafi\u011fini, b\u00fct\u00e7enizi, co\u011frafi konum gereksinimlerinizi ve ihtiyac\u0131n\u0131z olan ek hizmetleri (veritaban\u0131, depolama, CDN vb.) g\u00f6z \u00f6n\u00fcnde bulundurmal\u0131s\u0131n\u0131z. Genellikle DigitalOcean veya Vultr gibi sa\u011flay\u0131c\u0131lar, ba\u015flang\u0131\u00e7 i\u00e7in daha kolay ve maliyet etkin bir deneyim sunar.<\/p>\n<h4>1.2 Ubuntu Sunucusu Olu\u015fturma<\/h4>\n<p>Bulut sa\u011flay\u0131c\u0131n\u0131z\u0131 se\u00e7tikten sonra, bir sanal sunucu (Virtual Private Server &#8211; VPS veya Droplet, Instance vb.) olu\u015fturman\u0131z gerekir. Bu s\u00fcre\u00e7 genellikle \u015fu ad\u0131mlar\u0131 i\u00e7erir:<br \/>\n1.  <strong>\u0130\u015fletim Sistemi Se\u00e7imi:<\/strong> Ubuntu LTS (Long Term Support) s\u00fcr\u00fcmleri (\u00f6rn. 22.04 LTS veya 20.04 LTS) tercih edilmelidir. LTS s\u00fcr\u00fcmleri, uzun s\u00fcreli g\u00fcvenlik g\u00fcncellemeleri ve kararl\u0131l\u0131k sunar.<br \/>\n2.  <strong>Sunucu Boyutu:<\/strong> Uygulaman\u0131z\u0131n gereksinimlerine g\u00f6re CPU, RAM ve depolama alan\u0131 se\u00e7imi yap\u0131n. Basit bir Flask veya Django uygulamas\u0131 i\u00e7in 1 CPU, 1-2 GB RAM ve 25-50 GB SSD depolama ba\u015flang\u0131\u00e7 i\u00e7in yeterli olabilir. Trafik artt\u0131k\u00e7a bu kaynaklar\u0131 kolayca \u00f6l\u00e7eklendirebilirsiniz.<br \/>\n3.  <strong>B\u00f6lge Se\u00e7imi:<\/strong> Uygulaman\u0131z\u0131n hedef kitlesine en yak\u0131n co\u011frafi b\u00f6lgeyi se\u00e7erek gecikmeyi (latency) azaltabilirsiniz.<br \/>\n4.  <strong>SSH Anahtar\u0131:<\/strong> G\u00fcvenli ba\u011flant\u0131 i\u00e7in SSH anahtarlar\u0131 kullanmak \u015fiddetle tavsiye edilir. Bir SSH anahtar \u00e7ifti (\u00f6zel ve genel anahtar) olu\u015fturun ve genel anahtar\u0131n\u0131z\u0131 sunucu olu\u015fturma a\u015famas\u0131nda ekleyin. Bu, \u015fifre tabanl\u0131 giri\u015flerden \u00e7ok daha g\u00fcvenlidir.<\/p>\n<h4>1.3 \u0130lk Ba\u011flant\u0131 ve Temel G\u00fcvenlik Ayarlar\u0131<\/h4>\n<p>Sunucunuz olu\u015fturulduktan sonra, SSH arac\u0131l\u0131\u011f\u0131yla ilk ba\u011flant\u0131y\u0131 kurman\u0131z gerekir.<br \/>\nTerminalinizden \u015fu komutu kullanarak ba\u011flan\u0131n (kullan\u0131c\u0131 ad\u0131n\u0131z genellikle <code>root<\/code> veya sa\u011flay\u0131c\u0131n\u0131za g\u00f6re farkl\u0131l\u0131k g\u00f6sterebilir, IP adresini kendi sunucunuzun IP adresiyle de\u011fi\u015ftirin):<\/p>\n<pre><code class=\"language-bash\">ssh -i ~\/.ssh\/your_private_key_file root@your_server_ip<\/code><\/pre>\n<p>Ba\u011fland\u0131ktan sonra ilk yapman\u0131z gerekenler:<br \/>\n1.  <strong>Sistem G\u00fcncellemesi:<\/strong> Paket listelerini g\u00fcncelleyin ve y\u00fckl\u00fc paketleri y\u00fckseltin. Bu, g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 kapat\u0131r ve en yeni yaz\u0131l\u0131mlar\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-bash\">sudo apt update\n    sudo apt upgrade -y<\/code><\/pre>\n<p>2.  <strong>Yeni Bir <code>sudo<\/code> Kullan\u0131c\u0131s\u0131 Olu\u015fturma:<\/strong> <code>root<\/code> kullan\u0131c\u0131s\u0131 olarak s\u00fcrekli \u00e7al\u0131\u015fmak risklidir. Yeni bir standart kullan\u0131c\u0131 olu\u015fturun ve ona <code>sudo<\/code> ayr\u0131cal\u0131klar\u0131 verin.<\/p>\n<pre><code class=\"language-bash\">sudo adduser your_username\n    sudo usermod -aG sudo your_username<\/code><\/pre>\n<p>    Daha sonra bu kullan\u0131c\u0131ya ge\u00e7i\u015f yap\u0131n ve <code>root<\/code> kullan\u0131c\u0131s\u0131n\u0131n SSH eri\u015fimini devre d\u0131\u015f\u0131 b\u0131rakmay\u0131 d\u00fc\u015f\u00fcnebilirsiniz (daha sonraki bir ad\u0131mda).<br \/>\n3.  <strong>G\u00fcvenlik Duvar\u0131 (UFW) Yap\u0131land\u0131rmas\u0131:<\/strong> UFW (Uncomplicated Firewall), Ubuntu i\u00e7in kullan\u0131m\u0131 kolay bir g\u00fcvenlik duvar\u0131d\u0131r. Sadece gerekli portlara eri\u015fime izin vererek sunucunuzu korur.<\/p>\n<pre><code class=\"language-bash\">sudo apt install ufw -y\n    sudo ufw allow OpenSSH       # SSH eri\u015fimine izin ver\n    sudo ufw allow 'Nginx HTTP'  # HTTP (80) portuna izin ver (Nginx kurduktan sonra)\n    sudo ufw allow 'Nginx HTTPS' # HTTPS (443) portuna izin ver (Nginx kurduktan sonra)\n    sudo ufw enable              # G\u00fcvenlik duvar\u0131n\u0131 etkinle\u015ftir\n    sudo ufw status              # Durumu kontrol et<\/code><\/pre>\n<p>    UFW&#8217;yi etkinle\u015ftirmeden \u00f6nce SSH portuna izin verdi\u011finizden emin olun, aksi takdirde sunucunuza eri\u015fiminizi kaybedebilirsiniz.<\/p>\n<h3>II. Python Ortam\u0131n\u0131n Kurulumu ve Y\u00f6netimi<\/h3>\n<p>Python web uygulaman\u0131z\u0131n ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 izole etmek ve y\u00f6netmek, sorunsuz bir da\u011f\u0131t\u0131m s\u00fcreci i\u00e7in kritik \u00f6neme sahiptir. Bu b\u00f6l\u00fcmde, Python&#8217;\u0131 kurma ve sanal ortamlar\u0131 etkin bir \u015fekilde kullanma ad\u0131mlar\u0131n\u0131 ele alaca\u011f\u0131z.<\/p>\n<h4>2.1 Python Kurulumu<\/h4>\n<p>Ubuntu genellikle varsay\u0131lan olarak Python 3 ile gelir, ancak uygulaman\u0131z\u0131n belirli bir Python s\u00fcr\u00fcm\u00fcne veya ek geli\u015ftirme ara\u00e7lar\u0131na ihtiyac\u0131 olabilir.<br \/>\nGerekli Python geli\u015ftirme ara\u00e7lar\u0131n\u0131 ve <code>pip<\/code>&#8216;i (Python paket y\u00f6neticisi) kural\u0131m:<\/p>\n<pre><code class=\"language-bash\">sudo apt install python3-pip python3-dev build-essential -y<\/code><\/pre>\n<p>*   <code>python3-pip<\/code>: Python 3 paket y\u00f6neticisi.<br \/>\n*   <code>python3-dev<\/code>: Python C uzant\u0131lar\u0131 derlemek i\u00e7in gereken ba\u015fl\u0131k dosyalar\u0131 ve statik k\u00fct\u00fcphaneler.<br \/>\n*   <code>build-essential<\/code>: Derleyici ve di\u011fer derleme ara\u00e7lar\u0131n\u0131 i\u00e7erir.<\/p>\n<p>E\u011fer uygulaman\u0131z farkl\u0131 bir Python s\u00fcr\u00fcm\u00fc gerektiriyorsa, <code>pyenv<\/code> gibi ara\u00e7lar veya <code>deadsnakes<\/code> PPA&#8217;s\u0131 kullan\u0131labilir. Ancak \u00e7o\u011fu durumda, sistemdeki Python 3 yeterli olacakt\u0131r.<\/p>\n<h4>2.2 Sanal Ortam Olu\u015fturma<\/h4>\n<p>Python sanal ortamlar\u0131, her projenin kendi ba\u011f\u0131ml\u0131l\u0131k setini izole etmesini sa\u011flar. Bu, ba\u011f\u0131ml\u0131l\u0131k \u00e7ak\u0131\u015fmalar\u0131n\u0131 \u00f6nler ve projelerin ta\u015f\u0131nabilirli\u011fini art\u0131r\u0131r. <code>venv<\/code> mod\u00fcl\u00fc, Python 3 ile birlikte gelir ve kullan\u0131m\u0131 kolayd\u0131r.<br \/>\nUygulaman\u0131z\u0131n dosyalar\u0131n\u0131 bar\u0131nd\u0131raca\u011f\u0131n\u0131z bir dizin olu\u015fturun ve i\u00e7ine girin:<\/p>\n<pre><code class=\"language-bash\">mkdir ~\/my_python_app\ncd ~\/my_python_app<\/code><\/pre>\n<p>\u015eimdi bu dizin i\u00e7inde bir sanal ortam olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-bash\">python3 -m venv venv<\/code><\/pre>\n<p>Bu komut, <code>my_python_app<\/code> dizini i\u00e7inde <code>venv<\/code> ad\u0131nda bir dizin olu\u015fturur ve bu dizin, Python yorumlay\u0131c\u0131s\u0131n\u0131n, pip&#8217;in ve ba\u011f\u0131ms\u0131z bir paket setinin kopyalar\u0131n\u0131 i\u00e7erir.<\/p>\n<p>Sanal ortam\u0131 etkinle\u015ftirmek i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">source venv\/bin\/activate<\/code><\/pre>\n<p>Ortam etkinle\u015ftirildi\u011finde, terminal istemciniz genellikle sanal ortam\u0131n ad\u0131n\u0131 g\u00f6sterecektir (\u00f6rn. <code>(venv) your_username@your_server_ip:~\/my_python_app$<\/code>). Art\u0131k bu ortamda <code>pip install<\/code> ile y\u00fckledi\u011finiz t\u00fcm paketler, sistem genelindeki Python kurulumunu etkilemeden bu sanal ortamda kalacakt\u0131r.<\/p>\n<p>Sanal ortamdan \u00e7\u0131kmak i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">deactivate<\/code><\/pre>\n<p>Uygulaman\u0131z\u0131 da\u011f\u0131t\u0131rken, sanal ortam\u0131 etkinle\u015ftirip ba\u011f\u0131ml\u0131l\u0131klar\u0131 kuracaks\u0131n\u0131z.<\/p>\n<h3>III. Web Uygulamas\u0131 Dosyalar\u0131n\u0131n Sunucuya Aktar\u0131m\u0131<\/h3>\n<p>Uygulama kodunuzu yerel geli\u015ftirme ortam\u0131n\u0131zdan bulut sunucusuna aktarman\u0131n birka\u00e7 yolu vard\u0131r. Git kullanmak, s\u00fcr\u00fcm kontrol\u00fc ve kolay g\u00fcncellemeler sa\u011flad\u0131\u011f\u0131 i\u00e7in en \u00e7ok \u00f6nerilen y\u00f6ntemdir.<\/p>\n<h4>3.1 Git Kullan\u0131m\u0131 (\u00d6nerilen Y\u00f6ntem)<\/h4>\n<p>Git, kodunuzu y\u00f6netmek ve sunucuya da\u011f\u0131tmak i\u00e7in standart bir ara\u00e7t\u0131r. Uygulaman\u0131z\u0131n kodunu bir Git deposunda (GitHub, GitLab, Bitbucket vb.) bar\u0131nd\u0131rman\u0131z idealdir.<br \/>\n\u00d6nce sunucunuza Git&#8217;i kurun:<\/p>\n<pre><code class=\"language-bash\">sudo apt install git -y<\/code><\/pre>\n<p>\u015eimdi, uygulaman\u0131z\u0131n depoyu klonlamak istedi\u011finiz dizine gidin (genellikle <code>\/var\/www\/<\/code> veya kullan\u0131c\u0131n\u0131z\u0131n ana dizinindeki bir proje klas\u00f6r\u00fc). \u00d6rne\u011fin, <code>my_python_app<\/code> klas\u00f6r\u00fcne:<\/p>\n<pre><code class=\"language-bash\">cd ~\/my_python_app\ngit clone https:\/\/github.com\/your_username\/your_repo_name.git . # \".\" mevcut dizine klonlar<\/code><\/pre>\n<p>E\u011fer deponuz \u00f6zel ise, SSH anahtarlar\u0131n\u0131z\u0131 Git sa\u011flay\u0131c\u0131n\u0131zla yap\u0131land\u0131rman\u0131z veya bir eri\u015fim belirteci kullanman\u0131z gerekebilir. Klonlad\u0131ktan sonra, uygulaman\u0131z\u0131n t\u00fcm dosyalar\u0131 sunucunuzda olacakt\u0131r.<\/p>\n<h4>3.2 SCP veya SFTP Kullan\u0131m\u0131 (Alternatif)<\/h4>\n<p>K\u00fc\u00e7\u00fck projeler veya tek seferlik dosya aktar\u0131mlar\u0131 i\u00e7in SCP (Secure Copy Protocol) veya SFTP (SSH File Transfer Protocol) kullanabilirsiniz.<br \/>\n<strong>SCP ile dosya kopyalama (yerelden sunucuya):<\/strong><\/p>\n<pre><code class=\"language-bash\">scp -i ~\/.ssh\/your_private_key_file \/path\/to\/your\/local\/file.py your_username@your_server_ip:~\/my_python_app\/<\/code><\/pre>\n<p><strong>SCP ile dizin kopyalama (yerelden sunucuya):<\/strong><\/p>\n<pre><code class=\"language-bash\">scp -r -i ~\/.ssh\/your_private_key_file \/path\/to\/your\/local\/project_folder your_username@your_server_ip:~\/my_python_app\/<\/code><\/pre>\n<p>SFTP ise, dosya y\u00f6neticisi benzeri bir aray\u00fczle (\u00f6rne\u011fin FileZilla veya VS Code&#8217;un Remote-SSH eklentisi arac\u0131l\u0131\u011f\u0131yla) dosya aktar\u0131m\u0131 yapman\u0131z\u0131 sa\u011flar. Bu y\u00f6ntemler, h\u0131zl\u0131 ve manuel aktar\u0131mlar i\u00e7in kullan\u0131\u015fl\u0131d\u0131r ancak s\u00fcr\u00fcm kontrol\u00fc sa\u011flamazlar.<\/p>\n<h3>IV. Ba\u011f\u0131ml\u0131l\u0131klar\u0131n Kurulumu ve Veritaban\u0131 Yap\u0131land\u0131rmas\u0131<\/h3>\n<p>Uygulaman\u0131z\u0131n kodunu sunucuya aktard\u0131ktan sonra, \u00e7al\u0131\u015fmas\u0131 i\u00e7in gereken t\u00fcm Python paketlerini kurman\u0131z ve varsa veritaban\u0131n\u0131 yap\u0131land\u0131rman\u0131z gerekir.<\/p>\n<h4>4.1 Python Ba\u011f\u0131ml\u0131l\u0131klar\u0131<\/h4>\n<p>Projenizin k\u00f6k dizininde bir <code>requirements.txt<\/code> dosyas\u0131 bulundurman\u0131z, t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131 tek seferde kurmak i\u00e7in en iyi y\u00f6ntemdir. Bu dosyay\u0131 yerel geli\u015ftirme ortam\u0131n\u0131zda <code>pip freeze > requirements.txt<\/code> komutuyla olu\u015fturabilirsiniz.<br \/>\nSunucuda, sanal ortam\u0131n\u0131z\u0131 etkinle\u015ftirin ve ba\u011f\u0131ml\u0131l\u0131klar\u0131 kurun:<\/p>\n<pre><code class=\"language-bash\">cd ~\/my_python_app\/your_repo_name # E\u011fer klonlad\u0131\u011f\u0131n\u0131z repo bir alt dizin olu\u015fturduysa\nsource venv\/bin\/activate\npip install -r requirements.txt<\/code><\/pre>\n<p>Bu komut, uygulaman\u0131z\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in gereken t\u00fcm Python paketlerini sanal ortam\u0131n\u0131za y\u00fckleyecektir.<\/p>\n<h4>4.2 Veritaban\u0131 Kurulumu<\/h4>\n<p>\u00c7o\u011fu web uygulamas\u0131 bir veritaban\u0131na ihtiya\u00e7 duyar. PostgreSQL ve MySQL\/MariaDB, Python uygulamalar\u0131yla yayg\u0131n olarak kullan\u0131lan pop\u00fcler se\u00e7eneklerdir. Burada PostgreSQL \u00fczerinden bir \u00f6rnek verece\u011fiz.<\/p>\n<p><strong>PostgreSQL Kurulumu:<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo apt install postgresql postgresql-contrib -y<\/code><\/pre>\n<p>PostgreSQL varsay\u0131lan olarak <code>postgres<\/code> adl\u0131 bir kullan\u0131c\u0131 olu\u015fturur. Bu kullan\u0131c\u0131 ile veritaban\u0131 i\u015flemleri yapabilirsiniz.<br \/>\n<code>postgres<\/code> kullan\u0131c\u0131s\u0131na ge\u00e7i\u015f yap\u0131n:<\/p>\n<pre><code class=\"language-bash\">sudo -i -u postgres<\/code><\/pre>\n<p>\u015eimdi bir veritaban\u0131 ve veritaban\u0131 kullan\u0131c\u0131s\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-bash\">createuser --pwprompt my_app_user # \u015eifre belirleyin\ncreatedb -O my_app_user my_app_db\nexit # postgres kullan\u0131c\u0131s\u0131ndan \u00e7\u0131k\u0131\u015f yap\u0131n<\/code><\/pre>\n<p>Bu komutlar <code>my_app_db<\/code> ad\u0131nda bir veritaban\u0131 ve <code>my_app_user<\/code> ad\u0131nda bir kullan\u0131c\u0131 olu\u015fturur. <code>my_app_user<\/code> kullan\u0131c\u0131s\u0131, <code>my_app_db<\/code> veritaban\u0131n\u0131n sahibidir.<\/p>\n<p><strong>Veritaban\u0131 Ba\u011flant\u0131 Ayarlar\u0131:<\/strong><br \/>\nUygulaman\u0131z\u0131n veritaban\u0131 ba\u011flant\u0131 bilgilerini yap\u0131land\u0131rmas\u0131 gerekecektir. Hassas bilgileri (veritaban\u0131 \u015fifreleri, API anahtarlar\u0131 vb.) do\u011frudan kod i\u00e7ine yazmak yerine, \u00e7evre de\u011fi\u015fkenleri arac\u0131l\u0131\u011f\u0131yla y\u00f6netmek en iyi uygulamad\u0131r. Bu, daha sonraki b\u00f6l\u00fcmlerde ele al\u0131nacakt\u0131r. \u015eimdilik, uygulaman\u0131z\u0131n <code>settings.py<\/code> (Django) veya benzeri bir yap\u0131land\u0131rma dosyas\u0131nda veritaban\u0131 ba\u011flant\u0131 parametrelerini (host: <code>localhost<\/code>, port: <code>5432<\/code>, user: <code>my_app_user<\/code>, password: <code>your_password<\/code>, dbname: <code>my_app_db<\/code>) ayarlayaca\u011f\u0131n\u0131z\u0131 unutmay\u0131n.<\/p>\n<h4>4.3 Migrasyonlar ve Veritaban\u0131 Haz\u0131rl\u0131\u011f\u0131<\/h4>\n<p>E\u011fer uygulaman\u0131z Django veya Flask-SQLAlchemy gibi bir ORM (Object-Relational Mapper) kullan\u0131yorsa, veritaban\u0131 \u015femas\u0131n\u0131 olu\u015fturmak ve g\u00fcncellemek i\u00e7in migrasyonlar\u0131 \u00e7al\u0131\u015ft\u0131rman\u0131z gerekir.<br \/>\nSanal ortam\u0131n\u0131z etkinle\u015ftirilmi\u015fken, uygulaman\u0131z\u0131n dizininde migrasyon komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131r\u0131n:<br \/>\n<strong>Django i\u00e7in \u00f6rnek:<\/strong><\/p>\n<pre><code class=\"language-bash\">python manage.py makemigrations # E\u011fer yeni modelleriniz varsa\npython manage.py migrate<\/code><\/pre>\n<p><strong>Flask (Alembic ile) i\u00e7in \u00f6rnek:<\/strong><\/p>\n<pre><code class=\"language-bash\">flask db upgrade<\/code><\/pre>\n<p>Bu ad\u0131mlar, veritaban\u0131n\u0131z\u0131n uygulaman\u0131z\u0131n modelleriyle e\u015fle\u015fen tablolar\u0131 ve yap\u0131lar\u0131 i\u00e7ermesini sa\u011flar.<\/p>\n<h3>V. Web Sunucusu ve Uygulama Sunucusu Yap\u0131land\u0131rmas\u0131<\/h3>\n<p>Python web uygulamalar\u0131 genellikle do\u011frudan internetten gelen istekleri i\u015fleyemez. Bunun yerine, bir uygulama sunucusu (Gunicorn) ve bir web sunucusu\/ters proxy (Nginx) kombinasyonu kullan\u0131l\u0131r.<\/p>\n<h4>5.1 Gunicorn Kurulumu ve Yap\u0131land\u0131rmas\u0131 (Uygulama Sunucusu)<\/h4>\n<p>Gunicorn (Green Unicorn), bir WSGI (Web Server Gateway Interface) HTTP sunucusudur. Python web uygulaman\u0131z\u0131 \u00e7al\u0131\u015ft\u0131rmak ve Nginx&#8217;ten gelen istekleri i\u015flemek i\u00e7in kullan\u0131l\u0131r.<br \/>\nSanal ortam\u0131n\u0131z etkinle\u015ftirilmi\u015fken Gunicorn&#8217;u kurun:<\/p>\n<pre><code class=\"language-bash\">pip install gunicorn<\/code><\/pre>\n<p>Uygulaman\u0131z\u0131n \u00e7al\u0131\u015f\u0131p \u00e7al\u0131\u015fmad\u0131\u011f\u0131n\u0131 test etmek i\u00e7in Gunicorn&#8217;u manuel olarak \u00e7al\u0131\u015ft\u0131rabilirsiniz. \u00d6rne\u011fin, Django projeniz i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">gunicorn --bind 0.0.0.0:8000 your_project_name.wsgi:application<\/code><\/pre>\n<p>Flask projeniz i\u00e7in (e\u011fer uygulaman\u0131z <code>app.py<\/code> dosyas\u0131nda <code>app<\/code> ad\u0131nda bir Flask nesnesi olarak tan\u0131mlanm\u0131\u015fsa):<\/p>\n<pre><code class=\"language-bash\">gunicorn --bind 0.0.0.0:8000 app:app<\/code><\/pre>\n<p>Taray\u0131c\u0131n\u0131zdan <code>http:\/\/your_server_ip:8000<\/code> adresine giderek uygulaman\u0131z\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 do\u011frulayabilirsiniz. <code>Ctrl+C<\/code> ile durdurun.<\/p>\n<p><strong>Gunicorn&#8217;u <code>systemd<\/code> Servisi Olarak Yap\u0131land\u0131rma:<\/strong><br \/>\nGunicorn&#8217;u arka planda s\u00fcrekli \u00e7al\u0131\u015facak bir servis olarak yap\u0131land\u0131rmak i\u00e7in <code>systemd<\/code> kullan\u0131l\u0131r.<br \/>\nBir <code>systemd<\/code> servis dosyas\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-bash\">sudo nano \/etc\/systemd\/system\/my_app.service<\/code><\/pre>\n<p>Dosyan\u0131n i\u00e7eri\u011fi a\u015fa\u011f\u0131daki gibi olmal\u0131d\u0131r (yer tutucular\u0131 kendi bilgilerinizle de\u011fi\u015ftirin):<\/p>\n<pre><code class=\"language-ini\">[Unit]\nDescription=Gunicorn instance to serve my_python_app\nAfter=network.target\n\n[Service]\nUser=your_username            # Olu\u015fturdu\u011funuz sudo kullan\u0131c\u0131s\u0131\nGroup=www-data                # Nginx'in kulland\u0131\u011f\u0131 grup (veya your_username)\nWorkingDirectory=\/home\/your_username\/my_python_app\/your_repo_name # Uygulaman\u0131z\u0131n k\u00f6k dizini\nExecStart=\/home\/your_username\/my_python_app\/venv\/bin\/gunicorn \\\n          --workers 3 \\        # \u0130\u015f\u00e7i say\u0131s\u0131 (2*CPU_\u00e7ekirde\u011fi + 1 genellikle iyi bir ba\u015flang\u0131\u00e7t\u0131r)\n          --bind unix:\/run\/my_app.sock \\ # Unix soketi \u00fczerinden Nginx ile ileti\u015fim\n          your_project_name.wsgi:application # Django i\u00e7in, Flask i\u00e7in app:app\nRestart=always                # Servis \u00e7\u00f6kerse otomatik yeniden ba\u015flat\nEnvironment=\"PATH=\/home\/your_username\/my_python_app\/venv\/bin\" # Sanal ortam\u0131n PATH'i\n<h2>Ortam de\u011fi\u015fkenleri i\u00e7in Environment=\"DJANGO_SETTINGS_MODULE=your_project_name.settings.production\" gibi ek sat\u0131rlar ekleyebilirsiniz.<\/h2>\n\n[Install]\nWantedBy=multi-user.target<\/code><\/pre>\n<p>Dosyay\u0131 kaydedip kapat\u0131n (<code>Ctrl+X<\/code>, <code>Y<\/code>, <code>Enter<\/code>).<br \/>\n\u015eimdi <code>systemd<\/code>&#8216;yi g\u00fcncelleyin, servisi ba\u015flat\u0131n ve otomatik ba\u015flamas\u0131 i\u00e7in etkinle\u015ftirin:<\/p>\n<pre><code class=\"language-bash\">sudo systemctl daemon-reload\nsudo systemctl start my_app\nsudo systemctl enable my_app<\/code><\/pre>\n<p>Servisin durumunu kontrol edin:<\/p>\n<pre><code class=\"language-bash\">sudo systemctl status my_app<\/code><\/pre>\n<p>Her \u015fey yolundaysa, Gunicorn arka planda \u00e7al\u0131\u015f\u0131yor olacakt\u0131r.<\/p>\n<h4>5.2 Nginx Kurulumu ve Yap\u0131land\u0131rmas\u0131 (Web Sunucusu\/Proxy)<\/h4>\n<p>Nginx, h\u0131zl\u0131 ve g\u00fc\u00e7l\u00fc bir web sunucusu ve ters proxy&#8217;dir. Gelen HTTP\/S isteklerini al\u0131r, statik dosyalar\u0131 (CSS, JS, resimler) do\u011frudan sunar ve dinamik istekleri Gunicorn&#8217;a y\u00f6nlendirir.<br \/>\nNginx&#8217;i kurun:<\/p>\n<pre><code class=\"language-bash\">sudo apt install nginx -y<\/code><\/pre>\n<p>Nginx&#8217;in varsay\u0131lan yap\u0131land\u0131rmas\u0131n\u0131 kald\u0131r\u0131n ve kendi yap\u0131land\u0131rma dosyan\u0131z\u0131 olu\u015fturun:<\/p>\n<pre><code class=\"language-bash\">sudo rm \/etc\/nginx\/sites-enabled\/default\nsudo nano \/etc\/nginx\/sites-available\/my_app<\/code><\/pre>\n<p><code>my_app<\/code> yap\u0131land\u0131rma dosyas\u0131n\u0131n i\u00e7eri\u011fi (yer tutucular\u0131 de\u011fi\u015ftirin):<\/p>\n<pre><code class=\"language-nginx\">server {\n    listen 80;\n    server_name your_domain.com www.your_domain.com; # Alan ad\u0131n\u0131z\u0131 veya sunucu IP'nizi yaz\u0131n\n\n    location \/ {\n        include proxy_params;\n        proxy_pass http:\/\/unix:\/run\/my_app.sock; # Gunicorn'un soket dosyas\u0131na y\u00f6nlendirme\n    }\n\n    location \/static\/ {\n        # Django i\u00e7in, statik dosyalar\u0131n topland\u0131\u011f\u0131 dizini belirtin\n        alias \/home\/your_username\/my_python_app\/your_repo_name\/staticfiles\/;\n    }\n\n    location \/media\/ {\n        # Django i\u00e7in, medya dosyalar\u0131n\u0131n bulundu\u011fu dizini belirtin\n        alias \/home\/your_username\/my_python_app\/your_repo_name\/media\/;\n    }\n}<\/code><\/pre>\n<p>*   <code>proxy_params<\/code>: Nginx&#8217;in proxy isteklerini do\u011fru \u015fekilde iletmek i\u00e7in kulland\u0131\u011f\u0131 varsay\u0131lan parametreleri i\u00e7erir.<br \/>\n*   <code>location \/static\/<\/code> ve <code>location \/media\/<\/code>: Nginx&#8217;in statik ve medya dosyalar\u0131n\u0131 do\u011frudan sunmas\u0131n\u0131 sa\u011flar, bu da Gunicorn&#8217;un y\u00fck\u00fcn\u00fc azalt\u0131r ve performans\u0131 art\u0131r\u0131r. Django kullan\u0131yorsan\u0131z, <code>python manage.py collectstatic<\/code> komutunu \u00e7al\u0131\u015ft\u0131rarak statik dosyalar\u0131 belirtilen dizine toplaman\u0131z gerekir.<\/p>\n<p>Yap\u0131land\u0131rma dosyas\u0131n\u0131 etkinle\u015ftirmek i\u00e7in <code>sites-enabled<\/code> dizinine sembolik bir link olu\u015fturun:<\/p>\n<pre><code class=\"language-bash\">sudo ln -s \/etc\/nginx\/sites-available\/my_app \/etc\/nginx\/sites-enabled\/<\/code><\/pre>\n<p>Nginx yap\u0131land\u0131rmas\u0131n\u0131 test edin ve servisi yeniden ba\u015flat\u0131n:<\/p>\n<pre><code class=\"language-bash\">sudo nginx -t\nsudo systemctl restart nginx<\/code><\/pre>\n<p>\u015eimdi taray\u0131c\u0131n\u0131zdan <code>http:\/\/your_server_ip<\/code> veya alan ad\u0131n\u0131zla eri\u015fmeyi deneyin. Uygulaman\u0131z\u0131n \u00e7al\u0131\u015f\u0131yor olmas\u0131 gerekir.<\/p>\n<h3>VI. Alan Ad\u0131 ve SSL\/TLS Yap\u0131land\u0131rmas\u0131<\/h3>\n<p>Uygulaman\u0131z\u0131n profesyonel g\u00f6r\u00fcnmesi ve g\u00fcvenli olmas\u0131 i\u00e7in bir alan ad\u0131 ve HTTPS (SSL\/TLS \u015fifrelemesi) kullanmak zorunludur.<\/p>\n<h4>6.1 Alan Ad\u0131 Y\u00f6nlendirmesi<\/h4>\n<p>Alan ad\u0131n\u0131z\u0131 (\u00f6rne\u011fin <code>example.com<\/code>) sunucunuza y\u00f6nlendirmek i\u00e7in, alan ad\u0131 sa\u011flay\u0131c\u0131n\u0131z\u0131n (Godaddy, Namecheap vb.) DNS y\u00f6netimi aray\u00fcz\u00fcnde bir &#8220;A kayd\u0131&#8221; olu\u015fturman\u0131z gerekir.<br \/>\n*   <code>@<\/code> veya bo\u015f b\u0131rak\u0131lan bir ana bilgisayar ad\u0131 i\u00e7in sunucunuzun IP adresini i\u015faret eden bir A kayd\u0131 olu\u015fturun.<br \/>\n*   <code>www<\/code> alt alan ad\u0131 i\u00e7in de sunucunuzun IP adresini i\u015faret eden bir A kayd\u0131 olu\u015fturun.<br \/>\nDNS de\u011fi\u015fikliklerinin d\u00fcnya genelinde yay\u0131lmas\u0131 biraz zaman alabilir (genellikle birka\u00e7 dakika ila birka\u00e7 saat).<\/p>\n<h4>6.2 SSL\/TLS \u015eifrelemesi (HTTPS)<\/h4>\n<p>Let&#8217;s Encrypt, \u00fccretsiz ve otomatik SSL\/TLS sertifikalar\u0131 sa\u011flayan bir hizmettir. Certbot arac\u0131 ile bu sertifikalar\u0131 kolayca alabilir ve Nginx ile entegre edebilirsiniz.<br \/>\nCertbot&#8217;u Snapcraft \u00fczerinden kurmak en kolay yoldur:<\/p>\n<pre><code class=\"language-bash\">sudo snap install core\nsudo snap refresh core\nsudo snap install --classic certbot\nsudo ln -s \/snap\/bin\/certbot \/usr\/bin\/certbot<\/code><\/pre>\n<p>\u015eimdi Nginx i\u00e7in bir SSL sertifikas\u0131 alal\u0131m:<\/p>\n<pre><code class=\"language-bash\">sudo certbot --nginx -d your_domain.com -d www.your_domain.com<\/code><\/pre>\n<p>Certbot, e-posta adresinizi soracak, hizmet ko\u015fullar\u0131n\u0131 kabul etmenizi isteyecek ve sertifikay\u0131 otomatik olarak Nginx yap\u0131land\u0131rman\u0131za ekleyecektir. Ayr\u0131ca, HTTP trafi\u011fini HTTPS&#8217;e y\u00f6nlendirme se\u00e7ene\u011fi de sunacakt\u0131r (genellikle &#8220;2: Redirect&#8221; se\u00e7ene\u011fini se\u00e7mek iyi bir uygulamad\u0131r).<br \/>\nCertbot, sertifikalar\u0131 otomatik olarak yenilemek i\u00e7in bir <code>cron<\/code> i\u015fi de kurar. Yenileme i\u015fleminin d\u00fczg\u00fcn \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 test etmek i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">sudo certbot renew --dry-run<\/code><\/pre>\n<p>Art\u0131k uygulaman\u0131za <code>https:\/\/your_domain.com<\/code> adresinden g\u00fcvenli bir \u015fekilde eri\u015febilirsiniz.<\/p>\n<h3>VII. Uygulaman\u0131n Da\u011f\u0131t\u0131m\u0131 ve Bak\u0131m\u0131<\/h3>\n<p>Uygulaman\u0131z canl\u0131ya al\u0131nd\u0131ktan sonra, onun s\u00fcrd\u00fcr\u00fclebilirli\u011fini, g\u00fcvenli\u011fini ve performans\u0131n\u0131 sa\u011flamak i\u00e7in d\u00fczenli bak\u0131m ve y\u00f6netim gereklidir.<\/p>\n<h4>7.1 Ortam De\u011fi\u015fkenleri Y\u00f6netimi<\/h4>\n<p>Veritaban\u0131 \u015fifreleri, API anahtarlar\u0131, gizli anahtarlar (Django&#8217;daki <code>SECRET_KEY<\/code> gibi) gibi hassas bilgiler asla do\u011frudan kodda veya Git deposunda saklanmamal\u0131d\u0131r. Bunun yerine, ortam de\u011fi\u015fkenleri kullan\u0131lmal\u0131d\u0131r.<br \/>\n*   <strong><code>systemd<\/code> Servis Dosyas\u0131 \u0130\u00e7inde:<\/strong> Gunicorn <code>systemd<\/code> servis dosyan\u0131za <code>Environment=\"KEY=VALUE\"<\/code> sat\u0131rlar\u0131 ekleyebilirsiniz.<\/p>\n<pre><code class=\"language-ini\">[Service]\n    # ...\n    Environment=\"DJANGO_SETTINGS_MODULE=your_project_name.settings.production\"\n    Environment=\"DATABASE_URL=postgres:\/\/my_app_user:your_password@localhost:5432\/my_app_db\"\n    Environment=\"SECRET_KEY=your_very_secret_key\"<\/code><\/pre>\n<p>*   <strong><code>.env<\/code> Dosyalar\u0131 (<code>python-dotenv<\/code> ile):<\/strong> E\u011fer uygulaman\u0131z <code>python-dotenv<\/code> gibi bir k\u00fct\u00fcphane kullan\u0131yorsa, <code>my_app.service<\/code> dosyan\u0131zda <code>ExecStart<\/code> komutundan \u00f6nce <code>EnvironmentFile=\/path\/to\/.env<\/code> ekleyebilirsiniz. Ancak bu y\u00f6ntem, <code>systemd<\/code>&#8216;nin yerle\u015fik ortam de\u011fi\u015fkeni y\u00f6netimi kadar g\u00fcvenli veya tercih edilen bir y\u00f6ntem de\u011fildir. Hassas bilgiler i\u00e7in <code>systemd<\/code> servis dosyas\u0131n\u0131 kullanmak daha iyidir.<\/p>\n<h4>7.2 Log Y\u00f6netimi<\/h4>\n<p>Sorun giderme ve uygulaman\u0131z\u0131n performans\u0131n\u0131 izlemek i\u00e7in loglar hayati \u00f6neme sahiptir.<br \/>\n*   <strong>Gunicorn Loglar\u0131:<\/strong> <code>systemd<\/code> ile Gunicorn \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, loglar\u0131 <code>journalctl<\/code> ile izleyebilirsiniz:<\/p>\n<pre><code class=\"language-bash\">sudo journalctl -u my_app.service -f<\/code><\/pre>\n<p>    <code>-f<\/code> bayra\u011f\u0131, loglar\u0131 ger\u00e7ek zamanl\u0131 olarak izlemenizi sa\u011flar.<br \/>\n*   <strong>Nginx Loglar\u0131:<\/strong> Nginx eri\u015fim ve hata loglar\u0131 genellikle <code>\/var\/log\/nginx\/access.log<\/code> ve <code>\/var\/log\/nginx\/error.log<\/code> konumlar\u0131nda bulunur.<\/p>\n<pre><code class=\"language-bash\">sudo tail -f \/var\/log\/nginx\/access.log\n    sudo tail -f \/var\/log\/nginx\/error.log<\/code><\/pre>\n<p>*   <strong>Uygulama Loglar\u0131:<\/strong> Uygulaman\u0131z\u0131n kendi loglama mekanizmas\u0131 varsa, bu loglar\u0131n nereye yaz\u0131ld\u0131\u011f\u0131n\u0131 kontrol edin (\u00f6rne\u011fin, uygulaman\u0131z\u0131n k\u00f6k dizinindeki bir <code>logs<\/code> klas\u00f6r\u00fc).<\/p>\n<h4>7.3 S\u00fcrekli Entegrasyon\/S\u00fcrekli Da\u011f\u0131t\u0131m (CI\/CD) (\u0130ste\u011fe Ba\u011fl\u0131)<\/h4>\n<p>Uygulaman\u0131z b\u00fcy\u00fcd\u00fck\u00e7e veya s\u0131k s\u0131k g\u00fcncelleniyorsa, CI\/CD s\u00fcre\u00e7leri da\u011f\u0131t\u0131m\u0131 otomatikle\u015ftirerek hata riskini azalt\u0131r ve geli\u015ftirme h\u0131z\u0131n\u0131 art\u0131r\u0131r. GitHub Actions, GitLab CI\/CD, Jenkins veya CircleCI gibi ara\u00e7lar, kodunuz bir depoya push edildi\u011finde otomatik olarak testleri \u00e7al\u0131\u015ft\u0131rmak, derlemek ve sunucuya da\u011f\u0131tmak i\u00e7in kullan\u0131labilir. Bu, bu makalenin kapsam\u0131n\u0131n d\u0131\u015f\u0131nda olsa da, gelecekteki bir iyile\u015ftirme olarak g\u00f6z \u00f6n\u00fcnde bulundurulmal\u0131d\u0131r.<\/p>\n<h4>7.4 Yedekleme Stratejileri<\/h4>\n<p>Veri kayb\u0131n\u0131 \u00f6nlemek i\u00e7in d\u00fczenli yedeklemeler kritik \u00f6neme sahiptir.<br \/>\n*   <strong>Veritaban\u0131 Yedeklemesi:<\/strong> PostgreSQL i\u00e7in <code>pg_dump<\/code> komutuyla veritaban\u0131 yedekleri alabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">pg_dump -U my_app_user my_app_db > \/path\/to\/backup\/my_app_db_$(date +%Y%m%d).sql<\/code><\/pre>\n<p>    Bu komutu bir <code>cron<\/code> i\u015fi olarak d\u00fczenli aral\u0131klarla \u00e7al\u0131\u015ft\u0131rmak iyi bir uygulamad\u0131r. Yedek dosyalar\u0131n\u0131 sunucudan farkl\u0131 bir konuma (\u00f6rn. S3, Google Cloud Storage) ta\u015f\u0131may\u0131 unutmay\u0131n.<br \/>\n*   <strong>Sunucu Anl\u0131k G\u00f6r\u00fcnt\u00fcleri (Snapshots):<\/strong> \u00c7o\u011fu bulut sa\u011flay\u0131c\u0131s\u0131, sunucunuzun tamam\u0131n\u0131n anl\u0131k g\u00f6r\u00fcnt\u00fclerini alma imkan\u0131 sunar. Bu, bir felaket durumunda sunucuyu h\u0131zl\u0131ca \u00f6nceki bir duruma geri y\u00fcklemenizi sa\u011flar.<\/p>\n<h4>7.5 Uygulama G\u00fcncellemeleri<\/h4>\n<p>Uygulaman\u0131zda bir g\u00fcncelleme yapt\u0131\u011f\u0131n\u0131zda, genellikle \u015fu ad\u0131mlar\u0131 izlemeniz gerekir:<br \/>\n1.  <strong>Kodu G\u00fcncelle:<\/strong> Uygulama dizininize gidin ve en son de\u011fi\u015fiklikleri \u00e7ekin:<\/p>\n<pre><code class=\"language-bash\">cd ~\/my_python_app\/your_repo_name\n    git pull origin main # veya kulland\u0131\u011f\u0131n\u0131z dal ad\u0131<\/code><\/pre>\n<p>2.  <strong>Ba\u011f\u0131ml\u0131l\u0131klar\u0131 G\u00fcncelle:<\/strong> E\u011fer <code>requirements.txt<\/code> dosyan\u0131z de\u011fi\u015ftiyse:<\/p>\n<pre><code class=\"language-bash\">source venv\/bin\/activate\n    pip install -r requirements.txt\n    deactivate<\/code><\/pre>\n<p>3.  <strong>Veritaban\u0131 Migrasyonlar\u0131n\u0131 \u00c7al\u0131\u015ft\u0131r:<\/strong> E\u011fer veritaban\u0131 \u015feman\u0131zda de\u011fi\u015fiklikler varsa:<\/p>\n<pre><code class=\"language-bash\">source venv\/bin\/activate\n    python manage.py migrate # Django i\u00e7in\n    # veya flask db upgrade # Flask i\u00e7in\n    deactivate<\/code><\/pre>\n<p>4.  <strong>Statik Dosyalar\u0131 Topla (Django i\u00e7in):<\/strong><\/p>\n<pre><code class=\"language-bash\">source venv\/bin\/activate\n    python manage.py collectstatic --noinput\n    deactivate<\/code><\/pre>\n<p>5.  <strong>Servisleri Yeniden Ba\u015flat:<\/strong> De\u011fi\u015fikliklerin etkili olmas\u0131 i\u00e7in Gunicorn ve Nginx servislerini yeniden ba\u015flat\u0131n:<\/p>\n<pre><code class=\"language-bash\">sudo systemctl restart my_app\n    sudo systemctl restart nginx<\/code><\/pre>\n<p>Bu ad\u0131mlar, uygulaman\u0131z\u0131n sorunsuz bir \u015fekilde g\u00fcncellenmesini sa\u011flar.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Bu makalede, bir Python web uygulamas\u0131n\u0131 Ubuntu tabanl\u0131 bir bulut sunucusuna da\u011f\u0131tmak i\u00e7in gereken temel ad\u0131mlar\u0131 ve en iyi uygulamalar\u0131 kapsaml\u0131 bir \u015fekilde inceledik. Bulut sa\u011flay\u0131c\u0131s\u0131 se\u00e7iminden ba\u015flayarak, Ubuntu sunucusunun haz\u0131rlanmas\u0131, Python ortam\u0131n\u0131n kurulmas\u0131, uygulama dosyalar\u0131n\u0131n aktar\u0131m\u0131, veritaban\u0131 yap\u0131land\u0131rmas\u0131, Gunicorn ve Nginx ile web sunucusu kurulumu, alan ad\u0131 ve SSL\/TLS yap\u0131land\u0131rmas\u0131 ve son olarak uygulaman\u0131n bak\u0131m\u0131 ve g\u00fcncellenmesi konular\u0131na de\u011findik.<\/p>\n<p>Bu s\u00fcre\u00e7, bir web uygulamas\u0131n\u0131 canl\u0131 ortama ta\u015f\u0131mak i\u00e7in sa\u011flam bir temel olu\u015fturur. Her ad\u0131m, uygulaman\u0131z\u0131n g\u00fcvenli\u011fini, performans\u0131n\u0131 ve kararl\u0131l\u0131\u011f\u0131n\u0131 art\u0131rmay\u0131 hedefler. Unutmay\u0131n ki, her projenin kendine \u00f6zg\u00fc gereksinimleri olabilir ve bu rehber genel bir \u00e7er\u00e7eve sunar. Daha karma\u015f\u0131k uygulamalar i\u00e7in izleme (monitoring), otomatik \u00f6l\u00e7eklendirme, y\u00fck dengeleme ve daha geli\u015fmi\u015f CI\/CD boru hatlar\u0131 gibi konular\u0131 ara\u015ft\u0131rman\u0131z gerekebilir. Bu rehberdeki bilgileri kullanarak, Python web uygulamalar\u0131n\u0131z\u0131 buluta g\u00fcvenle ta\u015f\u0131yabilir ve geli\u015ftirmeye odaklanabilirsiniz.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Ubuntu Bulut Sunucular\u0131nda Python Web Uygulamalar\u0131 Kurulumu: Kapsaml\u0131 Bir Rehber\nBulut bili\u015fim, g\u00fcn\u00fcm\u00fcz web uygulamalar\u0131n\u0131n da\u011f\u0131t\u0131m\u0131 ve","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1468],"tags":[],"class_list":{"0":"post-36985","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-ubuntu","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Ubuntu Bulut Sunucular\u0131nda Python Web Uygulamalar\u0131 Kurulumu: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/ubuntu-bulut-sunucularinda-python-web-uygulamalari-kurulumu-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ubuntu Bulut Sunucular\u0131nda Python Web Uygulamalar\u0131 Kurulumu: Kapsaml\u0131 Bir Rehber\" \/>\n<meta property=\"og:description\" content=\"Ubuntu Bulut Sunucular\u0131nda Python Web Uygulamalar\u0131 Kurulumu: Kapsaml\u0131 Bir Rehber Bulut bili\u015fim, g\u00fcn\u00fcm\u00fcz web uygulamalar\u0131n\u0131n da\u011f\u0131t\u0131m\u0131 ve\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/ubuntu-bulut-sunucularinda-python-web-uygulamalari-kurulumu-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-25T17:40:49+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"20 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ubuntu-bulut-sunucularinda-python-web-uygulamalari-kurulumu-kapsamli-bir-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ubuntu-bulut-sunucularinda-python-web-uygulamalari-kurulumu-kapsamli-bir-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Ubuntu Bulut Sunucular\u0131nda Python Web Uygulamalar\u0131 Kurulumu: Kapsaml\u0131 Bir Rehber\",\"datePublished\":\"2025-12-25T17:40:49+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ubuntu-bulut-sunucularinda-python-web-uygulamalari-kurulumu-kapsamli-bir-rehber\/\"},\"wordCount\":3077,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Ubuntu\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/ubuntu-bulut-sunucularinda-python-web-uygulamalari-kurulumu-kapsamli-bir-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ubuntu-bulut-sunucularinda-python-web-uygulamalari-kurulumu-kapsamli-bir-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/ubuntu-bulut-sunucularinda-python-web-uygulamalari-kurulumu-kapsamli-bir-rehber\/\",\"name\":\"Ubuntu Bulut Sunucular\u0131nda Python Web Uygulamalar\u0131 Kurulumu: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-25T17:40:49+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ubuntu-bulut-sunucularinda-python-web-uygulamalari-kurulumu-kapsamli-bir-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/ubuntu-bulut-sunucularinda-python-web-uygulamalari-kurulumu-kapsamli-bir-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ubuntu-bulut-sunucularinda-python-web-uygulamalari-kurulumu-kapsamli-bir-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ubuntu Bulut Sunucular\u0131nda Python Web Uygulamalar\u0131 Kurulumu: Kapsaml\u0131 Bir Rehber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Ubuntu Bulut Sunucular\u0131nda Python Web Uygulamalar\u0131 Kurulumu: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/ubuntu-bulut-sunucularinda-python-web-uygulamalari-kurulumu-kapsamli-bir-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"Ubuntu Bulut Sunucular\u0131nda Python Web Uygulamalar\u0131 Kurulumu: Kapsaml\u0131 Bir Rehber","og_description":"Ubuntu Bulut Sunucular\u0131nda Python Web Uygulamalar\u0131 Kurulumu: Kapsaml\u0131 Bir Rehber Bulut bili\u015fim, g\u00fcn\u00fcm\u00fcz web uygulamalar\u0131n\u0131n da\u011f\u0131t\u0131m\u0131 ve","og_url":"https:\/\/fatihsoysal.com\/blog\/ubuntu-bulut-sunucularinda-python-web-uygulamalari-kurulumu-kapsamli-bir-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-25T17:40:49+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"20 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/ubuntu-bulut-sunucularinda-python-web-uygulamalari-kurulumu-kapsamli-bir-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/ubuntu-bulut-sunucularinda-python-web-uygulamalari-kurulumu-kapsamli-bir-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Ubuntu Bulut Sunucular\u0131nda Python Web Uygulamalar\u0131 Kurulumu: Kapsaml\u0131 Bir Rehber","datePublished":"2025-12-25T17:40:49+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/ubuntu-bulut-sunucularinda-python-web-uygulamalari-kurulumu-kapsamli-bir-rehber\/"},"wordCount":3077,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Ubuntu"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/ubuntu-bulut-sunucularinda-python-web-uygulamalari-kurulumu-kapsamli-bir-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/ubuntu-bulut-sunucularinda-python-web-uygulamalari-kurulumu-kapsamli-bir-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/ubuntu-bulut-sunucularinda-python-web-uygulamalari-kurulumu-kapsamli-bir-rehber\/","name":"Ubuntu Bulut Sunucular\u0131nda Python Web Uygulamalar\u0131 Kurulumu: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-25T17:40:49+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/ubuntu-bulut-sunucularinda-python-web-uygulamalari-kurulumu-kapsamli-bir-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/ubuntu-bulut-sunucularinda-python-web-uygulamalari-kurulumu-kapsamli-bir-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/ubuntu-bulut-sunucularinda-python-web-uygulamalari-kurulumu-kapsamli-bir-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Ubuntu Bulut Sunucular\u0131nda Python Web Uygulamalar\u0131 Kurulumu: Kapsaml\u0131 Bir Rehber"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36985","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=36985"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36985\/revisions"}],"predecessor-version":[{"id":36986,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36985\/revisions\/36986"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36985"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36985"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36985"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}