Snipe IT Install


#追記
(2019/09/13):NginxのFastCGIの設定により、TOPページ以外開けない可能性があります。
現時点で参考情報として扱ってください。

#追記
(2019/11/29):php72->php7.0
MySQL8.0 ->5.6

#はじめに

https://snipeitapp.com/
オープンソースである資産管理ツール「Snipe IT」をインストールする機会があったのでメモ。
Cent OS 7 + Nginx + PHP 7.0(php-fpm) + MySQL 8.0 (+redis)の組み合わせです。
今回は社内等のFirewall環境下等の「安全な場所」にサーバーを構築する前提で行います。
ゆえにFirewall無効、SE Linux無効等行っておりますので、
各自の環境に合わせて適切なセキュリティの設定をしてください。

```
実行するコマンド(断りがない限りこの黒枠の部分はコピペ可)
```
`実行結果(または強調)`


```
[root@localhost ~]# cat /etc/redhat-release 
```

`CentOS Linux release 7.6.1810 (Core)`

##nginxの実行ユーザを作成
セキュリティ上の理由からNologinにしておきます。

```
useradd -s /sbin/nologin www
```

##"いつもの"(任意) 
私独自の「初期設定」です。
Firewall無効、SE Linux無効、Swap無効等しております。
やらなくても良いですが、Firewall無効をしない場合は後述のPort開放を行う必要があります。

```

systemctl stop firewalld.service
systemctl disable firewalld.service

systemctl stop NetworkManager
systemctl disable NetworkManager

setenforce 0
sed -i 's/SELINUX=enforcing/#SELINUX=enforcing/g' /etc/selinux/config
sed -i 'N;/#SELINUX=enforcing/i\SELINUX=disabled' /etc/selinux/config

sestatus

sed -i 's/# End of file//g' /etc/security/limits.conf
cat >> /etc/security/limits.conf << EOF
*        soft   nproc  655350
*        hard   nproc  655350
*        soft   nofile  655350
*        hard   nofile  655350

# End of file
EOF

sed -i 's/4096/655350/g' /etc/security/limits.d/20-nproc.conf

swapoff -a 
sed -i 's/.*swap.*/#&/' /etc/fstab
```

##Firewall無効(任意)

```
firewall-cmd --add-service=http --zone=public --permanent
firewall-cmd --reload
```



# Nginx
## Nginx install

```
yum -y install nginx
```


## NginxのConf設定


```
mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.org
cat >> /etc/nginx/nginx.conf << EOF

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user www;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /var/www/html/snipeit/public;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
                index  index.html index.htm index.php;
　　　　　　　　　try_files $uri $uri/ /snipeit/public/index.php$is_args$args;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
        location ~ \.php$ {
                root           /var/www/html/snipeit/public;
                fastcgi_pass   unix:/dev/shm/php-fpm.sock;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                include        fastcgi_params;
         }
    }

# Settings for a TLS enabled server.
#
#    server {
#        listen       443 ssl http2 default_server;
#        listen       [::]:443 ssl http2 default_server;
#        server_name  _;
#        root         /usr/share/nginx/html;
#
#        ssl_certificate "/etc/pki/nginx/server.crt";
#        ssl_certificate_key "/etc/pki/nginx/private/server.key";
#        ssl_session_cache shared:SSL:1m;
#        ssl_session_timeout  10m;
#        ssl_ciphers HIGH:!aNULL:!MD5;
#        ssl_prefer_server_ciphers on;
#
#        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        location / {
#        }
#
#        error_page 404 /404.html;
#            location = /40x.html {
#        }
#
#        error_page 500 502 503 504 /50x.html;
#            location = /50x.html {
#        }
#    }

}
EOF
```
##testファイル配置

```
mkdir -p /var/www/html/snipeit/public
touch /var/www/html/snipeit/public/index.html
echo testtestteeeeeeeeeeest >> /var/www/html/snipeit/public/index.html
chown -R www:www /var/www/html/*
systemctl start nginx
systemctl enable nginx

```
この時点でChrome等WebブラウザからWebページが見れるはずです。

#PHP 

##PHP install
その他もろもろも一緒にインストール

```
yum install -y http://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum install -y php70 php70-php php70-php-gd php70-php-mbstring php70-php-intl php70-php-fpm php70-php-opcache php70-php-json php70-php-mysqlnd php70-php-xml php70-php-xmlrpc php70-php-ldap php70-php-pecl-zip php70-php-pecl-redis php70-php-pecl-apcu php70-php-process php70-php-bcmath php70-php-pecl-imagick php70-php-pdo php70php-mcrypt 
 
```
 
##シンボリックリンク作成して起動
```
ln -s /opt/remi/php70/root/usr/bin/php /usr/bin/
systemctl start php70-php-fpm
systemctl enable php70-php-fpm
```

##PHPの設定①

```
#backup
cp /etc/opt/remi/php70/php.d/40-apcu.ini /etc/opt/remi/php70/php.d/40-apcu.ini.org

cat /etc/opt/remi/php70/php.d/40-apcu.ini | grep enabled=1
```
上記catの実行結果が

`apc.enabled=1`
でなかった場合は

```
vim /etc/opt/remi/php70/php.d/40-apcu.ini
```
で1に変更してください。

##PHPの設定②
```
cp /etc/opt/remi/php70/php.d/10-opcache.ini /etc/opt/remi/php70/php.d/10-opcache.ini.org
vim /etc/opt/remi/php70/php.d/10-opcache.ini
```
下記それぞれの値が

`opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.revalidate_freq=1
opcache.save_comments=1`
であることを確認、値が違う場合は上記の通り変更します。
また上記の該当行がコメントアウトされていないこと(行の先頭に;がついていない)を確認してください。


##PHPの設定③

```
#backup
mv /etc/opt/remi/php70/php-fpm.d/www.conf /etc/opt/remi/php70/php-fpm.d/www.conf.org


cat >> /etc/opt/remi/php70/php-fpm.d/www.conf << EOF

[www]

user = www
group = www

listen = /dev/shm/php-fpm.sock
listen.backlog = 20480
listen.owner = www
listen.group = www
listen.mode = 0666

;pm = static
pm.max_children = 200

pm = dynamic
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 100
pm.process_idle_timeout = 10s;

pm.max_requests = 1024

pm.status_path = /status_phpfpm

ping.path = /ping
ping.response = pong

slowlog = /var/opt/remi/php70/log/php-fpm/www-slow.log

clear_env = no

php_admin_value[error_log] = /var/opt/remi/php70/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on

;php_value[session.save_handler] = files
;php_value[session.save_path] = /var/opt/remi/php70/lib/php/session
php_value[soap.wsdl_cache_dir] = /var/opt/remi/php70/lib/php/wsdlcache

php_value[session.save_handler] = redis
php_value[session.save_path] = "tcp://127.0.0.1:6379"
EOF
```
##PHPの設定④

```
cp /etc/opt/remi/php70/php.ini /etc/opt/remi/php70/php.ini.org
vim /etc/opt/remi/php70/php.ini
```
下記それぞれの値が

`post_max_size = 16M
max_execution_time = 300
date.timezone =Asia/Tokyo`

であることを確認、値が違う場合は上記の通り変更します。
また上記の該当行がコメントアウトされていないこと(行の先頭に;がついていない)を確認してください。

フォルダ作成&所有者を変更してPHPをRestart

```
mkdir -p /var/log/php-fpm
chown www:www -R /var/log/php-fpm
chown www:www -R /var/lib/nginx
chown www:www -R /var/opt/remi/php70/lib/php/*
systemctl restart php70-php-fpm 
```

##testファイル作成

```
touch /var/www/html/snipeit/public/index.php
echo " <?php var_dump( phpinfo() ); ?> " >> /var/www/html/snipeit/public/index.php
chown -R www:www /var/www/html/*
```
この時点でChrome等Webブラウザから
http://nginxをインストールしたPCのIPaddress/index.php
にアクセスするとphpの詳細が表示されるWebページが見れるはずです。
ダウンロードが始まった方はphpのSocketやSELinux等でつまづいている可能性があります。

#MySQL Install

##Maria姫とお別れ
Maria DBが最初から入っている可能性があるので、ある場合は別れを告げます。
`すでにMaria DBを利用している場合、DBの中身が消えるのでバックアップ等とってください`
`すでにMaria DBを利用している場合、DBの中身が消えるのでバックアップ等とってください`
`すでにMaria DBを利用している場合、DBの中身が消えるのでバックアップ等とってください`
大切なことなので3回言いました。

```
rpm -qa | grep maria
```

`mariadb-libs-5.5.64-1.el7.x86_64`
等レスポンスがあった場合はMaria姫がいらっしゃるので

```
yum remove mariadb-libs
rm -rf /var/lib/mysql/   
```

##リポジトリ追加&インストール

```
#MySQL5.6を指定してインストール

#yum-util install
yum -y install yum-utils

#MySQLのレポジトリをインストール
yum localinstall -y http://dev.mysql.com/get/mysql57-community-release-el6-7.noarch.rpm 

MySQL5.6をインストールするよう設定
yum-config-manager --disable mysql57-community
yum-config-manager --enable mysql56-community

MySQL5.6をインストールする設定になっているか確認
yum repolist all | grep mysql
```

`mysql-connectors-community/x86_64 MySQL Connectors Community     enabled:    113
mysql-connectors-community-source MySQL Connectors Community - S disabled
mysql-tools-community/x86_64      MySQL Tools Community          enabled:     84
mysql-tools-community-source      MySQL Tools Community - Source disabled
mysql55-community/x86_64          MySQL 5.5 Community Server     disabled
mysql55-community-source          MySQL 5.5 Community Server - S disabled
mysql56-community/x86_64          MySQL 5.6 Community Server     enabled:    549
mysql56-community-source          MySQL 5.6 Community Server - S disabled
mysql57-community/x86_64          MySQL 5.7 Community Server     disabled
mysql57-community-source          MySQL 5.7 Community Server - S disabled`
5.6のところがenableになっていればOK

```
#MySQL Install
yum install -y mysql-community-devel mysql-community-server
```

##MySQL設定①

```
#設定ファイルbackup
cp /etc/my.cnf /etc/my.cnf.org


#ログのタイムゾーンの設定（初期値：UTC） 
echo log_timestamps=SYSTEM >> /etc/my.cnf

#クライアントの文字セットの設定を無視する
echo skip-character-set-client-handshake >> /etc/my.cnf

#認証方法の変更
echo default_authentication_plugin= mysql_native_password >> /etc/my.cnf
```

##MySQL起動
```
systemctl start mysqld
systemctl enable mysqld
```

##MySQLへログインする

###まず初期パスワードを調べる
```
grep password /var/log/mysqld.log
```
実行すると

`2019-08-25T17:30:31.014991+09:00 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: pnR,e5,j;!0dZ`
という実行結果が得られる。上記の場合、初期パスワードは行末尾の
`pnR,e5,j;!0dZ`
となる。これをメモする。


###MySQL初期化

```
mysql_secure_installation --use-default
```

`Securing the MySQL server deployment.`

`Enter password for user root:`
と聞かれるので、先程メモしたパスワードを入力し、`Enter`

`The existing password for the user account root has expired. Please set a new password.`
`New password:`
新しいパスワードを入力してくださいと言われたので、任意のパスワードを入力して`Enter`。
なお、確認のためもう一度パスワードの入力を求められるのでこれも入力して`Enter`。
ずら～とでて
`All done!`
と表示されれば完了

なおパスワードが「Pasword123」くらい"弱すぎる"と怒られて先に進めません。
英数字に加えて記号をを入力しないとだいたい怒られます。
回避方法がありますがここでは解説しません。


###MySQLにログイン

```
mysql -u root -p
```
先程入力した任意のパスワードを入力し、`Enter`。
パスワードがあっていれば
`Welcome to the MySQL monitor.  Commands end with ; or \g.`
`Your MySQL connection id is 11`
`Server version: 8.0.17 MySQL Community Server - GPL`

`Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.`

`Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.`

`Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.`

`mysql> `

と、コンソールが`mysql>`に変わり、MySQLへのログインが完了した。

###MySQLのユーザ追加
コンソールが`mysql> `の状態で下記4つのコマンドを実行する。
注意点として
・今回ユーザ名とデータベース名を`wordpress`としていますが、任意の名前に変更が可能です。こだわりがなければ`wordpress`でよいと思います。
・`@@@@@@@@@@@@`の部分は任意のパスワードを入力してください。先程と同様、"弱いパスワード"だと怒られます。これも回避方法がありますが、同様に今回は解説しません。
・(quitを除く)上記コマンド実行ごとに`Query OK, 0 rows affected (0.01 sec)`等と表示されていれば成功です。

```
CREATE USER `snipeit`@`localhost` IDENTIFIED WITH mysql_native_password BY '@@@@@@@@@@@';
CREATE DATABASE snipeit CHARACTER SET utf8;
GRANT ALL PRIVILEGES ON snipeit.* TO `snipeit`@`localhost` WITH GRANT OPTION;
flush privileges;
quit
```

#Snipe IT install
##Snipe IT Download
公式ページに各バージョンのリンクがあります。
https://snipeitapp.com/download
2019年9月12日時点の最新バージョンは4.7.7、結局Githubに飛ばされるので、Gitを使います。

###Git install
```
yum -y install git
```

###Snipe ITをDownload (git clone)

nginxのホームディレクトリが/var/www/html/なので、ここにダウンロードします。

```
git clone https://github.com/snipe/snipe-it /var/www/html//snipeit
```
おそらく最新Versionがダウンロードされるはずですが、
気になるようでしたら

```
cat /var/www/html/snipeit/config/version.php | grep app.version
```
`'app_version' => 'v4.7.7',`
でバージョンを確認するとよいと思います。

##Snipe IT 初期設定

```
cd /var/www/html/snipeit/
cat >> .env << EOF

# --------------------------------------------
# REQUIRED: BASIC APP SETTINGS
# --------------------------------------------
APP_ENV=production
APP_DEBUG=false
APP_KEY=ChangeMe
APP_URL=null
APP_TIMEZONE='Asia/Tokyo'
APP_LOCALE=ja
MAX_RESULTS=500

# --------------------------------------------
# REQUIRED: DATABASE SETTINGS
# --------------------------------------------
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_DATABASE=snipeit
DB_USERNAME=snipeit
DB_PASSWORD=@@@@@@@@@@@@@@@@
DB_PREFIX=null
DB_DUMP_PATH='/usr/bin'
DB_CHARSET=utf8mb4
DB_COLLATION=utf8mb4_unicode_ci

# --------------------------------------------
# OPTIONAL: SSL DATABASE SETTINGS
# --------------------------------------------
DB_SSL=false
DB_SSL_KEY_PATH=null
DB_SSL_CERT_PATH=null
DB_SSL_CA_PATH=null
DB_SSL_CIPHER=null

# --------------------------------------------
# REQUIRED: OUTGOING MAIL SERVER SETTINGS
# --------------------------------------------
MAIL_DRIVER=smtp
MAIL_HOST=email-smtp.us-west-2.amazonaws.com
MAIL_PORT=587
MAIL_USERNAME=YOURUSERNAME
MAIL_PASSWORD=YOURPASSWORD
MAIL_ENCRYPTION=null
MAIL_FROM_ADDR=you@example.com
MAIL_FROM_NAME='Snipe-IT'
MAIL_REPLYTO_ADDR=you@example.com
MAIL_REPLYTO_NAME='Snipe-IT'
MAIL_BACKUP_NOTIFICATION_ADDRESS=you@example.com

# --------------------------------------------
# REQUIRED: IMAGE LIBRARY
# This should be gd or imagick
# --------------------------------------------
IMAGE_LIB=gd

# --------------------------------------------
# OPTIONAL: SESSION SETTINGS
# --------------------------------------------
SESSION_LIFETIME=12000
EXPIRE_ON_CLOSE=false
ENCRYPT=false
COOKIE_NAME=snipeit_session
COOKIE_DOMAIN=null
SECURE_COOKIES=false

# --------------------------------------------
# OPTIONAL: SECURITY HEADER SETTINGS
# --------------------------------------------
APP_TRUSTED_PROXIES=192.168.1.1,10.0.0.1
ALLOW_IFRAMING=false
REFERRER_POLICY=same-origin
ENABLE_CSP=false
CORS_ALLOWED_ORIGINS=null

# --------------------------------------------
# OPTIONAL: CACHE SETTINGS
# --------------------------------------------
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync
CACHE_PREFIX=snipeit

# --------------------------------------------
# OPTIONAL: REDIS SETTINGS
# --------------------------------------------
REDIS_HOST=null
REDIS_PASSWORD=null
REDIS_PORT=null

# --------------------------------------------
# OPTIONAL: MEMCACHED SETTINGS
# --------------------------------------------
MEMCACHED_HOST=null
MEMCACHED_PORT=null

# --------------------------------------------
# OPTIONAL: AWS S3 SETTINGS
# --------------------------------------------
AWS_SECRET=null
AWS_KEY=null
AWS_REGION=null
AWS_BUCKET=null

# --------------------------------------------
# OPTIONAL: LOGIN THROTTLING
# --------------------------------------------
LOGIN_MAX_ATTEMPTS=5
LOGIN_LOCKOUT_DURATION=60

# --------------------------------------------
# OPTIONAL: MISC
# --------------------------------------------
APP_LOG=single
APP_LOG_MAX_FILES=10
APP_LOCKED=false
FILESYSTEM_DISK=local
APP_CIPHER=AES-256-CBC
GOOGLE_MAPS_API=
BACKUP_ENV=true

EOF

```
DB_PASSWORD=@@@@@@@@@@@@@@@@の@の部分はMySQLで設定したパスワードと同一のものに置き換えてください。


##パーミッション設定

```
chown -R www:www /var/www/html/
chmod -R 755 public/uploads
chmod -R 755 storage
chmod -R 755 storage/private_uploads
```

##composer download & insatll
しばらくかかりますのでコーヒーでも。

```
curl -sS https://getcomposer.org/installer | php
php composer.phar install --no-dev --prefer-source
```

##app key生成

```
php artisan key:generate
```

本当に実行するの・・？？と聞かれるので"yes"と答えましょう。

`Application key [base64:@@@@@@@@@@@@@@@@@@@@@@@@@@@@@] set successfully.`
と表示されたら成功です。
この生成されたKeyは先程操作した.envに書き込まれます。

##.env Backup (任意)
Keyが書き込まれた.envを適当な場所にコピー等してBackupすることをオヌヌメします。
このKeyがなくなると「えらい目」に合います。

```
cp .env /home/
chmod 400 /home/.env
```

#Webから初期設定
ブラウザからアクセスすると初期設定画面が出てきて、
指示の通りに登録を済ませれば完了です。おつかれさまでした。