はじめに
Rails を始めたいけれど「環境構築が大変そう…」と感じたことはありませんか?
今回は Docker Compose を使って Rails 8 + MySQL の環境を用意し、Shlink(オープンソースのURL短縮サービス)のUIを作る準備までを一歩ずつ解説します。
この記事を読めば、
- Docker Compose で Rails と MySQL をまとめて動かす
- Rails 8 の新規アプリを MySQL 前提で作る
- importmap / Turbo / Stimulus / Tailwind を後から追加してモダンUI基盤を整える
という流れをコピペで再現できます。
本記事はシリーズの 第1回(環境構築編)。
次回は実際に Shlink API とつないで、長いURLを入力すると短縮URLを返す Bitly風UIを実装していきます。
ソースコード全体はこちら👇
👉 https://github.com/enjoydarts/shlink-ui-rails
事前準備
この記事では Docker Compose を使います。
まず Docker Desktop をインストールしてください。
- macOS の方 → Docker for Mac (Docker Desktop)
- Windows の方 → Docker for Windows (Docker Desktop)
- Windows では WSL2(Windows Subsystem for Linux 2)の有効化が必要です。Docker Desktop インストーラが案内してくれるので、指示通り進めればOK。
インストール後、以下で動作確認します:
docker --version
docker compose version
どちらもバージョンが表示されれば準備完了です。
プロジェクトを作成する
作業用ディレクトリを作成します。
mkdir shlink-ui-rails && cd shlink-ui-rails
Dockerfile を作る
FROM ruby:3.4-bullseye
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential git curl \
libmariadb-dev-compat libmariadb-dev \
libyaml-dev libreadline-dev zlib1g-dev pkg-config \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
RUN gem install bundler
EXPOSE 3000
CMD ["bash","-lc","bundle exec rails s -b 0.0.0.0 -p 3000"]
compose.yaml を作る
Rails(web)、MySQL(db)、Tailwind watcher(css)の3サービス構成にします。
services:
db:
image: mysql:8.4
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: shlink_ui_rails_development
MYSQL_USER: app
MYSQL_PASSWORD: apppass
volumes:
- dbdata:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "-prootpass"]
interval: 5s
timeout: 3s
retries: 30
web:
build: .
depends_on:
db:
condition: service_healthy
environment:
RAILS_ENV: development
ports:
- "3000:3000"
volumes:
- ./:/app
- bundle:/usr/local/bundle
tty: true
stdin_open: true
css:
build: .
command: bin/rails tailwindcss:watch
volumes:
- ./:/app
- bundle:/usr/local/bundle
tty: true
volumes:
dbdata:
bundle:
👉 こうすると docker compose up
だけで Rails と Tailwind watcher が同時に動きます。
Rails を新規作成する
まずビルドします。
docker compose build
Rails をインストール:
docker compose run --rm --no-deps web gem install rails
新規アプリ作成(MySQL前提、最初はJSを抜く):
docker compose run --rm web rails new . \
--database=mysql --skip-system-test --skip-javascript
chmod +x bin/*
docker compose run --rm web bundle install
DB設定を整える
config/database.yml
を編集:
default: &default
adapter: mysql2
encoding: utf8mb4
pool: <%= ENV.fetch("RAILS_MAX_THREADS", 5) %>
host: <%= ENV.fetch("DATABASE_HOST", "db") %>
username: <%= ENV.fetch("DATABASE_USER", "app") %>
password: <%= ENV.fetch("DATABASE_PASSWORD", "apppass") %>
port: 3306
development:
<<: *default
database: <%= ENV.fetch("DATABASE_NAME", "shlink_ui_rails_development") %>
DBを作成:
docker compose run --rm web bin/rails db:create
JS/CSS を後から追加する
Rails 8 は最初に JS を抜いて作っても、後から簡単に追加できます。ここでは 4 つの要素を導入します。
importmap-rails
Rails が公式で採用している仕組みで、Node や npm なしで JavaScript を管理できます。
ES Modules と組み合わせて、Rails らしい「設定より規約」でライブラリを読み込めます。
docker compose run --rm --no-deps web bundle add importmap-rails
docker compose run --rm --no-deps web rails importmap:install
Turbo (turbo-rails)
Hotwire の中核。ページ全体をリロードせずに 差分だけを更新できる仕組みです。
フォーム送信や部分的なリロードを、シングルページアプリに近い操作感で実現します。
docker compose run --rm --no-deps web bundle add turbo-rails
docker compose run --rm --no-deps web rails turbo:install
Stimulus (stimulus-rails)
Hotwire のもう一つの柱。小さなUIの動きをHTMLに直結して書けるJSフレームワークです。
例えば「ボタンを押したらコピー」「ロード中はスピナーを回す」といった振る舞いを、HTML属性ベースで簡単に記述できます。
docker compose run --rm --no-deps web bundle add stimulus-rails
docker compose run --rm --no-deps web rails stimulus:install
Tailwind CSS
いまや標準になりつつある ユーティリティファーストCSSフレームワーク。.bg-gray-50 .p-4 .rounded-lg
のようにクラスを組み合わせるだけでデザインを作れます。tailwindcss-rails
gem を使えば Node 環境を用意しなくても導入可能です。
docker compose run --rm --no-deps web bundle add tailwindcss-rails tailwindcss-ruby
docker compose run --rm --no-deps web rails tailwindcss:install
レイアウトを確認する
app/views/layouts/application.html.erb
はこうなっていればOKです。
<!DOCTYPE html>
<html>
<head>
<title>shlink-ui-rails</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<%= csrf_meta_tags %>
<%= csp_meta_tag %>
<%= stylesheet_link_tag "tailwind", "data-turbo-track": "reload" %>
<%= javascript_importmap_tags %>
</head>
<body class="bg-gray-50 text-gray-900">
<%= yield %>
</body>
</html>
起動する
docker compose up
ブラウザで http://localhost:3000 を開き、Railsの画面が出れば準備完了。
ログに tailwindcss ... watching for changes
と出ていればCSSも自動ビルドされています。
まとめ
ここまでで、
- Docker Desktop をインストールし、Docker Compose が使える環境を整えた
- Dockerfile / compose.yaml を用意して Rails + MySQL を動かした
rails new --database=mysql
で新規アプリを作成し、DB接続を確認した- importmap / Turbo / Stimulus / Tailwind を追加してモダンUIの基盤を整えた
という流れを一通り体験できました。
次回はこの環境をベースに Shlink API と連携して URL 短縮UIを実装する実践編に進みます。
Bitly風のフォームを Rails で作ってみましょう!
👉 完成版コードはこちら
https://github.com/enjoydarts/shlink-ui-rails
コメント