Ubuntu Bulut Sunucularında Python Web Uygulamaları Kurulumu: Kapsamlı Bir Rehber
Bulut bilişim, günümüz web uygulamalarının dağıtımı ve yönetimi için vazgeçilmez bir teknoloji haline gelmiştir. Esneklik, ölçeklenebilirlik ve maliyet etkinliği sunan bulut sunucuları, geliştiricilere projelerini kolayca hayata geçirme imkanı tanır. Özellikle Python tabanlı web uygulamaları için Ubuntu işletim sistemi, geniş topluluk desteği, zengin paket yöneticisi ve kararlı yapısıyla ideal bir platform sunar. Bu makale, bir Python web uygulamasını Ubuntu tabanlı bir bulut sunucusuna nasıl dağıtacağınızı adım adım ve kapsamlı bir şekilde açıklamaktadır. Amacımız, uygulamanızın canlı ortama güvenli, verimli ve profesyonel bir şekilde ulaşmasını sağlamaktır.
I. Bulut Sunucusu Seçimi ve Temel Hazırlıklar
Bir Python web uygulamasını buluta taşımak için ilk adım, uygun bir bulut sağlayıcısı ve sunucu yapılandırması seçmektir. Bu bölüm, doğru seçimleri yapmanız ve sunucunuzu ilk kullanıma hazırlamanız için gereken temel adımları içerir.
1.1 Bulut Sağlayıcı Seçimi
Piyasada birçok popüler bulut sağlayıcısı bulunmaktadır ve her birinin kendine özgü avantajları vardır:
* Amazon Web Services (AWS): Kapsamlı hizmet yelpazesi, yüksek ölçeklenebilirlik ve küresel altyapı sunar. Ancak yeni başlayanlar için karmaşık olabilir.
* Google Cloud Platform (GCP): Makine öğrenimi ve veri analizi odaklı hizmetleriyle dikkat çeker, kullanıcı dostu arayüze sahiptir.
* Microsoft Azure: Kurumsal çözümler ve .NET entegrasyonu için güçlüdür, hibrit bulut senaryolarında tercih edilir.
* DigitalOcean, Vultr, Linode: Daha basit arayüzler, uygun fiyatlar ve geliştirici dostu özellikler sunarlar. Küçük ve orta ölçekli projeler için idealdirler.
Seçim yaparken uygulamanızın beklenen trafiğini, bütçenizi, coğrafi konum gereksinimlerinizi ve ihtiyacınız olan ek hizmetleri (veritabanı, depolama, CDN vb.) göz önünde bulundurmalısınız. Genellikle DigitalOcean veya Vultr gibi sağlayıcılar, başlangıç için daha kolay ve maliyet etkin bir deneyim sunar.
1.2 Ubuntu Sunucusu Oluşturma
Bulut sağlayıcınızı seçtikten sonra, bir sanal sunucu (Virtual Private Server – VPS veya Droplet, Instance vb.) oluşturmanız gerekir. Bu süreç genellikle şu adımları içerir:
1. İşletim Sistemi Seçimi: Ubuntu LTS (Long Term Support) sürümleri (örn. 22.04 LTS veya 20.04 LTS) tercih edilmelidir. LTS sürümleri, uzun süreli güvenlik güncellemeleri ve kararlılık sunar.
2. Sunucu Boyutu: Uygulamanızın gereksinimlerine göre CPU, RAM ve depolama alanı seçimi yapın. Basit bir Flask veya Django uygulaması için 1 CPU, 1-2 GB RAM ve 25-50 GB SSD depolama başlangıç için yeterli olabilir. Trafik arttıkça bu kaynakları kolayca ölçeklendirebilirsiniz.
3. Bölge Seçimi: Uygulamanızın hedef kitlesine en yakın coğrafi bölgeyi seçerek gecikmeyi (latency) azaltabilirsiniz.
4. SSH Anahtarı: Güvenli bağlantı için SSH anahtarları kullanmak şiddetle tavsiye edilir. Bir SSH anahtar çifti (özel ve genel anahtar) oluşturun ve genel anahtarınızı sunucu oluşturma aşamasında ekleyin. Bu, şifre tabanlı girişlerden çok daha güvenlidir.
1.3 İlk Bağlantı ve Temel Güvenlik Ayarları
Sunucunuz oluşturulduktan sonra, SSH aracılığıyla ilk bağlantıyı kurmanız gerekir.
Terminalinizden şu komutu kullanarak bağlanın (kullanıcı adınız genellikle root veya sağlayıcınıza göre farklılık gösterebilir, IP adresini kendi sunucunuzun IP adresiyle değiştirin):
ssh -i ~/.ssh/your_private_key_file root@your_server_ip
Bağlandıktan sonra ilk yapmanız gerekenler:
1. Sistem Güncellemesi: Paket listelerini güncelleyin ve yüklü paketleri yükseltin. Bu, güvenlik açıklarını kapatır ve en yeni yazılımları sağlar.
sudo apt update
sudo apt upgrade -y
2. Yeni Bir sudo Kullanıcısı Oluşturma: root kullanıcısı olarak sürekli çalışmak risklidir. Yeni bir standart kullanıcı oluşturun ve ona sudo ayrıcalıkları verin.
sudo adduser your_username
sudo usermod -aG sudo your_username
Daha sonra bu kullanıcıya geçiş yapın ve root kullanıcısının SSH erişimini devre dışı bırakmayı düşünebilirsiniz (daha sonraki bir adımda).
3. Güvenlik Duvarı (UFW) Yapılandırması: UFW (Uncomplicated Firewall), Ubuntu için kullanımı kolay bir güvenlik duvarıdır. Sadece gerekli portlara erişime izin vererek sunucunuzu korur.
sudo apt install ufw -y
sudo ufw allow OpenSSH # SSH erişimine izin ver
sudo ufw allow 'Nginx HTTP' # HTTP (80) portuna izin ver (Nginx kurduktan sonra)
sudo ufw allow 'Nginx HTTPS' # HTTPS (443) portuna izin ver (Nginx kurduktan sonra)
sudo ufw enable # Güvenlik duvarını etkinleştir
sudo ufw status # Durumu kontrol et
UFW’yi etkinleştirmeden önce SSH portuna izin verdiğinizden emin olun, aksi takdirde sunucunuza erişiminizi kaybedebilirsiniz.
II. Python Ortamının Kurulumu ve Yönetimi
Python web uygulamanızın bağımlılıklarını izole etmek ve yönetmek, sorunsuz bir dağıtım süreci için kritik öneme sahiptir. Bu bölümde, Python’ı kurma ve sanal ortamları etkin bir şekilde kullanma adımlarını ele alacağız.
2.1 Python Kurulumu
Ubuntu genellikle varsayılan olarak Python 3 ile gelir, ancak uygulamanızın belirli bir Python sürümüne veya ek geliştirme araçlarına ihtiyacı olabilir.
Gerekli Python geliştirme araçlarını ve pip‘i (Python paket yöneticisi) kuralım:
sudo apt install python3-pip python3-dev build-essential -y
* python3-pip: Python 3 paket yöneticisi.
* python3-dev: Python C uzantıları derlemek için gereken başlık dosyaları ve statik kütüphaneler.
* build-essential: Derleyici ve diğer derleme araçlarını içerir.
Eğer uygulamanız farklı bir Python sürümü gerektiriyorsa, pyenv gibi araçlar veya deadsnakes PPA’sı kullanılabilir. Ancak çoğu durumda, sistemdeki Python 3 yeterli olacaktır.
2.2 Sanal Ortam Oluşturma
Python sanal ortamları, her projenin kendi bağımlılık setini izole etmesini sağlar. Bu, bağımlılık çakışmalarını önler ve projelerin taşınabilirliğini artırır. venv modülü, Python 3 ile birlikte gelir ve kullanımı kolaydır.
Uygulamanızın dosyalarını barındıracağınız bir dizin oluşturun ve içine girin:
mkdir ~/my_python_app
cd ~/my_python_app
Şimdi bu dizin içinde bir sanal ortam oluşturalım:
python3 -m venv venv
Bu komut, my_python_app dizini içinde venv adında bir dizin oluşturur ve bu dizin, Python yorumlayıcısının, pip’in ve bağımsız bir paket setinin kopyalarını içerir.
Sanal ortamı etkinleştirmek için:
source venv/bin/activate
Ortam etkinleştirildiğinde, terminal istemciniz genellikle sanal ortamın adını gösterecektir (örn. (venv) your_username@your_server_ip:~/my_python_app$). Artık bu ortamda pip install ile yüklediğiniz tüm paketler, sistem genelindeki Python kurulumunu etkilemeden bu sanal ortamda kalacaktır.
Sanal ortamdan çıkmak için:
deactivate
Uygulamanızı dağıtırken, sanal ortamı etkinleştirip bağımlılıkları kuracaksınız.
III. Web Uygulaması Dosyalarının Sunucuya Aktarımı
Uygulama kodunuzu yerel geliştirme ortamınızdan bulut sunucusuna aktarmanın birkaç yolu vardır. Git kullanmak, sürüm kontrolü ve kolay güncellemeler sağladığı için en çok önerilen yöntemdir.
3.1 Git Kullanımı (Önerilen Yöntem)
Git, kodunuzu yönetmek ve sunucuya dağıtmak için standart bir araçtır. Uygulamanızın kodunu bir Git deposunda (GitHub, GitLab, Bitbucket vb.) barındırmanız idealdir.
Önce sunucunuza Git’i kurun:
sudo apt install git -y
Şimdi, uygulamanızın depoyu klonlamak istediğiniz dizine gidin (genellikle /var/www/ veya kullanıcınızın ana dizinindeki bir proje klasörü). Örneğin, my_python_app klasörüne:
cd ~/my_python_app
git clone https://github.com/your_username/your_repo_name.git . # "." mevcut dizine klonlar
Eğer deponuz özel ise, SSH anahtarlarınızı Git sağlayıcınızla yapılandırmanız veya bir erişim belirteci kullanmanız gerekebilir. Klonladıktan sonra, uygulamanızın tüm dosyaları sunucunuzda olacaktır.
3.2 SCP veya SFTP Kullanımı (Alternatif)
Küçük projeler veya tek seferlik dosya aktarımları için SCP (Secure Copy Protocol) veya SFTP (SSH File Transfer Protocol) kullanabilirsiniz.
SCP ile dosya kopyalama (yerelden sunucuya):
scp -i ~/.ssh/your_private_key_file /path/to/your/local/file.py your_username@your_server_ip:~/my_python_app/
SCP ile dizin kopyalama (yerelden sunucuya):
scp -r -i ~/.ssh/your_private_key_file /path/to/your/local/project_folder your_username@your_server_ip:~/my_python_app/
SFTP ise, dosya yöneticisi benzeri bir arayüzle (örneğin FileZilla veya VS Code’un Remote-SSH eklentisi aracılığıyla) dosya aktarımı yapmanızı sağlar. Bu yöntemler, hızlı ve manuel aktarımlar için kullanışlıdır ancak sürüm kontrolü sağlamazlar.
IV. Bağımlılıkların Kurulumu ve Veritabanı Yapılandırması
Uygulamanızın kodunu sunucuya aktardıktan sonra, çalışması için gereken tüm Python paketlerini kurmanız ve varsa veritabanını yapılandırmanız gerekir.
4.1 Python Bağımlılıkları
Projenizin kök dizininde bir requirements.txt dosyası bulundurmanız, tüm bağımlılıkları tek seferde kurmak için en iyi yöntemdir. Bu dosyayı yerel geliştirme ortamınızda pip freeze > requirements.txt komutuyla oluşturabilirsiniz.
Sunucuda, sanal ortamınızı etkinleştirin ve bağımlılıkları kurun:
cd ~/my_python_app/your_repo_name # Eğer klonladığınız repo bir alt dizin oluşturduysa
source venv/bin/activate
pip install -r requirements.txt
Bu komut, uygulamanızın çalışması için gereken tüm Python paketlerini sanal ortamınıza yükleyecektir.
4.2 Veritabanı Kurulumu
Çoğu web uygulaması bir veritabanına ihtiyaç duyar. PostgreSQL ve MySQL/MariaDB, Python uygulamalarıyla yaygın olarak kullanılan popüler seçeneklerdir. Burada PostgreSQL üzerinden bir örnek vereceğiz.
PostgreSQL Kurulumu:
sudo apt install postgresql postgresql-contrib -y
PostgreSQL varsayılan olarak postgres adlı bir kullanıcı oluşturur. Bu kullanıcı ile veritabanı işlemleri yapabilirsiniz.
postgres kullanıcısına geçiş yapın:
sudo -i -u postgres
Şimdi bir veritabanı ve veritabanı kullanıcısı oluşturalım:
createuser --pwprompt my_app_user # Şifre belirleyin
createdb -O my_app_user my_app_db
exit # postgres kullanıcısından çıkış yapın
Bu komutlar my_app_db adında bir veritabanı ve my_app_user adında bir kullanıcı oluşturur. my_app_user kullanıcısı, my_app_db veritabanının sahibidir.
Veritabanı Bağlantı Ayarları:
Uygulamanızın veritabanı bağlantı bilgilerini yapılandırması gerekecektir. Hassas bilgileri (veritabanı şifreleri, API anahtarları vb.) doğrudan kod içine yazmak yerine, çevre değişkenleri aracılığıyla yönetmek en iyi uygulamadır. Bu, daha sonraki bölümlerde ele alınacaktır. Şimdilik, uygulamanızın settings.py (Django) veya benzeri bir yapılandırma dosyasında veritabanı bağlantı parametrelerini (host: localhost, port: 5432, user: my_app_user, password: your_password, dbname: my_app_db) ayarlayacağınızı unutmayın.
4.3 Migrasyonlar ve Veritabanı Hazırlığı
Eğer uygulamanız Django veya Flask-SQLAlchemy gibi bir ORM (Object-Relational Mapper) kullanıyorsa, veritabanı şemasını oluşturmak ve güncellemek için migrasyonları çalıştırmanız gerekir.
Sanal ortamınız etkinleştirilmişken, uygulamanızın dizininde migrasyon komutlarını çalıştırın:
Django için örnek:
python manage.py makemigrations # Eğer yeni modelleriniz varsa
python manage.py migrate
Flask (Alembic ile) için örnek:
flask db upgrade
Bu adımlar, veritabanınızın uygulamanızın modelleriyle eşleşen tabloları ve yapıları içermesini sağlar.
V. Web Sunucusu ve Uygulama Sunucusu Yapılandırması
Python web uygulamaları genellikle doğrudan internetten gelen istekleri işleyemez. Bunun yerine, bir uygulama sunucusu (Gunicorn) ve bir web sunucusu/ters proxy (Nginx) kombinasyonu kullanılır.
5.1 Gunicorn Kurulumu ve Yapılandırması (Uygulama Sunucusu)
Gunicorn (Green Unicorn), bir WSGI (Web Server Gateway Interface) HTTP sunucusudur. Python web uygulamanızı çalıştırmak ve Nginx’ten gelen istekleri işlemek için kullanılır.
Sanal ortamınız etkinleştirilmişken Gunicorn’u kurun:
pip install gunicorn
Uygulamanızın çalışıp çalışmadığını test etmek için Gunicorn’u manuel olarak çalıştırabilirsiniz. Örneğin, Django projeniz için:
gunicorn --bind 0.0.0.0:8000 your_project_name.wsgi:application
Flask projeniz için (eğer uygulamanız app.py dosyasında app adında bir Flask nesnesi olarak tanımlanmışsa):
gunicorn --bind 0.0.0.0:8000 app:app
Tarayıcınızdan http://your_server_ip:8000 adresine giderek uygulamanızın çalıştığını doğrulayabilirsiniz. Ctrl+C ile durdurun.
Gunicorn’u systemd Servisi Olarak Yapılandırma:
Gunicorn’u arka planda sürekli çalışacak bir servis olarak yapılandırmak için systemd kullanılır.
Bir systemd servis dosyası oluşturalım:
sudo nano /etc/systemd/system/my_app.service
Dosyanın içeriği aşağıdaki gibi olmalıdır (yer tutucuları kendi bilgilerinizle değiştirin):
[Unit]
Description=Gunicorn instance to serve my_python_app
After=network.target
[Service]
User=your_username # Oluşturduğunuz sudo kullanıcısı
Group=www-data # Nginx'in kullandığı grup (veya your_username)
WorkingDirectory=/home/your_username/my_python_app/your_repo_name # Uygulamanızın kök dizini
ExecStart=/home/your_username/my_python_app/venv/bin/gunicorn \
--workers 3 \ # İşçi sayısı (2*CPU_çekirdeği + 1 genellikle iyi bir başlangıçtır)
--bind unix:/run/my_app.sock \ # Unix soketi üzerinden Nginx ile iletişim
your_project_name.wsgi:application # Django için, Flask için app:app
Restart=always # Servis çökerse otomatik yeniden başlat
Environment="PATH=/home/your_username/my_python_app/venv/bin" # Sanal ortamın PATH'i
Ortam değişkenleri için Environment="DJANGO_SETTINGS_MODULE=your_project_name.settings.production" gibi ek satırlar ekleyebilirsiniz.
[Install]
WantedBy=multi-user.target
Dosyayı kaydedip kapatın (Ctrl+X, Y, Enter).
Şimdi systemd‘yi güncelleyin, servisi başlatın ve otomatik başlaması için etkinleştirin:
sudo systemctl daemon-reload
sudo systemctl start my_app
sudo systemctl enable my_app
Servisin durumunu kontrol edin:
sudo systemctl status my_app
Her şey yolundaysa, Gunicorn arka planda çalışıyor olacaktır.
5.2 Nginx Kurulumu ve Yapılandırması (Web Sunucusu/Proxy)
Nginx, hızlı ve güçlü bir web sunucusu ve ters proxy’dir. Gelen HTTP/S isteklerini alır, statik dosyaları (CSS, JS, resimler) doğrudan sunar ve dinamik istekleri Gunicorn’a yönlendirir.
Nginx’i kurun:
sudo apt install nginx -y
Nginx’in varsayılan yapılandırmasını kaldırın ve kendi yapılandırma dosyanızı oluşturun:
sudo rm /etc/nginx/sites-enabled/default
sudo nano /etc/nginx/sites-available/my_app
my_app yapılandırma dosyasının içeriği (yer tutucuları değiştirin):
server {
listen 80;
server_name your_domain.com www.your_domain.com; # Alan adınızı veya sunucu IP'nizi yazın
location / {
include proxy_params;
proxy_pass http://unix:/run/my_app.sock; # Gunicorn'un soket dosyasına yönlendirme
}
location /static/ {
# Django için, statik dosyaların toplandığı dizini belirtin
alias /home/your_username/my_python_app/your_repo_name/staticfiles/;
}
location /media/ {
# Django için, medya dosyalarının bulunduğu dizini belirtin
alias /home/your_username/my_python_app/your_repo_name/media/;
}
}
* proxy_params: Nginx’in proxy isteklerini doğru şekilde iletmek için kullandığı varsayılan parametreleri içerir.
* location /static/ ve location /media/: Nginx’in statik ve medya dosyalarını doğrudan sunmasını sağlar, bu da Gunicorn’un yükünü azaltır ve performansı artırır. Django kullanıyorsanız, python manage.py collectstatic komutunu çalıştırarak statik dosyaları belirtilen dizine toplamanız gerekir.
Yapılandırma dosyasını etkinleştirmek için sites-enabled dizinine sembolik bir link oluşturun:
sudo ln -s /etc/nginx/sites-available/my_app /etc/nginx/sites-enabled/
Nginx yapılandırmasını test edin ve servisi yeniden başlatın:
sudo nginx -t
sudo systemctl restart nginx
Şimdi tarayıcınızdan http://your_server_ip veya alan adınızla erişmeyi deneyin. Uygulamanızın çalışıyor olması gerekir.
VI. Alan Adı ve SSL/TLS Yapılandırması
Uygulamanızın profesyonel görünmesi ve güvenli olması için bir alan adı ve HTTPS (SSL/TLS şifrelemesi) kullanmak zorunludur.
6.1 Alan Adı Yönlendirmesi
Alan adınızı (örneğin example.com) sunucunuza yönlendirmek için, alan adı sağlayıcınızın (Godaddy, Namecheap vb.) DNS yönetimi arayüzünde bir “A kaydı” oluşturmanız gerekir.
* @ veya boş bırakılan bir ana bilgisayar adı için sunucunuzun IP adresini işaret eden bir A kaydı oluşturun.
* www alt alan adı için de sunucunuzun IP adresini işaret eden bir A kaydı oluşturun.
DNS değişikliklerinin dünya genelinde yayılması biraz zaman alabilir (genellikle birkaç dakika ila birkaç saat).
6.2 SSL/TLS Şifrelemesi (HTTPS)
Let’s Encrypt, ücretsiz ve otomatik SSL/TLS sertifikaları sağlayan bir hizmettir. Certbot aracı ile bu sertifikaları kolayca alabilir ve Nginx ile entegre edebilirsiniz.
Certbot’u Snapcraft üzerinden kurmak en kolay yoldur:
sudo snap install core
sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
Şimdi Nginx için bir SSL sertifikası alalım:
sudo certbot --nginx -d your_domain.com -d www.your_domain.com
Certbot, e-posta adresinizi soracak, hizmet koşullarını kabul etmenizi isteyecek ve sertifikayı otomatik olarak Nginx yapılandırmanıza ekleyecektir. Ayrıca, HTTP trafiğini HTTPS’e yönlendirme seçeneği de sunacaktır (genellikle “2: Redirect” seçeneğini seçmek iyi bir uygulamadır).
Certbot, sertifikaları otomatik olarak yenilemek için bir cron işi de kurar. Yenileme işleminin düzgün çalıştığını test etmek için:
sudo certbot renew --dry-run
Artık uygulamanıza https://your_domain.com adresinden güvenli bir şekilde erişebilirsiniz.
VII. Uygulamanın Dağıtımı ve Bakımı
Uygulamanız canlıya alındıktan sonra, onun sürdürülebilirliğini, güvenliğini ve performansını sağlamak için düzenli bakım ve yönetim gereklidir.
7.1 Ortam Değişkenleri Yönetimi
Veritabanı şifreleri, API anahtarları, gizli anahtarlar (Django’daki SECRET_KEY gibi) gibi hassas bilgiler asla doğrudan kodda veya Git deposunda saklanmamalıdır. Bunun yerine, ortam değişkenleri kullanılmalıdır.
* systemd Servis Dosyası İçinde: Gunicorn systemd servis dosyanıza Environment="KEY=VALUE" satırları ekleyebilirsiniz.
[Service]
# ...
Environment="DJANGO_SETTINGS_MODULE=your_project_name.settings.production"
Environment="DATABASE_URL=postgres://my_app_user:your_password@localhost:5432/my_app_db"
Environment="SECRET_KEY=your_very_secret_key"
* .env Dosyaları (python-dotenv ile): Eğer uygulamanız python-dotenv gibi bir kütüphane kullanıyorsa, my_app.service dosyanızda ExecStart komutundan önce EnvironmentFile=/path/to/.env ekleyebilirsiniz. Ancak bu yöntem, systemd‘nin yerleşik ortam değişkeni yönetimi kadar güvenli veya tercih edilen bir yöntem değildir. Hassas bilgiler için systemd servis dosyasını kullanmak daha iyidir.
7.2 Log Yönetimi
Sorun giderme ve uygulamanızın performansını izlemek için loglar hayati öneme sahiptir.
* Gunicorn Logları: systemd ile Gunicorn çalıştırdığınızda, logları journalctl ile izleyebilirsiniz:
sudo journalctl -u my_app.service -f
-f bayrağı, logları gerçek zamanlı olarak izlemenizi sağlar.
* Nginx Logları: Nginx erişim ve hata logları genellikle /var/log/nginx/access.log ve /var/log/nginx/error.log konumlarında bulunur.
sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log
* Uygulama Logları: Uygulamanızın kendi loglama mekanizması varsa, bu logların nereye yazıldığını kontrol edin (örneğin, uygulamanızın kök dizinindeki bir logs klasörü).
7.3 Sürekli Entegrasyon/Sürekli Dağıtım (CI/CD) (İsteğe Bağlı)
Uygulamanız büyüdükçe veya sık sık güncelleniyorsa, CI/CD süreçleri dağıtımı otomatikleştirerek hata riskini azaltır ve geliştirme hızını artırır. GitHub Actions, GitLab CI/CD, Jenkins veya CircleCI gibi araçlar, kodunuz bir depoya push edildiğinde otomatik olarak testleri çalıştırmak, derlemek ve sunucuya dağıtmak için kullanılabilir. Bu, bu makalenin kapsamının dışında olsa da, gelecekteki bir iyileştirme olarak göz önünde bulundurulmalıdır.
7.4 Yedekleme Stratejileri
Veri kaybını önlemek için düzenli yedeklemeler kritik öneme sahiptir.
* Veritabanı Yedeklemesi: PostgreSQL için pg_dump komutuyla veritabanı yedekleri alabilirsiniz:
pg_dump -U my_app_user my_app_db > /path/to/backup/my_app_db_$(date +%Y%m%d).sql
Bu komutu bir cron işi olarak düzenli aralıklarla çalıştırmak iyi bir uygulamadır. Yedek dosyalarını sunucudan farklı bir konuma (örn. S3, Google Cloud Storage) taşımayı unutmayın.
* Sunucu Anlık Görüntüleri (Snapshots): Çoğu bulut sağlayıcısı, sunucunuzun tamamının anlık görüntülerini alma imkanı sunar. Bu, bir felaket durumunda sunucuyu hızlıca önceki bir duruma geri yüklemenizi sağlar.
7.5 Uygulama Güncellemeleri
Uygulamanızda bir güncelleme yaptığınızda, genellikle şu adımları izlemeniz gerekir:
1. Kodu Güncelle: Uygulama dizininize gidin ve en son değişiklikleri çekin:
cd ~/my_python_app/your_repo_name
git pull origin main # veya kullandığınız dal adı
2. Bağımlılıkları Güncelle: Eğer requirements.txt dosyanız değiştiyse:
source venv/bin/activate
pip install -r requirements.txt
deactivate
3. Veritabanı Migrasyonlarını Çalıştır: Eğer veritabanı şemanızda değişiklikler varsa:
source venv/bin/activate
python manage.py migrate # Django için
# veya flask db upgrade # Flask için
deactivate
4. Statik Dosyaları Topla (Django için):
source venv/bin/activate
python manage.py collectstatic --noinput
deactivate
5. Servisleri Yeniden Başlat: Değişikliklerin etkili olması için Gunicorn ve Nginx servislerini yeniden başlatın:
sudo systemctl restart my_app
sudo systemctl restart nginx
Bu adımlar, uygulamanızın sorunsuz bir şekilde güncellenmesini sağlar.
Sonuç
Bu makalede, bir Python web uygulamasını Ubuntu tabanlı bir bulut sunucusuna dağıtmak için gereken temel adımları ve en iyi uygulamaları kapsamlı bir şekilde inceledik. Bulut sağlayıcısı seçiminden başlayarak, Ubuntu sunucusunun hazırlanması, Python ortamının kurulması, uygulama dosyalarının aktarımı, veritabanı yapılandırması, Gunicorn ve Nginx ile web sunucusu kurulumu, alan adı ve SSL/TLS yapılandırması ve son olarak uygulamanın bakımı ve güncellenmesi konularına değindik.
Bu süreç, bir web uygulamasını canlı ortama taşımak için sağlam bir temel oluşturur. Her adım, uygulamanızın güvenliğini, performansını ve kararlılığını artırmayı hedefler. Unutmayın ki, her projenin kendine özgü gereksinimleri olabilir ve bu rehber genel bir çerçeve sunar. Daha karmaşık uygulamalar için izleme (monitoring), otomatik ölçeklendirme, yük dengeleme ve daha gelişmiş CI/CD boru hatları gibi konuları araştırmanız gerekebilir. Bu rehberdeki bilgileri kullanarak, Python web uygulamalarınızı buluta güvenle taşıyabilir ve geliştirmeye odaklanabilirsiniz.
