Ubuntu 14.04 Üzerinde Passenger ve Apache ile Rails Uygulaması Dağıtımı: Kapsamlı Bir Rehber
Modern web uygulamaları geliştirmenin hızla popülerleştiği günümüzde, Ruby on Rails çerçevesi, hızlı prototipleme ve sağlam mimarisi sayesinde birçok geliştiricinin tercihi haline gelmiştir. Bir Rails uygulamasını geliştirme ortamından canlı bir sunucuya taşımak, uygulamanın dünya ile buluştuğu kritik bir adımdır. Bu süreçte Apache web sunucusu ve Phusion Passenger uygulama sunucusu, performans, kararlılık ve kolay yönetim sunan güçlü bir kombinasyon oluşturur. Bu kapsamlı rehber, Ubuntu 14.04 işletim sistemi üzerinde Phusion Passenger ve Apache kullanarak bir Rails uygulamasını nasıl dağıtacağınızı adım adım anlatmaktadır. Her ne kadar Ubuntu 14.04 nispeten eski bir sürüm olsa da, bu rehber, belirli bir proje veya eski altyapılar nedeniyle bu sürümü kullanmak zorunda olan geliştiriciler ve sistem yöneticileri için hayati bilgiler sunmaktadır.
Bu rehberde, bir Rails uygulamasının gereksinimlerinden başlayarak, Ruby ve veritabanı kurulumu, uygulamanın sunucuya aktarılması, Apache ve Passenger’ın entegrasyonu ve son olarak sanal host yapılandırması gibi tüm adımları detaylı bir şekilde ele alacağız. Amacımız, uygulamanızın üretim ortamında sorunsuz ve güvenli bir şekilde çalışmasını sağlamak için gerekli tüm bilgi ve komutları sağlamaktır.
Ön Gereksinimler
Bir Rails uygulamasını sunucuya dağıtmaya başlamadan önce, bazı temel gereksinimleri karşılamanız gerekmektedir. Bu gereksinimler, sorunsuz bir kurulum süreci için kritik öneme sahiptir.
* Ubuntu 14.04 Sunucusu: Bu rehber, Ubuntu 14.04 LTS (Trusty Tahr) sürümünü hedeflemektedir. Sunucuya SSH erişiminizin ve sudo yetkilerine sahip bir kullanıcı hesabınızın olması gerekmektedir.
* Etki Alanı Adı (Domain Name): Uygulamanıza internet üzerinden erişmek için bir etki alanı adına (örneğin, ornekuygulama.com) ihtiyacınız olacaktır. Bu etki alanı adının DNS kayıtlarının, sunucunuzun IP adresine işaret ettiğinden emin olun. Bu adım zorunlu olmasa da, üretim ortamı için şiddetle tavsiye edilir.
* Git: Uygulamanızın kaynak kodunu sunucuya aktarmak için Git sürüm kontrol sistemine ihtiyacınız olacaktır.
* Temel Linux Komut Bilgisi: SSH aracılığıyla sunucuya bağlanma, dosya sistemi navigasyonu, dosya düzenleme ve paket yönetimi gibi temel Linux komutlarına aşina olmanız beklenmektedir.
* Rails Uygulaması: Dağıtılacak çalışan bir Ruby on Rails uygulamasına sahip olmanız gerekmektedir. Uygulamanızın Gemfile dosyasında pg (PostgreSQL için) veya mysql2 (MySQL için) gibi üretim veritabanı adaptörlerinin bulunduğundan emin olun.
Bu ön gereksinimleri sağladıktan sonra, bir sonraki adıma geçmeye hazırsınız demektir: sunucunuzu Rails uygulamanız için hazırlamak.
Sistem Güncellemesi ve Temel Bağımlılıkların Kurulumu
Sunucunuzu güncel tutmak ve gerekli sistem bağımlılıklarını kurmak, herhangi bir yazılım dağıtımının ilk ve en önemli adımıdır. Bu, güvenlik açıklarını kapatır ve yazılımların doğru şekilde derlenmesi için gerekli kütüphaneleri sağlar.
İlk olarak, sunucunuzdaki paket listesini güncelleyin ve yüklü paketleri en son sürümlerine yükseltin:
sudo apt-get update
sudo apt-get upgrade -y
Bu komutlar, sisteminizin güncel olduğundan emin olacaktır. Ardından, Ruby, veritabanı sürücüleri ve diğer bileşenlerin derlenmesi için gerekli olan geliştirme araçlarını ve kütüphanelerini kurmalıyız.
sudo apt-get install -y build-essential libssl-dev libreadline-dev zlib1g-dev libyaml-dev \
libsqlite3-dev libxml2-dev libxslt1-dev libcurl4-openssl-dev libffi-dev \
nodejs npm # Node.js ve NPM, Rails Asset Pipeline için gereklidir
* build-essential: C/C++ derleyicileri ve make gibi temel geliştirme araçlarını içerir.
* libssl-dev: OpenSSL kütüphanesi geliştirme başlıklarını sağlar.
* libreadline-dev: Readline kütüphanesi için geliştirme başlıkları.
* zlib1g-dev: Zlib sıkıştırma kütüphanesi için geliştirme başlıkları.
* libyaml-dev: YAML ayrıştırma kütüphanesi için geliştirme başlıkları.
* libsqlite3-dev: SQLite3 veritabanı kütüphanesi için geliştirme başlıkları (geliştirme ortamı için kullanışlıdır, üretimde genellikle PostgreSQL veya MySQL tercih edilir).
* libxml2-dev ve libxslt1-dev: XML ve XSLT işleme kütüphaneleri için geliştirme başlıkları (bazı gem’ler için gereklidir).
* libcurl4-openssl-dev: Curl kütüphanesi için geliştirme başlıkları (HTTP istekleri için).
* libffi-dev: Foreign Function Interface kütüphanesi için geliştirme başlıkları (bazı gem’ler için gereklidir).
* nodejs ve npm: Rails 4 ve üzeri sürümlerde Asset Pipeline, JavaScript sıkıştırma ve derleme işlemleri için Node.js’e ihtiyaç duyar.
Bu adımları tamamladıktan sonra, sisteminiz Ruby ve Rails uygulamaları için gerekli temel bağımlılıklara sahip olacaktır.
Ruby Kurulumu (rbenv ile)
Ruby’yi doğrudan sistem paket yöneticisiyle kurmak yerine, rbenv veya RVM gibi bir Ruby versiyon yöneticisi kullanmak, farklı Ruby sürümleri arasında kolayca geçiş yapmanızı ve sistem Ruby’sini etkilemeden uygulama bağımlılıklarını yönetmenizi sağlar. Bu rehberde rbenv kullanımını tercih edeceğiz, çünkü genellikle daha hafif ve daha az invaziv kabul edilir.
rbenv ve ruby-build Kurulumu
İlk olarak, rbenv ve eklentisi olan ruby-build‘u kurmanız gerekmektedir. ruby-build, rbenv‘in Ruby sürümlerini derlemesini ve kurmasını sağlar.
# rbenv'i klonlayın
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
rbenv'i PATH'e ekleyin ve başlatın
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
source ~/.bashrc
ruby-build'u klonlayın (rbenv'in bir eklentisi)
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
Bu komutlar, rbenv ve ruby-build‘u kullanıcı dizininize kurar ve kabuğunuzun başlangıçta rbenv‘i yüklemesini sağlayacak şekilde .bashrc dosyanızı günceller. Değişikliklerin etkili olması için source ~/.bashrc komutunu çalıştırmanız veya SSH oturumunuzu kapatıp yeniden açmanız gerekebilir.
Ruby Sürümü Kurulumu
Şimdi, uygulamanızın gerektirdiği Ruby sürümünü kurabilirsiniz. Uygulamanızın Gemfile dosyasında belirtilen veya geliştirme ortamınızda kullandığınız Ruby sürümünü kullanmanız önemlidir. Örneğin, Ruby 2.3.8 kurmak için:
rbenv install 2.3.8
rbenv global 2.3.8
rbenv rehash
* rbenv install 2.3.8: Belirtilen Ruby sürümünü indirir ve derler. Bu işlem biraz zaman alabilir.
* rbenv global 2.3.8: Bu Ruby sürümünü sistem genelinde varsayılan olarak ayarlar.
* rbenv rehash: Yeni kurulan Ruby sürümünü ve gem yürütülebilir dosyalarını rbenv’in PATH’ine ekler.
Kurulumun başarılı olup olmadığını kontrol etmek için:
ruby -v
Bu komut, kurduğunuz Ruby sürümünü göstermelidir.
Bundler Kurulumu
Ruby uygulamaları için bağımlılıkları yöneten Bundler gem’ini kurmanız gerekmektedir:
gem install bundler
rbenv rehash
Artık sunucunuzda doğru Ruby sürümü ve Bundler yüklü. Bu, Rails uygulamanızın bağımlılıklarını yönetmek için temel oluşturur.
Veritabanı Kurulumu
Rails uygulamaları genellikle bir ilişkisel veritabanına ihtiyaç duyar. PostgreSQL ve MySQL, Rails uygulamaları için en popüler iki seçenektir. Bu rehberde PostgreSQL’i tercih edeceğiz, ancak MySQL için de kısa bir genel bakış sunacağız.
PostgreSQL Kurulumu
PostgreSQL, güçlü, açık kaynaklı ve güvenilir bir ilişkisel veritabanı yönetim sistemidir. Rails uygulamalarıyla mükemmel bir uyum sağlar.
sudo apt-get install -y postgresql postgresql-contrib libpq-dev
* postgresql: PostgreSQL sunucu paketidir.
* postgresql-contrib: PostgreSQL için ek modüller ve araçlar içerir.
* libpq-dev: PostgreSQL C kütüphanesi geliştirme başlıklarıdır, pg gem’inin derlenmesi için gereklidir.
Kurulumdan sonra, PostgreSQL varsayılan olarak postgres adlı bir sistem kullanıcısı ve bu kullanıcıya ait bir rol oluşturur. Uygulamanız için özel bir veritabanı kullanıcısı ve veritabanı oluşturmanız gerekmektedir.
# postgres kullanıcısına geçiş yapın
sudo -u postgres psql
Yeni bir veritabanı kullanıcısı oluşturun
Komut isteminde şifre belirlemeniz istenecektir.
CREATE USER your_app_user WITH PASSWORD 'your_secure_password';
Yeni bir veritabanı oluşturun ve sahibini belirleyin
CREATE DATABASE your_app_production OWNER your_app_user;
Bağlantıları kısıtlamak isterseniz, izinleri düzenleyebilirsiniz.
Örneğin, sadece yerel bağlantılara izin vermek için:
REVOKE ALL ON DATABASE your_app_production FROM PUBLIC;
GRANT ALL PRIVILEGES ON DATABASE your_app_production TO your_app_user;
psql'den çıkın
\q
Veritabanı kullanıcınız ve veritabanınız hazır. Uygulamanızın config/database.yml dosyasını bu bilgilerle güncelleyeceksiniz.
MySQL Kurulumu (Alternatif)
Eğer uygulamanız MySQL kullanıyorsa, aşağıdaki komutlarla MySQL sunucusunu ve gerekli kütüphaneleri kurabilirsiniz:
sudo apt-get install -y mysql-server mysql-client libmysqlclient-dev
Kurulum sırasında MySQL root şifresi belirlemeniz istenecektir. Daha sonra, PostgreSQL’de yaptığınız gibi bir veritabanı kullanıcısı ve veritabanı oluşturmanız gerekecektir.
# MySQL'e root kullanıcısı ile bağlanın
sudo mysql -u root -p
Yeni bir veritabanı kullanıcısı oluşturun
CREATE USER 'your_app_user'@'localhost' IDENTIFIED BY 'your_secure_password';
Yeni bir veritabanı oluşturun
CREATE DATABASE your_app_production;
Kullanıcıya veritabanı üzerinde tüm yetkileri verin
GRANT ALL PRIVILEGES ON your_app_production.* TO 'your_app_user'@'localhost';
FLUSH PRIVILEGES;
MySQL'den çıkın
EXIT;
Hangi veritabanını kullanırsanız kullanın, uygulamanızın database.yml dosyasını üretim ortamı için doğru şekilde yapılandırmanız gerekecektir.
Rails Uygulamasının Sunucuya Aktarılması
Artık sunucunuz hazır olduğuna göre, Rails uygulamanızın kodunu sunucuya aktarabilir ve gerekli bağımlılıkları yükleyebilirsiniz.
Uygulama Klonlama
Uygulamanızı genellikle /var/www dizini altına klonlamak en yaygın yöntemdir. Bu dizin, web sunucusu tarafından erişilebilir olması gereken web siteleri için standart bir konumdur.
# /var/www dizinini oluşturun (eğer yoksa)
sudo mkdir -p /var/www
Uygulamanızı klonlayın
sudo git clone /var/www/your_app_name
Klonlanan dizinin sahibini değiştirin
Bu adım, uygulama dosyaları üzerinde işlem yapabilmek için önemlidir.
Genellikle uygulama için ayrı bir kullanıcı oluşturmak ve bu kullanıcıya sahip olmak daha güvenlidir.
Ancak basit dağıtımlar için mevcut SSH kullanıcınızı veya www-data'yı kullanabilirsiniz.
Burada, SSH kullanıcınıza sahip olmanızı varsayıyoruz:
sudo chown -R $USER:$USER /var/www/your_app_name
Uygulama dizinine geçiş yapın
cd /var/www/your_app_name
yerine uygulamanızın Git deposunun URL’sini (örn. git@github.com:kullaniciadi/uygulama.git) ve your_app_name yerine uygulamanızın adını yazmalısınız.
Bağımlılıkların Yüklenmesi
Uygulama dizinine geçtikten sonra, bundle install komutunu kullanarak uygulamanızın Gemfile’ında belirtilen tüm gem’leri yüklemelisiniz. Üretim ortamı için, geliştirme ve test bağımlılıklarını yüklememek önemlidir.
bundle install --deployment --without development test
* --deployment: Gem’leri sistem genelinde değil, uygulama dizini içinde vendor/bundle altına yükler. Bu, uygulamalar arası çakışmaları önler ve daha izole bir ortam sağlar.
* --without development test: Gemfile dosyasındaki development ve test gruplarındaki gem’leri yüklemez.
Veritabanı Yapılandırması
Uygulamanızın config/database.yml dosyasını üretim ortamı için doğru veritabanı bilgileriyle düzenlemeniz gerekmektedir.
# config/database.yml (örnek)
production:
adapter: postgresql
encoding: unicode
pool: 5
database: your_app_production
username: your_app_user
password: your_secure_password
host: localhost
Bu dosyayı düzenlemek için nano veya vim gibi bir metin düzenleyici kullanabilirsiniz:
nano config/database.yml
your_app_production, your_app_user ve your_secure_password değerlerini kendi veritabanı ayarlarınızla değiştirmeyi unutmayın.
Ortam Değişkenleri ve Gizli Anahtarlar
Rails uygulamaları, güvenlik için SECRET_KEY_BASE gibi gizli anahtarlara ihtiyaç duyar. Ayrıca, API anahtarları veya diğer hassas bilgiler gibi ortam değişkenlerini de yönetmeniz gerekebilir.
SECRET_KEY_BASE‘i oluşturmak için:
RAILS_ENV=production bundle exec rake secret
Bu komutun çıktısını kopyalayın. Ardından, bu anahtarı uygulamanızın config/secrets.yml dosyasına eklemelisiniz:
# config/secrets.yml
production:
secret_key_base:
Diğer ortam değişkenlerini yönetmek için, Passenger’ın Apache yapılandırmasında PassengerAppEnv direktifi ile production ortamını belirtmenin yanı sıra, PassengerEnv direktifi ile ek değişkenler tanımlayabilir veya config/application.yml gibi bir dosya kullanıp bunu .gitignore‘a ekleyebilirsiniz.
Asset Precompilation
Rails uygulamaları, JavaScript ve CSS dosyalarını (asset’leri) üretim ortamında performans için derler ve sıkıştırır. Bu işlem, genellikle dağıtım sırasında yapılır.
RAILS_ENV=production bundle exec rake assets:precompile
Bu komut, uygulamanızın public/assets dizinine sıkıştırılmış ve parmak izli (fingerprinted) asset dosyalarını oluşturacaktır.
Veritabanı Oluşturma ve Göç Etme
Son olarak, veritabanınızı oluşturmanız ve şemayı uygulamanızın model tanımlarına göre yapılandırmanız gerekmektedir.
RAILS_ENV=production bundle exec rake db:create
RAILS_ENV=production bundle exec rake db:migrate
Eğer uygulamanızda başlangıç verileri (seed data) varsa, bunları da yükleyebilirsiniz:
RAILS_ENV=production bundle exec rake db:seed
Dizin İzinleri
Web sunucusunun uygulamanızın belirli dizinlerine (örneğin, public, log, tmp) yazma erişimine sahip olması gerekebilir. Apache’nin varsayılan kullanıcısı www-data‘dır.
# Log ve tmp dizinlerine www-data kullanıcısına yazma izni verin
sudo chown -R $USER:www-data /var/www/your_app_name
sudo chmod -R g+w /var/www/your_app_name/log
sudo chmod -R g+w /var/www/your_app_name/tmp
public dizininin da www-data tarafından okunabilir olduğundan emin olun
sudo chmod -R o+r /var/www/your_app_name/public
Bu adım, uygulamanızın log dosyalarını yazabilmesi, geçici dosyalar oluşturabilmesi ve web sunucusunun statik asset’lere erişebilmesi için kritik öneme sahiptir.
Apache Web Sunucusunun Kurulumu ve Yapılandırılması
Apache HTTP Sunucusu, dünyanın en popüler web sunucularından biridir ve Rails uygulamaları için sağlam bir platform sağlar.
Apache Kurulumu
Apache’yi kurmak oldukça basittir:
sudo apt-get install -y apache2
Kurulumdan sonra Apache otomatik olarak başlayacaktır. Tarayıcınızda sunucunuzun IP adresine giderek varsayılan Apache “It works!” sayfasını görmelisiniz.
Gerekli Apache Modülleri
Rails uygulamaları genellikle URL yeniden yazma (rewrite) ve HTTP başlıklarını yönetme gibi işlevler için belirli Apache modüllerine ihtiyaç duyar.
sudo a2enmod rewrite
sudo a2enmod headers
* rewrite: URL yeniden yazma kurallarını etkinleştirir. Rails’in router’ı için gereklidir.
* headers: HTTP başlıklarını ayarlamanıza olanak tanır. Güvenlik başlıkları veya CORS ayarları için kullanışlıdır.
Modülleri etkinleştirdikten sonra Apache’yi yeniden başlatmanız gerekir:
sudo service apache2 restart
Passenger Kurulumu ve Apache ile Entegrasyonu
Phusion Passenger, Rails uygulamalarını Apache veya Nginx gibi web sunucularıyla entegre etmek için tasarlanmış, kullanımı kolay bir uygulama sunucusudur.
Passenger Gem Kurulumu
Passenger’ı bir Ruby gem’i olarak kurmanız gerekmektedir:
gem install passenger
rbenv rehash
Bu komut, Passenger gem’ini kurar. Ancak bu, henüz Apache ile entegre olduğu anlamına gelmez.
Passenger Apache Modülü Kurulumu
Passenger’ı Apache ile entegre etmek için özel bir kurulum betiği çalıştırmanız gerekmektedir:
sudo passenger-install-apache2-module
Bu betik, Apache modülünü derleyecek ve yapılandırma talimatlarını gösterecektir. Yükleyici size bir dizi soru sorabilir; genellikle varsayılan seçenekleri kabul edebilirsiniz. Kurulumun sonunda, Passenger Apache modülünü yüklemek için Apache yapılandırma dosyasına eklemeniz gereken bir dizi satır gösterecektir. Bu çıktıyı dikkatlice kopyalayın.
Örnek çıktıya benzer bir şey göreceksiniz:
LoadModule passenger_module /home/your_user/.rbenv/versions/2.3.8/lib/ruby/gems/2.3.0/gems/passenger-5.x.x/buildout/apache2/mod_passenger.so
PassengerRoot /home/your_user/.rbenv/versions/2.3.8/lib/ruby/gems/2.3.0/gems/passenger-5.x.x
PassengerDefaultRuby /home/your_user/.rbenv/versions/2.3.8/bin/ruby
Bu satırları Apache’nin modül yapılandırma dizinine yeni bir dosya olarak eklemelisiniz.
sudo nano /etc/apache2/mods-available/passenger.conf
Kopyaladığınız satırları bu dosyaya yapıştırın ve kaydedin. Dosyanın içeriği aşağıdaki gibi olacaktır (yollar kendi sisteminize göre değişebilir):
# /etc/apache2/mods-available/passenger.conf
LoadModule passenger_module /home/your_user/.rbenv/versions/2.3.8/lib/ruby/gems/2.3.0/gems/passenger-5.x.x/buildout/apache2/mod_passenger.so
PassengerRoot /home/your_user/.rbenv/versions/2.3.8/lib/ruby/gems/2.3.0/gems/passenger-5.x.x
PassengerDefaultRuby /home/your_user/.rbenv/versions/2.3.8/bin/ruby
Passenger modülünü Apache için etkinleştirin:
sudo a2enmod passenger
Ve Apache’yi yeniden başlatın:
sudo service apache2 restart
Bu adımlarla Passenger, Apache ile başarıyla entegre edilmiş olmalıdır.
Apache Sanal Host Yapılandırması
Uygulamanızın belirli bir etki alanı adıyla (domain name) erişilebilir olması için Apache’de bir sanal host (Virtual Host) yapılandırması oluşturmanız gerekmektedir.
Yeni bir sanal host yapılandırma dosyası oluşturun:
sudo nano /etc/apache2/sites-available/your_app_name.conf
Bu dosyaya aşağıdaki yapılandırmayı ekleyin. Kendi etki alanı adınızı ve uygulama dizininizi doğru şekilde değiştirdiğinizden emin olun.
# /etc/apache2/sites-available/your_app_name.conf
ServerName your_domain.com
ServerAlias www.your_domain.com
DocumentRoot /var/www/your_app_name/public
# Rails uygulamanızın kök dizini
# Passenger bu dizini kullanarak uygulamanızı başlatacaktır
# PassengerAppRoot /var/www/your_app_name (PassengerDefaultRuby tanımlandığı için genellikle gereksizdir)
# Uygulamanın çalışacağı Rails ortamı
PassengerAppEnv production
# Apache'nin .htaccess dosyalarını işlemesine izin verir
AllowOverride all
# Dizindeki dosyaların listelenmesini engeller
Options -MultiViews
# Apache'nin bu dizine erişmesine izin verir
Require all granted
# Hata ve erişim logları
ErrorLog ${APACHE_LOG_DIR}/your_app_name_error.log
CustomLog ${APACHE_LOG_DIR}/your_app_name_access.log combined
* ServerName: Uygulamanızın birincil etki alanı adıdır.
* ServerAlias: Uygulamanız için alternatif etki alanı adlarıdır (örneğin, www ön eki ile).
* DocumentRoot: Rails uygulamanızın public dizinini işaret etmelidir. Bu, web sunucusunun statik varlıklara ve uygulamanın giriş noktasına erişmesini sağlar.
* PassengerAppEnv production: Passenger’a Rails uygulamasını production ortamında başlatmasını söyler. Bu, Rails’in üretim modunda çalışmasını sağlar.
* bloğu, Apache’nin public dizini için özel kuralları tanımlar. AllowOverride all Rails’in .htaccess dosyasındaki yönlendirme kurallarını kullanmasına izin verir.
Sanal hostu etkinleştirin ve varsayılan sanal hostu devre dışı bırakın (eğer sadece bu uygulamayı barındırıyorsanız):
sudo a2ensite your_app_name.conf
sudo a2dissite 000-default.conf # Varsayılan Apache sayfasını devre dışı bırakır
Son olarak, Apache’yi yeniden başlatarak değişikliklerin etkili olmasını sağlayın:
sudo service apache2 restart
Şimdi tarayıcınızdan your_domain.com adresine giderek Rails uygulamanızın çalıştığını görmelisiniz!
Güvenlik İpuçları ve Ek Ayarlar
Uygulamanız canlıya alındığında, güvenlik ve bakım için bazı ek adımlar atmak önemlidir.
SSL/TLS Kurulumu (HTTPS)
Tüm modern web uygulamaları için HTTPS kullanmak zorunludur. Let’s Encrypt ve Certbot, ücretsiz ve otomatikleştirilmiş SSL sertifikaları sağlar. Ubuntu 14.04 için Certbot kurulumu biraz farklı olabilir çünkü varsayılan depolarda olmayabilir.
# Certbot PPA'sını ekleyin
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:certbot/certbot -y
sudo apt-get update
Certbot'u ve Apache eklentisini kurun
sudo apt-get install -y certbot python-certbot-apache
Sertifikayı alın ve Apache yapılandırmasını otomatik olarak güncelleyin
sudo certbot --apache -d your_domain.com -d www.your_domain.com
Certbot, sertifikayı alacak ve Apache sanal host yapılandırmanızı otomatik olarak HTTPS’ye yönlendirecek şekilde güncelleyecektir. Ayrıca sertifikaların otomatik yenilenmesini de ayarlayacaktır.
Güvenlik Duvarı (UFW)
Sunucunuzun güvenliğini sağlamak için bir güvenlik duvarı (örneğin, UFW – Uncomplicated Firewall) kullanmak kritik öneme sahiptir.
sudo ufw enable
sudo ufw allow ssh # SSH erişimine izin ver (port 22)
sudo ufw allow http # HTTP erişimine izin ver (port 80)
sudo ufw allow https # HTTPS erişimine izin ver (port 443)
sudo ufw status # Güvenlik duvarı durumunu kontrol edin
Bu, sunucunuza sadece gerekli portlar üzerinden erişilmesini sağlar.
Log Yönetimi
Uygulamanızın ve web sunucunuzun loglarını düzenli olarak kontrol etmek, sorun giderme ve performans izleme için hayati öneme sahiptir.
* Rails Uygulama Logları: /var/www/your_app_name/log/production.log
* Apache Hata Logları: /var/log/apache2/error.log
* Apache Erişim Logları: /var/log/apache2/access.log veya sanal host yapılandırmanızda belirttiğiniz özel log dosyaları (your_app_name_error.log, your_app_name_access.log).
Bu log dosyalarını tail -f komutuyla canlı olarak izleyebilirsiniz:
tail -f /var/www/your_app_name/log/production.log
Otomatik Başlatma
Apache ve Passenger, sunucunuz yeniden başlatıldığında otomatik olarak başlamalıdır. Ubuntu 14.04’te Apache varsayılan olarak bu şekilde yapılandırılmıştır. Passenger, Apache modülü olarak çalıştığı için, Apache başladığında o da otomatik olarak çalışacaktır.
Ortam Değişkenleri
Hassas bilgileri (veritabanı şifreleri, API anahtarları vb.) doğrudan kod içinde tutmak yerine ortam değişkenleri olarak yönetmek daha güvenlidir. Passenger, sanal host yapılandırmanıza PassengerEnv direktifi ekleyerek ortam değişkenlerini ayarlamanıza olanak tanır:
# /etc/apache2/sites-available/your_app_name.conf içine
# ... diğer ayarlar ...
PassengerAppEnv production
PassengerEnv RAILS_MASTER_KEY your_master_key_here # Rails 5.2+ credentials için
PassengerEnv AWS_ACCESS_KEY_ID your_aws_access_key
# ...
Veya daha güvenli bir yöntem olarak, config/secrets.yml dosyasını Rails 5.2+ credentials.yml.enc veya dotenv gem’i ile .env dosyası kullanarak yönetmek daha iyi bir yaklaşımdır. Passenger, .env dosyalarını otomatik olarak yüklemez, bu nedenle uygulama kodunuzda bu dosyayı yüklemeyi sağlamanız veya ortam değişkenlerini Apache yapılandırmasında belirtmeniz gerekir.
Sorun Giderme
Dağıtım sürecinde sorunlarla karşılaşmak oldukça yaygındır. İşte karşılaşabileceğiniz bazı yaygın sorunlar ve çözüm yolları:
* “It works!” sayfası görünüyor veya 404 hatası alıyorum:
* Apache sanal host yapılandırmanızın doğru olduğundan emin olun (/etc/apache2/sites-available/your_app_name.conf).
* a2ensite your_app_name.conf komutuyla sanal hostunuzu etkinleştirdiğinizden emin olun.
* 000-default.conf gibi diğer sanal hostları devre dışı bırakın (a2dissite 000-default.conf).
* Apache’yi yeniden başlattığınızdan emin olun (sudo service apache2 restart).
* DocumentRoot‘un /var/www/your_app_name/public‘i işaret ettiğinden emin olun.
* 500 Internal Server Error veya Beyaz Sayfa:
* En olası neden, uygulamanızın kendisinde bir hatadır. Rails production.log dosyasını kontrol edin: tail -f /var/www/your_app_name/log/production.log.
* Apache error.log dosyasını kontrol edin: tail -f /var/log/apache2/error.log.
* Dosya izinlerini kontrol edin. www-data kullanıcısının log, tmp ve public dizinlerine yazma ve okuma erişimi olduğundan emin olun.
* Veritabanı bağlantı bilgilerinin config/database.yml dosyasında doğru olduğundan emin olun.
* SECRET_KEY_BASE‘in config/secrets.yml dosyasında ayarlandığından emin olun.
* bundle install --deployment komutunu doğru şekilde çalıştırdığınızdan ve tüm gem’lerin yüklü olduğundan emin olun.
* RAILS_ENV=production bundle exec rake assets:precompile komutunu çalıştırdığınızdan emin olun.
* Passenger ile ilgili hatalar:
* passenger-install-apache2-module çıktısını passenger.conf dosyasına doğru kopyaladığınızdan emin olun.
* Passenger modülünü etkinleştirdiğinizden emin olun: sudo a2enmod passenger.
* Apache’yi yeniden başlattığınızdan emin olun.
* PassengerDefaultRuby yolunun doğru Ruby ikili dosyasını işaret ettiğinden emin olun (örneğin, rbenv tarafından kurulan Ruby).
* Veritabanı bağlantı sorunları:
* Veritabanı sunucusunun çalıştığından emin olun (sudo service postgresql status veya sudo service mysql status).
* Veritabanı kullanıcısı ve şifresinin doğru olduğundan ve bu kullanıcının veritabanına erişim izinlerine sahip olduğundan emin olun.
* libpq-dev (PostgreSQL için) veya libmysqlclient-dev (MySQL için) gibi geliştirme başlıklarının yüklü olduğundan emin olun.
* pg veya mysql2 gem’lerinin bundle install sırasında başarıyla derlendiğinden emin olun.
Bu adımlar, çoğu dağıtım sorununu teşhis etmenize ve çözmenize yardımcı olacaktır. Unutmayın, log dosyaları en iyi arkadaşınızdır!
Sonuç
Ubuntu 14.04 üzerinde Phusion Passenger ve Apache ile bir Rails uygulaması dağıtmak, dikkatli bir planlama ve adım adım uygulama gerektiren kapsamlı bir süreçtir. Bu rehberde, sunucunuzu hazırlamaktan başlayarak Ruby ve veritabanı kurulumuna, uygulamanızın sunucuya aktarılmasına, Apache ve Passenger entegrasyonuna ve son olarak sanal host yapılandırmasına kadar tüm kritik adımları detaylı bir şekilde ele aldık. Ayrıca güvenlik ipuçları ve yaygın sorun giderme yöntemleri hakkında da bilgi verdik.
Bu adımları dikkatlice takip ederek, Rails uygulamanızın üretim ortamında kararlı, performanslı ve güvenli bir şekilde çalışmasını sağlayabilirsiniz. Dağıtım, bir uygulamanın yaşam döngüsünün sadece bir parçasıdır. Başarılı bir dağıtımın ardından, uygulamanızın performansını izlemek, logları takip etmek ve düzenli güvenlik güncellemeleri yapmak da aynı derecede önemlidir.
Unutmayın ki her uygulama ve sunucu ortamı kendine özgü zorluklar barındırabilir. Bu rehber genel bir yol haritası sunarken, kendi özel durumunuza göre ayarlamalar yapmanız gerekebilir. İleriye dönük olarak, dağıtım süreçlerinizi otomatikleştirmek (örneğin Capistrano veya CI/CD araçları ile) ve sunucu izleme çözümlerini entegre etmek, operasyonel yükünüzü azaltacak ve uygulamanızın istikrarını artıracaktır. Başarılı bir dağıtım dileğiyle!
