自宅用サーバーいろいろ

# はじめに
自宅サーバーの自分用備忘録兼アイデアプールです. 
たまたまディスクイメージを保存してあったubuntu 18.04 LTS を前提にしています.  
# もくじ
1. [sshサーバ](#sshサーバ)
2. [GitLabサーバ](#GitLabサーバ)
3. [Webサーバ](Webサーバ)
4. [カメラ画像のストリーミング](#カメラ画像のストリーミング)
5. [パケットキャプチャ](#パケットキャプチャ)
6. [ストレージサーバ](#ストレージサーバ) 
7. [グローバル化](#グローバル化)

# IP関連

```shell

$ sudo apt install net-tools
```
これでifconfig等が使えるようになる.
今後このマシンのLocal IPは```${L_IP}```, Global IPは```${G_IP}```とする.

# sshサーバ
```shell

$ sudo apt install openssh-server
```
## 公開鍵認証するために

```shell
$ sudo mkdir /home/${USER_NAME}
$ sudo mkdir /home/${USER_NAME}/.ssh
$ sudo chmod 700 /home/${USER_NAME}/.ssh
$ sudo vim /home/${USER_NAME}/.ssh/authorized_keys
# ホストマシンの公開鍵を記入
$ sudo chmod 600 /home/${USER_NAME}/.ssh/authorized_keys
```
## パスワード認証をオフにして, 公開鍵認証だけに

```shell

$ sudo vim /etc/ssh/sshd_config
# PasswordAuthentication no
# PubkeyAuthentication yes 
# を設定
```
## sshdを再起動

```shell
$ sudo systemctl restart sshd
```

## ホストマシンからssh

```shell
$ ssh ${USER_NAME}@${L_IP}
```

# GitLabサーバ
## 依存インストール

```shell

$ sudo apt install curl openssh-server ca-certificates
$ sudo apt install postfix
```
## GitLabパッケージの登録

```shell

curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
```
## GitLabのインストール

```shell

$ sudo apt install gitlab-ce
```

## GitLabのConfiguration

```shell

$ sudo vim /etc/gitlab/gitlab.rb
# external_urlでURLを決める  
$ sudo gitlab-ctl reconfigure
```

# Webサーバ
## apache2のインストール

```shell
$ sudo apt install apache2
```
## サーバ名の変更 

```shell
$ sudo vim /etc/apache2/apache2.conf
# ServerNameを設定
```
初期設定では```/var/www/html/```がルートディレクトリになる. 
## ルートディレクトリの変更

```shell
$ sudo vim /etc/apache2/apache2.conf
# <Directory "ルートにしたいディレクトリ">
#        Options Indexes FollowSymLinks
#        AllowOverride None
#        Require all granted
# </Directory>

$ sudo vim /etc/apache2/sites-available/000-default.conf
# DocumentRoot を ルートにしたいディレクトリ　に変更
```
## ポートの変更 
httpは80番だが, 変えたいとき用 
今回は8080番に設定する 

```shell
$ sudo vim /etc/apache2/apache2.conf
# ServerName www.example.com:8080
$ sudo vim /etc/apache2/ports.conf
# Listen 8080 に変更
```

## apacheを再起動 

```shell
$ sudo systemctl restart apache2
```

# カメラ画像のストリーミング
## mjpg-streamerをインストールする 

```shell
$ sudo apt-get install subversion imagemagick libjpeg-dev
$ svn checkout svn://svn.code.sf.net/p/mjpg-streamer/code/ mjpg-streamer
$ cd mjpg-streamer/mjpg-streamer/
$ make
$ sudo make install
```
## mjpg-streamerを起動する
解像度を1280×720、fpsを30、ポートを14230で起動 
バックグラウンド化するため -b を追加

```shell
mjpg_streamer -i "/usr/local/lib/input_uvc.so -y -q 100 -r 1280x720 -f 30" -o "/usr/local/lib/output_http.so -w ~/Documents/mjpg-streamer/mjpeg-streamer/www -p 14230" -b
```
ブラウザで```http://${L_IP}:14230/?action=stream```にアクセスすると再生される.

# パケットキャプチャ
ubuntuにはプリインストールされている```tcpdump```を使用する 
今回は同一LAN上のhttp/httpsプロトコルを傍受する

```shell
$ sudo tcpdump  -vvv port 80 or port 443
```
# ストレージサーバ
owncloudsを用いる
## インストール

```shell
$ sudo wget -nv https://download.owncloud.org/download/repositories/10.0.3/Ubuntu_17.04/Release.key -O Release.key
$ sudo apt-key add - < Release.key
$ sudo echo 'deb http://download.owncloud.org/download/repositories/10.2/Ubuntu_18.04/ /' > /etc/apt/sources.list.d/owncloud.list
$ sudo apt-get update
$ sudo apt-get install owncloud-files
```
## apacheの設定
[Webサーバ](Webサーバ)を参照
デフォルトだと```/var/www/ownclouds```に実体がインストールされるので, apacheのパスを通す

## 依存の解決
Webページにアクセスすると, モジュール XXX がインストールされてませんと表示されるので, aptで取得する  

```shell
$ sudo apt install -y php-xxx
# mb multibyteは、`php-mbstring`をインストール
$ sudo systemctl restart apache2
```

# グローバル化
今までの章では同一LANでのアクセスを前提としていた. 
外部からでもアクセスするための設定を行う

## 固定IP化
ubuntuインストール時に設定できる 
新しく設定する場合はGUIで設定可能
![linux_ip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323745/73db9e1b-5580-1e04-e79f-31fd74af5546.png)
ifconfigで調べた情報をもとに, アドレス・ネットマスク・ゲートウェイを適切に設定 
## ポートマッピング
ルータのグローバルIPにアクセスした際に, 自宅サーバのポートに関する設定
UPnPクライアントを用いる

### インストール

```shell
$ sudo apt install miniupnpc
```

### ポート一覧
グローバルIPも取得できる

```shell
$ upnpc -l
```

### ポートマッピング追加
これはhttp用(80番)の設定
httpd, ssh等も同様に行う 

```shell
$ upnpc -a ${L_IP} 80 80 tcp
# ローカルIP 内向きポート番号 外向きポート番号　通信プロトコル(tcp/udp)
```
### ポートマッピング削除

```shell
$ upnpc -d ${L_IP} 80 
# ローカルIP 外向きポート番号
```

## DDNS
グローバルIPを名前解決するためのDDNS
自宅で契約しているルータのグローバルIPが一ヶ月起きに変わるので利用
[mydns](http://www.mydns.jp/)というオンラインサービスを用いた.

### 登録
サイトに登録後, DOMAIN INFOで使いたい名前${MYDNS_NAME}を設定 

### CRONの設定
mydnsでは一定周期ごとにグローバルIPを通知しなければIPが削除されてしまう
グローバルIPを通知するshellscriptをcronに設定する必要がある

```shell
$ crontab -e
# 0,30 * * * * wget -q -O - --http-user=${MYDNS_USER_ID} --http-password=${MYDNS_PASS} http://www.mydns.jp/logwww.in.html
#これで30分ごとにIPを通知
```
### アクセス
http(80番ポート)の場合
ブラウザで```http://${MYDNS_NAME}.mydns.jp:80 ```にアクセスできる

ssh(22番ポート)の場合

```shell
$ ssh ${USER_NAME}@${MYDNS_NAME}.mydns.jp:22
```

# 参考
https://webnetforce.net/web-camera-mjpg-streamer/
https://www.yokoweb.net/2018/05/04/ubuntu-18_04-server-gitlab-install/
https://thr3a.hatenablog.com/entry/20140625/1403638550
http://bashalog.c-brains.jp/09/10/15-132615.php
http://d.hatena.ne.jp/konbunori/20110328/1301250660
https://qiita.com/t-kumarr/items/d1880382ebbb06a8fafc