Flask API için sytemd servisi oluşturmak(linux dist. için) …
Merhaba… Bu benim ilk blog yazım. Basit bir şeyle başlamak istiyorum. Uygulama geliştirme sürecinde ya da özel amaçlar için kullanılabilecek, Linux sistemler üzerinde systemd servisi oluşturmaya değineceğim.
Öncelikle “systemd” linux işletim sistemleri içinde yer alan bir yazılım paketidir Lennart Poettering’e göre…Kendisi paket yazılımının yazarıdır.
İnit process’i tarafından oluturulur ve process id (pid) olarak 1 alır. systemd servisleri otomatik olarak başlatılır ve root yetkisine sahip olan kullanıcılar tarafından yönetilebilir . “sytemctl” komutu ile systemd servisleri başlatılıp(start) durdurulabilir(stop), konfigurasyon dosyalarında değişiklik yapılan uygulamaların bu dosyayı tekrar okuyup tekrar başlatılması sağlanabilir(reload), process’in durum bilgisi alınabilir(status) ve sistemin yeniden başlatılması sonrası aktivasyonu kontrol edilebilir(enable/disable). daha fazla bilgi için manual sayfasına bakabilirsiniz.
$ man systemctl
“Flask microfreamwork”’ü ise basit API’lar oluşturabilmeniz için kullanımı oldukça kolay bir çerçeve yazılımdır. Yalnızca script dosyanıza eklemek için pip3 ile flask modülünü indirip sayfaya dahil etmek, route’larınızı oluşturmak için bir app nesnesi oluşturmak yeterlidir.Sonrasında aşağıdaki script kullanılabilir.
import flaskapp = flask.Flask(__name__)app.config["DEBUG"] = True@app.route('/', methods=['GET'])def function_one():return "<div style=\" display: flex;justify-content: center;align-items: center;height: 100%;border: 3px solid green; \" ><p>Hello sir, It seems to work properly.Here is<span style=\"font-size:50px; color:white; background-color:red\"> / </span></p> </div>"@app.route('/users', methods=['GET'])def function_two():return "<div style=\" display: flex;justify-content: center;align-items: center;height: 100%;border: 3px solid green; \" ><p>Hello sir, It seems to work properly.Here is<span style=\"font-size:50px; color:white; background-color:green\"> /users</span> </p> </div>"@app.route('/products', methods=['GET'])def function_three():return "<div style=\" display: flex;justify-content: center;align-items: center;height: 100%;border: 3px solid green; \" ><p>Hello sir, It seems to work properly.Here is<span style=\"font-size:50px; color:white; background-color:blue\"> /products </span></p> </div>"app.run()
Default olarak localhost:5000 portunda çalışmaya başlar. Portu ya da host u değiştirmek için app.run(host=’ip_addr’,port=’port’ ) ile yeni host ve port verebilirsiniz.
Script, app.py olarak kaydedildikten sonra sistemd servisi yazılarak bir sistemd servisine dönüştürülebilir.
Bir flask uygulaması python ile çalıştırıldığında “development server” üzerinde ayağa kaldırılır. API’ın “Production” ortamında ayağa kaldırılabilmesi için farklı opsiyonlar mevcuttur. Flask manual sayfasından öğrenebilirsiniz.
İşletim sistemine göre değişiklik göstermekle birlikte sudo vi /lib/systemd/system/myFlaskApp.service komutu ile vi || nano editor’de açalım. Bu path distro’ya göre farklılık gösterebilir. Diğer servislerin nerede olduğunu öğrenmek için, örneğin mariadb servisi için,
$locate mariadb.servie
komutunu kullanın. Çıktı vermezse updatedb komutunu kullanıp tekrar deneyin. servisler /usr/lib/systemd/system/… altında da bulunabilir. Veya /usr dizini altına böyle bir dizin de oluşturabilirsiniz.
/lib/systemd/system/myFlaskApp.service =>
[Unit]
Description=My flask API service[Install]
WantedBy=multi-user.target[Service]
Type=simple
User=your username
PermissionsStartOnly=true
ExecStart=/usr/bin/python3 /your/path/app.py
Restart=on-failure
TimeoutSec=600
Not : Burada Restart=on-failure belirledik. Bu, sadece exit code’un 0 olmadığı durumlarda yeniden başlatmasını istediğimizi belirtir. Yerine Restart=always ve RestartSec=1 satırlarını da ekleyebiliriz. Her durumda yeniden başlatmasını sağlar.
sudo vi /etc/init/myFlaskApp.config ile bir config dosyası ekleyebilrisiniz.
description "MyFlaskApp"
start on stopped rc RUNLEVEL=[2345]
respawn
exec python3 /your/path/app.py
Sonra,
$ sudo systemctl start myFlaskApp
ile servisi ayağa kaldırabilirsiniz. systemctl status ile ‘active(running)’ durumunda olduğundan emin olun.
Bulut servis üzerinde yapılan geliştirmeler için bu yöntem kullanışlı olabiliyor fakat production ortamında hem performans, hem de yönetilebilirlik açısından yukarıdaki “deployment” seçeneklerinin kullanılması önerilir.
Bu servis kullanıcı müdahalesi olmaksızın arka planda çalışmaktadır. Sytemctl status ile görülebileceği üzere bir pid alır. Eğer modüler bir API yapısı oluşturulursa ve route işlemi ile diğer işlemler birbirinden izole edilirse, bu dosya üzerinde değişiklik yapılması gerekmeyen durumlarda bu yöntemin kullanılması kullanışlı olabilir. Bu şekilde “life hack” diyebiliriz. Kelime anlamı olarak bir şeyi amacı dışında yaşam tarzını geliştirmek için kullanmak…
Bunun gibi veya sisteminizle ilgili müdaheleye ihtiyaç duymayan işlemleri systemd servisi haline getirebilir ve systemctl ile kontrol edebilirsiniz.