【IT資産管理】Snipe-itのインストール

## 【IT資産管理】Snipe-itのインストール

### この記事でわかる・できること

- WindowsにLinuxの仮想環境を作成してSnipe-itを構築

### この記事の対象者

- Snipe-itを使ってみたい人

### 動作環境・使用するツールや言語

- Windows Server 2019 Standard
- Ubuntu 22.04

### はじめに

IT資産管理では基本的にExcelを使用することが多いと思いますが、情報があちこちに分散して何がどこにあるのかわかりにくくなったり関数やマクロが増えてブラックボックスになったりしがちです。
今回はオープンソースの資産管理ソフトであるSnipe-itをインストールしてみます。

### Windows上にLinux環境を構築

前回のzabbix構築時と同様ですがあらためて記載します。
もし途中で失敗して初期化して最初からやり直ししたい場合は
powershellから
```
wslconfig /u ubuntu
```
で登録解除してフォルダごと削除します。

#### WSLの有効化
コントロールパネルの「Windowsの機能の有効化または無効化」から　「Linux用Windowsサブシステム」にチェックを入れて再起動します。
もしこれがエラーになる場合はBIOSで仮想化機能が有効になっていない可能性があります。この場合、DockerやVirtual Boxなど他の仮想化ソフトも使えません。
BIOSから有効化してください。

#### WSLのインストール
コマンドプロンプトかPowerShellを管理者権限で起動します。
Windowsのバージョンによっては単純に
```
wsl --install
```
でインストールされますが、今回の環境であるWindows Server 2019 Standardでは--install自体が使えません。
なおこの環境では関係ありませんが、WSLにはバージョン１と２があって、１だとsystemctlが使えないので可能であれば２にした方がよいです。（デフォルトで１がインストールされる場合もあるようです）
Microsoftの公式サイトからパッケージをダウンロードする必要があります。拡張子がappxになっていて、公式サイトでは色々とコマンドが書いてありますが、環境によってはエラーになって通らない場合もあります。
やることは拡張子をzipにして解凍するだけです。ディストリビューションによるかもしれませんが、appxを解凍するとさらにx64やARM64などのappxに分かれているので、それをさらにzipにして解凍します。
今回はUbuntu22.04のx64を選択しました。
最終的にexeが出てくるので、それを実行することでWSLおよびLinux環境が起動します。
最初にユーザ名とパスワードを聞かれるので設定します。
rootのパスワードも設定しておきましょう。
```
sudo passwd root
```
#### Linuxの設定

##### DNS
ダウンロード時に名前解決エラーが出るかもしれないので
/etc/resolve.confを編集してNameServerを8.8.8.8（GoogleのDNSサーバ）にしておきましょう。

##### apacheをインストール
```
apt update && apt upgrade -y
```
起動時に警告「Failed to enable APR_TCP_DEFER_ACCEPT」が出るので
/etc/apache2/apache2.conf
を編集して
AcceptFilter http none
AcceptFilter https none
を追記します。
windows環境ではenableにできないオプションなのでnoneにしておくということのようです。

WSL2があるなら
```
systemctl start apache2
systemctl enable apache2
```
で自動起動できますが、今回は無いのでとりあえず
```
service apache2 start
```
で手動起動しておきます。

#### mysqlのインストールと設定
```
apt install mysql-server -y
service mysql start
```
公式サイトのマニュアルに従ってデータベースを設定しますが、mysql8以降だと権限付与の構文が違うようです。
```
mysql -u root -p
create database snipeit;
create user 'snipe_user'@'localhost' identified by 'P_ssw0rd';
grant all privileges on snipeit.* to 'snipe_user'@'localhost' with grant option;
flush privileges;
quit
```

#### phpのインストール
標準インストール(8.1)でいいです。
最新版をインストールすると拡張機能をインストールするときにエラーになって面倒になります。
```
apt install -y php
apt install -y php-{opcache,pdo,bcmath,calendar,ctype,fileinfo,ftp,gd,intl,json,ldap,mbstring,mysqli,posix,readline,sockets,bz2,tokenizer,zip,curl,iconv,phar}
```
#### その他
使いそうなものをインストールします。
```
apt install -y openssl curl git wget zip
```

#### Snipe-itのインストール
公式サイトのマニュアルに従ってダウンロードします。
```
git clone https://github.com/snipe/snipe-it /var/www/html/snipe-it
```
環境設定します。
環境設定ファイルはexampleがあるのでそれをコピーします。
```
cd /var/www/html/snipe-it
cp .env.example .env
```

こちらの環境の都合上80番は競合するので3000番を使用しました。
APP_URLでlocalhostを使うと他の端末からアクセスしたときにURLがlocalhostになってうまくいかない（アクセス元の端末が自分自身を見ようとする）ので注意が必要です。
```
APP_URL=http://【サーバ名】:3000
APP_TIMEZONE='Asia/Tokyo'
APP_LOCALE='ja-JP'

DB_DATABASE=snipeit
DB_USERNAME=snipe_user
DB_PASSWORD=P_ssw0rd

MAIL_HOST=【送信メールサーバ】
MAIL_USERNAME=【メールアドレス】
MAIL_PASSWORD=【パスワード】
MAIL_FROM_ADDR=【メールアドレス】
MAIL_REPLYTO_ADDR=【メールアドレス】
```
#### phpの設定
phpの依存関係をインストールします。
コンポーザー（依存関係の管理ツール）をダウンロードしますが、rootで実行しようとすると怒られるので、ここまでrootで実行している場合は先に抜けておきます。
```
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
```
アクセス権限を変更しておきます。（不要かもしれませんが念のため）
```
chmod -R 775 /var/www/html/snipe-it
```
windows側のipv6を切っておかないと次のコマンドがエラーになる可能性があるようなので切っておいた方がよいでしょう。
コマンドはcomposerがあるディレクトリで実行する必要があります。
警告が出ても無視します。
```
composer update --no-plugins --no-scripts
composer install --no-dev --prefer-source --no-plugins --no-scripts
```
アプリキーを生成します。暗号化の処理に関係するようです。
.envのAPP_KEYが自動的に設定されます。
```
php artisan key:generate
```
ラジオボタンでYesかNoか聞かれるのでYesを選択します。

#### apacheの設定
apacheの実行ユーザはデフォルトで「www-data」なので所有者にしておきます。
```
sudo chown -R www-data:www-data /var/www/html/snipe-it
```
ここからはrootでもいいです。
```
su -
```
設定ファイルを編集します。

デフォルトは「000-default.conf」ですが、無効化して別のファイルを作成します。
```
cd /etc/apache2/sites-available
a2dissite 000-default.conf
```

snipeit.conf（名前はなんでもいいです）を作成して下記のように編集します。
serverNameはlocalhostにすると他の端末からアクセスできないのでIPアドレスかFQDNを指定します。
```
<VirtualHost *:3000>
        <Directory /var/www/html/snipe-it/public>
                Allow From All
                AllowOverride None
                Options None
        </Directory>

        DocumentRoot /var/www/html/snipe-it/public
        ServerName 【サーバ名】:3000
        # Other directives here

        RewriteEngine On
        # From public/.htaccess
        RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_URI} (.+)/$
        RewriteRule ^ %1 [L,R=301]
        RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
        RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
        RewriteRule ^ /index.php [L]
</VirtualHost>
```
ポート番号を変更している場合は
/etc/apache2/ports.conf
を編集しておく必要があります。

apache2を再起動する時にRewriteEngineがエラーにならないよう下記を実行します。
```
a2enmod rewrite
```
先ほど作成したsnipeit.confを有効化してapache2を再起動します。
```
a2ensite snipeit.conf
service apache2 restart
```
これで
http://【サーバ名】:3000
でブラウザからアクセスできるようになります。

### 自動起動の方法
タスクスケジューラにトリガ「スタートアップ時」で下記の内容のバッチを登録すればwindowsを起動した時に自動起動します。
wslコマンドのhelpを見ればわかりますが、--でLinux側に対してコマンドを渡すことができます。
```
wsl -u root -- service mysql start
wsl -u root -- service apache2 start
```

### Snipe-itの操作
画面の挙動が不安定な場合は
```
php artisan config:cache
service apache2 restart
```
で直ることが多いです。
資産を登録する場合は必須の列（「Category」と「Model Name」）があるので、インポート時にその列がないとエラーになります。
インポートはコマンドでも実行可能です。画面上のインポートより高速です。
WSLでは/mntでwindowsのフォルダをマウントしているので、例えばC:\temp\sample-assets.csvをインポートする場合は下記のようになります。
```
cd /var/www/html/snipe-it
php artisan snipeit:import /mnt/c/temp/sample-assets.csv
```
画面上でインポートする場合はインポートした列とSnipe-itで定義した列との対応づけを行うことになりますが、コマンドの場合は事前に同名の列を定義しておく必要があるようです。（オプションで設定できるかもしれませんが確認はしていません）

画面上で資産を削除すると論理削除扱いになります。
完全に削除する場合は管理画面でのパージが必要になりますが、初期状態では操作できず、「.env」ファイルに以下を追記する必要があります。
ALLOW_DATA_PURGE=true
パージする時は「DELETE」を入力するように画面上で指示されます。

どうしても2次元の表となるとExcelが比較対象になると思いますが、さすがにExcelに比べるとかなり操作しづらいので、そうなるとやはりExcelに戻らざるを得ないようにも思います。

Windows PCの情報を自動収集してSnipe-itに登録するSnipe-PCViewというソフトもあります。systeminfoやpowershellを駆使して自前で作るという手もあると思います。
次回はそのあたりの記事を作成します。