Redmine Application Sunucu Kurulumu adımlarını anlatacağım. Daha önceki yazılarımda Redmine için Ubuntu server kurulum ve yapılandırmayı anlatmıştım. Ayrıca Redmine için veritabanı sunucu kurulumunuda anlatmıştım.
Application sunucusu üzerinde MariaDB kurulu olmayacak; ancak uygulama ile veritabanı arasındaki veri geçişini sağlayabilmek ve MariaDB’ye sorunsuz bağlanabilmek için gerekli istemci kütüphaneleri (client libraries) mutlaka yüklü olmalıdır.
A. Bağımlılıkların Kurulması
Öncelikle, uygulama sunucusu kurulumunun ilk aşamasında, sistemler arası veri geçişini yöneten ve servislerin kararlı çalışmasını sağlayan temel paketlerin kurulumunu gerçekleştiriyoruz. Bu kapsamda, aşağıdaki komutla gerekli derleme araçlarını ve kütüphaneleri sisteme dahil ederek, uygulamanın altyapısını bu veri geçiş trafiğine hazır hale getiriyoruz. Ayrıca, bu paketler sayesinde sistemin gelecekteki güncellemelerle olan uyumunu da garanti altına almış oluyoruz.
“sudo apt update
sudo apt install -y build-essential libmariadb-dev-compat libmariadb-dev \
libssl-dev libyaml-dev ruby-full apache2 libapache2-mod-passenger curl git”

B. Redmine Dosyalarını Hazırlama
Redmine için klasör oluşturuyoruz.
“sudo mkdir -p /var/www/redmine”

Oluşturduğumuz klasöre redmine uygulamasını indiriyoruz.
“cd /var/www/redmine”

Redmine dosyasını bu klasöre açıyorum.

C. Kritik Adım: Uzak Veritabanı Bağlantısı
config/database.yml dosyasını oluşturun ve uzak sunucuyu gösterecek şekilde yapılandırın.
“sudo cp config/database.yml.example config/database.yml”

Editör ile dosyayı açıyoruz.
“nano config/database.yml”

Production kısmını şu şekilde güncelleyin:
production:
adapter: mysql2
database: redmine
host: 192.168.1.231 (Veritabanı sunucunuzun IP adresi)
username: redmineuser (Sizin oluşturduğunuz user)
password: “GucluSifre123” (Sizin belirlediğiniz User)
encoding: utf8mb4

Profesyonel İpucu: Eğer kurulum ve veri geçişi aşamasında Unknown system variable 'transaction_isolation' hatası alırsanız, bu durum modern MariaDB sürümleri ile eski Rails sürümleri arasındaki iletişim uyuşmazlığından kaynaklanır. Sorunsuz bir veri geçişi sağlamak için abstract_mysql_adapter.rb kütüphanesindeki ilgili sorgu satırını yorum satırı yaparak sistemi yamalamanız gerekebilir.
“sudo sed -i ‘/variables\[:transaction_isolation\] = “READ-COMMITTED”/d’ /var/lib/gems/3.2.0/gems/activerecord-6.1.7.7/lib/active_record/connection_adapters/abstract_mysql_adapter.rb”
Mimariyi Tamamlama ve Başlatma
Yapılandırma dosyalarımızı hazırladıktan sonra, uygulama sunucusu tarafındaki kurulumu tamamlıyoruz. Bu aşamada gerçekleştireceğimiz işlemler, uygulamanın veritabanı ile tam uyumlu bir veri geçişi yapmasını sağlayacak ve sistemi ilk kullanıcı girişine hazır hale getirecektir
sudo gem install bundler
bundle install development test
bundle exec rake generate_secret_token
RAILS_ENV=production bundle exec rake db:migrate
RAILS_ENV=production bundle exec rake redmine:load_default_data
(Dil seçeneği sorulduğunda tr seçilmelidir).

Son olarak izinleri düzenliyoruz ve Apache servisini yeniden başlatıyoruz.

Bütün işlemlerden sonra web browser üzerinden sunucuya bağlanmayı deneyebilirsiniz.

Özetle Ne Yapmış Olduk?
| Sunucu | Görev | Güvenlik / Port |
| Uygulama (Sunucu A) | Ruby/Rails, Apache, Passenger | Sadece 80/443 dışarıya açık. |
| Veritabanı (Sunucu B) | MariaDB (Data storage) | 3306 sadece Uygulama Sunucusuna açık. |
Multi-Tier Mimari Avantajları:
- “Güvenlik: Veritabanı sunucunuzun internete doğrudan erişimi tamamen kapatılmıştır. Bu mimari sayesinde, tüm veri geçişi sadece uygulama sunucusu üzerinden izole bir kanal üzerinden gerçekleşir. Veritabanı sadece uygulama sunucusuyla konuştuğu için dış tehditlere karşı maksimum koruma sağlanmış olur.
- Performans: CPU yoğunluklu işleri (Ruby/Rails) bir sunucu, disk yoğunluklu işleri (Database) diğer sunucu üstlenir.
- Yedekleme: DB Sunucu üzerinde veritabanı yedeği alınması veya veri geçiş süreçlerinin yönetilmesi sırasında, operasyonel yük uygulama sunucusuna yansımaz. Bu sayede, yedekleme işlemleri devam ederken uygulama sunucunuzun performansı etkilenmez ve kullanıcı deneyimi kesintiye uğramaz.
