ラズパイで Vapor を動かす


はじめに

一年前くらいにラズパイで Vapor を動かすのにチャレンジ(ラズパイにVaporいれたけど失敗した話)していたのですがそのときは動かず。。。今年再チャレンジしたらついに動きました

方法としては Mac でプロジェクト作成をしてラズパイに転送するやり方です。
下記記事に大変お世話になりました
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
    
  2. Xcode で開く

    $ cd hoge
    $ vapor xcode
    
  3. Package.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")]) // ここ変更
    ]
)
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()
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)
}
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!」の表示が確認できます

Server starting on http://localhost:8080

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

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

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

こんな状態です。

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

$ scp -r hoge [email protected]:

ラズパイ側

ラズパイの OS インストールとかは下記参考。
MacでラズパイのLチカしてみた

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

$ 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

無事起動できました

おわりに

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

あとは Mac のブラウザからアクセスできるよう模索したいと思います(http://[email protected]:8080 とかでアクセスできると思ったんですが無理でした)。

参考