Setup Nginx Free SSL menggunakan Lets encrypt with Certbot di dalam docker

Let’s Encrypt adalah penyedia sertifikat SSL gratis yang telah digunakan oleh banyak website. ada beberapa cara untuk meninstall ke website yang kita miliki. ada yang menggunakan cara manual atau otomatis seperti Certbot yang bisa menggenerate Sertifikat SSL secara otomatis.

Kita akan mengiplementasikan Certbot menggunakan Docker dan Docker Compose. Untuk web server kita akan menggunakan Nginx.

Pertama siapkan website yang sudah terdapat file “docker-composer.yml”. pada contohnya saya akan menggunakan laravel sebagai contoh projectnya.

buat file “docker-compose.yml” dengan isi sebagai berikut:

version: "3.8"

services:

  app:
    build: .docker
    container_name: my_app
    volumes:
      - ./:/var/www
    working_dir: /var/www
    restart: always
    environment: 
      - TZ=Asia/Jakarta

  nginx:
    image: nginx:latest
    volumes:
      - ./:/var/www
      - ./nginxconf:/etc/nginx/conf.d/default.conf
      - ./log/nginx:/var/log/nginx
      - ./certbot/conf:/etc/nginx/ssl
      - ./certbot/data:/var/www/certbot
    working_dir: /var/www
    ports:
      - 80:80
      - 443:443
    depends_on:
      - app
    environment: 
      - TZ=Asia/Jakarta

  certbot:
    image: certbot/certbot
    command: certonly --webroot --webroot-path=/var/www/certbot --email [email protected] --agree-tos --no-eff-email -d domain.com
    volumes:
      - ./certbot/conf:/etc/letsencrypt
      - ./certbot/logs:/var/log/letsencrypt
      - ./certbot/data:/var/www/certbot
    depends_on:
      - nginx

Kemudian buatfile nginx.conf di dalam root project kita dengan settingan sebagai berikut ini:

upstream php-upstream {
    server my_app:9000;
}
server {

    listen 80;

    server_name namadomain.com www.namadomain.com;
    root /var/www/public;
    index index.php;


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


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


    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_pass php-upstream;
        fastcgi_index index.php;
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        #fixes timeouts
        fastcgi_read_timeout 600;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }
}

server {
    listen 443 ssl;
    server_name namadomain.com www.namadomain.com;
    root /var/www/public;
    index index.php;


    ssl_certificate /etc/nginx/ssl/live/namadomain.com/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/live/namadomain.com/privkey.pem;

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

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

    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_pass php-upstream;
        fastcgi_index index.php;
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        #fixes timeouts
        fastcgi_read_timeout 600;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }
}


Kemudian jalankan menggunakan perintah “docker-compose up –build” atau “docker-compose up –build -d”.

Certbot akan berjalan dengan lancar apabila di jalankan di server yang sudah live sebelumnya menggunakan http. karena ada verifikasi dari Let’s Encrypt yang mengarah ke website kita.