2018年 モダンな開発環境構築方法 (PHP Ruby Python Node.js Go)

## はじめに
- 各種言語はanyenvから*envをインストールする (phpenv rbenv pyenv ndenv goenv)
- *envから各言語をインストールする (PHP Ruby Python Node.js Go)
- phpの実行環境は[Laradock](https://github.com/laradock/laradock) で構築する
- Apache、NGINX、MYSQL、PostgreSQL等も[Laradock](https://github.com/laradock/laradock) で構築する
- 要Dokcer環境 ([2018年 ArchLinuxで開発環境を作る完全版 (UEFI + GNOME3 + GRUB) - 開発環境構築編](https://qiita.com/bubbkis/items/c5f1530151f52e997140)のDockerインストールを参考)

## .profileの設定
- [2018年 ArchLinuxで開発環境を作る完全版 (UEFI + GNOME3 + GRUB) - 開発環境構築編](https://qiita.com/bubbkis/items/c5f1530151f52e997140) を行った前提です。
- ↑をやっていない人は.zshrc、.zprofile、.bashrc、.bash_profileなどに以下の設定を

```zsh
if [ -d $HOME/.anyenv ] ; then
    export PATH="$HOME/.anyenv/bin:$PATH"
    eval "$(anyenv init -)"
    # tmux対応
    for D in `\ls $HOME/.anyenv/envs`
    do
        export PATH="$HOME/.anyenv/envs/$D/shims:$PATH"
    done
fi
eval "$(pyenv virtualenv-init -)"
eval "$(pipenv --completion)"
eval "$(goenv init -)"
```

## anyenv のインストール
```zsh
git clone https://github.com/riywo/anyenv ~/.anyenv
exec $SHELL -l
```

## setup-env をクローンして実行
[https://github.com/bubbkis/setup_env](https://github.com/bubbkis/setup_env)

- anyenvのプラグイン(anyenv-update、anyenv-git)をインストール
- rbenv(Ruby)、pyenv(Python)、ndenv(Node.js)、phpenv(PHP)、goenv(Go) のインストール
 - 他にもRenv、erlenv、plenv、scalaenvなど必要な物があればカスタマイズしてご自由にどうぞ
- プラグイン(pyenv-virtualenv、ndenv-yarn) のインストール
- Ruby(最新版)、Python(最新版、2.7系の最新)、Node.js(最新版)、Go(最新版) のインストール
- PHPは[Laradock](https://github.com/laradock/laradock)で対応するためインストールしていない。一応phpenvをインストールしただけ。
- python- virtualenvでneovimに対応

```zsh
git clone https://github.com/bubbkis/setup_env.git ~/setup_env
sh ~/setup_env/1_setup_env.sh
sh ~/setup_env/2_setup_env_plugin.sh
sh ~/setup_env/3_setup_lang.sh
sh ~/setup_env/4_setup_virtualenv_neovim.sh
```

## Laradock のインストール
php apache nginx mysql postgresql等の開発環境はlaradockにて構築する
[https://github.com/laradock/laradock](https://github.com/laradock/laradock)

```zsh
mkdir -p ~/Develop/Sites
cd ~/Develop
git clone https://github.com/Laradock/laradock.git
cd laradock
cp env-example .env
```

### .env の設定

```zsh
# ~/Develop/Sites がapacheやnginxの共有ワークディレクトリになります。
APP_CODE_PATH_HOST=../Sites/

WORKSPACE_INSTALL_XDEBUG=true
WORKSPACE_INSTALL_DEPLOYER=true
WORKSPACE_INSTALL_IMAGE_OPTIMIZERS=true
WORKSPACE_INSTALL_IMAGEMAGICK=true
WORKSPACE_INSTALL_PG_CLIENT=true
WORKSPACE_TIMEZONE=Asia/Tokyo

PHP_FPM_INSTALL_MEMCACHED=true
PHP_FPM_INSTALL_XDEBUG=true
PHP_FPM_INSTALL_EXIF=true
PHP_FPM_INSTALL_PGSQL=true
PHP_FPM_INSTALL_POSTGRES=true

NGINX_HOST_HTTP_PORT=8888
NGINX_HOST_HTTPS_PORT=4433

APACHE_HOST_HTTP_PORT=8887
APACHE_HOST_HTTPS_PORT=4432

MYSQL_VERSION=latest
# MYSQL_VERSION=latest の場合、MySQL8.*がインストールされる。
# MYSQL_VERSION=5.7 とすればMySQL5.7がインストールされる。
```

### MySQL8.* をインストールした場合、laradock/mysql/my.cnf を修正する 

```zsh
# sql-modelをコメントアウト
#sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

# [mysqld] の下に以下を指定する。
[mysqld]
default_authentication_plugin= mysql_native_password
```

### PostgreSQL 初期設定
```zsh
docker-compose up -d postgres
docker-compose exec postgres bash
su - postgres
psql
\du
\password postgres
\q
vi ./data/postgresql.conf

log_timezone = 'UTC'
↓
log_timezone = 'Asia/Tokyo'

timezone = 'UTC'
↓
timezone = 'Asia/Tokyo'

exit
exit
docker-compose restart postgres
docker-compose stop
```
### laradock/php-fpm/xdebug.ini を修正する
```zsh
xdebug.remote_host=dockerhost
xdebug.remote_connect_back=0

xdebug.remote_autostart=1
xdebug.remote_enable=1
xdebug.cli_color=1
```

### Modifiy laradock/workspace/xdebug.ini
```zsh
xdebug.remote_host=dockerhost
xdebug.remote_connect_back=0

xdebug.remote_autostart=1
xdebug.remote_enable=1
xdebug.cli_color=1
```

### laradock/php-fpm/Dockerfile を修正する
#### PHP Memcached:
```zsh
ARG INSTALL_MEMCACHED=false

RUN if [ ${INSTALL_MEMCACHED} = true ] && ( [ ${PHP_VERSION%.*} = 5.6 ] || [ ${PHP_VERSION%.*} = 5.5 ] ) ;then \
        # Install the php memcached extension
        pecl install memcached-2.2.0 && \
        docker-php-ext-enable memcached; \
    elif [ ${INSTALL_MEMCACHED} = true ]; then \
        # Install the php memcached extension
        curl -L -o /tmp/memcached.tar.gz "https://github.com/php-memcached-dev/php-memcached/archive/php7.tar.gz" \
        && mkdir -p memcached \
        && tar -C memcached -zxvf /tmp/memcached.tar.gz --strip 1 \
        && ( \
            cd memcached \
            && phpize \
            && ./configure \
            && make -j$(nproc) \
            && make install \
        ) \
        && rm -r memcached \
        && rm /tmp/memcached.tar.gz \
        && docker-php-ext-enable memcached \
;fi
```

### laradock/workspace/Dockerfile を修正する
#### PG_Client:
```zsh
USER root

ARG INSTALL_PG_CLIENT=false

RUN if [ ${INSTALL_PG_CLIENT} = true ]; then \
    # Install the pgsql client
    #apt-get -y install postgresql-client \
    apt-get install wget \
    && add-apt-repository "deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main" \
    && wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - \
    && apt-get update \
    && apt-get -y install postgresql-client-10 \
;fi
```

#### ImageMagick:
```zsh
USER root

ARG INSTALL_IMAGEMAGICK=false

RUN if [ ${INSTALL_IMAGEMAGICK} = true ]; then \
    apt-get update \
    && apt-get install -y --force-yes imagemagick php-imagick \
;fi
```

#### Python:
```zsh
ARG INSTALL_PYTHON=false

RUN if [ ${INSTALL_PYTHON} = true ]; then \
  apt-get -y install python python-pip python-dev build-essential  \
  && pythom -m pip install --upgrade pip  \
  && pythom -m pip install --upgrade virtualenv \
;fi
```

### Laradock の使い方
#### 起動方法 (初回起動時は時間が掛かります)

```zsh
cd ~/Develop/laradock
# apache2, postgresql, pgadmin を起動する場合
docker-compose up -d apache2 postgres pgadmin workspace
# apache2 のポートは8887を指定したので、http://localhost:8887 でアクセス出来る。
# pgadmin へは、http://localhost:5050
# laradock/pgadmin/Dockerfile を確認してください
# user: pgadmin4@pgadmin.org
# password: admin

# nginx, mysql, phpmyadmin を起動する場合
docker-compose up -d nginx mysql phpmyadmin workspace
# nginx のポートは8888を指定したので、http://localhost:8888 でアクセス出来る。
# phpmyadmin へは、http://localhost:8080
# phpmyadmin の設定は、.env のPHP MY ADMIN の箇所を確認してください
# PMA_USER=default
# PMA_PASSWORD=secret
# PMA_ROOT_PASSWORD=secret
# PMA_PORT=8080
# mysql の設定は、.env のMYSQL の箇所を確認してください
# MYSQL_DATABASE=default
# MYSQL_USER=default
# MYSQL_PASSWORD=secret
# MYSQL_PORT=3306
# MYSQL_ROOT_PASSWORD=root
```

#### 起動状態の確認
```zsh
docker-compose ps
```

#### .envファイルのパラメーターを修正して、再buildする場合
 例えば、PHPのバージョン5.6を使いたい場合、.envの

```zsh
PHP_VERSION=7.2
↓
PHP_VERSION=5.6
```
へ修正し再buildする

```zsh
docker-compose up -d --build php-fpm workspace
```

#### DB(mysql、postgres)のデータ保存先
```zsh
# ホームディレクトリ直下の .laradock/data
~/.laradock/data
```
 - DBのバージョン更新などの場合、各DBのデータディレクトリをバックアップして移動すること
 - バージョンアップ時、古いバージョンのデータがあるとBuild時にエラーで止まってしまう

### Laradock に Laravel をインストールする
- workspace へは既にcomposer がインストール済み

```zsh
docker-compose up -d nginx mysql phpmyadmin workspace
docker-compose exec workspace bash
composer create-project laravel/laravel mylaravel
exit
```

- laradock/nginx/sites/default.conf を修正する

```zsh
- root /var/www/public;
+ root /var/www/mylaravel/public;
```
- nginx を再起動

```zsh
docker-compose restart nginx
```

### Laradock に CakePHPをインストールする
- workspace へは既にcomposer がインストール済み

```zsh
docker-compose up -d nginx mysql phpmyadmin workspace
docker-compose exec workspace bash
composer self-update && composer create-project --prefer-dist cakephp/app mycakephp
```
- laradock/nginx/sites/default.conf を修正する

```zsh
/laradock/nginx/sites/default.conf
-  root /var/www/public;
+  root /var/www/mycakephp/webroot;
```
- nginx を再起動

```zsh
docker-compose restart nginx
```

- cakephp のDB設定でhostを"localhost"や"127.0.0.1"ではなく、"mysql"や"postgres"と指定する