WordPress Docker ile nasıl kurulur

0 Hisse senetleri
0
0
0
0

giriiş

WordPress, MySQL veritabanı ve PHP işleme üzerine kurulu, ücretsiz ve açık kaynaklı bir içerik yönetim sistemidir (CMS). Eklenti mimarisi ve genişletilebilir şablon sistemi sayesinde yönetiminin çoğu bir web arayüzü üzerinden yapılabilir. Bu nedenle WordPress, bloglardan ürün sayfalarına ve e-ticaret sitelerine kadar her türlü web sitesi oluşturulurken popüler bir tercihtir.

WordPress'i çalıştırmak genellikle bir LAMP (Linux, Apache, MySQL ve PHP) veya LEMP (Linux, Nginx, MySQL ve PHP) yığınının kurulmasını gerektirir ve bu da zaman alıcı olabilir. Ancak, Docker ve Docker Compose gibi araçlar kullanarak kendi özel yığınınızı kurma ve WordPress'i kurma sürecini basitleştirebilirsiniz. Tek tek bileşenleri elle kurmak yerine, kitaplıklar, yapılandırma dosyaları ve ortam değişkenleri gibi öğeleri standartlaştıran imajlar kullanabilirsiniz. Ardından, bu imajları paylaşımlı bir işletim sisteminde çalışan izole edilmiş süreçler olan kapsayıcılarda çalıştırın. Ayrıca, Compose kullanarak birden fazla kapsayıcıyı (örneğin bir uygulama ve veritabanı) birbirleriyle iletişim kuracak şekilde koordine edebilirsiniz.

Bu eğitimde, çok konteynerli bir WordPress kurulumu oluşturacaksınız. Konteynerleriniz MySQL veritabanını, Nginx web sunucusunu ve WordPress'in kendisini içerecektir. Ayrıca, sitenizle ilişkilendirmek istediğiniz alan adı için Let's Encrypt ile TLS/SSL sertifikaları alarak kurulumunuzu güvence altına alacaksınız. Son olarak, alan adınızın güvenli kalması için sertifikalarınızı yenilemek üzere bir cron işi oluşturacaksınız.

Ön koşullar

  • Ayrıcalıklara sahip kök olmayan bir kullanıcıya sahip Ubuntu çalıştıran bir sunucu sudo Ve aktif güvenlik duvarı.
  • Sunucunuzda Docker kuruludur.
  • Sunucunuzda Docker Compose yüklü olmalıdır.
  • Kayıtlı bir alan adı. Bu eğitimde alan adınızın tamamı kullanılacaktır.
  • Sunucunuz için aşağıdaki DNS kayıtlarının ikisi de ayarlanmıştır.

Sunucunuzun genel IP adresini işaret eden your_domain adlı bir kayıt.

Sunucunuzun genel IP adresini işaret eden www.your_domain uzantılı bir kayıt.

Adım 1 – Web sunucusu yapılandırmasını tanımlayın

Herhangi bir kapsayıcıyı çalıştırmadan önce, ilk adımınız Nginx web sunucunuzun yapılandırmasını tanımlamaktır. Yapılandırma dosyanız, Let's Encrypt doğrulama isteklerini otomatik sertifika yenilemesi için Certbot istemcisine yönlendiren bir konum bloğunun yanı sıra, WordPress'e özgü bazı konum blokları içerir.

Öncelikle WordPress kurulumunuz için bir proje dizini oluşturun. Bu örnekte, adı WordPress olacak. İsterseniz bu dizine başka bir ad da verebilirsiniz:

mkdir wordpress

Daha sonra dizine gidin:

cd wordpress

Daha sonra yapılandırma dosyası için bir dizin oluşturun:

mkdir nginx-conf

Dosya ile nano Veya favori düzenleyicinizi açın:

nano nginx-conf/nginx.conf

Bu dosyaya, sunucu adı ve belge kökü için talimatlar içeren bir sunucu bloğu ve Certbot istemcisinin sertifika, PHP işleme ve sabit varlık isteklerine yönelik isteklerini yönlendirecek konum blokları ekleyin.

Aşağıdaki kodu dosyaya ekleyin. your_domain kısmını alan adınızla değiştirdiğinizden emin olun:

server {
        listen 80;
        listen [::]:80;

        server_name your_domain www.your_domain;

        index index.php index.html index.htm;

        root /var/www/html;

        location ~ /.well-known/acme-challenge {
                allow all;
                root /var/www/html;
        }

        location / {
                try_files $uri $uri/ /index.php$is_args$args;
        }

        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass wordpress:9000;
                fastcgi_index index.php;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PATH_INFO $fastcgi_path_info;
        }

        location ~ /\.ht {
                deny all;
        }

        location = /favicon.ico {
                log_not_found off; access_log off;
        }
        location = /robots.txt {
                log_not_found off; access_log off; allow all;
        }
        location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
                expires max;
                log_not_found off;
        }
}
 
Sunucu bloğumuz aşağıdaki bilgileri içermektedir:

Talimatlar:

  1. Dinlemek: Bu, Nginx'e 80 numaralı portu dinlemesini söyler ve bu da sertifika istekleriniz için Webroot Certbot eklentisini kullanmanıza olanak tanır. Henüz 443 numaralı portu girmediğinizi unutmayın; sertifikalarınızı başarıyla aldıktan sonra yapılandırmanızı SSL'i içerecek şekilde güncelleyeceksiniz.
  2. sunucu_adı: Sunucunuzun adını ve sunucunuza yapılan istekler için kullanılacak sunucu bloğunu belirtir. Bu satırdaki your_domain ifadesini alan adınızla değiştirdiğinizden emin olun.
  3. dizin: Bu yönerge, sunucunuza gelen istekleri işlerken dizin olarak kullanılan dosyaları tanımlar. Varsayılan öncelik sırasını burada değiştirdiniz ve Nginx'in mümkün olduğunda index.php adlı dosyalara öncelik vermesi için index.php dosyasını index.html dosyasının önüne taşıdınız.
  4. kök: Bu yönerge, sunucu istekleriniz için kök dizini adlandırır. Bu dizin, /var/www/html, WordPress Dockerfile'ınızdaki yönergeler tarafından derleme sırasında bir bağlama noktası olarak oluşturulur. Bu Dockerfile yönergeleri ayrıca, WordPress sürüm dosyalarının bu birime yüklenmesini de sağlar.

Konum blokları:

  1. konum ~ /.well-known/acme-challenge: Bu blok, Certbot'un alan adınızın DNS'inin sunucunuza çözümlendiğini doğrulamak için geçici bir dosya yerleştirdiği .well-known dizinine gelen istekleri işler. Bu yapılandırmayla, alan adınız için bir sertifika almak üzere Webroot Certbot eklentisini kullanabilirsiniz.
  2. konum /: Bu konum bloğunda, try_files yönergesi, istenen URI ile eşleşen dosyaları kontrol etmek için kullanılır. Ancak, varsayılan olarak 404 Bulunamadı durumu döndürmek yerine, kontrolü istek argümanlarıyla birlikte WordPress index.php dosyasına aktarırsınız.
  3. konum ~ \.php$: Bu konum bloğu, PHP işlemlerini yönetir ve bu istekleri WordPress konteynerinize yönlendirir. WordPress Docker imajınız php:fpm imajına dayalı olacağından, bu bloğa FastCGI protokolüne özgü yapılandırma seçenekleri de ekleyeceksiniz. Nginx, PHP istekleri için ayrı bir PHP işlemcisi gerektirir. Bu durumda, bu istekler php:fpm imajıyla birlikte gelen php-fpm işlemcisi tarafından işlenir. Ayrıca, bu konum bloğu, WordPress konteynerinizde çalışan WordPress uygulamasına proxy isteklerini yapılandıran, ayrıştırılan istek URI'si için bir tercih listesi ayarlayan ve istek URI'sini ayrıştıran FastCGI'ye özgü yönergeler, değişkenler ve seçenekler içerir.
  4. konum ~ /\.ht: Bu blok, .htaccess dosyalarını işler çünkü Nginx bunları sunmaz. deny_all yönergesi, .htaccess dosyalarının kullanıcılara asla sunulmamasını sağlar.
  5. konum = /favicon.ico, konum = /robots.txt: Bu bloklar /favicon.ico ve /robots.txt isteklerinin kaydedilmemesini sağlar.
  6. konum ~* \.(css|gif|ico|jpeg|jpg|js|png)$: Bu blok, sabit varlık isteklerinin günlüğe kaydedilmesini devre dışı bırakır ve bu varlıkların yüksek oranda önbelleğe alınabilir olmasını sağlar; çünkü bunlara hizmet vermek genellikle pahalıdır.

Düzenlemeyi tamamladığınızda dosyayı kaydedip kapatın. Nano kullanıyorsanız, bunu CTRL+X, Y ve ardından ENTER tuşlarına basarak yapabilirsiniz. Nginx'iniz yapılandırıldıktan sonra, çalışma zamanında uygulamanıza ve veritabanı kapsayıcılarınıza aktarılacak ortam değişkenleri oluşturmaya geçebilirsiniz.

Adım 2 – Ortam değişkenlerini tanımlayın

WordPress uygulama veritabanınız ve kapsayıcılarınız, uygulama verilerinizi canlı ve uygulamanız tarafından erişilebilir tutmak için çalışma zamanında belirli ortam değişkenlerine erişmelidir. Bu değişkenler hem hassas hem de hassas olmayan bilgiler içerir: MySQL kök parolası ve uygulama veritabanı kullanıcı adı ve parolası için hassas değerler ve uygulama veritabanı adınız ve ana bilgisayarınız için hassas olmayan bilgiler. Tüm bu değerleri kapsayıcılarınızın nasıl çalıştığı hakkında bilgi içeren ana dosya olan Docker Compose dosyasında ayarlamak yerine, hassas değerleri bir env. dosyasında ayarlayın ve dolaşımını kısıtlayın. Bu, bu değerlerin proje depolarınız arasında kopyalanmasını ve herkese açık olarak görünmesini engeller.

Projenizin kök dizininde, ~/wordpress, .env adlı bir dosya açın:

nano .env

Bu dosyada ayarladığınız gizli değerler, MySQL kök kullanıcısı için bir parola ve WordPress'in veritabanına erişmek için kullanacağı bir kullanıcı adı ve parola içerir. Dosyaya aşağıdaki değişken adlarını ve değerlerini ekleyin. Her değişken için burada kendi değerlerinizi belirtmeyi unutmayın:

MYSQL_ROOT_PASSWORD=your_root_password
MYSQL_USER=your_wordpress_database_user
MYSQL_PASSWORD=your_wordpress_database_password

Kök yönetici hesabı için bir parola ve uygulama veritabanınız için istediğiniz kullanıcı adı ve parolayı ekleyin. Düzenlemeyi bitirdiğinizde dosyayı kaydedip kapatın.

Env dosyanız hassas bilgiler içerdiğinden, projenizin .gitignore ve .dockerignore dosyalarına eklendiğinden emin olmak istersiniz. Bu, Git'e ve Docker'a sırasıyla Git depolarınıza ve Docker imajlarınıza hangi dosyaların kopyalanmaması gerektiğini söyler.

Git init ile:

git init

Daha sonra .gitignore dosyasını oluşturup açın:

nano .gitignore

Dosyaya env ekleyin:

.env

Düzenlemeyi bitirdiğinizde dosyayı kaydedip kapatın.

Benzer şekilde, .dockerignore dosyasına .env eklemek, bu dizini yapı bağlamınız olarak kullandığınızda kapsayıcılarınıza dahil edilmemesi için iyi bir önlemdir.

Dosyayı açın:

nano .dockerignore

Dosyaya env ekleyin:

.env

Bunun altına isteğe bağlı olarak uygulama geliştirmenizle ilgili dosyaları ve dizinleri ekleyebilirsiniz:

.env
.git
docker-compose.yml
.dockerignore

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

Hassas bilgileriniz hazır olduğuna göre artık docker-compose.yml dosyasında hizmetlerinizi tanımlamaya geçebilirsiniz.

Adım 3 – Docker Compose ile hizmetleri tanımlayın

Docker-compose.yml dosyanız, kurulumunuz için servis tanımlarını içerecektir. Compose'daki bir servis, çalışan bir konteynerdir ve servis tanımları, her konteynerin nasıl çalışması gerektiği hakkında bilgi sağlar.

Compose'u kullanarak, çok kapsayıcılı uygulamaları çalıştırmak için farklı hizmetler tanımlayabilirsiniz. Compose, bu hizmetleri paylaşılan ağlar ve birimlerle birbirine bağlamanıza olanak tanır. Veritabanınız, WordPress uygulamanız ve web sunucunuz için farklı kapsayıcılar oluşturacağınız için bu, mevcut kurulumunuz için faydalı olacaktır. Ayrıca, web sunucunuz için sertifika almak üzere Certbot istemcisini çalıştırmak üzere bir kapsayıcı da oluşturacaksınız.

Başlamak için docker-compose.yml dosyasını oluşturun ve açın:

nano docker-compose.yml

Compose dosyanızın ve db veritabanı servisinizin sürümünü tanımlamak için aşağıdaki kodu ekleyin:

version: '3'

services:
  db:
    image: mysql:8.0
    container_name: db
    restart: unless-stopped
    env_file: .env
    environment:
      - MYSQL_DATABASE=wordpress
    volumes:
      - dbdata:/var/lib/mysql
    command: '--default-authentication-plugin=mysql_native_password'
    networks:
      - app-network

Veritabanı servis tanımı aşağıdaki seçenekleri içerir:

  1. görüntü: Bu, Compose'a konteyneri oluşturmak için hangi görüntüyü çekeceğini söyler. mysql:latest görüntüsü güncellenmeye devam ettikçe gelecekte oluşabilecek çakışmaları önlemek için mysql:8.0 görüntüsünü buraya sabitliyorsunuz. Sürüm sabitleme ve bağımlılık çakışmalarından kaçınma hakkında daha fazla bilgi için Dockerfile en iyi uygulamaları hakkındaki Docker belgelerini okuyun.
  2. Konteyner_adı: Konteyner için bir ad belirtir.
  3. tekrar başlat: Bu politika, konteynerin yeniden başlatılıp başlatılmayacağını belirtir. Varsayılan ayar hayırdır, ancak konteyneri manuel olarak durdurulmadığı sürece yeniden başlatılacak şekilde yapılandırdınız.
  4. env_dosyası: Bu seçenek, Compose'a yapı bağlamınızda bulunan .env adlı bir dosyadan ortam değişkenleri eklemek istediğinizi söyler. Bu durumda, yapı bağlamı geçerli dizininizdir.
  5. çevre: Bu seçenek, .env dosyasında tanımlananların ötesinde ek ortam değişkenleri eklemenize olanak tanır. Uygulama veritabanınıza bir ad vermek için MYSQL_DATABASE değişkenini WordPress olarak ayarlarsınız. Bu bilgi hassas olmadığı için, doğrudan docker-compose.yml dosyasına ekleyebilirsiniz.
  6. birimler: Burada, konteynerdeki /var/lib/mysql klasörüne dbdata adlı bir birim bağlıyorsunuz. Bu, çoğu dağıtımda MySQL için standart veri dizinidir.
  7. emretmek: Bu seçenek, imaj için varsayılan CMD komutunu geçersiz kılmak üzere bir komut belirtir. Bu özel durumda, konteynerdeki MySQL sunucusunu başlatan standart mysqld Docker imaj komutuna bir seçenek ekliyorsunuz. Bu seçenek, –default-authentication-plugin=mysql_native_password, –default-authentication-plugin sistem değişkenini mysql_native_password olarak ayarlar ve sunucuya yapılan yeni kimlik doğrulama isteklerini hangi kimlik doğrulama mekanizmasının yöneteceğini belirtir. PHP ve dolayısıyla WordPress imajınız yeni MySQL kimlik doğrulama varsayılanını desteklemediğinden, uygulama veritabanı kullanıcınızın kimliğini doğrulamak için bunu yapılandırmanız gerekecektir.
  8. ağlar: Bu, uygulama hizmetinizin dosyanın alt kısmında tanımladığınız uygulama-ağ ağına katılacağını belirtir.

Daha sonra db servis tanımınızın altına WordPress uygulama servis tanımınızı ekleyin:

...
  wordpress:
    depends_on:
      - db
    image: wordpress:5.1.1-fpm-alpine
    container_name: wordpress
    restart: unless-stopped
    env_file: .env
    environment:
      - WORDPRESS_DB_HOST=db:3306
      - WORDPRESS_DB_USER=$MYSQL_USER
      - WORDPRESS_DB_PASSWORD=$MYSQL_PASSWORD
      - WORDPRESS_DB_NAME=wordpress
    volumes:
      - wordpress:/var/www/html
    networks:
      - app-network

Bu hizmet tanımında, tıpkı veritabanı hizmetinde yaptığınız gibi, konteynerinize bir ad veriyor ve bir yeniden başlatma politikası tanımlıyorsunuz. Ayrıca bu konteynere bazı özel seçenekler de ekliyorsunuz:

  1. bağlıdır: Bu seçenek, kapsayıcılarınızın bağımlılık sırasına göre başlatılmasını ve WordPress kapsayıcısının veritabanı kapsayıcısından sonra başlamasını sağlar. WordPress uygulamanız veritabanınızın ve uygulama kullanıcınızın varlığına bağlıdır, bu nedenle bu bağımlılık sırasını belirtmek uygulamanızın düzgün bir şekilde başlamasını sağlar.
  2. görüntü: Bu kurulum için WordPress 5.1.1-fpm-alpine imajını kullanacaksınız. 1. Adım'da açıklandığı gibi, bu imajı kullanmak, uygulamanızın Nginx'in PHP işlemlerini gerçekleştirmek için ihtiyaç duyduğu php-fpm işlemcisine sahip olmasını sağlar. Bu aynı zamanda, Alpine Linux projesinden türetilen ve imajınızın genel boyutunu küçültmenize yardımcı olan bir Alpine imajıdır. Alpine imajlarını kullanmanın avantajları ve dezavantajları ve uygulamanız için uygun olup olmadığı hakkında daha fazla bilgi için, WordPress Docker Hub imaj sayfasındaki İmaj Varyantları bölümündeki tüm tartışmayı inceleyin.
  3. env_dosyası: Yine .env dosyanızdan değerleri çıkarmak istediğinizi belirtiyorsunuz, çünkü uygulama veritabanı kullanıcı adınızı ve şifrenizi burada tanımladınız.
  4. çevre: Burada, .env dosyanızda tanımladığınız değerleri kullanıyorsunuz, ancak bunları WordPress görüntüsünün beklediği değişkenlerin adlarına atıyorsunuz: WORDPRESS_DB_USER ve WORDPRESS_DB_PASSWORD. Ayrıca, varsayılan MySQL portu olan 3306'da erişilebilen veritabanı konteynerinde çalışan MySQL sunucusu olan WORDPRESS_DB_HOST'u da tanımlıyorsunuz. WORDPRESS_DB_NAME, MySQL servis tanımınızda MYSQL_DATABASE için belirttiğiniz değerle aynı olacaktır: wordpress.
  5. birimler: WordPress imajı tarafından oluşturulan /var/www/html bağlama noktasına wordpress adlı bir birim bağlıyorsunuz. Bu şekilde adlandırılmış bir birim kullanmak, uygulama kodunuzu diğer kapsayıcılarla paylaşmanıza olanak tanır.
  6. : Ayrıca WordPress konteynerini uygulama ağına ekliyorsunuz.

Daha sonra wordpress uygulama servis tanımı altına Nginx web sunucusu servisiniz için aşağıdaki tanımı ekleyin:

...
  webserver:
    depends_on:
      - wordpress
    image: nginx:1.15.12-alpine
    container_name: webserver
    restart: unless-stopped
    ports:
      - "80:80"
    volumes:
      - wordpress:/var/www/html
      - ./nginx-conf:/etc/nginx/conf.d
      - certbot-etc:/etc/letsencrypt
    networks:
      - app-network

Burada, konteynerinize bir ad verin ve başlangıçta WordPress konteynerine bağımlı hale getirin. Ayrıca bir Alpine imajı (1.15.12-alpine Nginx imajı) kullanın.

Bu hizmet tanımı ayrıca aşağıdaki seçenekleri de içerir:

  • limanlar: Bu, 1. adımda nginx.conf dosyanızda tanımladığınız yapılandırma seçeneklerini etkinleştirmek için 80 numaralı portu açığa çıkarır.
  • birimler: Burada, adlandırılmış birimler ve bağlama noktalarının bir kombinasyonunu tanımlarsınız:
  • wordpress:/var/www/html: Bu kod, WordPress uygulamanızı Nginx sunucu bloğunuzda kök olarak ayarladığınız dizin olan /var/www/html klasörüne yerleştirecektir.
  • ./nginx-conf:/etc/nginx/conf.d: Bu, ana bilgisayardaki Nginx yapılandırma klasörünü kapsayıcıdaki ilgili dizine bağlayacak ve ana bilgisayardaki dosyalarda yaptığınız tüm değişikliklerin ana bilgisayara yansımasını sağlayacaktır.
  • certbot-etc:/etc/letsencrypt: Bu, etki alanınız için Let's Encrypt sertifikalarını ve anahtarlarını kapsayıcıdaki uygun dizine yükleyecektir.

Bu konteyneri uygulama ağına da eklediniz.

Son olarak, web sunucusu tanımınızın altına certbot hizmeti için nihai hizmet tanımınızı ekleyin. Burada listelenen e-posta adresini ve alan adını kendi bilgilerinizle değiştirdiğinizden emin olun:

certbot:
    depends_on:
      - webserver
    image: certbot/certbot
    container_name: certbot
    volumes:
      - certbot-etc:/etc/letsencrypt
      - wordpress:/var/www/html
    command: certonly --webroot --webroot-path=/var/www/html --email sammy@your_domain --agree-tos --no-eff-email --staging -d your_domain -d www.your_domain

Bu tanım, Compose'a certbot/certbot imajını Docker Hub'dan çekmesini söyler. Ayrıca, certbot-etc'deki alan sertifikaları ve anahtarları ile WordPress'teki uygulama kodu da dahil olmak üzere Nginx konteyneriyle kaynakları paylaşmak için adlandırılmış birimler kullanır. Yine, certbot konteynerinin web sunucusu hizmeti başlatıldıktan sonra başlatılması gerektiğini belirtmek için dependent_on kullandınız. Ayrıca, konteynerin varsayılan certbot komutuyla çalıştırılacak bir alt komut belirten bir komut seçeneği de eklediniz. certonly alt komutu, sertifikayı aşağıdaki seçeneklerle alır:

  1. --web kökü: Bu, Certbot'a kimlik doğrulaması için webroot klasörüne dosya yerleştirmek üzere webroot eklentisini kullanmasını söyler. Eklenti, Certbot'un belirli bir etki alanı adına yanıt veren bir sunucudan kaynaklara erişebileceğini kanıtlamak için bir HTTP isteği kullanan HTTP-01 kimlik doğrulama yöntemine dayanır.
  2. --webroot-yolu: Bu, webroot dizinine giden yolu belirtir.
  3. --e-posta: Kayıt ve kurtarma için istediğiniz e-posta.
  4. --kabul-ediyorum: Bu, ACME Ortak Anlaşması'nı kabul ettiğinizi gösterir.
  5. --etkisiz-e-posta: Bu, Certbot'a e-postanızı Electronic Frontier Foundation (EFF) ile paylaşmak istemediğinizi bildirir. İsterseniz bunu kaldırabilirsiniz.
  6. --sahneleme: Bu, Certbot'a test sertifikaları almak için Let's Encrypt hazırlık ortamını kullanmak istediğinizi bildirir. Bu seçeneği kullanmak, yapılandırma seçeneklerinizi test etmenize ve olası etki alanı istek sınırlarından kaçınmanıza olanak tanır. Bu sınırlar hakkında daha fazla bilgi için lütfen Let's Encrypt hız sınırları belgelerini okuyun.
  7. -D: Bu, talebinize uygulamak istediğiniz alan adlarını belirtmenize olanak tanır. Bu durumda, your_domain ve www.your_domain girdiniz. Bunları alan adınızla değiştirdiğinizden emin olun.

Certbot servis tanımının altına ağ ve birim tanımlarınızı ekleyin:

...
volumes:
  certbot-etc:
  wordpress:
  dbdata:

networks:
  app-network:
    driver: bridge

Üst düzey birim anahtarınız, certbot-etc, wordpress ve dbdata birimlerini tanımlar. Docker birimleri oluşturduğunda, birimin içeriği ana dosya sistemindeki bir dizinde (/var/lib/docker/volumes/) saklanır ve bu dizin Docker tarafından yönetilir. Her birimin içeriği daha sonra bu dizinden, birimi kullanan herhangi bir kapsayıcıya bağlanır. Bu, kod ve verilerin kapsayıcılar arasında paylaşılmasını sağlar.

Kullanıcı tanımlı köprü ağı uygulama ağı, konteynerleriniz Docker daemon'ıyla aynı ana bilgisayarda oldukları için aralarında iletişimi mümkün kılar. Bu, aynı köprü ağı üzerindeki konteynerler arasındaki tüm bağlantı noktalarını dış dünyaya açmadan açtığı için uygulama içindeki trafiği ve iletişimi kolaylaştırır. Böylece veritabanınız, WordPress'iniz ve web sunucunuz konteynerleri birbirleriyle iletişim kurabilir ve uygulamaya ön uç erişimi için yalnızca 80 numaralı bağlantı noktasını açmanız gerekir.

Docker-compose.yml dosyası aşağıda tam olarak gösterilmiştir:

version: '3'

services:
  db:
    image: mysql:8.0
    container_name: db
    restart: unless-stopped
    env_file: .env
    environment:
      - MYSQL_DATABASE=wordpress
    volumes:
      - dbdata:/var/lib/mysql
    command: '--default-authentication-plugin=mysql_native_password'
    networks:
      - app-network

  wordpress:
    depends_on:
      - db
    image: wordpress:5.1.1-fpm-alpine
    container_name: wordpress
    restart: unless-stopped
    env_file: .env
    environment:
      - WORDPRESS_DB_HOST=db:3306
      - WORDPRESS_DB_USER=$MYSQL_USER
      - WORDPRESS_DB_PASSWORD=$MYSQL_PASSWORD
      - WORDPRESS_DB_NAME=wordpress
    volumes:
      - wordpress:/var/www/html
    networks:
      - app-network

  webserver:
    depends_on:
      - wordpress
    image: nginx:1.15.12-alpine
    container_name: webserver
    restart: unless-stopped
    ports:
      - "80:80"
    volumes:
      - wordpress:/var/www/html
      - ./nginx-conf:/etc/nginx/conf.d
      - certbot-etc:/etc/letsencrypt
    networks:
      - app-network

  certbot:
    depends_on:
      - webserver
    image: certbot/certbot
    container_name: certbot
    volumes:
      - certbot-etc:/etc/letsencrypt
      - wordpress:/var/www/html
    command: certonly --webroot --webroot-path=/var/www/html --email sammy@your_domain --agree-tos --no-eff-email --staging -d your_domain -d www.your_domain

volumes:
  certbot-etc:
  wordpress:
  dbdata:

networks:
  app-network:
    driver: bridge

Düzenlemeyi tamamladığınızda dosyayı kaydedip kapatın. Hizmet tanımlarınız hazır olduğunda, kapsayıcıları başlatmaya ve sertifika isteklerinizi test etmeye hazırsınız.

Adım 4 – SSL Sertifikalarını ve Kimlik Bilgilerini Edinin

Konteynerlerinizi, konteynerlerinizi belirttiğiniz sırayla oluşturup çalıştıracak olan docker-compose up komutuyla başlatın. -d bayrağını eklediğinizde, komut arka planda veritabanı, WordPress ve web sunucusu konteynerlerini çalıştıracaktır:

docker-compose up -d

Aşağıdaki çıktı, hizmetinizin oluşturulduğunu doğrular:

Output
Creating db ... done
Creating wordpress ... done
Creating webserver ... done
Creating certbot ... done

Servislerinizin durumunu docker-compose ps kullanarak kontrol edin:

docker-compose ps

Tamamlandığında, veritabanınız, wordpress ve web sunucusu hizmetleriniz çalışır duruma gelecek ve certbot konteyneri 0 durum mesajıyla sonlanacaktır:

Output
Name Command State Ports
-------------------------------------------------------------------------
certbot certbot certonly --webroot ... Exit 0
db docker-entrypoint.sh --def ... Up 3306/tcp, 33060/tcp
webserver nginx -g daemon off; Up 0.0.0.0:80->80/tcp
wordpress docker-entrypoint.sh php-fpm Up 9000/tcp

Veritabanı, wordpress veya web sunucusu hizmetleri için Durum sütununda yukarıdakilerden farklı bir değer veya certbot konteyneri için 0'dan farklı bir çıkış durumu, docker-compose logs komutuyla hizmet günlüklerini kontrol etmeniz gerekebileceği anlamına gelir:

 

docker-compose logs service_name

Sertifikalarınızın web sunucusu konteynerine yüklendiğini artık docker-compose exec ile doğrulayabilirsiniz:

docker-compose exec webserver ls -la /etc/letsencrypt/live

Sertifika istekleriniz başarılı olduğunda kodun çıktısı aşağıdaki gibidir:

Output
total 16
drwx------ 3 root root 4096 May 10 15:45 .
drwxr-xr-x 9 root root 4096 May 10 15:45 ..
-rw-r--r-- 1 root root 740 May 10 15:45 README
drwxr-xr-x 2 root root 4096 May 10 15:45 your_domain

Artık isteğinizin başarılı olduğunu bildiğinize göre, --staging'i kaldırmak için certbot servis tanımını düzenleyebilirsiniz.

docker-compose.yml dosyasını açın:

nano docker-compose.yml

Dosyanın certbot hizmet tanımının bulunduğu kısmını bulun ve komut seçeneğindeki –staging ifadesini, Certbot'a aynı etki alanlarıyla yeni bir sertifika talep etmek istediğinizi belirten –force-renewal ile değiştirin. Sertifika, certbot hizmet tanımının altında şu değişkenle güncellenir:

...
certbot:
depends_on:
- webserver
image: certbot/certbot
container_name: certbot
volumes:
- certbot-etc:/etc/letsencrypt
- certbot-var:/var/lib/letsencrypt
- wordpress:/var/www/html
command: certonly --webroot --webroot-path=/var/www/html --email sammy@your_domain --agree-tos --no-eff-email --force-renewal -d your_domain -d www.your_domain
...

Artık certbot konteynerini yeniden oluşturmak için docker-compose komutunu çalıştırabilirsiniz. Ayrıca, Compose'a web sunucusu hizmeti zaten çalışıyor olduğundan başlatmayı atlayabileceğini belirtmek için --no-deps seçeneğini de ekleyebilirsiniz:

docker-compose up --force-recreate --no-deps certbot

Aşağıdaki çıktı, sertifika isteğinizin başarılı olduğunu gösterir:

Output
Recreating certbot ... done
Attaching to certbot
certbot | Saving debug log to /var/log/letsencrypt/letsencrypt.log
certbot | Plugins selected: Authenticator webroot, Installer None
certbot | Renewing an existing certificate
certbot | Performing the following challenges:
certbot | http-01 challenge for your_domain
certbot | http-01 challenge for www.your_domain
certbot | Using the webroot path /var/www/html for all unmatched domains.
certbot | Waiting for verification...
certbot | Cleaning up challenges
certbot | IMPORTANT NOTES:
certbot | - Congratulations! Your certificate and chain have been saved at:
certbot | /etc/letsencrypt/live/your_domain/fullchain.pem
certbot | Your key file has been saved at:
certbot | /etc/letsencrypt/live/your_domain/privkey.pem
certbot | Your cert will expire on 2019-08-08. To obtain a new or tweaked
certbot | version of this certificate in the future, simply run certbot
certbot | again. To non-interactively renew *all* of your certificates, run
certbot | "certbot renew"
certbot | - Your account credentials have been saved in your Certbot
certbot | configuration directory at /etc/letsencrypt. You should make a
certbot | secure backup of this folder now. This configuration directory will
certbot | also contain certificates and private keys obtained by Certbot so
certbot | making regular backups of this folder is ideal.
certbot | - If you like Certbot, please consider supporting our work by:
certbot |
certbot | Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
certbot | Donating to EFF: https://eff.org/donate-le
certbot |
certbot exited with code 0

Sertifikalarınız elinizdeyken, Nginx yapılandırmanızı SSL'i içerecek şekilde değiştirebilirsiniz.

Adım 5 – Web sunucusu yapılandırmasını ve hizmet tanımını değiştirin

Nginx yapılandırmasında SSL'yi etkinleştirmek, HTTP'den HTTPS'ye yönlendirme eklemeyi, SSL sertifikasını ve anahtar konumlarını belirtmeyi ve güvenlik parametreleri ile başlıklarını eklemeyi içerir. Web sunucusu hizmetini bu eklemeleri içerecek şekilde yeniden oluşturmak istediğiniz için, şimdi durdurabilirsiniz:

docker-compose stop webserver

Yapılandırma dosyasını değiştirmeden önce, curl kullanarak Certbot'tan önerilen Nginx güvenlik parametresini alın:

curl -sSLo nginx-conf/options-ssl-nginx.conf https://raw.githubusercontent.com/certbot/certbot/master/certbot-nginx/certbot_nginx/_internal/tls_configs/options-ssl-nginx.conf

Bu komut bu parametreleri nginx-conf dizininde bulunan options-ssl-nginx.conf adlı bir dosyaya kaydeder.

Daha sonra daha önce oluşturduğunuz Nginx yapılandırma dosyasını silin:

rm nginx-conf/nginx.conf

Dosyanın başka bir sürümünü oluşturup açın:

nano nginx-conf/nginx.conf

HTTP'yi HTTPS'ye yönlendirmek ve kimlik bilgilerini, protokolleri ve SSL güvenlik başlıklarını eklemek için dosyaya aşağıdaki kodu ekleyin. your_domain yerine kendi alan adınızı yazmayı unutmayın:

server {
        listen 80;
        listen [::]:80;

        server_name your_domain www.your_domain;

        location ~ /.well-known/acme-challenge {
                allow all;
                root /var/www/html;
        }

        location / {
                rewrite ^ https://$host$request_uri? permanent;
        }
}

server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name your_domain www.your_domain;

        index index.php index.html index.htm;

        root /var/www/html;

        server_tokens off;

        ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;

        include /etc/nginx/conf.d/options-ssl-nginx.conf;

        add_header X-Frame-Options "SAMEORIGIN" always;
        add_header X-XSS-Protection "1; mode=block" always;
        add_header X-Content-Type-Options "nosniff" always;
        add_header Referrer-Policy "no-referrer-when-downgrade" always;
        add_header Content-Security-Policy "default-src * data: 'unsafe-eval' 'unsafe-inline'" always;
        # add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
        # enable strict transport security only if you understand the implications

        location / {
                try_files $uri $uri/ /index.php$is_args$args;
        }

        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass wordpress:9000;
                fastcgi_index index.php;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PATH_INFO $fastcgi_path_info;
        }

        location ~ /\.ht {
                deny all;
        }

        location = /favicon.ico {
                log_not_found off; access_log off;
        }
        location = /robots.txt {
                log_not_found off; access_log off; allow all;
        }
        location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
                expires max;
                log_not_found off;
        }
}

HTTP sunucu bloğu, Certbot'un .well-known/acme-challenge dizinine yönelik yenileme istekleri için web kökünü belirtir. Ayrıca, HTTP isteklerini kök dizine HTTPS olarak yönlendiren bir yeniden yazma yönergesi de içerir.

HTTPS sunucu bloğu, SSL ve HTTP2'yi etkinleştirir. HTTP/2'nin HTTP protokollerinde nasıl çoğaltıldığı ve web sitesi performansına sağlayabileceği faydalar hakkında daha fazla bilgi edinmek için lütfen Ubuntu 18.04'te HTTP/2 Desteğiyle Nginx Kurulumu girişini okuyun.

Bu blok ayrıca, nginx-conf/options-ssl-nginx.conf dosyasında sakladığınız önerilen Certbot güvenlik parametreleriyle birlikte SSL sertifikanızı ve anahtar konumlarınızı da içerir.

Ek olarak, SSL Labs ve Güvenlik Başlıkları sunucu test siteleri gibi platformlarda A notu almanızı sağlayacak bazı güvenlik başlıkları da eklenmiştir. Bu başlıklar arasında X-Frame-Options, X-Content-Type-Options, Referrer Policy, Content-Security-Policy ve X-XSS-Protection bulunur. HTTP Strict Transport Security (HSTS) başlığı açıklanmıştır; yalnızca kavramları anlıyor ve "ön yükleme" işlevini değerlendirdiyseniz etkinleştirin.

Kök ve dizin yönergeleriniz de bu blokta bulunur; 1. Adımda ele alınan WordPress'e özgü konum bloklarının geri kalanı da bu blokta bulunur. Düzenlemeyi bitirdikten sonra dosyayı kaydedip kapatın.

Web sunucusu hizmetini yeniden oluşturmadan önce, web sunucusu hizmet tanımınıza 443 port eşlemesini eklemeniz gerekir.

docker-compose.yml dosyanızı açın:

nano docker-compose.yml

Web sunucusu servis tanımına aşağıdaki port eşlemesini ekleyin:

...
webserver:
depends_on:
- wordpress
image: nginx:1.15.12-alpine
container_name: webserver
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- wordpress:/var/www/html
- ./nginx-conf:/etc/nginx/conf.d
- certbot-etc:/etc/letsencrypt
networks:
- app-network

Düzenlemeden sonra docker-compose.yml dosyasının tamamı şu şekilde:

version: '3'

services:
  db:
    image: mysql:8.0
    container_name: db
    restart: unless-stopped
    env_file: .env
    environment:
      - MYSQL_DATABASE=wordpress
    volumes:
      - dbdata:/var/lib/mysql
    command: '--default-authentication-plugin=mysql_native_password'
    networks:
      - app-network

  wordpress:
    depends_on:
      - db
    image: wordpress:5.1.1-fpm-alpine
    container_name: wordpress
    restart: unless-stopped
    env_file: .env
    environment:
      - WORDPRESS_DB_HOST=db:3306
      - WORDPRESS_DB_USER=$MYSQL_USER
      - WORDPRESS_DB_PASSWORD=$MYSQL_PASSWORD
      - WORDPRESS_DB_NAME=wordpress
    volumes:
      - wordpress:/var/www/html
    networks:
      - app-network

  webserver:
    depends_on:
      - wordpress
    image: nginx:1.15.12-alpine
    container_name: webserver
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - wordpress:/var/www/html
      - ./nginx-conf:/etc/nginx/conf.d
      - certbot-etc:/etc/letsencrypt
    networks:
      - app-network

  certbot:
    depends_on:
      - webserver
    image: certbot/certbot
    container_name: certbot
    volumes:
      - certbot-etc:/etc/letsencrypt
      - wordpress:/var/www/html
    command: certonly --webroot --webroot-path=/var/www/html --email sammy@your_domain --agree-tos --no-eff-email --force-renewal -d your_domain -d www.your_domain

volumes:
  certbot-etc:
  wordpress:
  dbdata:

networks:
  app-network:
    driver: bridge

Düzenlemeyi bitirdiğinizde dosyayı kaydedip kapatın.

Web sunucusu hizmetini yeniden oluşturun:

docker-compose up -d --force-recreate --no-deps webserver

Servislerinizi docker-compose ps ile kontrol edin:

docker-compose ps

Çıktıda veritabanınızın, wordpress'inizin ve web sunucunuzun servislerinin çalıştığı gösterilmelidir:

Output
Name Command State Ports
----------------------------------------------------------------------------------------------
certbot certbot certonly --webroot ... Exit 0
db docker-entrypoint.sh --def ... Up 3306/tcp, 33060/tcp
webserver nginx -g daemon off; Up 0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
wordpress docker-entrypoint.sh php-fpm Up 9000/tcp

Konteynerler çalışırken, WordPress kurulumunuzu web arayüzü üzerinden tamamlayabilirsiniz.

Adım 6 – Web arayüzü üzerinden kurulumu tamamlayın

Konteynerleriniz çalışırken WordPress web arayüzü üzerinden kurulumu tamamlayın.

Web tarayıcınızda sunucunuzun etki alanına gidin. your_domain ifadesini etki alanı adınızla değiştirmeyi unutmayın:

https://your_domain

Kullanmak istediğiniz dili seçin:


Devam'a tıkladıktan sonra, siteniz için bir ad ve kullanıcı adı seçmeniz gereken ana kurulum sayfasına yönlendirileceksiniz. Burada akılda kalıcı bir kullanıcı adı ("admin" yerine) ve güçlü bir parola seçmeniz iyi bir fikirdir. WordPress'in otomatik olarak oluşturduğu parolayı kullanabilir veya kendi parolanızı oluşturabilirsiniz. Son olarak, e-posta adresinizi girmeniz ve arama motorlarının sitenizi dizine eklemesini engellemek isteyip istemediğinize karar vermeniz gerekecektir:


Sayfanın alt kısmındaki WordPress'i Yükle'ye tıkladığınızda bir oturum açma istemine yönlendirileceksiniz:


Giriş yaptıktan sonra WordPress yönetici paneline erişebileceksiniz:


WordPress kurulumunuzu tamamladıktan sonra SSL sertifikalarınızın otomatik olarak yenilenmesini sağlamak için adımlar atabilirsiniz.

7. Adım – Sertifikaların Yenilenmesi

Let's Encrypt sertifikaları 90 gün geçerlidir. Sertifikaların süresinin dolmamasını sağlamak için otomatik yenileme süreci ayarlayabilirsiniz. Bunu yapmanın bir yolu, bir cron işi oluşturmaktır. Aşağıdaki örnekte, sertifikalarınızı yenileyen ve Nginx yapılandırmanızı yeniden yükleyen bir betiği periyodik olarak çalıştıran bir cron işi oluşturuyorsunuz.

Öncelikle ssl_renew.sh adlı betiği açın:

nano ssl_renew.sh

Sertifikalarınızı yenilemek ve web sunucusu yapılandırmanızı yeniden yüklemek için betiğe aşağıdaki kodu ekleyin. Buradaki örnek kullanıcı adını, kök olmayan kullanıcı adınızla değiştirmeyi unutmayın:

#!/bin/bash

COMPOSE="/usr/local/bin/docker-compose --no-ansi"
DOCKER="/usr/bin/docker"

cd /home/sammy/wordpress/
$COMPOSE run certbot renew --dry-run && $COMPOSE kill -s SIGHUP webserver
$DOCKER system prune -af

Bu betik önce docker-compose ikili dosyasını COMPOSE adlı bir değişkene atar ve docker-compose komutlarını ANSI kontrol karakterleri olmadan çalıştıran --no-ansi seçeneğini belirtir. Ardından aynı işlemi docker ikili dosyasıyla yapar. Son olarak, ~/wordpress proje dizinine geçer ve aşağıdaki docker-compose komutlarını çalıştırır:

  •  docker-compose: Bu, bir certbot kapsayıcısı başlatır ve certbot hizmet tanımınızda belirtilen komutu geçersiz kılar. certonly alt komutu yerine, süresi dolmak üzere olan sertifikaları yenileyen renew alt komutu kullanılır. Ayrıca, betiğinizi test etmek için --dry-run seçeneğini de içerir.
  • docker-compose öldürme: Bu, Nginx yapılandırmasını yeniden yüklemek için web sunucusu konteynerine bir SIGHUP sinyali gönderir.

Sistem daha sonra kullanılmayan tüm kapsayıcıları ve görüntüleri kaldırmak için docker prune'u çalıştırır.

Dosyayı düzenlemeyi bitirdikten sonra kapatın. Aşağıdaki komutla çalıştırılabilir hale getirin:

chmod +x ssl_renew.sh

Ardından, yenileme betiğini belirtilen zaman aralığında çalıştırmak için kök crontab dosyanızı açın:

sudo crontab -e

Bu dosyayı ilk defa düzenliyorsanız, bir düzenleyici seçmeniz istenecektir:

Output
no crontab for root - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.basic
  3. /usr/bin/vim.tiny
  4. /bin/ed

Choose 1-4 [1]:
...

Bu dosyanın sonuna şu satırı ekleyin:

...
*/5 * * * * /home/sammy/wordpress/ssl_renew.sh >> /var/log/cron.log 2>&1

Bu, iş aralığını her beş dakikada bir olarak ayarlar, böylece uzantı isteğinizin istediğiniz gibi çalışıp çalışmadığını kontrol edebilirsiniz. İşin ilgili çıktısını kaydetmek için cron.log adlı bir günlük dosyası oluşturulur.

Beş dakika sonra, uzantı isteğinin başarılı olup olmadığını doğrulamak için cron.log dosyasını kontrol edin:

tail -f /var/log/cron.log

Aşağıdaki çıktı, başarılı bir genişletmeyi onaylar:

Output
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates below have not been saved.)

Congratulations, all renewals succeeded. The following certs have been renewed:
  /etc/letsencrypt/live/your_domain/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates above have not been saved.)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Terminalinizde CTRL+C'ye basarak çıkın.

Crontab dosyasını günlük bir aralık belirleyecek şekilde düzenleyebilirsiniz. Örneğin, betiği her gün öğlen çalıştırmak için dosyanın son satırını şu şekilde değiştirin:

...
0 12 * * * /home/sammy/wordpress/ssl_renew.sh >> /var/log/cron.log 2>&1

Ayrıca ssl_renew.sh betiğinizden --dry-run seçeneğini de kaldırmak isteyebilirsiniz:

#!/bin/bash

COMPOSE="/usr/local/bin/docker-compose --no-ansi"
DOCKER="/usr/bin/docker"

cd /home/sammy/wordpress/
$COMPOSE run certbot renew && $COMPOSE kill -s SIGHUP webserver
$DOCKER system prune -af

Cron işiniz, Let's Encrypt sertifikalarınızın vadesi geldiğinde yenilenerek süresinin dolmamasını sağlar. Ayrıca, günlük dosyalarınızı döndürmek ve sıkıştırmak için Ubuntu 22.04 / 20.04'teki Logrotate aracını kullanarak günlük döndürme özelliğini de ayarlayabilirsiniz.

Sonuç

Bu eğitimde, Docker Compose kullanarak Nginx web sunucusuyla bir WordPress kurulumu oluşturdunuz. Bu iş akışının bir parçası olarak, WordPress sitenizle ilişkilendirmek istediğiniz alan adı için TLS/SSL sertifikaları edindiniz. Ayrıca, gerektiğinde bu sertifikaları yenilemek için bir cron işi oluşturdunuz.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Ayrıca Şunları da Beğenebilirsiniz