{"id":39504,"date":"2026-02-22T22:40:49","date_gmt":"2026-02-22T19:40:49","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=39504"},"modified":"2026-02-22T22:40:49","modified_gmt":"2026-02-22T19:40:49","slug":"elixir-phoenix-uygulamalarini-distillery-ve-edeliver-ile-ubuntu-16-04-uzerinde-otomatik-dagitma","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/elixir-phoenix-uygulamalarini-distillery-ve-edeliver-ile-ubuntu-16-04-uzerinde-otomatik-dagitma\/","title":{"rendered":"Elixir-Phoenix Uygulamalar\u0131n\u0131 Distillery ve edeliver ile Ubuntu 16.04 \u00dczerinde Otomatik Da\u011f\u0131tma"},"content":{"rendered":"<p><body><\/p>\n<h2>Elixir-Phoenix Uygulamalar\u0131n\u0131 Distillery ve edeliver ile Ubuntu 16.04 \u00dczerinde Otomatik Da\u011f\u0131tma<\/h2>\n<p>Elixir ve Phoenix Framework, y\u00fcksek performansl\u0131, \u00f6l\u00e7eklenebilir ve hataya dayan\u0131kl\u0131 web uygulamalar\u0131 geli\u015ftirmek i\u00e7in g\u00fc\u00e7l\u00fc bir ikili sunar. Ancak, bu t\u00fcr uygulamalar\u0131n da\u011f\u0131t\u0131m s\u00fcreci, geleneksel web uygulamalar\u0131na k\u0131yasla kendine \u00f6zg\u00fc zorluklar ve f\u0131rsatlar bar\u0131nd\u0131r\u0131r. Erlang Sanal Makinesi (BEAM) ve OTP (Open Telecom Platform) sayesinde Elixir uygulamalar\u0131, \u00e7al\u0131\u015fma zaman\u0131nda g\u00fcncellemeleri, s\u0131f\u0131r kesintiyle da\u011f\u0131t\u0131mlar\u0131 ve y\u00fcksek eri\u015filebilirli\u011fi do\u011fal olarak destekler. Bu yeteneklerden tam olarak faydalanmak i\u00e7in Distillery ve edeliver gibi \u00f6zel ara\u00e7lar gereklidir. Bu makale, Elixir-Phoenix uygulamalar\u0131n\u0131z\u0131 Ubuntu 16.04 sunucular\u0131nda Distillery ve edeliver kullanarak nas\u0131l otomatik olarak da\u011f\u0131taca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m a\u00e7\u0131klamaktad\u0131r.<\/p>\n<h3>Giri\u015f: Elixir\/Phoenix Da\u011f\u0131t\u0131m\u0131n\u0131n \u00d6nemi<\/h3>\n<p>Modern web uygulamalar\u0131 i\u00e7in kesintisiz \u00e7al\u0131\u015fma ve h\u0131zl\u0131 g\u00fcncellemeler hayati \u00f6neme sahiptir. Elixir ve Phoenix, bu gereksinimleri kar\u015f\u0131lamak \u00fczere tasarlanm\u0131\u015f olsa da, bu potansiyeli ger\u00e7e\u011fe d\u00f6n\u00fc\u015ft\u00fcrmek do\u011fru da\u011f\u0131t\u0131m stratejileri ve ara\u00e7lar\u0131 gerektirir. Distillery, uygulaman\u0131z\u0131 t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131 ve Erlang Sanal Makinesi ile birlikte tek, ta\u015f\u0131nabilir bir pakete d\u00f6n\u00fc\u015ft\u00fcr\u00fcrken, edeliver bu paketin uzaktaki sunuculara otomatik olarak da\u011f\u0131t\u0131lmas\u0131n\u0131, g\u00fcncellenmesini ve y\u00f6netilmesini sa\u011flar. Ubuntu 16.04, uzun s\u00fcreli destek (LTS) sunan ve bir\u00e7ok sunucu ortam\u0131nda yayg\u0131n olarak kullan\u0131lan bir i\u015fletim sistemi oldu\u011fu i\u00e7in bu rehberde hedef platform olarak se\u00e7ilmi\u015ftir.<\/p>\n<h3>Elixir\/Phoenix Da\u011f\u0131t\u0131m\u0131 Neden \u00d6zeldir?<\/h3>\n<p>Elixir uygulamalar\u0131 Erlang\/OTP \u00fczerinde \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in da\u011f\u0131t\u0131m s\u00fcre\u00e7leri di\u011fer dillerden (\u00f6rne\u011fin Node.js, Python, Ruby) farkl\u0131l\u0131k g\u00f6sterir. Geleneksel olarak, bu dillerde uygulamay\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in sunucuda dilin kendisinin ve ba\u011f\u0131ml\u0131l\u0131k y\u00f6neticisinin (npm, pip, bundler) kurulu olmas\u0131 gerekir. Elixir&#8217;de ise durum farkl\u0131d\u0131r:<\/p>\n<p>*   <strong>Erlang Sanal Makinesi (BEAM):<\/strong> Elixir uygulamalar\u0131 BEAM \u00fczerinde \u00e7al\u0131\u015f\u0131r. Bu, uygulamalar\u0131n y\u00fcksek e\u015fzamanl\u0131l\u0131k ve hataya dayan\u0131kl\u0131l\u0131k \u00f6zelliklerini BEAM&#8217;den almas\u0131n\u0131 sa\u011flar. Da\u011f\u0131t\u0131m s\u0131ras\u0131nda BEAM&#8217;in de uygun \u015fekilde paketlenmesi veya sunucuda bulunmas\u0131 gerekir.<br \/>\n*   <strong>OTP Uygulamalar\u0131:<\/strong> Elixir uygulamalar\u0131 genellikle OTP uygulamalar\u0131 olarak yap\u0131land\u0131r\u0131l\u0131r. Bu, uygulamalar\u0131n kendi ya\u015fam d\u00f6ng\u00fclerini (ba\u015flatma, durdurma, yeniden ba\u015flatma) y\u00f6netebilmesi anlam\u0131na gelir.<br \/>\n*   <strong>S\u0131cak Kod De\u011fi\u015fimi (Hot Code Swapping):<\/strong> Erlang\/Elixir, \u00e7al\u0131\u015fan bir sistemin durmadan yeni kodla g\u00fcncellenmesine olanak tan\u0131r. Bu, s\u0131f\u0131r kesintiyle da\u011f\u0131t\u0131m i\u00e7in b\u00fcy\u00fck bir potansiyel sunar.<br \/>\n*   <strong>Ba\u011f\u0131ml\u0131l\u0131klar:<\/strong> Uygulaman\u0131n ba\u011f\u0131ml\u0131l\u0131klar\u0131 da BEAM taraf\u0131ndan y\u00f6netilir ve da\u011f\u0131t\u0131m paketine dahil edilmelidir.<\/p>\n<p>Bu \u00f6zelikleri g\u00f6z \u00f6n\u00fcnde bulundurarak, Distillery ve edeliver gibi ara\u00e7lar, bu karma\u015f\u0131kl\u0131\u011f\u0131 soyutlayarak da\u011f\u0131t\u0131m s\u00fcrecini basitle\u015ftirir ve Elixir&#8217;in sundu\u011fu avantajlardan tam olarak yararlanmay\u0131 m\u00fcmk\u00fcn k\u0131lar.<\/p>\n<h3>Distillery Nedir ve Neden Kullan\u0131l\u0131r?<\/h3>\n<p>Distillery, Elixir\/Erlang uygulamalar\u0131n\u0131z i\u00e7in &#8220;release&#8221; (s\u00fcr\u00fcm) olu\u015fturmaya yarayan bir ara\u00e7t\u0131r. Bir release, uygulaman\u0131z\u0131n kendisini, t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 ve hatta Erlang Sanal Makinesi&#8217;ni (BEAM) i\u00e7eren, kendi kendine yeten, ta\u015f\u0131nabilir bir pakettir. Bu, da\u011f\u0131t\u0131m s\u00fcrecini \u00f6nemli \u00f6l\u00e7\u00fcde basitle\u015ftirir.<\/p>\n<h4>Kendi Kendine Yeterli S\u00fcr\u00fcmler (Self-Contained Releases)<\/h4>\n<p>Distillery&#8217;nin en b\u00fcy\u00fck avantaj\u0131, uygulaman\u0131z\u0131 kendi kendine yeten bir paket haline getirmesidir. Bu, hedef sunucuda Erlang veya Elixir&#8217;in kurulu olmas\u0131na gerek olmad\u0131\u011f\u0131 anlam\u0131na gelir. Tek yapman\u0131z gereken, olu\u015fturulan paketi sunucuya kopyalamak ve \u00e7al\u0131\u015ft\u0131rmakt\u0131r. Bu, ortam tutars\u0131zl\u0131klar\u0131n\u0131 azalt\u0131r ve ba\u011f\u0131ml\u0131l\u0131k y\u00f6netimi karma\u015fas\u0131n\u0131 ortadan kald\u0131r\u0131r.<\/p>\n<h4>\u00c7al\u0131\u015fma Zaman\u0131 Konfig\u00fcrasyonu (Runtime Configuration)<\/h4>\n<p>Geli\u015ftirme, test ve \u00fcretim ortamlar\u0131 aras\u0131nda farkl\u0131 konfig\u00fcrasyonlara sahip olmak yayg\u0131n bir durumdur. Distillery, <code>runtime.exs<\/code> (veya eski versiyonlarda <code>config\/releases.exs<\/code>) dosyas\u0131 arac\u0131l\u0131\u011f\u0131yla \u00e7al\u0131\u015fma zaman\u0131 konfig\u00fcrasyonunu destekler. Bu, paketi bir kez derleyip farkl\u0131 ortam de\u011fi\u015fkenleri veya konfig\u00fcrasyon dosyalar\u0131yla farkl\u0131 ortamlarda \u00e7al\u0131\u015ft\u0131rabilece\u011finiz anlam\u0131na gelir. \u00d6rne\u011fin, veritaban\u0131 ba\u011flant\u0131 bilgileri gibi hassas verileri ortam de\u011fi\u015fkenleri arac\u0131l\u0131\u011f\u0131yla y\u00f6netebilirsiniz.<\/p>\n<h4>Temel Bir S\u00fcr\u00fcm Olu\u015fturma<\/h4>\n<p>Bir Elixir projesinde Distillery&#8217;yi kullanmaya ba\u015flamak i\u00e7in \u00f6ncelikle ba\u011f\u0131ml\u0131l\u0131k olarak eklemeniz gerekir:<\/p>\n<pre><code class=\"language-elixir\"># mix.exs\ndef deps do\n  [\n    # ... di\u011fer ba\u011f\u0131ml\u0131l\u0131klar\n    {:distillery, \"~> 2.1\", runtime: false} # veya daha g\u00fcncel versiyon\n  ]\nend<\/code><\/pre>\n<p>Ard\u0131ndan, Phoenix uygulamalar\u0131 i\u00e7in genellikle <code>mix phx.gen.release<\/code> komutunu \u00e7al\u0131\u015ft\u0131rarak gerekli dosyalar\u0131 olu\u015ftururuz. Bu komut, uygulaman\u0131z\u0131n \u00e7al\u0131\u015fma zaman\u0131 konfig\u00fcrasyonunu <code>config\/runtime.exs<\/code> dosyas\u0131na ekler ve release ile ilgili di\u011fer ayarlar\u0131 yapar.<\/p>\n<p>Son olarak, bir release olu\u015fturmak i\u00e7in <code>mix release<\/code> komutunu kullan\u0131rs\u0131n\u0131z:<\/p>\n<pre><code class=\"language-bash\">mix release<\/code><\/pre>\n<p>Bu komut, projenizin <code>_build\/prod\/rel\/your_app<\/code> dizininde bir release paketi olu\u015fturur. Bu paket, uygulaman\u0131z\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in gereken her \u015feyi i\u00e7erir.<\/p>\n<h3>edeliver Nedir ve Neden Kullan\u0131l\u0131r?<\/h3>\n<p>edeliver, Distillery taraf\u0131ndan olu\u015fturulan Elixir\/Erlang release&#8217;lerini uzaktaki sunuculara da\u011f\u0131tmak i\u00e7in kullan\u0131lan bir otomasyon arac\u0131d\u0131r. Distillery bir release olu\u015ftururken, edeliver bu release&#8217;i al\u0131r, hedeflenen sunuculara y\u00fckler, ba\u015flat\u0131r, g\u00fcnceller ve hatta geri al\u0131r.<\/p>\n<h4>Orkestrasyon Arac\u0131<\/h4>\n<p>edeliver, da\u011f\u0131t\u0131m s\u00fcrecinin orkestrasyonunu \u00fcstlenir. Bir veya birden fazla sunucuya ayn\u0131 anda da\u011f\u0131t\u0131m yapabilir, build sunucusu (uygulaman\u0131n derlendi\u011fi yer) ile \u00fcretim sunucular\u0131 aras\u0131ndaki ileti\u015fimi y\u00f6netir ve da\u011f\u0131t\u0131m ad\u0131mlar\u0131n\u0131 otomatikle\u015ftirir. Bu, manuel SSH ba\u011flant\u0131lar\u0131 ve dosya kopyalamalar\u0131n\u0131n \u00f6n\u00fcne ge\u00e7er.<\/p>\n<h4>S\u0131f\u0131r Kesintiyle Da\u011f\u0131t\u0131m (Zero-Downtime Deployments)<\/h4>\n<p>edeliver&#8217;\u0131n en \u00f6nemli \u00f6zelliklerinden biri, Elixir&#8217;in s\u0131cak kod de\u011fi\u015fimi yeteneklerini kullanarak s\u0131f\u0131r kesintiyle da\u011f\u0131t\u0131m yapabilmesidir. Yeni bir s\u00fcr\u00fcm da\u011f\u0131t\u0131l\u0131rken, edeliver \u00f6nce yeni s\u00fcr\u00fcm\u00fc ba\u015flat\u0131r, ard\u0131ndan eski s\u00fcr\u00fcmden yeni s\u00fcr\u00fcme ge\u00e7i\u015f yapar ve son olarak eski s\u00fcr\u00fcm\u00fc durdurur. Bu ge\u00e7i\u015f s\u00fcreci genellikle \u00e7ok h\u0131zl\u0131d\u0131r ve son kullan\u0131c\u0131lar i\u00e7in herhangi bir kesinti ya\u015fanmaz. Veritaban\u0131 migrasyonlar\u0131 gibi \u00f6zel durumlar i\u00e7in de mekanizmalar sunar.<\/p>\n<h4>Geri Alma (Rollbacks)<\/h4>\n<p>Her da\u011f\u0131t\u0131m ba\u015far\u0131l\u0131 olmayabilir. edeliver, bir \u00f6nceki \u00e7al\u0131\u015fan s\u00fcr\u00fcme kolayca geri d\u00f6nme yetene\u011fi sunar. Bu, olas\u0131 sorunlarda h\u0131zl\u0131 bir \u015fekilde kurtarma yapman\u0131z\u0131 sa\u011flar ve \u00fcretim ortam\u0131n\u0131n istikrar\u0131n\u0131 korur.<\/p>\n<h4>Konfig\u00fcrasyon Y\u00f6netimi<\/h4>\n<p>edeliver, <code>.deliver\/config<\/code> dosyas\u0131 arac\u0131l\u0131\u011f\u0131yla esnek bir konfig\u00fcrasyon sunar. Bu dosya, build sunucusu, \u00fcretim sunucular\u0131, da\u011f\u0131t\u0131m yolu, SSH kullan\u0131c\u0131lar\u0131, git referans\u0131 ve di\u011fer da\u011f\u0131t\u0131m parametrelerini tan\u0131mlaman\u0131za olanak tan\u0131r.<\/p>\n<h3>\u00d6n Gereksinimler ve Kurulum<\/h3>\n<p>Da\u011f\u0131t\u0131m s\u00fcrecine ba\u015flamadan \u00f6nce hem yerel geli\u015ftirme ortam\u0131n\u0131zda hem de uzak sunucunuzda baz\u0131 \u00f6n gereksinimleri kar\u015f\u0131laman\u0131z gerekmektedir.<\/p>\n<h4>Yerel Makine (Geli\u015ftirme Ortam\u0131)<\/h4>\n<p>*   <strong>Elixir ve Erlang:<\/strong> Elixir ve Erlang&#8217;\u0131n kurulu olmas\u0131. <code>asdf<\/code> veya <code>kiex<\/code> gibi versiyon y\u00f6neticileri kullan\u0131lmas\u0131 \u00f6nerilir.<br \/>\n*   <strong>Git:<\/strong> Projenizin bir Git deposunda olmas\u0131 ve <code>git<\/code> komutunun y\u00fckl\u00fc olmas\u0131.<br \/>\n*   <strong>SSH Anahtarlar\u0131:<\/strong> Uzak sunuculara parola girmeden g\u00fcvenli bir \u015fekilde ba\u011flanmak i\u00e7in SSH anahtar \u00e7iftinizin (public\/private) olu\u015fturulmu\u015f ve public anahtar\u0131n\u0131z\u0131n uzak sunucudaki <code>~\/.ssh\/authorized_keys<\/code> dosyas\u0131na eklenmi\u015f olmas\u0131.<\/p>\n<h4>Uzak Sunucu (Ubuntu 16.04)<\/h4>\n<p>*   <strong>SSH Eri\u015fimi:<\/strong> Sunucuya SSH ile eri\u015fiminiz olmal\u0131.<br \/>\n*   <strong>Sudo Yetkileri:<\/strong> Gerekli yaz\u0131l\u0131mlar\u0131 kurmak ve sistem ayarlar\u0131n\u0131 yapmak i\u00e7in <code>sudo<\/code> yetkisine sahip bir kullan\u0131c\u0131.<br \/>\n*   <strong>Gerekli Paketler:<\/strong><br \/>\n    *   <code>inotify-tools<\/code>: edeliver&#8217;\u0131n baz\u0131 dosya izleme i\u015flemleri i\u00e7in gereklidir.<br \/>\n    *   <code>nginx<\/code> veya <code>apache<\/code>: Phoenix uygulaman\u0131z\u0131n \u00f6n\u00fcne bir reverse proxy olarak kullan\u0131lacak.<br \/>\n    *   <code>postgresql-client<\/code> veya <code>mysql-client<\/code>: Veritaban\u0131 migrasyonlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in ilgili veritaban\u0131 istemcisi gereklidir.<br \/>\n    *   <code>build-essential<\/code>: Build sunucusu olarak kullan\u0131yorsan\u0131z, baz\u0131 C\/C++ ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131n derlenmesi i\u00e7in gerekli olabilir.<br \/>\n*   <strong>Veritaban\u0131:<\/strong> Uygulaman\u0131z\u0131n kulland\u0131\u011f\u0131 bir veritaban\u0131 (\u00f6rn. PostgreSQL, MySQL) kurulu ve yap\u0131land\u0131r\u0131lm\u0131\u015f olmal\u0131.<br \/>\n*   <strong>G\u00fcvenlik Duvar\u0131 (UFW):<\/strong> G\u00fcvenlik i\u00e7in temel bir g\u00fcvenlik duvar\u0131 yap\u0131land\u0131rmas\u0131 (\u00f6rn. SSH, HTTP\/HTTPS portlar\u0131 a\u00e7\u0131k olmal\u0131).<\/p>\n<h4>Proje Ayarlar\u0131<\/h4>\n<p>*   <strong>Distillery Ba\u011f\u0131ml\u0131l\u0131\u011f\u0131:<\/strong> <code>mix.exs<\/code> dosyan\u0131zda Distillery ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n\u0131 ekledi\u011finizden emin olun.<br \/>\n*   <strong>Phoenix Release Ayarlar\u0131:<\/strong> Phoenix uygulamalar\u0131 i\u00e7in <code>mix phx.gen.release<\/code> komutuyla olu\u015fturulan <code>config\/runtime.exs<\/code> dosyas\u0131n\u0131 kontrol edin ve veritaban\u0131, port gibi ayarlar\u0131n ortam de\u011fi\u015fkenlerinden al\u0131nacak \u015fekilde yap\u0131land\u0131r\u0131ld\u0131\u011f\u0131ndan emin olun.<\/p>\n<pre><code class=\"language-elixir\"># config\/runtime.exs \u00f6rnek\nimport Config\n\nconfig :my_app, MyAppWeb.Endpoint,\n  http: [port: System.get_env(\"PORT\") || 4000],\n  url: [host: System.get_env(\"PHX_HOST\") || \"localhost\", port: 443],\n  secret_key_base: System.get_env(\"SECRET_KEY_BASE\"),\n  force_ssl: [rewrite_on: [:x_forwarded_proto]]\n\nconfig :my_app, MyApp.Repo,\n  adapter: Ecto.Adapters.Postgres,\n  username: System.get_env(\"DB_USERNAME\"),\n  password: System.get_env(\"DB_PASSWORD\"),\n  hostname: System.get_env(\"DB_HOSTNAME\") || \"localhost\",\n  database: System.get_env(\"DB_DATABASE\"),\n  port: String.to_integer(System.get_env(\"DB_PORT\") || \"5432\"),\n  pool_size: String.to_integer(System.get_env(\"DB_POOL_SIZE\") || \"10\")<\/code><\/pre>\n<p>Bu \u00f6rnekte, hassas bilgiler (veritaban\u0131 kullan\u0131c\u0131 ad\u0131\/\u015fifresi, secret_key_base) ortam de\u011fi\u015fkenlerinden okunmaktad\u0131r.<\/p>\n<h3>Ad\u0131m Ad\u0131m Da\u011f\u0131t\u0131m S\u00fcreci<\/h3>\n<p>\u015eimdi Elixir-Phoenix uygulaman\u0131z\u0131 Distillery ve edeliver kullanarak Ubuntu 16.04 sunucusuna da\u011f\u0131t\u0131m s\u00fcrecini ad\u0131m ad\u0131m inceleyelim.<\/p>\n<h4>1. Phoenix Uygulamas\u0131 Olu\u015fturma<\/h4>\n<p>\u00d6ncelikle basit bir Phoenix uygulamas\u0131 olu\u015ftural\u0131m. Bu \u00f6rnekte, HTML ve Webpack ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 atlayarak daha sade bir API uygulamas\u0131 gibi davranmas\u0131n\u0131 sa\u011flayabiliriz.<\/p>\n<pre><code class=\"language-bash\">mix phx.new my_app --no-html --no-webpack\ncd my_app\nmix deps.get<\/code><\/pre>\n<p>Uygulaman\u0131n \u00e7al\u0131\u015f\u0131p \u00e7al\u0131\u015fmad\u0131\u011f\u0131n\u0131 kontrol etmek i\u00e7in: <code>mix phx.server<\/code><\/p>\n<h4>2. Distillery Entegrasyonu<\/h4>\n<p>Phoenix i\u00e7in Distillery ayarlar\u0131n\u0131 otomatik olarak olu\u015fturmak i\u00e7in <code>phx.gen.release<\/code> komutunu kullan\u0131n:<\/p>\n<pre><code class=\"language-bash\">mix phx.gen.release<\/code><\/pre>\n<p>Bu komut, <code>mix.exs<\/code> dosyan\u0131za Distillery ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n\u0131 ekleyecek, <code>config\/runtime.exs<\/code> dosyas\u0131n\u0131 olu\u015fturacak ve <code>rel\/<\/code> dizinini yap\u0131land\u0131racakt\u0131r. <code>config\/runtime.exs<\/code> dosyas\u0131n\u0131 yukar\u0131daki \u00f6rnekteki gibi ortam de\u011fi\u015fkenlerini kullanacak \u015fekilde d\u00fczenledi\u011finizden emin olun.<\/p>\n<p><strong><code>SECRET_KEY_BASE<\/code> Olu\u015fturma:<\/strong><br \/>\n\u00dcretim ortam\u0131 i\u00e7in benzersiz bir <code>SECRET_KEY_BASE<\/code> gereklidir. Bunu a\u015fa\u011f\u0131daki komutla olu\u015fturabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">mix phx.gen.secret<\/code><\/pre>\n<p>Bu \u00e7\u0131kt\u0131y\u0131 not al\u0131n, sunucuda ortam de\u011fi\u015fkeni olarak ayarlayaca\u011f\u0131z.<\/p>\n<h4>3. edeliver Kurulumu ve Yap\u0131land\u0131rmas\u0131<\/h4>\n<p>edeliver&#8217;\u0131 projenize ba\u011f\u0131ml\u0131l\u0131k olarak ekleyin:<\/p>\n<pre><code class=\"language-elixir\"># mix.exs\ndef deps do\n  [\n    # ...\n    {:edeliver, \"~> 1.6\", runtime: false} # Veya en g\u00fcncel versiyon\n  ]\nend<\/code><\/pre>\n<p>Ba\u011f\u0131ml\u0131l\u0131klar\u0131 indirin:<\/p>\n<pre><code class=\"language-bash\">mix deps.get<\/code><\/pre>\n<p>edeliver konfig\u00fcrasyon dosyas\u0131n\u0131 olu\u015fturun:<\/p>\n<pre><code class=\"language-bash\">mix edeliver.init<\/code><\/pre>\n<p>Bu komut, projenizin k\u00f6k dizininde <code>.deliver\/config<\/code> ad\u0131nda bir dosya olu\u015fturacakt\u0131r. Bu dosyay\u0131 a\u015fa\u011f\u0131daki gibi d\u00fczenleyin:<\/p>\n<pre><code class=\"language-bash\"># .deliver\/config\nAPP=\"my_app\" # Uygulaman\u0131z\u0131n ad\u0131 (mix.exs'teki app: ayar\u0131 ile ayn\u0131)\n\n<h2>Git ayarlar\u0131<\/h2>\nGIT_REF=\"master\" # Da\u011f\u0131t\u0131lacak branch veya tag\nAUTO_VERSION=true # Her da\u011f\u0131t\u0131m i\u00e7in otomatik versiyon olu\u015ftur\n\n<h2>Build Sunucusu Ayarlar\u0131 (Uygulaman\u0131n derlenece\u011fi yer)<\/h2>\n<h2>E\u011fer yerel makinenizi kullanacaksan\u0131z, BUILD_HOST'u bo\u015f b\u0131rak\u0131n veya localhost yap\u0131n<\/h2>\nBUILD_HOST=\"localhost\" # Genellikle yerel makine veya ayr\u0131 bir build sunucusu\nBUILD_USER=\"your_local_username\" # Yerel makine kullan\u0131c\u0131 ad\u0131n\u0131z\nBUILD_AT=\"\/tmp\/edeliver\/my_app_build\" # Build dosyalar\u0131n\u0131n ge\u00e7ici olarak saklanaca\u011f\u0131 yer\n\n<h2>\u00dcretim Sunucusu Ayarlar\u0131<\/h2>\nPRODUCTION_HOSTS=\"your_server_ip_or_hostname\" # Uzak sunucunuzun IP adresi veya hostname\nPRODUCTION_USER=\"deployer\" # Uzak sunucudaki da\u011f\u0131t\u0131m kullan\u0131c\u0131s\u0131\nDELIVER_TO=\"\/home\/deployer\/my_app\" # Uygulaman\u0131n sunucuda konu\u015flanaca\u011f\u0131 dizin\n\n<h2>SSH Ayarlar\u0131<\/h2>\n<h2>PRIVATE_KEY=\"~\/.ssh\/id_rsa\" # \u00d6zel anahtar\u0131n\u0131z\u0131n yolu (varsay\u0131lan\u0131 kullan\u0131yorsan\u0131z gerekli de\u011fil)<\/h2>\n\n<h2>Release Ayarlar\u0131<\/h2>\nREPLACE_OS_VARS=true # Ortam de\u011fi\u015fkenlerinin config dosyalar\u0131nda kullan\u0131lmas\u0131n\u0131 sa\u011flar\n\n<h2>S\u0131f\u0131r kesinti da\u011f\u0131t\u0131m\u0131 i\u00e7in:<\/h2>\n<h2>START_DEPLOY=\"true\" # Da\u011f\u0131t\u0131m sonras\u0131 uygulamay\u0131 otomatik ba\u015flat\u0131r<\/h2>\n<h2>UPGRADE_STRATEGY=\"restart\" # Veya \"hot\" (ancak \"restart\" daha g\u00fcvenlidir)<\/h2>\n\n<h2>Veritaban\u0131 migrasyonlar\u0131 i\u00e7in:<\/h2>\n<h2>MIGRATE=true # 'edeliver deploy release' komutu ile otomatik migrasyon \u00e7al\u0131\u015ft\u0131r\u0131r<\/h2>\n<h2>MIGRATE_SCRIPTS=\"priv\/repo\/migrations\" # Migrasyon dosyalar\u0131n\u0131n yolu<\/h2>\n\n<h2>Statik dosyalar\u0131 ba\u011flama (\u00f6rne\u011fin priv\/static'i kal\u0131c\u0131 depolamaya ba\u011flamak i\u00e7in)<\/h2>\n<h2>LINK_EXPORTS=\"\/home\/deployer\/my_app\/priv\/static\" # \u00d6rne\u011fin Nginx'in sunaca\u011f\u0131 statik dosyalar<\/code><\/pre>\n<\/h2>\n<p><strong>\u00d6nemli Not:<\/strong> <code>BUILD_HOST<\/code> olarak <code>localhost<\/code> kullanmak, uygulaman\u0131n yerel makinenizde derlenece\u011fi anlam\u0131na gelir. Bu, yerel makinenizde Erlang\/Elixir kurulu olmas\u0131n\u0131 gerektirir. Daha b\u00fcy\u00fck projelerde veya farkl\u0131 mimarilerde, <code>BUILD_HOST<\/code> olarak ayr\u0131 bir sunucu (build sunucusu) kullanmak daha iyi bir uygulama olabilir.<\/p>\n<h4>4. Uzak Sunucu Ayarlar\u0131 (Ubuntu 16.04)<\/h4>\n<p>\u015eimdi Ubuntu 16.04 sunucunuzu haz\u0131rlayal\u0131m.<\/p>\n<p><strong>a. Da\u011f\u0131t\u0131m Kullan\u0131c\u0131s\u0131 Olu\u015fturma:<\/strong><br \/>\nG\u00fcvenlik nedeniyle, uygulamay\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in \u00f6zel bir <code>deployer<\/code> kullan\u0131c\u0131s\u0131 olu\u015fturun ve SSH anahtar\u0131n\u0131z\u0131 bu kullan\u0131c\u0131n\u0131n <code>~\/.ssh\/authorized_keys<\/code> dosyas\u0131na ekleyin.<\/p>\n<pre><code class=\"language-bash\">sudo adduser deployer\nsudo usermod -aG sudo deployer # E\u011fer deployer kullan\u0131c\u0131s\u0131na sudo yetkisi vermek isterseniz\nsudo su - deployer\nmkdir -p ~\/.ssh\nchmod 700 ~\/.ssh\n<h2>Kendi makinenizdeki id_rsa.pub i\u00e7eri\u011fini buraya yap\u0131\u015ft\u0131r\u0131n<\/h2>\n<h2>\u00d6rne\u011fin, yerel makinenizden: ssh-copy-id deployer@your_server_ip<\/h2>\nexit # deployer kullan\u0131c\u0131s\u0131ndan \u00e7\u0131k\u0131n<\/code><\/pre>\n<p><strong>b. Uygulama Dizini Olu\u015fturma:<\/strong><br \/>\n<code>DELIVER_TO<\/code> ayar\u0131nda belirtti\u011finiz dizini olu\u015fturun ve <code>deployer<\/code> kullan\u0131c\u0131s\u0131na yetki verin:<\/p>\n<pre><code class=\"language-bash\">sudo mkdir -p \/home\/deployer\/my_app\nsudo chown -R deployer:deployer \/home\/deployer\/my_app<\/code><\/pre>\n<p><strong>c. Gerekli Paketleri Kurma:<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo apt-get update\nsudo apt-get install -y inotify-tools nginx postgresql-client # Veya mysql-client<\/code><\/pre>\n<p><strong>d. Nginx Yap\u0131land\u0131rmas\u0131 (Reverse Proxy):<\/strong><br \/>\nNginx&#8217;i gelen HTTP\/HTTPS isteklerini Phoenix uygulaman\u0131za y\u00f6nlendirecek \u015fekilde yap\u0131land\u0131r\u0131n. Phoenix uygulamas\u0131 genellikle 4000 portunda \u00e7al\u0131\u015f\u0131r.<\/p>\n<pre><code class=\"language-bash\">sudo nano \/etc\/nginx\/sites-available\/my_app<\/code><\/pre>\n<p>\u0130\u00e7eri\u011fi a\u015fa\u011f\u0131daki gibi yap\u0131\u015ft\u0131r\u0131n (alan ad\u0131n\u0131z\u0131 ve sunucu IP&#8217;nizi g\u00fcncelleyin):<\/p>\n<pre><code class=\"language-nginx\">server {\n    listen 80;\n    server_name example.com www.example.com your_server_ip;\n\n    location \/ {\n        proxy_pass http:\/\/localhost:4000; # Phoenix uygulamas\u0131n\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 port\n        proxy_http_version 1.1;\n        proxy_set_header Upgrade $http_upgrade;\n        proxy_set_header Connection \"upgrade\";\n        proxy_set_header Host $host;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n        proxy_redirect off;\n    }\n}<\/code><\/pre>\n<p>Yap\u0131land\u0131rmay\u0131 etkinle\u015ftirin ve Nginx&#8217;i yeniden ba\u015flat\u0131n:<\/p>\n<pre><code class=\"language-bash\">sudo ln -s \/etc\/nginx\/sites-available\/my_app \/etc\/nginx\/sites-enabled\/\nsudo nginx -t # Yap\u0131land\u0131rma sentaks\u0131n\u0131 kontrol edin\nsudo systemctl restart nginx # Nginx'i yeniden ba\u015flat\u0131n<\/code><\/pre>\n<p><strong>e. Veritaban\u0131 Yap\u0131land\u0131rmas\u0131 (PostgreSQL \u00d6rne\u011fi):<\/strong><br \/>\nUygulaman\u0131z i\u00e7in bir veritaban\u0131 ve kullan\u0131c\u0131 olu\u015fturun.<\/p>\n<pre><code class=\"language-bash\">sudo -u postgres psql<\/code><\/pre>\n<p>PSQL kabu\u011funda:<\/p>\n<pre><code class=\"language-sql\">CREATE USER my_app_user WITH PASSWORD 'my_app_password';\nCREATE DATABASE my_app_prod;\nGRANT ALL PRIVILEGES ON DATABASE my_app_prod TO my_app_user;\n\\q<\/code><\/pre>\n<p><strong>f. Ortam De\u011fi\u015fkenlerini Ayarlama:<\/strong><br \/>\n<code>deployer<\/code> kullan\u0131c\u0131s\u0131n\u0131n <code>.profile<\/code> veya <code>.bashrc<\/code> dosyas\u0131na uygulaman\u0131z\u0131n ihtiya\u00e7 duydu\u011fu ortam de\u011fi\u015fkenlerini ekleyin. \u00d6rne\u011fin:<\/p>\n<pre><code class=\"language-bash\"># sudo su - deployer\nnano ~\/.profile<\/code><\/pre>\n<p>A\u015fa\u011f\u0131daki sat\u0131rlar\u0131 ekleyin (kendi de\u011ferlerinizle de\u011fi\u015ftirin):<\/p>\n<pre><code class=\"language-bash\">export PORT=4000\nexport PHX_HOST=\"example.com\"\nexport SECRET_KEY_BASE=\"<mix phx.gen.secret ile olu\u015fturdu\u011funuz de\u011fer>\"\nexport DB_USERNAME=\"my_app_user\"\nexport DB_PASSWORD=\"my_app_password\"\nexport DB_HOSTNAME=\"localhost\"\nexport DB_DATABASE=\"my_app_prod\"\nexport DB_PORT=\"5432\"\n\n<h2>E\u011fer sunucuyu ayn\u0131 zamanda build sunucusu olarak kullan\u0131yorsan\u0131z:<\/h2>\n<h2>export MIX_ENV=prod<\/h2>\n<h2>export LANG=en_US.UTF-8<\/code><\/pre>\n<\/h2>\n<p>Kaydedin ve \u00e7\u0131k\u0131n, ard\u0131ndan de\u011fi\u015fiklikleri uygulamak i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">source ~\/.profile<\/code><\/pre>\n<h4>5. \u0130lk Da\u011f\u0131t\u0131m<\/h4>\n<p>\u015eimdi yerel makinenizden ilk da\u011f\u0131t\u0131m\u0131 ger\u00e7ekle\u015ftirebilirsiniz.<\/p>\n<p><strong>a. Release Olu\u015fturma (Build):<\/strong><br \/>\nBu komut, uygulaman\u0131z\u0131n release&#8217;ini <code>BUILD_HOST<\/code> \u00fczerinde derler. E\u011fer <code>BUILD_HOST<\/code> <code>localhost<\/code> ise, yerel makinenizde derlenecektir.<\/p>\n<pre><code class=\"language-bash\">mix edeliver build release<\/code><\/pre>\n<p>Bu i\u015flem biraz zaman alabilir.<\/p>\n<p><strong>b. Release&#8217;i Da\u011f\u0131tma (Deploy):<\/strong><br \/>\nBu komut, derlenmi\u015f release&#8217;i <code>PRODUCTION_HOSTS<\/code> \u00fczerine y\u00fckler, a\u00e7ar ve uygulamay\u0131 ba\u015flat\u0131r.<\/p>\n<pre><code class=\"language-bash\">mix edeliver deploy release<\/code><\/pre>\n<p>E\u011fer <code>START_DEPLOY=true<\/code> ayar\u0131 <code>.deliver\/config<\/code> dosyan\u0131zda varsa, uygulama otomatik olarak ba\u015flayacakt\u0131r. Aksi takdirde, <code>mix edeliver start<\/code> komutunu kullanman\u0131z gerekebilir.<\/p>\n<p><strong>c. Veritaban\u0131 Migrasyonlar\u0131:<\/strong><br \/>\nUygulaman\u0131z\u0131n veritaban\u0131 migrasyonlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">mix edeliver migrate<\/code><\/pre>\n<p>Bu komut, uzak sunucudaki <code>deployer<\/code> kullan\u0131c\u0131s\u0131 alt\u0131nda migrasyonlar\u0131 \u00e7al\u0131\u015ft\u0131racakt\u0131r.<\/p>\n<p>Art\u0131k taray\u0131c\u0131n\u0131zdan <code>example.com<\/code> adresine giderek uygulaman\u0131z\u0131n \u00e7al\u0131\u015f\u0131p \u00e7al\u0131\u015fmad\u0131\u011f\u0131n\u0131 kontrol edebilirsiniz.<\/p>\n<h4>6. G\u00fcncellemeler ve Rollback<\/h4>\n<p>Uygulaman\u0131zda de\u011fi\u015fiklikler yapt\u0131\u011f\u0131n\u0131zda ve bunlar\u0131 da\u011f\u0131tmak istedi\u011finizde s\u00fcre\u00e7 a\u015fa\u011f\u0131daki gibidir:<\/p>\n<p><strong>a. G\u00fcncelleme (Upgrade):<\/strong><br \/>\nKodunuzda de\u011fi\u015fiklikler yap\u0131n, Git&#8217;e commit edin ve <code>master<\/code> branch&#8217;ine push edin. Ard\u0131ndan s\u0131f\u0131r kesintiyle g\u00fcncelleme yapmak i\u00e7in <code>upgrade<\/code> komutunu kullan\u0131n:<\/p>\n<pre><code class=\"language-bash\">mix edeliver upgrade<\/code><\/pre>\n<p>edeliver, yeni release&#8217;i derler, sunucuya y\u00fckler ve eski s\u00fcr\u00fcm\u00fc durdurmadan yeni s\u00fcr\u00fcm\u00fc ba\u015flat\u0131p ge\u00e7i\u015fi yapar.<\/p>\n<p><strong>b. Geri Alma (Rollback):<\/strong><br \/>\nE\u011fer yeni da\u011f\u0131t\u0131m\u0131n\u0131zda bir sorun olu\u015fursa, kolayca bir \u00f6nceki \u00e7al\u0131\u015fan s\u00fcr\u00fcme geri d\u00f6nebilirsiniz:<\/p>\n<pre><code class=\"language-bash\">mix edeliver rollback<\/code><\/pre>\n<p>Bu komut, uygulaman\u0131z\u0131 bir \u00f6nceki ba\u015far\u0131l\u0131 s\u00fcr\u00fcme geri d\u00f6nd\u00fcr\u00fcr.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular ve \u0130pu\u00e7lar\u0131<\/h3>\n<h4>Ortam De\u011fi\u015fkenleri Y\u00f6netimi<\/h4>\n<p><code>REPLACE_OS_VARS=true<\/code> ayar\u0131 sayesinde Distillery release&#8217;leri, <code>System.get_env()<\/code> ile ortam de\u011fi\u015fkenlerini okuyabilir. Bu de\u011fi\u015fkenleri <code>deployer<\/code> kullan\u0131c\u0131s\u0131n\u0131n <code>.profile<\/code> veya <code>.bashrc<\/code> dosyas\u0131na eklemek yayg\u0131n bir y\u00f6ntemdir. Ancak, hassas bilgileri (veritaban\u0131 \u015fifreleri) do\u011frudan ortam de\u011fi\u015fkenleri olarak saklamak yerine, HashiCorp Vault gibi s\u0131r y\u00f6netim ara\u00e7lar\u0131 kullanmak daha g\u00fcvenli olabilir.<\/p>\n<h4>Veritaban\u0131 Migrasyonlar\u0131<\/h4>\n<p><code>mix edeliver migrate<\/code> komutu, <code>MIGRATE=true<\/code> olarak ayarland\u0131\u011f\u0131nda <code>deploy release<\/code> veya <code>upgrade<\/code> komutlar\u0131yla birlikte \u00e7al\u0131\u015ft\u0131r\u0131labilir. Migrasyonlar\u0131n idempotent olmas\u0131 (birden fazla kez \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda sorun \u00e7\u0131karmamas\u0131) \u00e7ok \u00f6nemlidir, \u00e7\u00fcnk\u00fc da\u011f\u0131t\u0131m s\u00fcre\u00e7leri s\u0131ras\u0131nda yanl\u0131\u015fl\u0131kla tekrar \u00e7al\u0131\u015ft\u0131r\u0131labilirler.<\/p>\n<h4>S\u0131f\u0131r Kesinti (Zero-Downtime) Da\u011f\u0131t\u0131m<\/h4>\n<p>edeliver&#8217;\u0131n <code>upgrade<\/code> komutu, yeni s\u00fcr\u00fcm\u00fc eski s\u00fcr\u00fcmle paralel olarak ba\u015flat\u0131r ve ard\u0131ndan ba\u011flant\u0131lar\u0131 yeni s\u00fcr\u00fcme y\u00f6nlendirir. Bu, k\u0131sa bir s\u00fcre i\u00e7in her iki s\u00fcr\u00fcm\u00fcn de \u00e7al\u0131\u015f\u0131r durumda oldu\u011fu anlam\u0131na gelir. Bu ge\u00e7i\u015f, uygulaman\u0131z\u0131n durumunu koruyarak kesintisiz bir deneyim sunar.<\/p>\n<h4>Log Y\u00f6netimi<\/h4>\n<p>Uygulaman\u0131z\u0131n loglar\u0131n\u0131 takip etmek i\u00e7in <code>mix edeliver remote \"tail -f log\/phoenix.log\"<\/code> gibi komutlar\u0131 kullanabilirsiniz. \u00dcretim ortamlar\u0131nda, loglar\u0131 merkezi bir sisteme (\u00f6rn. ELK Stack, Grafana Loki) g\u00f6ndermek i\u00e7in <code>logger<\/code> ba\u011f\u0131ml\u0131l\u0131klar\u0131 (\u00f6rn. <code>lager<\/code>, <code>logfmt<\/code>) veya <code>systemd-journald<\/code> ile entegrasyon d\u00fc\u015f\u00fcn\u00fclmelidir. Ayr\u0131ca, <code>logrotate<\/code> ile log dosyalar\u0131n\u0131n boyutunu y\u00f6netmek \u00f6nemlidir.<\/p>\n<h4>G\u00fcvenlik \u0130pu\u00e7lar\u0131<\/h4>\n<p>*   <strong>SSH Anahtar Tabanl\u0131 Kimlik Do\u011frulama:<\/strong> Daima parola yerine SSH anahtarlar\u0131 kullan\u0131n.<br \/>\n*   <strong>Minimum Yetki Prensibi:<\/strong> <code>deployer<\/code> kullan\u0131c\u0131s\u0131na sadece uygulamay\u0131 \u00e7al\u0131\u015ft\u0131rmak ve y\u00f6netmek i\u00e7in gerekli minimum yetkileri verin. <code>sudo<\/code> yetkisini dikkatli kullan\u0131n.<br \/>\n*   <strong>G\u00fcvenlik Duvar\u0131 (UFW):<\/strong> Sunucunuzda sadece gerekli portlar\u0131 (SSH, HTTP, HTTPS) a\u00e7\u0131n.<br \/>\n*   <strong>Hassas Bilgiler:<\/strong> Veritaban\u0131 \u015fifreleri, API anahtarlar\u0131 gibi hassas bilgileri do\u011frudan kod i\u00e7inde veya versiyon kontrol\u00fcnde tutmay\u0131n. Ortam de\u011fi\u015fkenleri veya s\u0131r y\u00f6netim ara\u00e7lar\u0131 kullan\u0131n.<\/p>\n<h4>Ubuntu 16.04 \u00d6zel Notlar<\/h4>\n<p>Ubuntu 16.04, <code>systemd<\/code> kullanan ilk LTS s\u00fcr\u00fcm\u00fcd\u00fcr. Bu nedenle, uygulamay\u0131 bir <code>systemd<\/code> servisi olarak \u00e7al\u0131\u015ft\u0131rmak, otomatik ba\u015flatma ve hata durumunda yeniden ba\u015flatma gibi \u00f6zellikler i\u00e7in iyi bir se\u00e7enektir. edeliver, uygulama ba\u015flatma ve durdurma i\u015flemlerini kendisi y\u00f6netti\u011fi i\u00e7in genellikle <code>systemd<\/code> servisi do\u011frudan kullan\u0131lmaz, ancak uygulaman\u0131n genel sa\u011fl\u0131\u011f\u0131n\u0131 izlemek i\u00e7in <code>systemd<\/code>&#8216;den faydalan\u0131labilir.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Elixir ve Phoenix uygulamalar\u0131n\u0131 Distillery ve edeliver kullanarak Ubuntu 16.04 \u00fczerinde da\u011f\u0131tmak, modern web uygulamalar\u0131n\u0131n gerektirdi\u011fi otomasyon, g\u00fcvenilirlik ve s\u0131f\u0131r kesinti \u00f6zelliklerini sa\u011flamak i\u00e7in g\u00fc\u00e7l\u00fc ve etkili bir y\u00f6ntemdir. Distillery, kendi kendine yeten, ta\u015f\u0131nabilir release&#8217;ler olu\u015fturarak da\u011f\u0131t\u0131m karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 azalt\u0131rken, edeliver bu release&#8217;lerin uzaktaki sunuculara otomatik olarak da\u011f\u0131t\u0131lmas\u0131n\u0131, g\u00fcncellenmesini ve y\u00f6netilmesini sa\u011flar.<\/p>\n<p>Bu rehberde anlat\u0131lan ad\u0131mlar\u0131 takip ederek, Elixir-Phoenix uygulamalar\u0131n\u0131z i\u00e7in sa\u011flam bir CI\/CD (S\u00fcrekli Entegrasyon\/S\u00fcrekli Da\u011f\u0131t\u0131m) s\u00fcrecinin temelini atm\u0131\u015f olursunuz. Do\u011fru yap\u0131land\u0131rma ve stratejilerle, Elixir&#8217;in sundu\u011fu performans ve hataya dayan\u0131kl\u0131l\u0131k avantajlar\u0131n\u0131 \u00fcretim ortam\u0131nda tam olarak kullanabilir, kullan\u0131c\u0131lar\u0131n\u0131za kesintisiz ve h\u0131zl\u0131 bir deneyim sunabilirsiniz. Gelecekte, bu s\u00fcreci Jenkins, GitLab CI veya GitHub Actions gibi ara\u00e7larla entegre ederek tamamen otomatik hale getirmek, geli\u015ftirme ve da\u011f\u0131t\u0131m d\u00f6ng\u00fclerinizi daha da h\u0131zland\u0131racakt\u0131r.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Elixir-Phoenix Uygulamalar\u0131n\u0131 Distillery ve edeliver ile Ubuntu 16.04 \u00dczerinde Otomatik Da\u011f\u0131tma\nElixir ve Phoenix Framework, y\u00fcksek performansl","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-39504","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>Elixir-Phoenix Uygulamalar\u0131n\u0131 Distillery ve edeliver ile Ubuntu 16.04 \u00dczerinde Otomatik Da\u011f\u0131tma - 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\/elixir-phoenix-uygulamalarini-distillery-ve-edeliver-ile-ubuntu-16-04-uzerinde-otomatik-dagitma\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Elixir-Phoenix Uygulamalar\u0131n\u0131 Distillery ve edeliver ile Ubuntu 16.04 \u00dczerinde Otomatik Da\u011f\u0131tma\" \/>\n<meta property=\"og:description\" content=\"Elixir-Phoenix Uygulamalar\u0131n\u0131 Distillery ve edeliver ile Ubuntu 16.04 \u00dczerinde Otomatik Da\u011f\u0131tma Elixir ve Phoenix Framework, y\u00fcksek performansl\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/elixir-phoenix-uygulamalarini-distillery-ve-edeliver-ile-ubuntu-16-04-uzerinde-otomatik-dagitma\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-22T19: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=\"18 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/elixir-phoenix-uygulamalarini-distillery-ve-edeliver-ile-ubuntu-16-04-uzerinde-otomatik-dagitma\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/elixir-phoenix-uygulamalarini-distillery-ve-edeliver-ile-ubuntu-16-04-uzerinde-otomatik-dagitma\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Elixir-Phoenix Uygulamalar\u0131n\u0131 Distillery ve edeliver ile Ubuntu 16.04 \u00dczerinde Otomatik Da\u011f\u0131tma\",\"datePublished\":\"2026-02-22T19:40:49+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/elixir-phoenix-uygulamalarini-distillery-ve-edeliver-ile-ubuntu-16-04-uzerinde-otomatik-dagitma\/\"},\"wordCount\":2720,\"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\/elixir-phoenix-uygulamalarini-distillery-ve-edeliver-ile-ubuntu-16-04-uzerinde-otomatik-dagitma\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/elixir-phoenix-uygulamalarini-distillery-ve-edeliver-ile-ubuntu-16-04-uzerinde-otomatik-dagitma\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/elixir-phoenix-uygulamalarini-distillery-ve-edeliver-ile-ubuntu-16-04-uzerinde-otomatik-dagitma\/\",\"name\":\"Elixir-Phoenix Uygulamalar\u0131n\u0131 Distillery ve edeliver ile Ubuntu 16.04 \u00dczerinde Otomatik Da\u011f\u0131tma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-02-22T19:40:49+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/elixir-phoenix-uygulamalarini-distillery-ve-edeliver-ile-ubuntu-16-04-uzerinde-otomatik-dagitma\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/elixir-phoenix-uygulamalarini-distillery-ve-edeliver-ile-ubuntu-16-04-uzerinde-otomatik-dagitma\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/elixir-phoenix-uygulamalarini-distillery-ve-edeliver-ile-ubuntu-16-04-uzerinde-otomatik-dagitma\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Elixir-Phoenix Uygulamalar\u0131n\u0131 Distillery ve edeliver ile Ubuntu 16.04 \u00dczerinde Otomatik Da\u011f\u0131tma\"}]},{\"@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":"Elixir-Phoenix Uygulamalar\u0131n\u0131 Distillery ve edeliver ile Ubuntu 16.04 \u00dczerinde Otomatik Da\u011f\u0131tma - 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\/elixir-phoenix-uygulamalarini-distillery-ve-edeliver-ile-ubuntu-16-04-uzerinde-otomatik-dagitma\/","og_locale":"tr_TR","og_type":"article","og_title":"Elixir-Phoenix Uygulamalar\u0131n\u0131 Distillery ve edeliver ile Ubuntu 16.04 \u00dczerinde Otomatik Da\u011f\u0131tma","og_description":"Elixir-Phoenix Uygulamalar\u0131n\u0131 Distillery ve edeliver ile Ubuntu 16.04 \u00dczerinde Otomatik Da\u011f\u0131tma Elixir ve Phoenix Framework, y\u00fcksek performansl","og_url":"https:\/\/fatihsoysal.com\/blog\/elixir-phoenix-uygulamalarini-distillery-ve-edeliver-ile-ubuntu-16-04-uzerinde-otomatik-dagitma\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-02-22T19:40:49+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"18 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/elixir-phoenix-uygulamalarini-distillery-ve-edeliver-ile-ubuntu-16-04-uzerinde-otomatik-dagitma\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/elixir-phoenix-uygulamalarini-distillery-ve-edeliver-ile-ubuntu-16-04-uzerinde-otomatik-dagitma\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Elixir-Phoenix Uygulamalar\u0131n\u0131 Distillery ve edeliver ile Ubuntu 16.04 \u00dczerinde Otomatik Da\u011f\u0131tma","datePublished":"2026-02-22T19:40:49+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/elixir-phoenix-uygulamalarini-distillery-ve-edeliver-ile-ubuntu-16-04-uzerinde-otomatik-dagitma\/"},"wordCount":2720,"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\/elixir-phoenix-uygulamalarini-distillery-ve-edeliver-ile-ubuntu-16-04-uzerinde-otomatik-dagitma\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/elixir-phoenix-uygulamalarini-distillery-ve-edeliver-ile-ubuntu-16-04-uzerinde-otomatik-dagitma\/","url":"https:\/\/fatihsoysal.com\/blog\/elixir-phoenix-uygulamalarini-distillery-ve-edeliver-ile-ubuntu-16-04-uzerinde-otomatik-dagitma\/","name":"Elixir-Phoenix Uygulamalar\u0131n\u0131 Distillery ve edeliver ile Ubuntu 16.04 \u00dczerinde Otomatik Da\u011f\u0131tma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-02-22T19:40:49+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/elixir-phoenix-uygulamalarini-distillery-ve-edeliver-ile-ubuntu-16-04-uzerinde-otomatik-dagitma\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/elixir-phoenix-uygulamalarini-distillery-ve-edeliver-ile-ubuntu-16-04-uzerinde-otomatik-dagitma\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/elixir-phoenix-uygulamalarini-distillery-ve-edeliver-ile-ubuntu-16-04-uzerinde-otomatik-dagitma\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Elixir-Phoenix Uygulamalar\u0131n\u0131 Distillery ve edeliver ile Ubuntu 16.04 \u00dczerinde Otomatik Da\u011f\u0131tma"}]},{"@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\/39504","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=39504"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/39504\/revisions"}],"predecessor-version":[{"id":39505,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/39504\/revisions\/39505"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=39504"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=39504"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=39504"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}