おすすめの書籍を投稿し、いいねやコメントで交流できるWebアプリケーションです。
| カテゴリ | 技術 |
|---|---|
| Backend | Ruby on Rails 7.1 |
| Database | PostgreSQL |
| CSS | Tailwind CSS |
| 認証 | has_secure_password(自前実装) |
| 画像 | Active Storage + Cloudinary |
| 開発環境 | Docker Compose |
| 本番環境 | Render + Neon + Cloudinary |
- ユーザー登録・ログイン・ログアウト
- 書籍投稿(タイトル、著者、おすすめポイント、画像)
- いいね機能(非同期)
- コメント機能(非同期)
- Docker Desktop
- Git
git clone git@github.com:runteq/bookshelf_sample.git
cd bookshelf_sampledocker compose up初回起動時はイメージのビルドに数分かかります。
別のターミナルを開いて実行:
docker compose run --rm web rails db:create db:migrate# 起動(フォアグラウンド)
docker compose up
# 起動(バックグラウンド)
docker compose up -d
# 停止
docker compose down
# ログ確認
docker compose logs -f web# コンソール
docker compose run --rm web rails console
# マイグレーション
docker compose run --rm web rails db:migrate
# DBリセット
docker compose run --rm web rails db:reset
# ルート確認
docker compose run --rm web rails routesdocker compose build
docker compose up以下の無料サービスを使用します:
| サービス | 用途 | 無料枠 |
|---|---|---|
| Render | アプリホスティング | 750時間/月 |
| Neon | PostgreSQL | 0.5GB |
| Cloudinary | 画像ストレージ | 25GB |
- https://neon.tech にアクセス
- 「Sign Up」→ GitHubまたはGoogleでサインアップ
- 「Create a project」をクリック
- 設定:
- Project name:
bookshelf - Region:
Asia Pacific (Singapore)
- Project name:
- 「Create project」をクリック
ダッシュボードの「Connection Details」から「Connection string」をコピー:
postgresql://username:password@ep-xxx.ap-southeast-1.aws.neon.tech/neondb?sslmode=require
⚠️ この文字列は後でDATABASE_URLとして使用します
- https://cloudinary.com にアクセス
- 「Sign up for free」からアカウント作成
- ダッシュボードにログイン
- 画面上部の「API Environment variable」をコピー:
cloudinary://123456789012345:abcdefghijk@cloud_name
⚠️ この文字列は後でCLOUDINARY_URLとして使用します
- https://render.com にアクセス
- GitHubアカウントでサインアップ
- ダッシュボードで「New +」→「Web Service」
- 「Build and deploy from a Git repository」を選択
- GitHubリポジトリ
posts_sampleを選択 - 以下を設定:
| 項目 | 値 |
|---|---|
| Name | bookshelf(任意) |
| Region | Singapore (Southeast Asia) |
| Branch | main |
| Runtime | Ruby |
| Build Command | ./bin/render-build.sh |
| Start Command | bundle exec puma -C config/puma.rb |
| Instance Type | Free |
「Environment」セクションで「Add Environment Variable」をクリックし、以下を追加:
| Key | Value |
|---|---|
DATABASE_URL |
Step 1で取得したNeonの接続文字列 |
RAILS_MASTER_KEY |
下記コマンドで取得した値 |
CLOUDINARY_URL |
Step 2で取得したCloudinaryの接続文字列 |
RAILS_MASTER_KEY の取得方法:
cat config/master.key「Create Web Service」をクリック
初回デプロイには5〜10分かかります。完了後、発行されたURL(https://bookshelf-xxxx.onrender.com)にアクセスできます。
services:
db:
image: postgres:15
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
volumes:
- postgres_data:/var/lib/postgresql/data
web:
build: .
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails server -b '0.0.0.0'"
volumes:
- .:/app
- bundle_data:/usr/local/bundle
ports:
- "3000:3000"
depends_on:
- db
environment:
DATABASE_URL: postgres://postgres:password@db:5432
RAILS_ENV: development
tty: true
stdin_open: true
volumes:
postgres_data:
bundle_data:FROM ruby:3.2.2
RUN apt-get update -qq && apt-get install -y \
nodejs \
npm \
postgresql-client \
&& npm install -g yarn
WORKDIR /app
COPY Gemfile Gemfile.lock ./
RUN bundle install
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000
CMD ["rails", "server", "-b", "0.0.0.0"]#!/bin/bash
set -e
rm -f /app/tmp/pids/server.pid
exec "$@"#!/usr/bin/env bash
set -o errexit
bundle install
bundle exec rails assets:precompile
bundle exec rails assets:clean
bundle exec rails db:migrateproduction:
<<: *default
url: <%= ENV["DATABASE_URL"] %>cloudinary:
service: Cloudinary
folder: <%= Rails.env %>services:
- type: web
name: bookshelf
runtime: ruby
buildCommand: "./bin/render-build.sh"
startCommand: "bundle exec puma -C config/puma.rb"
envVars:
- key: DATABASE_URL
sync: false
- key: RAILS_MASTER_KEY
sync: false
- key: CLOUDINARY_URL
sync: false# 使用中のプロセスを確認
lsof -i :3000
# プロセスを終了
kill -9 <PID># コンテナを再起動
docker compose down
docker compose updocker compose build
docker compose upRenderのログを確認:
Dashboard → サービス名 → Logs
よくある原因:
DATABASE_URLが間違っているRAILS_MASTER_KEYが設定されていないCLOUDINARY_URLのフォーマットが間違っている
- Cloudinaryダッシュボードで使用量を確認
CLOUDINARY_URLが正しく設定されているか確認
- Neonのダッシュボードでプロジェクトがアクティブか確認
- 接続文字列に
?sslmode=requireが含まれているか確認
Renderの無料プランでは15分間アクセスがないとスリープします。 初回アクセス時に起動まで30秒〜1分かかることがあります。
| 変数名 | 用途 | 設定場所 |
|---|---|---|
DATABASE_URL |
PostgreSQL接続 | Render |
RAILS_MASTER_KEY |
credentials復号 | Render |
CLOUDINARY_URL |
画像ストレージ | Render |
RAILS_ENV |
環境指定 | 自動設定 |
MIT