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 #

AspekLocal DevelopmentProduction
Serverrackup / pumapuma
ReloadAktifTidak
DebugAktifDimatikan
Image sizeTidak kritisPenting

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 #

  1. Jalankan stack:

    docker compose up --build
    
  2. Akses aplikasi:

    http://localhost:4567
    
  3. Edit kode

  4. Reload otomatis


Anti-Pattern #

  1. Menjadikan Sinatra sebagai Rails mini
  2. Tidak menggunakan Rack
  3. Tidak mount volume
  4. 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
About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact