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.