Sinatra #
Sinatra adalah framework web Ruby yang sangat minimalis. Tidak se-opinionated Rails, tidak membawa banyak abstraksi, dan sangat dekat dengan HTTP itu sendiri. Sinatra sering dipilih untuk:
- API sederhana
- Microservice
- Internal tools
- Service dengan scope kecil dan jelas
Namun justru karena kesederhanaannya, setup local development Sinatra sering kali tidak distandarkan:
- Versi Ruby berbeda-beda
- Cara menjalankan app berbeda (ruby app.rb, rackup, puma)
- Dependency native sering bentrok
- Setup database manual
Di sinilah Dockerfile dan Docker Compose menjadi fondasi penting agar environment lokal konsisten, reproducible, dan mudah di-maintain.
Artikel ini membahas secara mendetail dan rinci:
- Dockerfile Ruby Sinatra khusus local development
- Docker Compose sebagai orkestrator environment lokal
- Workflow development Sinatra yang efisien
- Best practice dan anti-pattern yang sering terjadi
Fokus utama artikel ini adalah Docker Compose untuk local development, bukan production.
Filosofi Docker Sinatra #
Tujuan utama Docker di local development Sinatra:
- Menyamakan versi Ruby dan OS
- Menghindari konflik native dependency
- Mempermudah onboarding developer baru
- Menjaga kesederhanaan workflow
Bukan tujuan utama:
- Image sekecil mungkin
- Hardening security ekstrem
- Setup production-grade
Local development mengutamakan kesederhanaan dan konsistensi, bukan optimasi runtime.
Gambaran Arsitektur #
Arsitektur umum Sinatra lokal:
Developer
|
v
Docker Compose
|
+--> sinatra-app (rack / puma)
|
+--> database (PostgreSQL / MySQL)
Struktur Project Sinatra #
Contoh struktur project Sinatra yang rapi dan scalable:
.
├── app.rb
├── config.ru
├── Gemfile
├── Gemfile.lock
├── Dockerfile
├── docker-compose.yml
├── .env
└── .dockerignore
Sinatra sengaja dibiarkan sederhana — struktur yang terlalu kompleks justru anti-pattern.
Karakteristik Dockerfile Sinatra #
| Aspek | Local Development | Production |
|---|---|---|
| Server | rackup / puma | puma |
| Reload | Aktif | Tidak |
| Debug | Aktif | Dimatikan |
| Image size | Tidak kritis | Penting |
Kesalahan umum: menggunakan Dockerfile production untuk local development.
Dockerfile Sinatra #
Prinsip Dasar #
- Gunakan Ruby official image
- Install native dependency seperlunya
- Cache Gemfile
- Jalankan Rack server dengan reload
Contoh Dockerfile #
FROM ruby:3.3-slim
WORKDIR /app
# Install OS dependencies
RUN apt-get update -qq && apt-get install -y \
build-essential \
libpq-dev \
git \
curl \
&& rm -rf /var/lib/apt/lists/*
# Install bundler
RUN gem install bundler
# Cache gems
COPY Gemfile Gemfile.lock ./
RUN bundle install
# Copy source code
COPY . .
EXPOSE 4567
CMD ["bundle", "exec", "rackup", "-o", "0.0.0.0", "-p", "4567"]
Penjelasan Dockerfile #
1. Base Image #
FROM ruby:3.3-slim
- Versi Ruby eksplisit
- Image ringan
- Cocok untuk local dev
2. Native Dependency #
Native dependency diperlukan untuk:
- Build gem tertentu
- Database adapter (pg, mysql2)
3. Cache Gemfile #
COPY Gemfile Gemfile.lock ./
RUN bundle install
Ini adalah layer terpenting untuk mempercepat rebuild Docker.
4. Menjalankan Sinatra #
CMD ["bundle", "exec", "rackup"]
Rack akan menjalankan Sinatra dengan reload otomatis (di mode development).
Docker Compose #
Peran Docker Compose #
Docker Compose menyatukan:
- Sinatra app
- Database
- Environment variable
Dalam satu perintah.
Contoh docker-compose.yml #
version: "3.9"
services:
web:
container_name: sinatra-app
build:
context: .
dockerfile: Dockerfile
ports:
- "4567:4567"
volumes:
- .:/app
env_file:
- .env
depends_on:
- db
db:
image: postgres:16-alpine
container_name: postgres-db
environment:
POSTGRES_DB: app_development
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
Penjelasan docker-compose.yml #
1. Service Sinatra App #
Volume Mount #
volumes:
- .:/app
- Sinkronisasi source code
- Reload Sinatra berjalan optimal
Port Mapping #
ports:
- "4567:4567"
Akses aplikasi via http://localhost:4567.
2. Service Database #
- PostgreSQL image resmi
- Data persisten via volume
Workflow Development #
Jalankan stack:
docker compose up --buildAkses aplikasi:
http://localhost:4567Edit kode
Reload otomatis
Anti-Pattern #
- Menjadikan Sinatra sebagai Rails mini
- Tidak menggunakan Rack
- Tidak mount volume
- Setup Docker terlalu kompleks untuk app kecil
Best Practice #
1. Gunakan .dockerignore
#
.git
log/
tmp/
.env
2. Jaga Sinatra Tetap Minimal #
Jika logic mulai kompleks, pertimbangkan naik ke Rails API.
3. Pisahkan Config via ENV #
Gunakan ENV.fetch untuk konfigurasi.
Penutup #
Dockerfile dan Docker Compose untuk local development Ruby Sinatra seharusnya menekankan kesederhanaan, konsistensi, dan kecepatan iterasi.
Dengan setup yang tepat:
- Sinatra tetap ringan
- Environment lokal rapi
- Development terasa menyenangkan