Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# Git関連
.git
.gitignore

# Docker関連
Dockerfile
docker-compose.yml
.dockerignore

# ログファイル
log/*
*.log

# 一時ファイル
tmp/*
!tmp/.keep

# 依存関係
node_modules
vendor/bundle

# データベース
db/*.sqlite3
db/*.sqlite3-journal

# 環境変数
.env
.env.local
.env.*.local

# IDE設定
.vscode
.idea

# OS関連
.DS_Store
Thumbs.db

# テスト関連
coverage
.nyc_output

# その他
README.md
22 changes: 22 additions & 0 deletions .env.docker
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Docker用環境変数設定

# Rails設定
RAILS_ENV=development
RAILS_SERVE_STATIC_FILES=true

# データベース設定
DATABASE_HOST=db
DATABASE_USERNAME=ajax_app
DATABASE_PASSWORD=password
DATABASE_NAME=ajax_app_development

# Redis設定
REDIS_URL=redis://redis:6379/0

# セキュリティ設定
SECRET_KEY_BASE=your_secret_key_base_here
RAILS_MASTER_KEY=your_master_key_here

# その他の設定
RAILS_MAX_THREADS=5
WEB_CONCURRENCY=2
40 changes: 40 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# Ruby 3.2.0の公式イメージを使用
FROM ruby:3.2.0

# 必要なパッケージをインストール
RUN apt-get update -qq && \
apt-get install -y \
build-essential \
libpq-dev \
nodejs \
npm \
default-mysql-client \
vim \
&& rm -rf /var/lib/apt/lists/*

# 作業ディレクトリを設定
WORKDIR /app

# GemfileとGemfile.lockをコピー
COPY Gemfile Gemfile.lock ./

# Bundlerをインストール
RUN gem install bundler

# 依存関係をインストール
RUN bundle install

# package.jsonとyarn.lockをコピー
COPY package.json ./

# Node.jsの依存関係をインストール
RUN npm install

# アプリケーションのコードをコピー
COPY . .

# ポート3000を公開
EXPOSE 3000

# アプリケーションを起動
CMD ["rails", "server", "-b", "0.0.0.0"]
16 changes: 9 additions & 7 deletions config/database.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,20 +13,22 @@ default: &default
adapter: mysql2
encoding: utf8mb4
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password:
username: <%= ENV.fetch("DATABASE_USERNAME") { "root" } %>
password: <%= ENV.fetch("DATABASE_PASSWORD") { "" } %>
host: <%= ENV.fetch("DATABASE_HOST") { "localhost" } %>
port: <%= ENV.fetch("DATABASE_PORT") { 3306 } %>
socket: /tmp/mysql.sock

development:
<<: *default
database: ajax_app_development
database: <%= ENV.fetch("DATABASE_NAME") { "ajax_app_development" } %>

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
<<: *default
database: ajax_app_test
database: <%= ENV.fetch("DATABASE_NAME") { "ajax_app_test" } %>

# As with config/credentials.yml, you never want to store sensitive information,
# like your database password, in your source code. If your source code is
Expand All @@ -49,6 +51,6 @@ test:
#
production:
<<: *default
database: ajax_app_production
username: ajax_app
password: <%= ENV['FIRST_APP_DATABASE_PASSWORD'] %>
database: <%= ENV.fetch("DATABASE_NAME") { "ajax_app_production" } %>
username: <%= ENV.fetch("DATABASE_USERNAME") { "ajax_app" } %>
password: <%= ENV.fetch("DATABASE_PASSWORD") { ENV['FIRST_APP_DATABASE_PASSWORD'] } %>
74 changes: 74 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
version: '3.8'

services:
# MySQLデータベース
db:
image: mysql:8.0
container_name: rails_mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: ajax_app_development
MYSQL_USER: ajax_app
MYSQL_PASSWORD: password
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
- ./docker/mysql/init:/docker-entrypoint-initdb.d
networks:
- rails_network

# Redis(オプション - Action Cable用)
redis:
image: redis:7-alpine
container_name: rails_redis
restart: always
ports:
- "6379:6379"
volumes:
- redis_data:/data
networks:
- rails_network

# Railsアプリケーション
web:
build: .
container_name: rails_app
restart: always
ports:
- "3000:3000"
environment:
- RAILS_ENV=development
- DATABASE_HOST=db
- DATABASE_USERNAME=ajax_app
- DATABASE_PASSWORD=password
- DATABASE_NAME=ajax_app_development
- REDIS_URL=redis://redis:6379/0
volumes:
- .:/app
- /app/node_modules
- /app/tmp
- /app/log
depends_on:
- db
- redis
networks:
- rails_network
command: >
sh -c "
bundle install &&
npm install &&
rails db:create &&
rails db:migrate &&
rails db:seed &&
rails server -b 0.0.0.0
"

volumes:
mysql_data:
redis_data:

networks:
rails_network:
driver: bridge
140 changes: 140 additions & 0 deletions docker/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
# Docker実行環境

このプロジェクトはDockerを使用してRailsアプリケーションを実行するための環境を提供します。

## 構成

- **Rails 7.0** (Ruby 3.2.0)
- **MySQL 8.0** (データベース)
- **Redis 7** (キャッシュ・セッション管理)
- **Node.js** (フロントエンド資産のビルド)

## セットアップ手順

### 1. 前提条件

- Docker
- Docker Compose

### 2. 環境の起動

```bash
# コンテナをビルドして起動
docker-compose up --build

# バックグラウンドで起動
docker-compose up -d --build
```

### 3. 初回セットアップ

初回起動時は以下のコマンドでデータベースをセットアップします:

```bash
# データベースの作成とマイグレーション
docker-compose exec web rails db:create
docker-compose exec web rails db:migrate
docker-compose exec web rails db:seed
```

### 4. アプリケーションへのアクセス

- **Rails アプリケーション**: http://localhost:3000
- **MySQL**: localhost:3306
- **Redis**: localhost:6379

## よく使用するコマンド

### コンテナの管理

```bash
# コンテナの起動
docker-compose up

# コンテナの停止
docker-compose down

# コンテナの再起動
docker-compose restart

# ログの確認
docker-compose logs -f web
```

### Rails コマンドの実行

```bash
# Rails コンソール
docker-compose exec web rails console

# データベースマイグレーション
docker-compose exec web rails db:migrate

# テストの実行
docker-compose exec web rails test

# ジェネレーターの実行
docker-compose exec web rails generate model User name:string
```

### データベースの管理

```bash
# MySQL に接続
docker-compose exec db mysql -u ajax_app -p ajax_app_development

# データベースのリセット
docker-compose exec web rails db:drop db:create db:migrate db:seed
```

## トラブルシューティング

### ポートが既に使用されている場合

`docker-compose.yml`のポート設定を変更してください:

```yaml
ports:
- "3001:3000" # 3000番ポートが使用されている場合
```

### データベース接続エラー

1. MySQLコンテナが起動しているか確認:
```bash
docker-compose ps
```

2. データベースのログを確認:
```bash
docker-compose logs db
```

### ボリュームのリセット

データベースを完全にリセットしたい場合:

```bash
# コンテナとボリュームを削除
docker-compose down -v

# 再起動
docker-compose up --build
```

## 開発時の注意点

- コードの変更は自動的に反映されます(ホットリロード)
- `node_modules`はボリュームマウントから除外されています
- ログファイルは`log/`ディレクトリに保存されます
- データベースのデータは永続化されます(`mysql_data`ボリューム)

## 本番環境へのデプロイ

本番環境では以下の点に注意してください:

1. 環境変数の適切な設定
2. セキュリティキーの設定
3. データベースのバックアップ戦略
4. ログの管理
5. リソース制限の設定
20 changes: 20 additions & 0 deletions docker/mysql/init/01-init.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
-- MySQL初期化スクリプト
-- データベースとユーザーの作成

-- データベースの作成(既にdocker-compose.ymlで作成済み)
-- CREATE DATABASE IF NOT EXISTS ajax_app_development;
-- CREATE DATABASE IF NOT EXISTS ajax_app_test;
-- CREATE DATABASE IF NOT EXISTS ajax_app_production;

-- ユーザーの権限設定(既にdocker-compose.ymlで作成済み)
-- GRANT ALL PRIVILEGES ON ajax_app_development.* TO 'ajax_app'@'%';
-- GRANT ALL PRIVILEGES ON ajax_app_test.* TO 'ajax_app'@'%';
-- GRANT ALL PRIVILEGES ON ajax_app_production.* TO 'ajax_app'@'%';

-- 文字セットの設定
ALTER DATABASE ajax_app_development CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER DATABASE ajax_app_test CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER DATABASE ajax_app_production CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- タイムゾーンの設定
SET time_zone = '+00:00';
Loading