Bloğa geri dön

Ubuntu 20.04 üzerinde Docker ile Node.js (Express.js) Uygulaması Nasıl Dağıtılır

Ubuntu 20.04 üzerinde Docker ile Node.js (Express.js) Uygulaması Nasıl Dağıtılır

Giriş

Docker hafif, sanallaştırılmış, taşınabilir, yazılımla tanımlanmış standartlaştırılmış bir ortam olan bir konteyner platformudur. Yazılımın, fiziksel ana makinede çalışan diğer yazılımlardan yalıtılmış olarak çalışmasını sağlar. Docker, Yazılım Geliştirmenin Sürekli Geliştirme ve Entegrasyon yönünün tanımlayıcı bir bileşenidir. Sanal makinelere hafif bir alternatif sunar ve geliştiricilerin dağıtık uygulama mimarilerinin keyfini çıkarmasını sağlar. Docker ekosistemine kapsamlı bir genel bakış için bu makaleye göz atın.

Docker ile bir uygulama oluşturma süreci, geliştiricinin uygulaması için bir imaj oluşturmasıyla başlar. Ardından imaj, bir konteyner içinde konuşlandırılır. İmaj; uygulama kodu, kütüphaneler, yapılandırma dosyaları, ortam değişkenleri ve çalışma zamanı ortamı gibi bir uygulamanın tanımlayıcı bileşenlerini barındırır. İmaj, konteyner içindeki ortamı standartlaştırarak konteynerleştirmeye taşınabilirlik özelliklerini kazandırır. Node.js JavaScript kodunu bir web tarayıcısının dışında yürütebilen, açık kaynaklı, platformlar arası bir arka uç JavaScript çalışma zamanı ortamıdır. Chrome'un V8 JavaScript Motoru. Express.js Node.js üzerinde çalışan minimalist bir arka uç JavaScript çerçevesidir.

Bu eğitimde, Express çerçevesi üzerinde çalışan bir web sitesi için bir imaj oluşturacağız. Ön ucun daha iyi görünmesini sağlamak için bir ön uç kütüphanesi olan Bootstrap kullanacağız. İmajı oluşturduktan sonra bir konteyner derleyeceğiz ve bunu Docker Hub platformuna yükleyeceğiz. Docker Hub, geliştiricilerin herhangi bir Docker ortamına kolayca konuşlandırma yapabilmesi için konteynerli uygulamaları barındırmasına olanak tanır. Konteyneriniz Docker Hub üzerinde barındırıldıktan sonra, onu çekeceğiz ve web sitemizi fiilen sunacak başka bir imaj oluşturacağız.

Ön Koşullar

Bu uygulamalı bir eğitim olacaktır. Takip edebilmenizi sağlayacak bir ortam oluşturmalısınız.

takip edebilirsiniz. Adım 1: Uygulama Bağımlılıklarını Yapılandırma

İmajı oluşturmadan önce uygulama kaynak kodunuzu oluşturmanız gerekir. Uygulama kaynak kodu; konteynere kopyalanacak kodları, statik içerikleri ve bağımlılıkları içerir. Root olmayan kullanıcının ana dizininde projeniz için bir dizin oluşturarak başlayın. Biz buna node_express diyeceğiz, ancak istediğiniz bir dizin adını kullanmakta serbestsiniz:

Ardından, bu dizine geçin:

Burası uygulamanızın kök dizini olacaktır. Bir node.js uygulaması, kök klasörde bir package.json dosyası bekler. Npm, uygulamanızın hangi bağımlılıklara ihtiyaç duyduğunu belirlemek için bu dosyayı kullanır. Bu dosyayı oluşturmak için aşağıdaki komutu girin:

Bundan sonra, dosyaya aşağıdaki kod parçacığını ekleyin. Adı, yazarı, açıklamayı ve giriş noktası dosyasını dilediğiniz gibi güncelleyebilirsiniz:

Görebileceğiniz gibi, bu dosya proje adını, sürümünü, yazarını ve uygulama kodunun paylaşılacağı lisansı belirtir. Projeniz için kısa ve açıklayıcı bir ad kullanmanız, şuradaki kopyaları önlemek için önerilir: npm kayıt defteri. Proje için, uygulama kodunun serbestçe kopyalanmasına, değiştirilmesine veya dağıtılmasına izin veren ISC lisansını belirttik.

En önemlisi, dosyadaki şu yönergelere dikkat etmelisiniz:

  • main”: bu yönerge, uygulamanın giriş noktasını belirtir; biz bunu index.js olarak ayarladık. Bu dosyayı kısa süre içinde oluşturacağız.
  • dependencies”: bu yönerge, npm komutunu çalıştırdığımızda npm kayıt defterinden çekilecek uygulama bağımlılıklarını belirtir; bizim durumumuzda Express 4.17.1 ve üzeri sürümünü istiyoruz.

Şimdi Ctrl + O tuşlarına basarak dosyayı kaydedebilirsiniz. Ardından, Ctrl + X tuşlarına basarak dosyayı kapatın. Sırada, aşağıdaki komutu çalıştırarak bağımlılıkları yükleyeceğiz:

Bu komut, package.json dosyasında belirtilen uygulama bağımlılıklarını node_modules dizinlerine yükler. Komutu ilk çalıştırdığınızda bunlar otomatik olarak oluşturulmuştur. Uygulama bağımlılıklarımız yüklendiğine göre, artık uygulama kodunu eklemeye başlayabilirsiniz.

Adım 2: Uygulama Kod Dosyalarınızı Ekleme

Şunun katkılarıyla temel bir yemek tarifi web sitesi oluşturacağız: allrecipes. Uygulamanın ana giriş noktası index.js dosyasıdır. Projenin çeşitli sayfalarını ve statik varlıklarını barındıracak bir views dizini ekleyeceğiz. Web sitesinde, tanıtıcı bilgiler ve bazı tariflere bağlantılar içeren bir açılış sayfası bulunacaktır.

Açılış sayfası kodumuz home.html dosyasına yerleştirilecektir. İlk olarak, aşağıdaki komutu girerek index.js dosyasını oluşturun:

Bir Express uygulaması içe aktaran ve oluşturan aşağıdaki kodu ekleyin. Bu kod ayrıca Router nesnesini, temel dizini ve bu uygulamanın sunulacağı bağlantı noktasını belirtir:

require, bir modülü yükleyen bir JavaScript işlevidir. Bu durumda, express modülünü yüklüyoruz. Ardından, express ve router nesnelerini oluşturmak için içe aktarılan modülü kullanacağız. Router nesnesi, eğitim boyunca bu nesneye ekleyeceğimiz HTTP yöntemi çağrılarına yanıt vererek uygulamanın yönlendirme işlevlerini gerçekleştirir.

Ayrıca path ve port değerlerini de ayarladık. Path sabiti, kod için temel dizini tanımlar. Bizim durumumuzda bu, proje kök dizini içindeki views alt dizinidir. port, express uygulamasının dinlemesi gereken bağlantı noktasını belirtir; örneğimizde bunu şu şekilde ayarladık: 8090.

Sabitleri belirledikten sonra, router nesnesini kullanarak uygulama için bazı rotalar belirtebiliriz. Rotaları belirtmek için index.js dosyasına aşağıdaki kodu ekleyin:

You can ara katman yazılımı ekleyebilirsiniz rotalara, router.use işlevini kullanarak. Bu durumda, yönlendiricinin isteklerini uygulama rotalarına iletmeden önce günlüğe kaydeden bir işlev ekliyoruz. Uygulamanın temeline yapılacak bir GET isteği, bir home.html dosyası döndürecektir. sayfası. Ardından, belirli tarif sayfasına yönelik GET isteği kullanılarak da alınacak olan üç tarif için sayfalar ekledik.

Son olarak, router ara yazılımını ve uygulamanın statik varlıklarını bağlamak için aşağıdaki kodu ekleyin. Ek olarak, express uygulamasına şu portu dinlemesini söyleyin: 8090:

Tamamlanmış index.js dosyanız şu şekilde görünmelidir:

Şimdi dosyayı kaydedip kapatabilirsiniz. Bir sonraki adım, statik web sayfalarını views dizinine eklemektir. Dizini oluşturmak için aşağıdaki komutu girerek başlayın:

Enter the following command to open the home.html açılış sayfası dosyasını açmak için aşağıdaki komutu girin:

Dosyaya aşağıdaki kodu ekleyin. Kod, Bootstrap'i içe aktarır ve web sitesi ziyaretçilerine web sitesinin ne hakkında olduğuyla ilgili bazı bilgiler sunar:

Bootstrap'i içe aktarmanın yanı sıra, sayfa ayrıca temel bir navigasyon menüsü ekler; bu da sayfalarda gezinmemize ve açılış sayfasına geri dönmemize yardımcı olur. Ayrıca özel CSS dosyamızı içe aktarmak için bir satır ekledik:

Daha sonra uygulamaya özel stiller eklemek için bu dosyayı kullanacağız. Şimdi tarifler için üç sayfayı oluşturalım. İlk olarak lazanya sayfasını oluşturarak başlıyoruz. Aşağıdaki komutu kullanarak dosyayı nano düzenleyici ile açın:

Açılan dosyaya aşağıdaki kodu ekleyin. Bu dosya Bootstrap'i ve custom.css dosyasını içe aktaracak, bir navigasyon menüsü belirtecek ve bazı Lazanya tarifi bilgileri sunacaktır:

Şimdi de aynı süreci takip ederek guacamole tarifi sayfası için bir dosya oluşturalım. Aşağıdaki komutu çalıştırarak dosyayı nano ile açın:

Ardından bu kodu dosyaya ekleyin:

Son olarak, şu komutu girerek banana_bread.html dosyasını oluşturalım:

Ardından, dosyaya aşağıdaki HTML kodunu ekleyin:

Şimdi tüm sayfaları oluşturduk. Hatırlarsanız, css/custom.css dosyasını eklememiz gerekiyor. Dizini oluşturmak için aşağıdaki komutu girin:

Ardından şu komutla dosyayı oluşturun ve nano düzenleyicide açın:

Web sitenizi dilediğiniz gibi şekillendirmek için daha fazla CSS kodu ekleyebilirsiniz. Kısa olması açısından, dosyaya aşağıdaki kod parçacığını ekleyelim:

İşiniz bittiğinde dosyayı kaydedip kapatın.

Artık uygulama kaynak koduna ve yüklü proje bağımlılıklarına sahip olduğumuza göre uygulamayı başlatabilirsiniz.

Uygulamayı bir bağlantı noktasını dinleyecek şekilde ayarlamıştık, 8090 güvenlik duvarına bu bağlantı noktası üzerinden trafiğe izin vermesini söylemek için aşağıdaki komutu çalıştırın. Farklı bir bağlantı noktası belirttiyseniz, komuttaki bağlantı noktası numarasını değiştirin:

Şimdi uygulamayı başlatabilirsiniz. Ancak öncelikle, aşağıdaki komutu çalıştırarak proje kök dizininde olduğunuzdan emin olun:

Uygulamayı node index.js ile başlatın. Farklı bir giriş noktası belirttiyseniz, bunu kendi giriş noktanızla değiştirin:

Tarayıcınızla http://your_public_server_ip:8090 adresine giderseniz, tanımlandığı şekliyle Tarifler açılış sayfasını göreceksiniz:

Recipes

 

Navigasyonda çeşitli tariflerin bağlantılarını görebilirsiniz. Bazılarına tıklayalım. Aşağıda Lazanya tarifi sayfası yer almaktadır:

Node.js app install on Ubuntu 1

Ve burada da Guacamole tarifi sayfası yer almaktadır:

Guacamole

Bu noktaya kadar uygulamanızı oluşturdunuz ve beklendiği gibi çalıştığını test ettiniz. Ctrl + C tuşlarına basarak sunucudan çıkabilir ve Dockerfile dosyasını oluşturmaya geçebilirsiniz. Dockerfile'lar, gerektiğinde bir uygulamanın örneğini yeniden oluşturmayı mümkün kılarak ölçeklenebilirliğe yardımcı olur.

Adım 3: Dockerfile Oluşturma

Docker, imajları oluştururken bir Dockerfile içinde belirtilen talimatları okur. Bir uygulamanın çalışma zamanı ortamını belirtir. Bu nedenle, geliştiricilerin bağımlılıklarla ilgili tutarsızlıklardan veya çalışma zamanı sürümlerini değiştirmekten kaçınmasına yardımcı olur. Dockerfile'ı oluşturmak için aşağıdaki komutu girin:

Bir Docker imajı, birbiri üzerine inşa edilen birkaç imaj katmanı kullanılarak oluşturulur. Uygulama için başlangıç noktasını oluşturmak üzere bir temel imaj ekleyerek başlarsınız.

Uygulama bir node.js ortamında çalışmayı beklediğinden, node:10-alpine imajını for node.js için ekleyerek başlayacağız. Şu anda, biz bu kılavuzu yazarken, bu Node.js'in önerilen LTS sürümüdür. Bu özel imajı seçtik çünkü Alpine Linux projesinden türetilmiştir. Bu nedenle, imaj boyutumuzun minimumda tutulmasına yardımcı olacaktır. Docker Hub Node imajları sayfasında ihtiyaçlarınıza göre seçebileceğiniz birkaç imaj varyantı bulunmaktadır.

Uygulamanın temel imajını FROM yönergesini kullanarak ayarlamak için aşağıdaki kodu ekleyin:

Bu imaj Node.js ve npm içerir. Her Dockerfile bir FROM yönergesi ile başlamalıdır. Docker node imajı, varsayılan olarak uygulamanızın konteynerini root olarak çalıştırmak için kullanabileceğiniz root olmayan bir node kullanıcısıyla birlikte gelir. Docker güvenliği, konteynerlerin root olarak çalıştırılmamasını ve ayrıcalıkların yalnızca kaynaklarını çalıştırmak için gerekenlerle sınırlandırılmasını önerir.

Bu durumda, uygulamanın çalışma dizini ve konteynerin içindeki kullanıcı olarak node kullanıcısının ev dizinini kullanacağız. Daha fazla bilgi için bu Docker Node imajı en iyi uygulamaları kılavuzuna göz atabilirsiniz.

Uygulama kodunun izinlerini kolaylaştırmaya yardımcı olmak için node_modules alt dizinini, uygulama diziniyle birlikte /home/node içinde oluşturacağız. Bu dizinlerin oluşturulması, konteynerlerin içinde yerel olarak npm install komutunu çalıştırdığımızda doğru izinlere sahip olmalarını sağlar. Dizinleri oluşturduktan sonra, bunların sahipliğini node kullanıcısına atamalısınız. Bunu Dockerfile içinde aşağıdaki satırı ekleyerek yapacağız:

Ardından aşağıdaki satırı ekleyerek çalışma dizinini ayarlayacaksınız:

Docker'ın varsayılan olarak bir tane oluşturmak zorunda kalmaması için WORKDIR dizinini her zaman ayarlamak iyi bir fikirdir.

Add the following line to copy the package.json ve package-lock.json dosyalarını kopyalamak için aşağıdaki satırı ekleyin:

It’s recommended to add the COPY talimatını, npm install çalıştırmadan veya uygulama kaynak kodunu kopyalamadan önce eklemeniz önerilir. Bu, Docker'ın önbelleğe alma mekanizmasından yararlanmanızı sağlar. Derleme işlemi sırasında Docker, her talimat için önbelleğe alınmış bir katmanı olup olmadığını kontrol eder. Bu, package.json dosyasını değiştirmediyseniz, Docker'ın mevcut imaj katmanını kullanacağı ve node modüllerini yeniden yüklemekten kaçınacağı, dolayısıyla daha hızlı derleme süreçleri sağlayacağı anlamına gelir.

Before running npm install çalıştırmadan önce, kullanıcıyı node olarak değiştirmek üzere aşağıdaki satırı ekleyin; böylece tüm uygulama dosyalarının ve node_modules dizininin root olmayan node kullanıcısına ait olması sağlanır:

Konteynerimiz artık npm install komutunu çalıştırmaya hazır. Dockerfile'a aşağıdaki satırı ekleyin:

Once node_modules yüklendikten sonra, Docker'a uygulama kodunu konteyner üzerindeki uygulama dizinine doğru izinler ve sahiplikle (yani root olmayan node kullanıcısı) kopyalamasını söyleyecek olan aşağıdaki satırı ekleyin:

Son adım, 8090 portunu, giriş index.js dosyamızda tanımladığımız gibi konteyner üzerinde dışa açmaktır:

EXPOSE, çalışma zamanında konteyner üzerindeki hangi portların açık olacağını belirler. CMD ise uygulamayı başlatmak için komutu çalıştırır, bu durumda node index.js.

Dockerfile içinde yalnızca bir CMD komutunuz olmalıdır, çünkü yalnızca sonuncusu geçerli olur. Lütfen şuna göz atın: Dockerfile referans belgeleri Dockerfile ile yapabileceğiniz şeylerin bir listesi için.

Tamamlanmış Dockerfile dosyanız şu şekilde görünmelidir:

Artık dosyayı kaydedip kapatabilirsiniz.

Bir sonraki adımda .dockerignore dosyasını ekleyeceksiniz. Tıpkı .gitignore dosyasında olduğu gibi, .dockerignore dosyası da proje dizini içindeki hangi dosya ve dizinlerin konteynere kopyalanmaması gerektiğini belirtir.

Dosyayı nano düzenleyici ile açın:

Dosyanın içine aşağıdaki satırları ekleyin:

Eğer bir git deposuyla çalışıyorsanız, .git dizinini ve .gitignore dosyasını da eklemelisiniz. Dosyayı kaydedip kapatın.

Her şey yolunda gittiyse, docker build komutunu kullanarak uygulama imajını oluşturma zamanı gelmiştir. Docker'ın varsayılan olarak atadığı rastgele dize yerine imajı akılda kalıcı bir adla etiketlemek için –t bayrağını docker build komutuna ekleyebilirsiniz. İmajı Docker Hub'a da yükleyeceğimiz için, etikete Docker Hub kullanıcı adınızı dahil etmek en iyisidir.

Etiket adı olarak nodejs-express-image kullanacağız. İstediğiniz bir etiket adını seçmekte özgürsünüz. İmajı oluşturmak için gereken komut şudur:

your_dockerhub_username kısmını gerçek Docker Hub kullanıcı adınızla değiştirmeyi unutmayın. Sondaki . (nokta), derleme bağlamının geçerli dizin olduğunu belirtir.

Derleme işlemi bir veya iki dakika sürer. Tamamlandığında, imajlarınızı kontrol etmek için şu komutu girin:

Şuna benzer bir şey görmelisiniz:

sudo docker images

Unutmayın, your_dockerhub_username kısmını gerçek bir kullanıcı adıyla değiştirdik.

İmajınızın oluşturulduğunu onayladıktan sonra, artık docker run kullanarak imajla bir konteyner oluşturabilirsiniz. Aşağıdaki bayraklar dahil edilecektir:

  • -p: konteyner üzerindeki bağlantı noktasını (port) yayınlar ve bunu ana bilgisayar sistemindeki bir bağlantı noktasına eşler. Gösterim amacıyla ana bilgisayar sisteminde port 80'i kullanacağız. Ancak, bu portta çalışan başka bir işleminiz varsa, bunu gerektiği gibi değiştirebilirsiniz. Şunun hakkında daha fazla bilgi edinin: Docker belgelerinden port bağlama.
  • -d: arka plan modu (detached mode) içindir. Konteynerin arka planda çalışmaya devam etmesini sağlar.
  • --name: Docker'ın rastgele bir dize atamasına izin vermek yerine akılda kalıcı bir ad belirlemek için bunu kullanabilirsiniz.

Konteyneri oluşturma komutu aşağıdaki gibidir. Docker Hub kullanıcı adınızı uygun şekilde değiştirin:

Konteynerin oluşturulmasını ve çalışmaya başlamasını bekleyin. Çalışan tüm konteynerleri incelemek için bu komutu kullanabilirsiniz:

Aşağıdakine benzer bir çıktı görmelisiniz:

Node.js app install on Ubuntu 3

Çıktıda görüldüğü gibi, konteyner artık çalışıyor. Tarayıcıda port belirtmeden sunucunuzun genel IP adresini ziyaret ederseniz bunu tarayıcıda görüntüleyebilirsiniz. Ana sayfanız yüklenecektir:

awesome recipe

 

Docker ile bir Node Express statik web sitesini başarıyla dağıttınız. Gelecekte kullanmak ve ölçeklendirmek amacıyla bu imajı Docker Hub'a nasıl yükleyebileceğimizi görelim.

Adım 4: Docker İmaj Depoları ile Çalışma

Görüntülerinizi Docker Hub gibi görüntü kayıt defterlerine gönderebilir ve gelecekte kullanmak üzere kaydedebilir, diğer geliştiricilerle paylaşabilir veya konteynerlerinizi ölçeklendirmenize izin verebilirsiniz. Oluşturduğumuz görüntüyü Docker Hub'a gönderebilir ve bir konteyneri yeniden oluşturmak için kullanabiliriz.

Docker Hub hesabınızda oturum açmak için aşağıdaki komutu kullanın. Bunu gerçek Docker Hub kullanıcı adınızla değiştirin:

İstendiğinde şifrenizi girin. Oturum açtıktan sonra, ~/.docker/config.json dosyası, kullanıcınızın ev dizininde Docker Hub kimlik bilgilerinizi içerecek şekilde oluşturulur.

Bu ayarlandıktan sonra, daha önce görüntüyü oluştururken belirlediğiniz etiketi belirterek görüntüyü Docker Hub'a göndermek için aşağıdaki komutu girin:

Bu komut, docker görüntüsünü Docker Hub hesabınıza gönderir. Hesabınızı ziyaret ederseniz, yakın zamanda gönderdiğiniz görüntüyü görebilirsiniz:

Docker Hub

Mevcut uygulama konteynerini yok ederek ve depodaki görüntüyü kullanarak yeniden oluşturarak görüntü deposunun kullanışlılığını test edebiliriz.

Aşağıdaki komutu girerek mevcut konteynerlerinizi listeleyin:

Buna benzer bir çıktı görmelisiniz:

Docker Hub

Çıktınızda listelenen CONTAINER ID değerini not edin, kopyalayın ve kimliği kendinizinkiyle değiştirerek şu komutla konteynerinizi durdurmak için kullanın:

Sisteminizde bulunan tüm docker görüntülerini listelemek için aşağıdaki komutu girin:

Çıktı, görüntünüzün adını, node.js görüntüsünü ve derleme sürecindeki diğer görüntüleri gösterecektir.

Kullanılmayan veya askıda kalan görüntüler de dahil olmak üzere görüntüleri kaldırmak için aşağıdaki komutu girin:

Onaylamak için y yazın. Bu, durdurulan konteynerleri ve görüntüleri kaldırır. Bunları listelerseniz çıktıda boş bir liste görürsünüz:

output

Artık hem uygulamayı çalıştıran konteyneri hem de görüntünün kendisini kaldırdınız. öğreticimizi takip ederek Docker konteynerlerini, görüntülerini ve birimlerini kaldırma hakkında daha fazla bilgi edinin.

Şimdi, aşağıdaki komutla görüntüyü önce Docker Hub'dan çekerek tüm süreci yeniden oluşturabiliriz. Docker Hub kullanıcı adınızı uygun şekilde değiştirin:

Şu komutla Docker görüntülerinizi tekrar listeleyin:

Çıktıda görüntüyü görmelisiniz:

sudo docker

Artık Adım 3 içindeki komutu kullanarak konteynerinizi yeniden oluşturabilirsiniz. Elbette, uygun olan yerlerde Docker Hub kullanıcı adınızı değiştirin:

Yeniden oluşturulduğunu onaylamak için konteynerlerinizi listeleyin:

Benzer bir çıktı görmelisiniz:

Tarayıcınızda sunucunuzun genel IP adresine gidin; uygulamanızın çalıştığını görmelisiniz.

Sonuç

Öğreticiyi buraya kadar takip ettiyseniz, artık Express ve Bootstrap ile yapılmış ve Docker ile dağıtılmış statik bir web siteniz var demektir. Bir Docker görüntüsü oluşturmak için statik web sitesi dosyalarını kullandınız ve bir konteyner oluşturmak için bu görüntüyü kullandınız. Ardından görüntüyü bir Docker görüntü kayıt defteri olan Docker Hub, göndererek gelecekte kullanmak veya ölçeklendirmek üzere hazır hale getirdiniz. Görüntü kayıt defterinin kullanımını test etmek için görüntüleri ve konteynerleri yok ettiniz, görüntüleri kayıt defterinden çektiniz ve konteynerleri yeniden oluşturdunuz.

Bu öğreticide bir Node.js uygulamasının nasıl dağıtılacağı açıklandı. Farklı bir web geliştirme yığını kullanmayı öğrenmek isterseniz, Nginx üzerinde Docker Compose ile bir Laravel uygulamasını dağıtma.

Docker'ı kullanma hakkında daha fazla kaynak için aşağıdaki öğreticilere göz atın:

Keyifli Hesaplamalar!

author

Hark Labs

Yazar · CloudSigma

Preslav Dobrev, CloudSigma'da Kreatif Tasarımcı olarak görev yapmakta olup geleneksel ve yenilikçi pazarlama kanallarını kullanarak tutarlı bir kurumsal kimlik oluşturmaya odaklanmaktadır. Sanatsal vizyonu stratejik pazarlamayla harmanlayarak etkili marka anlatıları oluşturma konusunda oldukça yeteneklidir.

Yorumlar

Henüz yorum yapılmamış. İlk siz olun.