魔法使いの卵

WEBエンジニアの卵の成長記録

instantSpaceCentOS72をつくってみた

instantSpaceCentOS72の情報

github.com

作った理由

  • 環境を自由に切り替えながら開発がしたかった(今後このへんも対応予定)
  • 毎回初回のセットアップがめんどくさかったので自動化した

なんでシェルスクリプトなの?

ちょっとした変更で利用者に学習コストを要求しないため

今後追加する機能

  • rbenb
  • bundler
  • phpenv
  • nvm
  • apache
  • jenkins
  • java

今後の課題

  • 鍵の扱いをもっといいかんじにしたい
  • nginxをrpmで管理できるようにする
  • windowsOSへの対応
  • オプションで実行するシェルスクリプトの切り替え

最後に

  • アプリケーションの開発がしたいからひとまずこのあたりでリリースしてみた

2016年前半の振り返り

前置き

  • なんだかんだ2016年も半分終わってしまった
  • この半年何を学んできて仕事で何してるのか振り返っておく
  • 具体的なことはかけないのでざっくり
  • 半年ぐらい何を独学したのかもざっくり

この半年何してたの?仕事編

  • 去年から変わった点

    • 今の部長になって業務でもコードを書かせてもらえてるので今度ちゃんとお礼を言わなきゃ
    • ユーザに対してどうすればサービスの価値を当たり前のように提供できるか評価してもらえるかという考え
    • 言えばだいたい何でもやらせてもらえてるので何やっても楽しい
  • プロジェクトの開発環境の構築

    • 仮想環境で開発環境を作ったけどもっとよく出来る気がする
    • コードだけではなくて環境も変化に強くあるべきだと痛感
    • このへんはもう少し学習してよりよい環境を目指していきたい
  • プロジェクトの開発

    • 仕事でコードかけるの最高に楽しい
    • レビューで色々な知見を授けてもらえてるので幸せすぎて死にそう
  • 既存サービス

    • 色々書けないことが多い
    • 改修するためのルール作りや仕組み作りなどをしていた
    • 今後もサービスとして当たり前の価値をユーザに届けるだけではなくて、付加価値を評価してもらえるように改善しまくる予定
    • 結局、僕達エンジニアが辛くないようにすればするほど要望に答えやすくなるし早く動けるので現在はその期間だとおもってる
    • チーム文化を新しく作り直してる

今年の残りはなにするの?仕事編

  • 従来の業務と平行してどんどん改善を続けていく
  • 現チーム及びサービスで溜まった知見等は社内で共有
  • 最終的には既存サービス全ての品質向上を目指したい(その為にまずは今見ているサービスから)
  • 要望には早く対応できるようにする
    • 過去の遺産や技術的負債を潰して今までよりも早く動けるようにしたい

この半年なにしてたの?プライベート

  • webアプリつくってた

    • TwitterのAPIが実はもうなくなってるやつとしらなくて頓挫
  • Laravel5.1独学した

    • なんだかんだ今年に入ってちゃんと触り始めた
    • もっと触りまくって僕もLaravelと仲良くなりたい
  • 開発環境構築の自動化

    • Provisioningするためのシェル書いてた
    • もう少しよりよくこのへんも知識がなくてもすぐに必要な環境が誰でも作れるってぐらいの使いやすさを目指したい
  • さくらVPSを契約した

    • ネットワーク周りやセキュリティの勉強になった
    • 仮想環境では得られなかった危機感を感じれた
    • リテラシーが向上した
    • どんどんせっかく借りてるので知見をためていくために使っていく
  • VirtualBoxでVagrantBoxを1から作った

    • とても勉強になった
    • 当たり前のことを当たり前に知れた

今年の半年はなにするの?プライベート

  • 自分が使いたいものがあるのでLaravelをつかった開発
  • 今年中にphpunitは普通にかけるようになりたいのでその辺りまで
  • laravelのコアのコードを読んでみる
  • ガンガンプライベートでもコードを書く(環境はできた)

まとめ

  • 仕事たのしい
  • 開発たのしい
  • 環境作るのたのしい
  • 不眠症辛い

  • 成長しているというよりも今までの積み重ねだなーと感じた(振り返って)

CentOS72(1511)x64のVagrantBoxを作った

はじめに

f:id:raichel:20160701000712p:plain

  • 作るきっかけは上記の一言です。

作業環境環境

環境 バージョン
OS XEI Capitan バージョン10.11.4
VirtualBox バージョン5.0.24
Vagrant バージョン1.8.1

入れておきたいVagrantプラグイン

目指す成果物

  • 最小構成のCentOS72(1511)x64のbox

VirtualBox仮想マシンを作成する

f:id:raichel:20160630223750p:plain

  • ハードディスクのタイプを選択し可変サイズで作成する

f:id:raichel:20160630223806p:plain

f:id:raichel:20160630223826p:plain

f:id:raichel:20160630223837p:plain

  • 読み込ませると以下になる

f:id:raichel:20160701011756p:plain

  • オーディオを有効化のチェックを外す

f:id:raichel:20160630223918p:plain

  • ネットワークのアダプター1を開きポートフォワーディングをクリックする

f:id:raichel:20160630223931p:plain

  • 1レコードを作成する(以下)

f:id:raichel:20160630223948p:plain

  • アダプター2を開きホストオンリーアダプターを選択する

f:id:raichel:20160630224001p:plain

  • ポートを開きUSBをクリックしチェックを外す

f:id:raichel:20160630224015p:plain

  • 設定後は以下になる

f:id:raichel:20160630224033p:plain

CentOS側の設定

  • CentOS7をインストールする

f:id:raichel:20160630231711p:plain

  • 言語を選択する
    • 僕はUSキーボードなのでEnglish English(United States)を選択

f:id:raichel:20160630231724p:plain

f:id:raichel:20160630231741p:plain

  • あとは以下の状態と同じ設定ができてればおk
    • できていたら右下の青いボタンをクリック

f:id:raichel:20160630231805p:plain

  • rootユーザの設定の設定

  • ユーザの設定は以下

f:id:raichel:20160630231828p:plain

  • 設定完了後は右下の青いボタンを押して再起動

f:id:raichel:20160630231848p:plain

ユーザの情報

アカウント Password グループ
root vagrant wheel
vagrant vagrant

Macのターミナルから作成した仮想マシンに接続する

ssh -p 2222 root@localhost

sudoコマンドの設定

vagrantユーザがパスワード無しでsudo実行可能とする。

  • 設定ファイルを開く
visudo
  • 設定を以下のように変更する
Defaults    requiretty

         ↓
          
# Defaults    requiretty
%vagrant  ALL=(ALL)       NOPASSWD:ALL

selinuxの無効化

  • 設定ファイルを変更する
vi /etc/sysconfig/selinux
  • 以下のように設定を変更する
# enforcingからdisabledに変更
SELINUX=disabled

firewallを停止する

systemctl stop firewalld
systemctl disable firewalld

sshの設定

  • vagrantSSHする際に使用するInsecure Private Keyを登録しておく。
mkdir /home/vagrant/.ssh
chmod 700 /home/vagrant/.ssh
curl https://raw.githubusercontent.com/mitchellh/vagrant/master/keys/vagrant.pub >> /home/vagrant/.ssh/authorized_keys
chmod 600 /home/vagrant/.ssh/authorized_keys
chown -R vagrant:vagrant /home/vagrant/.ssh

パッケージマネージャーの更新

  • パッケージマネージャーを更新する
yum update -y
  • 仮想環境を再起動する
reboot

Guest Additionsインストール

  • Guest Additionsをインストールする

    1. VirtualBox(別ウィンドウで起動している)のメニューからDevicesを選択
    2. Devicesの中に Install Guest Additions CD image... をクリック
  • Guest Additionsをマウントするディレクトリを作成する

mkdir -p /mnt/cdrom
  • Guest Additionsをマウントする
mount -r /dev/cdrom /mnt/cdrom
  • VBoxLinuxAdditions.runを実行する
sh /mnt/cdrom/VBoxLinuxAdditions.run
  • 以下のエラーは関係ないので無視

Could not find the X.Org or XFree86 Window System, skipping.

  • マウントを解除する
umount /mnt/cdrom
  • 仮想ドライブからディスクを除去する
    1. VirtualBox(別ウィンドウで起動している)のメニューからDevicesを選択
    2. Devicesの中に Optical Drives をクリック
    3. Remove disk from virtual drive をクリック
    4. Force Unmount をクリック

VagrantBox作成前のお掃除

  • yumで利用したファイルのcacheを削除
yum clean all

vagrantはネットワークの設定をvagrantが行うので既存の設定ファイル等を削除する

  • ifcfg-enp0s3の削除
rm /etc/sysconfig/network-scripts/ifcfg-enp0s3
  • udevルールの削除
rm /etc/udev/rules.d/70-persistent-ipoib.rules

フラグメンテーションを解消

  • box作成時の圧縮率をあげるため
dd if=/dev/zero of=/EMPTY bs=1M
rm -f /EMPTY
  • historyを削除する
history -c

仮想マシンを終了させる

shutdown -h now

Boxを作成する前に

作業をしやすくするために行ったポートフォワーディングの設定を削除する。

f:id:raichel:20160630231901p:plain

  1. 仮想マシンの設定を開く。
  2. ネットワークのアダプター1(NAT)を選択し、「高度」の内容を展開。
  3. 下部に表示される「ポートフォワーディング」ボタンを押してメニューを表示。
  4. 作成した項目を選択してDelキーを押して削除。その後下部のOKボタンを押す。
  5. 設定画面のOKボタンを押す。

boxの作成

  • ※CentOS72(1511)x64って名前は使えないのでCentOS72x64に変更しておきます。
vagrant package --base "仮想マシンの名前" --output box名.box

今回作成したboxを使う方法は以下

  • boxを登録
vagrant box add CentOS72x64 作成したboxのディレクトリのパス/CentOS72x64.box
  • 設定ファイルの作成
vagrant init CentOS72x64
  • 起動
vagrant up
  • 接続
vagrant ssh

作るのめんどくせーからこの環境使わせろよって人向け

  • boxを登録
vagrant box add raichel/CentOS72x64
  • 設定ファイルの作成
vagrant init raichel/CentOS72x64;
  • 起動
vagrant up
  • 接続
vagrant ssh

最後に

  • 技術者なんで自分で作りました。

さくらVPSに入れたMySQL5.7の初期設定を行った

MySQL5.7 のrootユーザーの初期パスワードを取得

  • 以下コマンド
sudo cat /var/log/mysqld.log | grep root
  • 結果は以下
[Note] A temporary password is generated for root@localhost:初期パスワード

MySQL5.7の初期設定

  • 設定コマンド
mysql_secure_installation
  • 以下対話しながら設定
Securing the MySQL server deployment.

Enter password for user root:初期パスワード

The existing password for the user account root has expired. Please set a new password.

New password:8文字以上、英大文字小文字数字記号の4種類を含む

Re-enter new password:8文字以上、英大文字小文字数字記号の4種類を含む
The 'validate_password' plugin is installed on the server.
The subsequent steps will run with the existing configuration
of the plugin.
Using existing password for root.

Estimated strength of the password: 100
Change the password for root ? ((Press y|Y for Yes, any other key for No) : y

New password:8文字以上、英大文字小文字数字記号の4種類を含む

Re-enter new password:8文字以上、英大文字小文字数字記号の4種類を含む

Estimated strength of the password: 100
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done!

MySQL5.7の設定ファイルによる設定の変更

  • 設定ファイルを開く
sudo vim /etc/my.cnf
  • 以下を[mysqld]配下の最後に追記
# MySQL サーバーのデータベースで利用する文字コードに UTF-8 を指定
character-set-server = utf8
# パスワード変更の有効期限を無効化
default_password_lifetime = 0

おもったこと

  • ここしばらくセキュリティ周りを意識しはじめた
  • パスワードなどは1Passwordで生成するようにしてる

参考元

MySQL 5.7 をインストールしたら最初に行うセットアップ | WEB ARCH LABO

さくらVPSにMySQL5.7を導入した

mariaDBを削除

 CentOS 7 には mariaDB という MySQL 互換のデータベースサーバーがデフォルトでインストールされている場合がありますので、これからインストールする MySQL と競合を起こさないように削除しておきましょう。

sudo yum remove -y mariadb-libs

MySQL公式yumリポジトリの追加

  • 以下コマンド
sudo yum localinstall -y http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm

yumに追加したパッケージが正しいか確認する

  • 以下コマンド
sudo yum info mysql-community-server
  • 結果は以下
名前                : mysql-community-server
アーキテクチャー    : x86_64
バージョン          : 5.7.13
リリース            : 1.el7
容量                : 151 M
リポジトリー        : mysql57-community/x86_64
要約                : A very fast and reliable SQL database server
URL                 : http://www.mysql.com/
ライセンス          : Copyright (c) 2000, 2016, Oracle and/or its 

MySQL5.7をinstallする

  • 以下コマンド
sudo yum -y install mysql-community-server

導入したMySQLのバージョンを確認する

  • 以下コマンド
mysqld --version
  • 結果は以下
mysqld  Ver 5.7.13 for Linux on x86_64 (MySQL Community Server (GPL))

MySQLを起動

sudo systemctl start mysqld.service

MySQLを自動起動

sudo systemctl enable mysqld.service

さくらVPSにjenkinsを導入した

はじめに

  • さくらVPSにjenkins載せてみたけど仮想環境とかのほうがセキュリティ上よさそう
  • 導入方法だけ一応メモとして残しておこうとおもっている

Javaのインストール

sudo yum install -y java-1.7.0-openjdk

Jenkinsのレポジトリをyumに追加

sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key

jenkinsをインストール

sudo yum install -y jenkins

Nginxを使ってベーシック認証時のjenkins側の設定

  • jenkinsの設定ファイルのバックアップ作成
sudo cp /var/lib/jenkins/config.xml /var/lib/jenkins/config.xml.org
  • jenkins設定ファイルを開く(ベーシック認証を行う場合)
sudo vim /var/lib/jenkins/config.xml
  • 以下のように設定を変更
<useSecurity>true</useSecurity>
              
              ↓
              
<useSecurity>flases</useSecurity>

jenkinsで利用するポートを変更したい場合

  • sudo vim /etc/sysconfig/jenkins
JENKINS_PORT="8080"

       ↓

例:JENKINS_PORT="利用したいポート番号"

ファイヤーウォールで許可するポートの追加

sudo firewall-cmd --zone=public --add-port=利用したいポート番号/tcp --permanent

ファイヤーウォールを再起動

sudo firewall-cmd --reload

jenkinsのセットアップ

  • jenkinsのinstallAdminPasswordを用意する
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
  • IP:利用したいポート番号にブラウザでアクセス
  • AdminPasswordに上記コマンドで出したPasswordを貼り付ける
  • Install suggested pluginsをクリック(オススメのプラグイン)
  • デフォルトユーザの作成を行う

Nginxの設定

  • 導入は以下

raichel.hatenablog.com

  • confファイルを変更する
sudo vim /etc/nginx/conf.d/jenkins.conf
  • confの設定を記述する
server {
    listen 80;
    server_name jenkins.ドメイン名;
    location / {
        proxy_pass http://localhost:利用したいポート番号;
        auth_basic "Restricted";                   # 認証時に表示されるメッセージ
        auth_basic_user_file /etc/nginx/.htpasswd; # .htpasswdファイルのパス
        proxy_set_header Authorization "";
    }
}

jenkinsの起動

sudo systemctl start jenkins

nginxの起動

sudo systemctl start nginx

確認方法

  • jenkins.ドメイン名にブラウザからアクセスしてみる
  • ログイン画面が表示されていたら導入完了。

【僕のメモ】許可するポートの追加と削除

sudo firewall-cmd --zone=public --add-port=利用したいポート番号/tcp --permanent
sudo firewall-cmd --zone=public --remove-port=利用したいポート番号/tcp --permanent

おもったこと

  • 外にServiceとして出すならともかく出したくないものを制御するのむずかしい
  • ベーシック認証も総当たり攻撃等されたらすぐ死にそうだしセキュアにする難しい
  • IP固定も考えたけど家と外で使う回線が違うのでなんだか微妙なかんじがした
  • セキュリティ周りとネットワークをもっとしっかり学習しないといけない(真顔)

さくらVPSにNginxとPHP7が動作する環境を作成する

前提

  • 独自ドメイン持ってる
  • DNSの設定済み

NginxとPHP7の動作環境を作成する

  • 実際に開発サーバにデフォルトで利用するPHP導入手順

Nginxの導入

raichel.hatenablog.com

phpの導入

# PHP7の導入
sudo yum install -y epel-release.noarch
sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
sudo yum install -y --enablerepo=remi --enablerepo=remi-php70 php php-opcache php-devel php-fpm php-gd php-pdo php-dom php-mbstring php-mcrypt php-mysqlnd php-mssql php-pecl-xdebug php-openssl php-json php-pecl-apcu php-pdo_sqlite php-pdo_mysql php-pecl-memcached php-bcmath php-msgpack php-ldap php-pecl-imagick php-pgsql php-pecl-pthreads php-pecl-msgpack

設定ファイルの作成

  • 設定ファイルを作成する
sudo vim /etc/nginx/conf.d/設定ファイル名.conf
  • 以下サンプル
server {
    # listenするポート番号を記述する
    listen       80;
    # バーチャルホスト名を記述する
    server_name 独自ドメイン;
    # ドキュメントパスを記述する
    root 公開したいServiceのパス;
    # デフォルト要求ファイル名を記述する
    index index.php;

    # 末尾が.phpの要求を対象とする設定
    location ~* \.php$ {
        # /usr/local/php7/etc/php-fpm.d/www.confに設定しているIPとポートを指定する
        # (例)listen = 127.0.0.1:9000
        fastcgi_pass 127.0.0.1:9000;

        # FastCGIサーバは自動index付与をサポートしていない
        # その為、Nginx側が末尾が"/"だった場合fastcgi_indexの値を末尾に付与する
        fastcgi_index  index.php;

        # PHP-FPMに渡されるドキュメントパス
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

        # ベーシック認証
        auth_basic "Restricted";                   # 認証時に表示されるメッセージ
        auth_basic_user_file /etc/nginx/.htpasswd; # .htpasswdファイルのパス

        # その他のFastCGI関連の設定は以下に追加
        include         fastcgi_params;
    }
}

設定ファイルのテストをする

sudo nginx -t

Nginxとphp-fpmを起動する

sudo systemctl start nginx
sudo systemctl start php-fpm

Nginxとphp-fpmを自動起動する

sudo chkconfig nginx on
sudo chkconfig php-fpm on

さいごに

  • 独自ドメインはじめて手に入れた
  • jenkinsとmysqlとredmineも近々入れてみる