ラズパイで Vapor を動かす

## はじめに
一年前くらいにラズパイで Vapor を動かすのにチャレンジ（[ラズパイにVaporいれたけど失敗した話](https://www.am10.blog/archives/274)）していたのですがそのときは動かず。。。今年再チャレンジしたらついに動きました:raised_hands:

<img width="500" alt="vapor" src="https://user-images.githubusercontent.com/34936885/144705088-2596ecdc-90b1-4cde-a63d-74220bc06ddc.png">

方法としては Mac でプロジェクト作成をしてラズパイに転送するやり方です。 
下記記事に大変お世話になりました:bow: 
https://qiita.com/YutoMizutani/items/ed66461a6150d28b886f

## 環境
### Mac
* macOS Big Sur バージョン 11.6
* Xcode 13.1
* Vapor Toolbox 18.3.3

### ラズパイ
* Raspberry Pi 3 Model B
* Raspbian 10
* Swift 5.1.5

調べ方よくわかってないですが下記コマンドで確認しました。

```
$ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 10 (buster)
Release:    10
Codename:   buster

$ swift --version
Swift version 5.1.5 (swift-5.1.5-RELEASE)
Target: armv6-unknown-linux-gnueabihf
```

## Mac側の操作
Mac 側色々やってたのでちょっと何入れたか覚えてないです。。。たぶん下記コマンドはやったはず。

```
$ brew tap vapor/tap
$ brew install vapor/tap/vapor
$ brew install libressl
```

色々入れたら Vapor プロジェクトを作成します。

1. プロジェクト作成（いろいろ聞かれるやつは全部 n にしました）  

    ```
    $ vapor new hoge
    ```

1. Xcode で開く  

    ```
    $ cd hoge
    $ vapor xcode
    ```

1. Package.swift などを修正  

```swift:Package.swift
// swift-tools-version:5.1 // ここ変更
import PackageDescription

let package = Package(
    name: "hoge",
    platforms: [
       .macOS(.v10_15)
    ],
    dependencies: [
        .package(url: "https://github.com/vapor/vapor.git", from: "3.0.0"), // ここ変更
    ],
    targets: [
        .target(
            name: "App",
            dependencies: [
                .product(name: "Vapor", package: "vapor")
            ],
            swiftSettings: [
                .unsafeFlags(["-cross-module-optimization"], .when(configuration: .release))
            ]
        ),
        .target(name: "Run", dependencies: [.target(name: "App")]) // ここ変更
    ]
)
```

```swift:main.swift
import App
import Vapor

var config = Config.default()
var env = try Environment.detect()
var services = Services.default()
try configure(&config, &env, &services)
let app = try Application(config: config, environment: env, services: services)
try app.run()
```

```swift:configure.swift
import Vapor

public func configure(_ config: inout Config, _ env: inout Environment, _ services: inout Services) throws {
    let router = EngineRouter.default()
    try routes(router)
    services.register(router, as: Router.self)
}
```

```swift:routes.swift
import Vapor

func routes(_ router: Router) throws {
    router.get { req in
        return "It works!"
    }

    router.get("hello") { req -> String in
        return "Hello, world!"
    }
}
```

これでとりあえず動くか実行してみます（Xcode で Run する）。

実行すると下記のように表示され、ブラウザで下記 URL にアクセスすると「It works!」の表示が確認できます:tada:

```
Server starting on http://localhost:8080
```

<img width="300" alt="screen_1" src="https://user-images.githubusercontent.com/34936885/144705098-6aa1f8cb-15f7-49c8-ab6b-236ab662d294.png">

<img width="300" alt="screen_2" src="https://user-images.githubusercontent.com/34936885/144705112-e44bf6ba-1e07-427e-b01e-d498040738ee.png">

無事起動を確認できたので停止して Xcode を閉じます。

ラズパイへ転送する前に不要そうな下記ファイルを削除しておきます。

* .dockerignore
* .git
* .gitignore
* docker-compose.yml
* Dockerfile
* Tests
* .swiftpm/xcode/xcuserdata

こんな状態です。

<img width="778" alt="files" src="https://user-images.githubusercontent.com/34936885/144705091-89e01c06-c9a9-4716-af36-062d4902e3c7.png">

下記コマンドでラズパイに転送します。Mac 側はこれで終了！

```
$ scp -r hoge pi@raspberrypi.local:
```

## ラズパイ側
ラズパイの OS インストールとかは下記参考。 
[MacでラズパイのLチカしてみた](https://www.am10.blog/archives/247)

下記のように設定しておいてやるとディスプレイなしでいけました:sunglasses:

```
$ cd /Volumes/boot
$ vi wpa_supplicant.conf
```

下記を記載して wq で終了。

```
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP
 
network={
 ssid="SSID記載F"
 psk="パスワード記載"
 key_mgmt=WPA-PSK
}
```

ラズパイを起動したらあとは必要そうなものを入れて Mac から転送したやつを実行すれば　OK です。

```
// いろいろ更新
$ sudo apt-get update 
$ sudo apt-get upgrade

// Swift インストール
$ curl -s https://packagecloud.io/install/repositories/swift-arm/release/script.deb.sh | sudo bash
$ sudo apt-get install swift5

// Vapor に必要なやつインストール
$ sudo apt-get install libssl-dev

// Mac から転送したやつ実行
$ cd hoge
$ swift run Run
```

無事起動できました:confetti_ball:

<img width="500" alt="vapor" src="https://user-images.githubusercontent.com/34936885/144705088-2596ecdc-90b1-4cde-a63d-74220bc06ddc.png">

## おわりに
ほんとはラズパイだけでやりたかったんですが Ubuntu とか Docker とかがどうしてもよくわからず。。。まあラズパイで Vapor を動かすことができたのでよかったです:raised_hands:

あとは Mac のブラウザからアクセスできるよう模索したいと思います（http://pi@raspberrypi.local:8080 とかでアクセスできると思ったんですが無理でした:cry:）。

## 参考
* [SwiftのみでIoT! Raspberry Pi Zeroでサーボを動かすサーバーを立ててiPhoneから制御する](https://qiita.com/YutoMizutani/items/ed66461a6150d28b886f)
* [Vaporで始めるサーバーサイドSwift 〜Mac上での環境構築からHello, World!まで〜 (swiftenv, Vapor Toolboxを使用)](https://dev.classmethod.jp/articles/start-server-side-swift-with-vapor-on-mac/)