近年、サブスクリプションビジネスに注目が集まるなか、新規事業でSaaSを開発する機会が増えてきました。しかし、新規事業でSaaSを開発する際に、はじめの開発環境の構築に時間がかかりがちです。そこで、新規事業のSaaSを始めるにあたって、私たちが具体的にどのようにして最短で開発環境を構築したかを振り返ってみました。
新規事業立ち上げは突然に(リリースまで2ヶ月!)
正月明けの初日、2019年1月7日(月)10時10分。
新規事業として、サブスクリプションビジネスの成長とともに顕在化する請求業務の課題を解決するSaaS「KIMERA(キメラ)」を立ち上げるためのキックオフミーティングをしました。
自社のサブスクリプションビジネスで請求業務に課題があったので、まずは自社の請求業務をKIMERAで置き換えていくことに。請求業務は毎月発生するため、最初の請求書発行機能のリリースを2019年2月末(リリースまで2ヶ月!)に設定しました。
実際のKIMERAのロードマップ
技術選定は慎重に
今回の新規事業では、SaaSとして展開できる技術を選定する必要がありまして、以下の基準で技術を選定していました。
枯れた技術
- 技術的な安全性や安定性を確保する
開発スピード
- ドキュメントが多く公開されていて学習コストが低い
- 世の中の先駆者たちが残してくれているノウハウが豊富
フレームワークやインフラの拡張性
- 今後の機能拡充や負荷対策への拡張性を確保する
技術選定の結果、KIMERAの技術スタックを以下のように定めて開発していくことにしました。
技術スタック
環境構築に使える時間は1日のみ
技術選定が終わったあとは、急ピッチで開発環境を整えて、開発をスタートしなければなりません。最初となる請求書発行機能のリリース予定が2019年2月末のため、残り時間が刻一刻と減っていきます。
リリース日から逆算すると、開発環境の構築に使えるのは、本日1日のみ。ゼロベースで環境構築していると間に合いません。
そこで、Dockerを利用して、CakePHPの開発環境をつくることにしました。
Dockerで環境構築を最短で
それでは、Docker環境を構築していきましょう。
ディレクトリ構成
ディレクトリとファイルは、以下の方針で作成します。
- 小回りがきくようにコンテナをWebとDB、phpMyAdminで分ける。
- 各コンテナ定義ファイルのディレクトリ配下で必要なファイル群を配置する。
├── app
└── index.php
├── dokcer
├── web
├── Dockerfile
├── conf.d
└── conf.d/000-default.conf
├── db
├── Dockerfile
└── phpmyadmin
├── Dockerfile
├── docker-compose.yml
Dockerコンテナのベースイメージ
Dockerコンテナのイメージをゼロから作ると時間がかかりますので、WebとDB、phpMyAdminのそれぞれで以下のベースイメージを利用します。
Webコンテナ(Apache):ベースイメージ php:7.0-apache
DBコンテナ(MySQL):ベースイメージ mysql:5.6
phpMyAdminコンテナ:ベースイメージ phpmyadmin/phpmyadmin
具体的なDockerファイルを作り込む
docker-compose.yml
WebとDB、phpMyAdminでコンテナを分けるため、コンテナ同士の依存関係をdepends_onで指定しておきます。
version: "2"
services:
web:
container_name: "kimera_web"
build: ./docker/web
links:
- db
depends_on:
- db
ports:
- "8765:8765"
volumes:
- ./:/var/www/html
- ./docker/web/conf.d/000-default.conf:/etc/apache2/sites-enabled/001-default.conf
working_dir: /var/www/html
environment:
DATABASE_URL: "mysql://kimera:kimera@db/kimera?timezone=Asia/Tokyo"
APP_DEFAULT_LOCALE: "ja_JP"
AWS_ACCESS_KEY_ID: ""
AWS_SECRET_ACCESS_KEY: ""
XDEBUG_CONFIG: remote_port=9001
hostname: webhost
db:
container_name: "kimera_db"
build: ./docker/db
ports:
- "3306:3306"
volumes:
- ./docker/db/data:/var/lib/mysql
- ./docker/db/conf.d:/etc/mysql/conf.d
- ./config/schema:/docker-entrypoint-initdb.d
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: kimera
MYSQL_USER: kimera
MYSQL_PASSWORD: kimera
hostname: db
phpmyadmin:
container_name: "kimera_phpmyadmin"
build: ./docker/phpmyadmin
environment:
- PMA_ARBITRARY=1
- PMA_HOST=db
- PMA_USER=root
- PMA_PASSWORD=root
links:
- db
depends_on:
- db
ports:
- 8080:80
volumes:
- ./docker/phpmyadmin/sessions:/sessions
web/Dockerfile
ベースイメージから作成されるコンテナに、事前にインストールしたいライブラリを指定しておくことで、開発に必要な環境を一気に作成できます。
FROM php:7.0-apache
RUN apt-get update && apt-get install -y vim git unzip libicu-dev \
&& a2enmod rewrite \
&& apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libmcrypt-dev libpng-dev libgd-dev \
&& docker-php-ext-configure intl \
&& docker-php-ext-install mbstring gettext intl pdo_mysql \
&& docker-php-ext-install -j$(nproc) iconv mcrypt \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd \
&& curl -sS https://getcomposer.org/installer | php \
&& mv composer.phar /usr/local/bin/composer \
&& rm -rf /var/cache/apk/*
CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
ENV CAKEPHP_ENV development
EXPOSE 8765 9001
web/conf.d/000-default.conf
Listen 8765
NameVirtualHost *:8765
ServerAdmin webmaster@test.com
DocumentRoot /var/www/html/app
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
Options FollowSymLinks
AllowOverride All
Require all granted
DirectoryIndex index.php
BrowserMatch "MSIE [2-6]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
# MSIE 7 and newer should be able to use keepalive
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
SetEnv CAKEPHP_ENV development
db/Dockerfile
FROM mysql:5.6
phpmyadmin/Dockerfile
FROM phpmyadmin/phpmyadmin
Docker x CakePHPの構築〜起動までは3ステップ
ここまででDocker環境の準備が整いましたので、最後に、CakePHPのソースコードを取得して、Dockerのコンテナを起動します。
(1)CakePHPの環境構築
$ docker-compose run web composer create-project --prefer-dist -n cakephp/app app
(2)Dockerコンテナのビルド
$ docker-compose build --no-cache
(3)サーバーの起動
$ docker-compose up -d
ブラウザで以下のURLを開きます。
CakePHPのWebサイト http://localhost:8765/
phpMyAdmin http://localhost:8080
CakePHPの初期画面
SaaSの開発環境を約3時間で構築完了!
無事にDockerでCakePHPの開発環境を構築できまして、実際のファーストコミットは同日の12時48分でしたので、SaaSの開発環境を約3時間で構築できました!
実際のGitHubのコミットログ