{"id":43561,"date":"2026-07-23T17:01:03","date_gmt":"2026-07-23T14:01:03","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=43561"},"modified":"2026-07-23T17:01:30","modified_gmt":"2026-07-23T14:01:30","slug":"clojure-web-uygulamasini-ubuntu-14-04-uzerine-dagitma-rehberi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/clojure-web-uygulamasini-ubuntu-14-04-uzerine-dagitma-rehberi\/","title":{"rendered":"Clojure Web Uygulamas\u0131n\u0131 Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma Rehberi"},"content":{"rendered":"<h2>Clojure Web Uygulamas\u0131n\u0131 Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma Rehberi<\/h2>\n<h3>Giri\u015f<\/h3>\n<p>Modern web uygulamas\u0131 geli\u015ftirme d\u00fcnyas\u0131nda, performans, e\u015fzamanl\u0131l\u0131k ve g\u00fcvenilirlik giderek daha kritik hale gelmektedir. Bu ba\u011flamda, JVM \u00fczerinde \u00e7al\u0131\u015fan, fonksiyonel bir dil olan Clojure, geli\u015ftiricilere benzersiz avantajlar sunar. Clojure&#8217;\u0131n sa\u011flam ekosistemi, Java k\u00fct\u00fcphaneleriyle sorunsuz entegrasyonu ve e\u015fzamanl\u0131l\u0131k i\u00e7in tasarlanm\u0131\u015f yap\u0131s\u0131, onu y\u00fcksek performansl\u0131 ve \u00f6l\u00e7eklenebilir web uygulamalar\u0131 geli\u015ftirmek i\u00e7in ideal bir se\u00e7enek haline getirir. \u00d6te yandan, Ubuntu, \u00f6zellikle 14.04 LTS (Uzun S\u00fcreli Destek) s\u00fcr\u00fcm\u00fc, sunucu ortamlar\u0131nda y\u0131llarca istikrarl\u0131 ve g\u00fcvenilir bir platform olarak kendini kan\u0131tlam\u0131\u015ft\u0131r. Bu makale, bir Clojure web uygulamas\u0131n\u0131 Ubuntu 14.04 sunucusu \u00fczerine ba\u015far\u0131l\u0131 bir \u015fekilde da\u011f\u0131tmak i\u00e7in ad\u0131m ad\u0131m kapsaml\u0131 bir rehber sunmaktad\u0131r. Her ne kadar Ubuntu&#8217;nun daha yeni s\u00fcr\u00fcmleri mevcut olsa da, bir\u00e7ok kurumsal ortamda veya belirli projelerde 14.04&#8217;\u00fcn hala kullan\u0131ld\u0131\u011f\u0131 g\u00f6z \u00f6n\u00fcne al\u0131nd\u0131\u011f\u0131nda, bu rehberin pratik de\u011feri devam etmektedir. Amac\u0131m\u0131z, geli\u015ftirme ortam\u0131ndan canl\u0131 sunucuya ge\u00e7i\u015f s\u00fcrecini m\u00fcmk\u00fcn oldu\u011funca sorunsuz hale getirmektir.<\/p>\n<h3>\u00d6n Gereksinimler ve Ortam Kurulumu<\/h3>\n<p>Clojure web uygulaman\u0131z\u0131 da\u011f\u0131tmaya ba\u015flamadan \u00f6nce, Ubuntu 14.04 sunucunuzda baz\u0131 temel ara\u00e7lar\u0131n ve bile\u015fenlerin kurulu olmas\u0131 gerekmektedir. Bu b\u00f6l\u00fcmde, gerekli t\u00fcm \u00f6n gereksinimleri ve bunlar\u0131n nas\u0131l kurulaca\u011f\u0131n\u0131 ele alaca\u011f\u0131z.<\/p>\n<h4>Ubuntu 14.04 Sunucusu<\/h4>\n<p>\u00d6ncelikle, SSH eri\u015fimi olan bir Ubuntu 14.04 sunucusuna ihtiyac\u0131n\u0131z var. Sunucunuzun temel kurulumunun tamamland\u0131\u011f\u0131n\u0131 ve root veya sudo yetkilerine sahip bir kullan\u0131c\u0131yla eri\u015febildi\u011finizi varsay\u0131yoruz. Sunucuya SSH ile ba\u011flanarak ba\u015flay\u0131n:<\/p>\n<pre><code>ssh kullanici_adi@sunucu_ip_adresi<\/code><\/pre>\n<p>T\u00fcm paket listelerini g\u00fcncelleyerek ba\u015flay\u0131n:<\/p>\n<pre><code>sudo apt-get update\nsudo apt-get upgrade -y<\/code><\/pre>\n<h4>Java Geli\u015ftirme Kiti (JDK)<\/h4>\n<p>Clojure, JVM \u00fczerinde \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in bir Java Geli\u015ftirme Kiti&#8217;ne (JDK) ihtiya\u00e7 duyar. OpenJDK, Ubuntu \u00fczerinde en yayg\u0131n ve \u00f6nerilen se\u00e7enektir.<\/p>\n<pre><code>sudo apt-get install openjdk-7-jdk -y<\/code><\/pre>\n<p>Kurulumdan sonra Java s\u00fcr\u00fcm\u00fcn\u00fc kontrol ederek do\u011frulu\u011funu teyit edebilirsiniz:<\/p>\n<pre><code>java -version\njavac -version<\/code><\/pre>\n<h4>Leiningen<\/h4>\n<p>Leiningen, Clojure projeleri i\u00e7in bir derleme otomasyonu ve ba\u011f\u0131ml\u0131l\u0131k y\u00f6netim arac\u0131d\u0131r. Uygulaman\u0131z\u0131 paketlemek ve \u00e7al\u0131\u015ft\u0131rmak i\u00e7in Leiningen&#8217;e ihtiyac\u0131m\u0131z olacak.<\/p>\n<p>Leiningen&#8217;i indirip \u00e7al\u0131\u015ft\u0131r\u0131labilir hale getirmek i\u00e7in a\u015fa\u011f\u0131daki ad\u0131mlar\u0131 izleyin:<\/p>\n<pre><code>wget https:\/\/raw.githubusercontent.com\/technomancy\/leiningen\/stable\/bin\/lein\nsudo mv lein \/usr\/local\/bin\/\nsudo chmod +x \/usr\/local\/bin\/lein<\/code><\/pre>\n<p>\u0130lk kez \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, Leiningen kendisini kuracakt\u0131r. Bu biraz zaman alabilir:<\/p>\n<pre><code>lein<\/code><\/pre>\n<p>S\u00fcr\u00fcm\u00fc kontrol ederek kurulumu do\u011frulay\u0131n:<\/p>\n<pre><code>lein version<\/code><\/pre>\n<h4>Git<\/h4>\n<p>Uygulaman\u0131z\u0131n kaynak kodunu sunucuya \u00e7ekmek i\u00e7in Git&#8217;e ihtiyac\u0131n\u0131z olacak.<\/p>\n<pre><code>sudo apt-get install git -y<\/code><\/pre>\n<h4>Nginx<\/h4>\n<p>Nginx, web uygulaman\u0131z i\u00e7in bir ters proxy ve statik dosya sunucusu olarak g\u00f6rev yapacakt\u0131r. Gelen HTTP isteklerini Clojure uygulaman\u0131za y\u00f6nlendirecek ve performans\u0131 art\u0131racakt\u0131r.<\/p>\n<pre><code>sudo apt-get install nginx -y<\/code><\/pre>\n<p>Nginx&#8217;in \u00e7al\u0131\u015f\u0131p \u00e7al\u0131\u015fmad\u0131\u011f\u0131n\u0131 kontrol edin:<\/p>\n<pre><code>sudo service nginx status<\/code><\/pre>\n<h4>PostgreSQL veya MySQL (\u0130ste\u011fe Ba\u011fl\u0131)<\/h4>\n<p>Uygulaman\u0131z bir veritaban\u0131 kullan\u0131yorsa, ilgili veritaban\u0131 sunucusunu kurman\u0131z gerekecektir. Bu \u00f6rnekte PostgreSQL&#8217;i ele alal\u0131m:<\/p>\n<pre><code>sudo apt-get install postgresql postgresql-contrib -y<\/code><\/pre>\n<p>PostgreSQL kurulumundan sonra, varsay\u0131lan <code>postgres<\/code> kullan\u0131c\u0131s\u0131 i\u00e7in bir parola belirlemek iyi bir uygulamad\u0131r:<\/p>\n<pre><code>sudo -u postgres psql\nALTER USER postgres WITH PASSWORD 'sifreniz';\n\\q<\/code><\/pre>\n<p>Ard\u0131ndan, uygulaman\u0131z i\u00e7in yeni bir veritaban\u0131 ve kullan\u0131c\u0131 olu\u015fturabilirsiniz:<\/p>\n<pre><code>sudo -u postgres psql\nCREATE DATABASE myapp_db;\nCREATE USER myapp_user WITH PASSWORD 'myapp_sifresi';\nGRANT ALL PRIVILEGES ON DATABASE myapp_db TO myapp_user;\n\\q<\/code><\/pre>\n<h3>Clojure Web Uygulamas\u0131 Haz\u0131rl\u0131\u011f\u0131<\/h3>\n<p>Da\u011f\u0131t\u0131ma ba\u015flamadan \u00f6nce, Clojure web uygulaman\u0131z\u0131n da\u011f\u0131t\u0131ma haz\u0131r oldu\u011fundan emin olmal\u0131s\u0131n\u0131z. Bu b\u00f6l\u00fcm, bir Clojure uygulamas\u0131n\u0131n da\u011f\u0131t\u0131m i\u00e7in nas\u0131l haz\u0131rlanaca\u011f\u0131n\u0131 anlat\u0131r.<\/p>\n<h4>\u00d6rnek Clojure Uygulamas\u0131<\/h4>\n<p>Basit bir Clojure web uygulamas\u0131, genellikle Ring ve Compojure (veya Reitit gibi ba\u015fka bir y\u00f6nlendirici) kullan\u0131r. \u00d6rnek olarak, <code>my-clojure-app<\/code> ad\u0131nda bir uygulama olu\u015ftural\u0131m:<\/p>\n<pre><code>lein new compojure my-clojure-app\ncd my-clojure-app<\/code><\/pre>\n<p><code>src\/my_clojure_app\/handler.clj<\/code> dosyan\u0131zda basit bir rota tan\u0131mlayabilirsiniz:<\/p>\n<pre><code>(ns my-clojure-app.handler\n  (:require [compojure.core :refer :all]\n            [compojure.route :as route]\n            [ring.middleware.defaults :refer [wrap-defaults site-defaults]]))\n\n(defroutes app-routes\n  (GET \"\/\" [] \"Merhaba Clojure Uygulamas\u0131!\")\n  (route\/not-found \"Sayfa Bulunamad\u0131\"))\n\n(def app\n  (wrap-defaults app-routes site-defaults))<\/code><\/pre>\n<p><code>project.clj<\/code> dosyan\u0131zda, uygulaman\u0131z\u0131n ana s\u0131n\u0131f\u0131n\u0131 ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 belirtmeniz gerekir. Varsay\u0131lan olarak Leiningen, <code>my-clojure-app.handler\/app<\/code> fonksiyonunu Ring uygulamas\u0131 olarak kullan\u0131r. Uygulaman\u0131z\u0131n belirli bir portta \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flamak i\u00e7in <code>project.clj<\/code> dosyan\u0131za <code>profiles<\/code> b\u00f6l\u00fcm\u00fc ekleyebilirsiniz:<\/p>\n<pre><code>(defproject my-clojure-app \"0.1.0-SNAPSHOT\"\n  :description \"FIXME: write description\"\n  :url \"http:\/\/example.com\/FIXME\"\n  :min-lein-version \"2.0.0\"\n  :dependencies [[org.clojure\/clojure \"1.8.0\"]\n                 [compojure \"1.5.1\"]\n                 [ring\/ring-defaults \"0.2.0\"]\n                 [ring\/ring-jetty-adapter \"1.5.0\"]] ; Jetty web sunucusunu ekleyin\n  :plugins [[lein-ring \"0.9.7\"]]\n  :ring {:handler my-clojure-app.handler\/app\n         :init my-clojure-app.handler\/init\n         :destroy my-clojure-app.handler\/destroy}\n  :profiles\n  {:dev {:dependencies [[javax.servlet\/servlet-api \"2.5\"]\n                        [ring\/ring-mock \"0.3.0\"]]}\n   :uberjar {:aot :all\n             :main my-clojure-app.server ; E\u011fer uberjar ile \u00e7al\u0131\u015ft\u0131rmak istiyorsan\u0131z\n             :omit-source true}})<\/code><\/pre>\n<p>E\u011fer <code>uberjar<\/code> kullanarak do\u011frudan bir JAR dosyas\u0131 \u00e7al\u0131\u015ft\u0131rmak istiyorsan\u0131z, uygulaman\u0131z\u0131 bir Jetty sunucusu \u00fczerinde ba\u015flatacak bir <code>my-clojure-app.server<\/code> namespace&#8217;i olu\u015fturman\u0131z gerekir:<\/p>\n<pre><code>;; src\/my_clojure_app\/server.clj\n(ns my-clojure-app.server\n  (:require [ring.adapter.jetty :refer [run-jetty]]\n            [my-clojure-app.handler :refer [app]])\n  (:gen-class))\n\n(defn -main\n  [& args]\n  (let [port (Integer\/parseInt (or (System\/getenv \"PORT\") \"3000\"))]\n    (println (str \"Sunucu \" port \" portunda ba\u015flat\u0131l\u0131yor.\"))\n    (run-jetty app {:port port :join? false})))<\/code><\/pre>\n<p>Bu, uygulaman\u0131z\u0131 <code>java -jar<\/code> komutuyla \u00e7al\u0131\u015ft\u0131r\u0131rken varsay\u0131lan olarak 3000 portunu kullanmas\u0131n\u0131 sa\u011flar. Portu bir ortam de\u011fi\u015fkeni (<code>PORT<\/code>) arac\u0131l\u0131\u011f\u0131yla yap\u0131land\u0131rabilirsiniz.<\/p>\n<h4>Uygulaman\u0131n Yerel Ortamda Test Edilmesi<\/h4>\n<p>Da\u011f\u0131t\u0131mdan \u00f6nce uygulaman\u0131z\u0131n yerel olarak do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olun:<\/p>\n<pre><code>lein ring server<\/code><\/pre>\n<p>Taray\u0131c\u0131n\u0131zda <code>http:\/\/localhost:3000<\/code> adresine giderek &#8220;Merhaba Clojure Uygulamas\u0131!&#8221; mesaj\u0131n\u0131 g\u00f6rmelisiniz.<\/p>\n<h4>Uygulaman\u0131n JAR Olarak Paketlenmesi<\/h4>\n<p>Canl\u0131 sunucuda \u00e7al\u0131\u015ft\u0131r\u0131lmak \u00fczere, Clojure uygulaman\u0131z\u0131 tek bir \u00e7al\u0131\u015ft\u0131r\u0131labilir JAR dosyas\u0131 (uberjar) olarak paketlemek en yayg\u0131n y\u00f6ntemdir. Bu JAR dosyas\u0131, t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131 i\u00e7erir ve harici bir Leiningen kurulumuna ihtiya\u00e7 duymaz.<\/p>\n<pre><code>lein uberjar<\/code><\/pre>\n<p>Bu komut, <code>target\/uberjar<\/code> dizini alt\u0131nda <code>my-clojure-app-0.1.0-SNAPSHOT-standalone.jar<\/code> gibi bir dosya olu\u015fturacakt\u0131r.<\/p>\n<h4>Ortam De\u011fi\u015fkenleri Y\u00f6netimi<\/h4>\n<p>Veritaban\u0131 ba\u011flant\u0131 bilgileri, API anahtarlar\u0131 gibi hassas veya ortama \u00f6zel ayarlar\u0131n do\u011frudan kodda tutulmamas\u0131 \u00f6nemlidir. Bunun yerine, ortam de\u011fi\u015fkenleri veya yap\u0131land\u0131rma dosyalar\u0131 kullanmal\u0131s\u0131n\u0131z. Uygulaman\u0131zda bu de\u011ferleri <code>System\/getenv<\/code> ile okuyabilirsiniz.<\/p>\n<pre><code>(System\/getenv \"DATABASE_URL\")<\/code><\/pre>\n<h3>Sunucuya Da\u011f\u0131t\u0131m Ad\u0131mlar\u0131<\/h3>\n<p>Uygulaman\u0131z haz\u0131r oldu\u011funa g\u00f6re, \u015fimdi onu Ubuntu 14.04 sunucunuza da\u011f\u0131tabiliriz.<\/p>\n<h4>Kullan\u0131c\u0131 Olu\u015fturma ve Yetkilendirme<\/h4>\n<p>G\u00fcvenlik amac\u0131yla, uygulaman\u0131z\u0131 <code>root<\/code> kullan\u0131c\u0131s\u0131 yerine ayr\u0131, yetkileri k\u0131s\u0131tlanm\u0131\u015f bir kullan\u0131c\u0131 alt\u0131nda \u00e7al\u0131\u015ft\u0131rmak her zaman iyi bir uygulamad\u0131r. <code>deployer<\/code> ad\u0131nda bir kullan\u0131c\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code>sudo adduser deployer<\/code><\/pre>\n<p>Bu kullan\u0131c\u0131ya <code>sudo<\/code> yetkisi vermek isteyebilirsiniz, ancak uygulaman\u0131n kendisi <code>sudo<\/code> ile \u00e7al\u0131\u015fmamal\u0131d\u0131r.<\/p>\n<h4>Uygulama Dosyalar\u0131n\u0131 Sunucuya Aktarma<\/h4>\n<p>Olu\u015fturdu\u011funuz uberjar dosyas\u0131n\u0131 sunucuya aktarman\u0131n birka\u00e7 yolu vard\u0131r. En yayg\u0131n olan\u0131 <code>scp<\/code> veya Git kullanmakt\u0131r.<\/p>\n<p><strong>SCP ile:<\/strong> Yerel makinenizden sunucuya kopyalay\u0131n:<\/p>\n<pre><code>scp target\/uberjar\/my-clojure-app-0.1.0-SNAPSHOT-standalone.jar deployer@sunucu_ip_adresi:\/home\/deployer\/my-clojure-app.jar<\/code><\/pre>\n<p><strong>Git ile:<\/strong> E\u011fer uygulaman\u0131z bir Git deposundaysa, sunucuda depoyu klonlayabilir ve orada uberjar olu\u015fturabilirsiniz:<\/p>\n<pre><code>sudo mkdir -p \/opt\/my-clojure-app\nsudo chown deployer:deployer \/opt\/my-clojure-app\nsu - deployer\ncd \/opt\/my-clojure-app\ngit clone https:\/\/github.com\/kullaniciadi\/my-clojure-app.git .\nlein uberjar<\/code><\/pre>\n<p>Uygulaman\u0131z\u0131 <code>\/opt\/my-clojure-app<\/code> gibi standart bir dizine yerle\u015ftirmek iyi bir uygulamad\u0131r.<\/p>\n<h4>Veritaban\u0131 Kurulumu ve Yap\u0131land\u0131rmas\u0131<\/h4>\n<p>E\u011fer uygulaman\u0131z bir veritaban\u0131 kullan\u0131yorsa, sunucuda veritaban\u0131 \u015femas\u0131n\u0131 olu\u015fturman\u0131z ve ba\u015flang\u0131\u00e7 verilerini y\u00fcklemeniz gerekebilir. PostgreSQL i\u00e7in:<\/p>\n<pre><code>sudo -u postgres psql -d myapp_db -f \/opt\/my-clojure-app\/db\/schema.sql<\/code><\/pre>\n<p>Uygulaman\u0131z\u0131n veritaban\u0131 ba\u011flant\u0131 bilgilerini ortam de\u011fi\u015fkenleri arac\u0131l\u0131\u011f\u0131yla veya bir yap\u0131land\u0131rma dosyas\u0131 arac\u0131l\u0131\u011f\u0131yla sa\u011flamay\u0131 unutmay\u0131n.<\/p>\n<h4>Uygulaman\u0131n Servis Olarak \u00c7al\u0131\u015ft\u0131r\u0131lmas\u0131 (Upstart)<\/h4>\n<p>Ubuntu 14.04, sistem servislerini y\u00f6netmek i\u00e7in Upstart kullan\u0131r. Uygulaman\u0131z\u0131n sunucu yeniden ba\u015flat\u0131ld\u0131\u011f\u0131nda otomatik olarak ba\u015flamas\u0131 ve arka planda s\u00fcrekli \u00e7al\u0131\u015fmas\u0131 i\u00e7in bir Upstart yap\u0131land\u0131rma dosyas\u0131 olu\u015fturaca\u011f\u0131z.<\/p>\n<p><code>\/etc\/init\/my-clojure-app.conf<\/code> ad\u0131nda bir dosya olu\u015fturun ve i\u00e7ine a\u015fa\u011f\u0131daki i\u00e7eri\u011fi ekleyin:<\/p>\n<pre><code>description \"Clojure Web Uygulamas\u0131\"\n\nstart on runlevel [2345]\nstop on runlevel [!2345]\n\nrespawn\nrespawn limit 10 5 ; 5 saniyede 10 kez yeniden ba\u015flat\u0131l\u0131rsa durur\n\nsetuid deployer\nsetgid deployer\n\nenv PORT=3000\nenv DATABASE_URL=\"jdbc:postgresql:\/\/localhost:5432\/myapp_db?user=myapp_user&password=myapp_sifresi\"\n\nexec java -jar \/opt\/my-clojure-app\/target\/uberjar\/my-clojure-app-0.1.0-SNAPSHOT-standalone.jar<\/code><\/pre>\n<p><strong>A\u00e7\u0131klamalar:<\/strong><\/p>\n<ul>\n<li><code>description<\/code>: Servisin k\u0131sa a\u00e7\u0131klamas\u0131.<\/li>\n<li><code>start on<\/code> ve <code>stop on<\/code>: Servisin hangi runlevel&#8217;larda ba\u015flay\u0131p duraca\u011f\u0131n\u0131 belirtir.<\/li>\n<li><code>respawn<\/code>: Servis beklenmedik bir \u015fekilde durursa otomatik olarak yeniden ba\u015flat\u0131l\u0131r.<\/li>\n<li><code>setuid<\/code> ve <code>setgid<\/code>: Servisi \u00e7al\u0131\u015ft\u0131racak kullan\u0131c\u0131 ve grup. Bu, uygulaman\u0131n <code>deployer<\/code> kullan\u0131c\u0131s\u0131n\u0131n yetkileriyle \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar.<\/li>\n<li><code>env<\/code>: Ortam de\u011fi\u015fkenlerini ayarlar. Uygulaman\u0131z\u0131n ihtiya\u00e7 duydu\u011fu t\u00fcm ortam de\u011fi\u015fkenlerini buraya eklemelisiniz.<\/li>\n<li><code>exec<\/code>: \u00c7al\u0131\u015ft\u0131r\u0131lacak komut. Bu, olu\u015fturdu\u011fumuz uberjar dosyas\u0131n\u0131 ba\u015flat\u0131r.<\/li>\n<\/ul>\n<p>Yap\u0131land\u0131rma dosyas\u0131n\u0131 kaydettikten sonra, servisi ba\u015flat\u0131n:<\/p>\n<pre><code>sudo service my-clojure-app start<\/code><\/pre>\n<p>Servisin durumunu kontrol edin:<\/p>\n<pre><code>sudo service my-clojure-app status<\/code><\/pre>\n<p>Loglar\u0131 kontrol etmek i\u00e7in:<\/p>\n<pre><code>sudo tail -f \/var\/log\/upstart\/my-clojure-app.log<\/code><\/pre>\n<p>E\u011fer bir de\u011fi\u015fiklik yaparsan\u0131z, servisi yeniden ba\u015flatman\u0131z gerekir:<\/p>\n<pre><code>sudo service my-clojure-app restart<\/code><\/pre>\n<h3>Nginx ile Ters Proxy Kurulumu<\/h3>\n<p>Uygulamam\u0131z art\u0131k arka planda \u00e7al\u0131\u015f\u0131yor, ancak do\u011frudan 3000 portundan eri\u015filebilir durumda. Nginx&#8217;i kullanarak bu eri\u015fimi daha g\u00fcvenli ve y\u00f6netilebilir hale getirece\u011fiz. Nginx, gelen HTTP\/HTTPS isteklerini Clojure uygulamam\u0131za y\u00f6nlendirecek ve statik dosyalar\u0131 (CSS, JS, resimler) do\u011frudan sunarak performans\u0131 art\u0131racakt\u0131r.<\/p>\n<h4>Nginx Yap\u0131land\u0131rma Dosyas\u0131 Olu\u015fturma<\/h4>\n<p>Uygulaman\u0131z i\u00e7in yeni bir Nginx sunucu blo\u011fu yap\u0131land\u0131rma dosyas\u0131 olu\u015fturun:<\/p>\n<pre><code>sudo nano \/etc\/nginx\/sites-available\/my-clojure-app<\/code><\/pre>\n<p>\u0130\u00e7eri\u011fi a\u015fa\u011f\u0131daki gibi doldurun (alan ad\u0131n\u0131z\u0131 ve sunucu IP&#8217;nizi g\u00fcncellemeyi unutmay\u0131n):<\/p>\n<pre><code>server {\n    listen 80;\n    server_name www.alanadiniz.com alanadiniz.com; # Alan ad\u0131n\u0131z\u0131 buraya yaz\u0131n\n\n    # Clojure uygulamas\u0131na y\u00f6nlendirme\n    location \/ {\n        proxy_pass http:\/\/localhost:3000; # Uygulaman\u0131z\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-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n        proxy_cache_bypass $http_upgrade;\n    }\n\n    # Statik dosyalar\u0131 do\u011frudan sunma (iste\u011fe ba\u011fl\u0131)\n    # E\u011fer uygulaman\u0131z statik dosyalar i\u00e7eriyorsa ve Nginx'in bunlar\u0131 sunmas\u0131n\u0131 istiyorsan\u0131z\n    # bu b\u00f6l\u00fcm\u00fc kullanabilirsiniz. \u00d6rne\u011fin: \/opt\/my-clojure-app\/public\n    # location ~* ^\/(img|js|css|fonts|robots.txt|favicon.ico) {\n    #     root \/opt\/my-clojure-app\/public; # Statik dosyalar\u0131n\u0131z\u0131n yolu\n    #     expires 30d;\n    #     add_header Cache-Control \"public, no-transform\";\n    # }\n\n    error_log \/var\/log\/nginx\/my-clojure-app_error.log;\n    access_log \/var\/log\/nginx\/my-clojure-app_access.log;\n}<\/code><\/pre>\n<h4>Yap\u0131land\u0131rmay\u0131 Etkinle\u015ftirme<\/h4>\n<p>Olu\u015fturdu\u011funuz yap\u0131land\u0131rma dosyas\u0131n\u0131 <code>sites-enabled<\/code> dizinine ba\u011flayarak etkinle\u015ftirin:<\/p>\n<pre><code>sudo ln -s \/etc\/nginx\/sites-available\/my-clojure-app \/etc\/nginx\/sites-enabled\/<\/code><\/pre>\n<p>Varsay\u0131lan Nginx yap\u0131land\u0131rmas\u0131n\u0131 devre d\u0131\u015f\u0131 b\u0131rakmak isteyebilirsiniz:<\/p>\n<pre><code>sudo rm \/etc\/nginx\/sites-enabled\/default<\/code><\/pre>\n<p>Nginx yap\u0131land\u0131rmas\u0131n\u0131n s\u00f6zdizimini kontrol edin:<\/p>\n<pre><code>sudo nginx -t<\/code><\/pre>\n<p>Her \u015fey yolundaysa, Nginx&#8217;i yeniden ba\u015flat\u0131n:<\/p>\n<pre><code>sudo service nginx restart<\/code><\/pre>\n<p>Art\u0131k taray\u0131c\u0131n\u0131zdan <code>http:\/\/alanadiniz.com<\/code> adresine gitti\u011finizde Clojure uygulaman\u0131z\u0131n yan\u0131t\u0131n\u0131 g\u00f6rmelisiniz.<\/p>\n<h4>SSL\/TLS Yap\u0131land\u0131rmas\u0131 (\u00d6nerilir)<\/h4>\n<p>Canl\u0131 bir uygulama i\u00e7in HTTPS kullanmak kritik \u00f6neme sahiptir. Let&#8217;s Encrypt, \u00fccretsiz SSL sertifikalar\u0131 sa\u011flar ve Certbot arac\u0131yla kolayca kurulabilir. Ubuntu 14.04 i\u00e7in Certbot kurulumu biraz farkl\u0131 olabilir.<\/p>\n<pre><code>sudo apt-get install software-properties-common\nsudo add-apt-repository ppa:certbot\/certbot\nsudo apt-get update\nsudo apt-get install python-certbot-nginx -y<\/code><\/pre>\n<p>Ard\u0131ndan, sertifikay\u0131 almak ve Nginx&#8217;i yap\u0131land\u0131rmak i\u00e7in Certbot&#8217;u \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code>sudo certbot --nginx -d alanadiniz.com -d www.alanadiniz.com<\/code><\/pre>\n<p>Certbot, Nginx yap\u0131land\u0131rman\u0131z\u0131 otomatik olarak g\u00fcncelleyecek ve HTTPS&#8217;yi etkinle\u015ftirecektir.<\/p>\n<h3>G\u00fcvenlik ve Optimizasyon \u0130pu\u00e7lar\u0131<\/h3>\n<p>Uygulaman\u0131z\u0131 canl\u0131ya ald\u0131ktan sonra, g\u00fcvenlik ve performans\u0131n\u0131 art\u0131rmak i\u00e7in baz\u0131 ek ad\u0131mlar atman\u0131z \u00f6nemlidir.<\/p>\n<h4>G\u00fcvenlik Duvar\u0131 (UFW)<\/h4>\n<p>Ubuntu&#8217;da UFW (Uncomplicated Firewall) kullanarak sunucunuza gelen trafi\u011fi kontrol edebilirsiniz. Yaln\u0131zca gerekli portlar\u0131 a\u00e7\u0131n.<\/p>\n<pre><code>sudo ufw enable\nsudo ufw allow ssh\nsudo ufw allow http\nsudo ufw allow https\nsudo ufw status<\/code><\/pre>\n<p>E\u011fer veritaban\u0131na d\u0131\u015far\u0131dan eri\u015fim gerekiyorsa (genellikle \u00f6nerilmez), ilgili portu da a\u00e7man\u0131z gerekir (\u00f6rne\u011fin PostgreSQL i\u00e7in 5432).<\/p>\n<h4>SSH G\u00fcvenli\u011fi<\/h4>\n<ul>\n<li><strong>Anahtar Tabanl\u0131 Kimlik Do\u011frulama:<\/strong> Parola ile giri\u015f yerine SSH anahtarlar\u0131 kullan\u0131n.<\/li>\n<li><strong>Root Eri\u015fimi Kapatma:<\/strong> <code>sshd_config<\/code> dosyas\u0131nda <code>PermitRootLogin no<\/code> olarak ayarlay\u0131n.<\/li>\n<li><strong>Varsay\u0131lan SSH Portunu De\u011fi\u015ftirme:<\/strong> <code>Port 22<\/code> yerine farkl\u0131 bir port kullan\u0131n.<\/li>\n<\/ul>\n<pre><code>sudo nano \/etc\/ssh\/sshd_config\nsudo service ssh restart<\/code><\/pre>\n<h4>Log Y\u00f6netimi<\/h4>\n<p>Uygulaman\u0131z\u0131n ve Nginx&#8217;in log dosyalar\u0131 zamanla b\u00fcy\u00fcyebilir. <code>logrotate<\/code> kullanarak bu loglar\u0131 otomatik olarak s\u0131k\u0131\u015ft\u0131r\u0131p ar\u015fivleyebilirsiniz.<\/p>\n<p>Nginx ve Upstart zaten <code>logrotate<\/code> taraf\u0131ndan y\u00f6netilir, ancak Clojure uygulaman\u0131z\u0131n kendi loglar\u0131 varsa, bunlar i\u00e7in \u00f6zel bir yap\u0131land\u0131rma eklemeniz gerekebilir.<\/p>\n<h4>Performans \u0130zleme<\/h4>\n<p>JVM tabanl\u0131 uygulamalar i\u00e7in JMX metriklerini izlemek, performans\u0131 anlamak i\u00e7in faydal\u0131d\u0131r. Prometheus ve Grafana gibi ara\u00e7lar, bu metrikleri g\u00f6rselle\u015ftirmek i\u00e7in kullan\u0131labilir.<\/p>\n<p>JVM bellek ayarlar\u0131n\u0131 optimize etmek de \u00f6nemlidir. Upstart yap\u0131land\u0131rman\u0131zdaki <code>exec<\/code> sat\u0131r\u0131na JVM arg\u00fcmanlar\u0131 ekleyebilirsiniz:<\/p>\n<pre><code>exec java -Xmx512m -Xms256m -jar \/opt\/my-clojure-app\/target\/uberjar\/my-clojure-app-0.1.0-SNAPSHOT-standalone.jar<\/code><\/pre>\n<p><code>-Xmx<\/code> maksimum heap boyutunu, <code>-Xms<\/code> ba\u015flang\u0131\u00e7 heap boyutunu ayarlar.<\/p>\n<h4>Yedekleme Stratejileri<\/h4>\n<p>Veritaban\u0131n\u0131z\u0131n ve uygulama dosyalar\u0131n\u0131z\u0131n d\u00fczenli yedeklerini almay\u0131 unutmay\u0131n. <code>pg_dump<\/code> (PostgreSQL i\u00e7in) gibi ara\u00e7lar veritaban\u0131 yedeklemeleri i\u00e7in kullan\u0131labilir.<\/p>\n<h4>Otomatik Da\u011f\u0131t\u0131m (CI\/CD)<\/h4>\n<p>Uygulaman\u0131z b\u00fcy\u00fcd\u00fck\u00e7e, manuel da\u011f\u0131t\u0131m s\u00fcre\u00e7leri hantal hale gelebilir. Jenkins, GitLab CI, CircleCI gibi CI\/CD ara\u00e7lar\u0131 kullanarak test, derleme ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini otomatikle\u015ftirebilirsiniz.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular ve Sorun Giderme<\/h3>\n<h4>Uygulama Ba\u015flam\u0131yor veya Hata Veriyor<\/h4>\n<ul>\n<li><strong>Upstart Loglar\u0131n\u0131 Kontrol Edin:<\/strong> <code>\/var\/log\/upstart\/my-clojure-app.log<\/code> dosyas\u0131nda hata mesajlar\u0131n\u0131 aray\u0131n.<\/li>\n<li><strong>Ortam De\u011fi\u015fkenlerini Do\u011frulay\u0131n:<\/strong> Uygulaman\u0131z\u0131n ihtiya\u00e7 duydu\u011fu t\u00fcm ortam de\u011fi\u015fkenlerinin (PORT, DATABASE_URL vb.) Upstart yap\u0131land\u0131rma dosyas\u0131nda do\u011fru ayarland\u0131\u011f\u0131ndan emin olun.<\/li>\n<li><strong>JVM Bellek Sorunlar\u0131:<\/strong> Uygulaman\u0131z yeterli belle\u011fe sahip olmayabilir. Upstart yap\u0131land\u0131rman\u0131zdaki <code>java -jar<\/code> komutuna <code>-Xmx<\/code> ve <code>-Xms<\/code> parametrelerini ekleyerek JVM bellek ayarlar\u0131n\u0131 art\u0131rmay\u0131 deneyin.<\/li>\n<li><strong>Dosya Yollar\u0131:<\/strong> <code>exec<\/code> komutundaki JAR dosyas\u0131n\u0131n yolunun do\u011fru oldu\u011fundan emin olun.<\/li>\n<\/ul>\n<h4>Nginx 502 Bad Gateway Hatas\u0131<\/h4>\n<p>Bu hata genellikle Nginx&#8217;in Clojure uygulaman\u0131zla ba\u011flant\u0131 kuramad\u0131\u011f\u0131 anlam\u0131na gelir.<\/p>\n<ul>\n<li><strong>Clojure Uygulamas\u0131n\u0131n \u00c7al\u0131\u015ft\u0131\u011f\u0131ndan Emin Olun:<\/strong> <code>sudo service my-clojure-app status<\/code> komutuyla uygulaman\u0131z\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 kontrol edin.<\/li>\n<li><strong>Port Do\u011frulu\u011fu:<\/strong> Nginx yap\u0131land\u0131rmas\u0131ndaki <code>proxy_pass<\/code> adresinin (<code>http:\/\/localhost:3000<\/code>) uygulaman\u0131z\u0131n dinledi\u011fi portla e\u015fle\u015fti\u011finden emin olun.<\/li>\n<li><strong>Nginx Hata Loglar\u0131:<\/strong> <code>\/var\/log\/nginx\/error.log<\/code> dosyas\u0131n\u0131 kontrol edin.<\/li>\n<\/ul>\n<h4>Veritaban\u0131 Ba\u011flant\u0131 Sorunlar\u0131<\/h4>\n<ul>\n<li><strong>Ba\u011flant\u0131 Dizisi (Connection String):<\/strong> Uygulaman\u0131z\u0131n kulland\u0131\u011f\u0131 veritaban\u0131 ba\u011flant\u0131 dizisinin (\u00f6rne\u011fin <code>DATABASE_URL<\/code> ortam de\u011fi\u015fkeni) do\u011fru oldu\u011fundan emin olun. Kullan\u0131c\u0131 ad\u0131, parola, veritaban\u0131 ad\u0131 ve host bilgilerini kontrol edin.<\/li>\n<li><strong>Veritaban\u0131 Servisi:<\/strong> Veritaban\u0131 sunucusunun (PostgreSQL) \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olun: <code>sudo service postgresql status<\/code>.<\/li>\n<li><strong>G\u00fcvenlik Duvar\u0131:<\/strong> E\u011fer veritaban\u0131 farkl\u0131 bir sunucudaysa, veritaban\u0131 sunucusunun g\u00fcvenlik duvar\u0131n\u0131n Clojure uygulaman\u0131z\u0131n sunucusundan gelen ba\u011flant\u0131lara izin verdi\u011finden emin olun.<\/li>\n<\/ul>\n<h4>Uygulama Performans\u0131 D\u00fc\u015f\u00fck<\/h4>\n<ul>\n<li><strong>JVM Ayarlar\u0131:<\/strong> \u00d6zellikle <code>-Xmx<\/code> ve <code>-Xms<\/code> parametreleri olmak \u00fczere JVM bellek ayarlar\u0131n\u0131 optimize edin.<\/li>\n<li><strong>Veritaban\u0131 \u0130ndeksleri:<\/strong> Veritaban\u0131 sorgular\u0131n\u0131z\u0131n yava\u015f \u00e7al\u0131\u015f\u0131p \u00e7al\u0131\u015fmad\u0131\u011f\u0131n\u0131 kontrol edin. Gerekli tablolara indeksler ekleyin.<\/li>\n<li><strong>Nginx Caching:<\/strong> Statik dosyalar i\u00e7in Nginx \u00f6nbelleklemesini etkinle\u015ftirin.<\/li>\n<li><strong>Kod Optimizasyonu:<\/strong> Clojure kodunuzdaki performans darbo\u011fazlar\u0131n\u0131 profilleyici ara\u00e7larla tespit edin ve optimize edin.<\/li>\n<\/ul>\n<h3>Sonu\u00e7<\/h3>\n<p>Bu kapsaml\u0131 rehber, bir Clojure web uygulamas\u0131n\u0131 Ubuntu 14.04 sunucusu \u00fczerine da\u011f\u0131tman\u0131n t\u00fcm temel ad\u0131mlar\u0131n\u0131 detayland\u0131rm\u0131\u015ft\u0131r. \u00d6n gereksinimlerin kurulumundan, Clojure uygulamas\u0131n\u0131n paketlenmesine, Upstart ile servis olarak \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131na ve Nginx ile ters proxy yap\u0131land\u0131rmas\u0131na kadar her a\u015famay\u0131 ele ald\u0131k. Ayr\u0131ca, g\u00fcvenlik, optimizasyon ve sorun giderme konular\u0131na da de\u011finerek uygulaman\u0131z\u0131n canl\u0131 ortamda sa\u011flam ve performansl\u0131 \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayacak ek ipu\u00e7lar\u0131 sunduk. Unutulmamal\u0131d\u0131r ki, her uygulaman\u0131n kendine \u00f6zg\u00fc gereksinimleri olabilir ve bu rehber genel bir \u00e7er\u00e7eve sunmaktad\u0131r. Da\u011f\u0131t\u0131m s\u00fcrecini kendi uygulaman\u0131z\u0131n \u00f6zel ihtiya\u00e7lar\u0131na g\u00f6re uyarlamak, ba\u015far\u0131l\u0131 bir canl\u0131ya ge\u00e7i\u015f i\u00e7in kritik \u00f6neme sahiptir. Bu ad\u0131mlar\u0131 dikkatlice takip ederek, Clojure uygulaman\u0131z\u0131 Ubuntu 14.04 \u00fczerinde g\u00fcvenle ve etkin bir \u015fekilde \u00e7al\u0131\u015ft\u0131rabilirsiniz.<\/p>\n<div class=\"github-example-link\"><strong>\u00d6rnek kod:<\/strong> <a href=\"https:\/\/github.com\/fatihsoysalcom\/simple-clojure-web-app\" target=\"_blank\" rel=\"noopener noreferrer\">github.com\/fatihsoysalcom\/simple-clojure-web-app<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"Modern web uygulamas\u0131 geli\u015ftirme d\u00fcnyas\u0131nda, performans, e\u015fzamanl\u0131l\u0131k ve g\u00fcvenilirlik giderek daha kritik hale gelmektedir.","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-43561","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>Clojure Web Uygulamas\u0131n\u0131 Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma Rehberi - 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\/clojure-web-uygulamasini-ubuntu-14-04-uzerine-dagitma-rehberi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Clojure Web Uygulamas\u0131n\u0131 Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma Rehberi\" \/>\n<meta property=\"og:description\" content=\"Modern web uygulamas\u0131 geli\u015ftirme d\u00fcnyas\u0131nda, performans, e\u015fzamanl\u0131l\u0131k ve g\u00fcvenilirlik giderek daha kritik hale gelmektedir.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/clojure-web-uygulamasini-ubuntu-14-04-uzerine-dagitma-rehberi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-23T14:01:03+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-23T14:01:30+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=\"15 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/clojure-web-uygulamasini-ubuntu-14-04-uzerine-dagitma-rehberi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/clojure-web-uygulamasini-ubuntu-14-04-uzerine-dagitma-rehberi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Clojure Web Uygulamas\u0131n\u0131 Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma Rehberi\",\"datePublished\":\"2026-07-23T14:01:03+00:00\",\"dateModified\":\"2026-07-23T14:01:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/clojure-web-uygulamasini-ubuntu-14-04-uzerine-dagitma-rehberi\/\"},\"wordCount\":2255,\"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\/clojure-web-uygulamasini-ubuntu-14-04-uzerine-dagitma-rehberi\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/clojure-web-uygulamasini-ubuntu-14-04-uzerine-dagitma-rehberi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/clojure-web-uygulamasini-ubuntu-14-04-uzerine-dagitma-rehberi\/\",\"name\":\"Clojure Web Uygulamas\u0131n\u0131 Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-07-23T14:01:03+00:00\",\"dateModified\":\"2026-07-23T14:01:30+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/clojure-web-uygulamasini-ubuntu-14-04-uzerine-dagitma-rehberi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/clojure-web-uygulamasini-ubuntu-14-04-uzerine-dagitma-rehberi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/clojure-web-uygulamasini-ubuntu-14-04-uzerine-dagitma-rehberi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Clojure Web Uygulamas\u0131n\u0131 Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma Rehberi\"}]},{\"@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":"Clojure Web Uygulamas\u0131n\u0131 Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma Rehberi - 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\/clojure-web-uygulamasini-ubuntu-14-04-uzerine-dagitma-rehberi\/","og_locale":"tr_TR","og_type":"article","og_title":"Clojure Web Uygulamas\u0131n\u0131 Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma Rehberi","og_description":"Modern web uygulamas\u0131 geli\u015ftirme d\u00fcnyas\u0131nda, performans, e\u015fzamanl\u0131l\u0131k ve g\u00fcvenilirlik giderek daha kritik hale gelmektedir.","og_url":"https:\/\/fatihsoysal.com\/blog\/clojure-web-uygulamasini-ubuntu-14-04-uzerine-dagitma-rehberi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-07-23T14:01:03+00:00","article_modified_time":"2026-07-23T14:01:30+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"15 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/clojure-web-uygulamasini-ubuntu-14-04-uzerine-dagitma-rehberi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/clojure-web-uygulamasini-ubuntu-14-04-uzerine-dagitma-rehberi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Clojure Web Uygulamas\u0131n\u0131 Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma Rehberi","datePublished":"2026-07-23T14:01:03+00:00","dateModified":"2026-07-23T14:01:30+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/clojure-web-uygulamasini-ubuntu-14-04-uzerine-dagitma-rehberi\/"},"wordCount":2255,"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\/clojure-web-uygulamasini-ubuntu-14-04-uzerine-dagitma-rehberi\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/clojure-web-uygulamasini-ubuntu-14-04-uzerine-dagitma-rehberi\/","url":"https:\/\/fatihsoysal.com\/blog\/clojure-web-uygulamasini-ubuntu-14-04-uzerine-dagitma-rehberi\/","name":"Clojure Web Uygulamas\u0131n\u0131 Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-07-23T14:01:03+00:00","dateModified":"2026-07-23T14:01:30+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/clojure-web-uygulamasini-ubuntu-14-04-uzerine-dagitma-rehberi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/clojure-web-uygulamasini-ubuntu-14-04-uzerine-dagitma-rehberi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/clojure-web-uygulamasini-ubuntu-14-04-uzerine-dagitma-rehberi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Clojure Web Uygulamas\u0131n\u0131 Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma Rehberi"}]},{"@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\/43561","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=43561"}],"version-history":[{"count":2,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/43561\/revisions"}],"predecessor-version":[{"id":43563,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/43561\/revisions\/43563"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=43561"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=43561"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=43561"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}