個人開発を支えてくれる次のサーバーはこれだ Tencent Cloud Lighthouse

## はじめに

こんにちは。@komasayukiです。

この記事は、むちゃぶりにも応える開発技術があるって？！〜3つのテーマで記事を募集〜 by V-CUBE Advent Calendar 2023 の15日目です。

https://qiita.com/advent-calendar/2023/v-cube

V-CUBEさんはTencent Cloudの日本代理店で、Tencent Cloudに関わるカレンダーです。

Tencent Cloudを調べていたら、個人開発のサーバーに最適な[Tencent Cloud Lighthouse](https://www.tencentcloud.com/jp/products/lighthouse)を見つけて、使ってみたので紹介します。

このAdvent Calenderには3つのテーマがあって、

> ③あの時Tencent Cloudがあったら苦労しなかった？おじさんエンジニアの昔話

を選びました。個人開発の昔話から書いてみます。


## 個人開発のサーバー、何を使ってきた？

### 〜2009年まで 自宅Linuxサーバー

もらった古いパソコンをサーバーにしていました。枕元でサーバーがうるさいので、ファンの回転数を落とし、静音HDDケースを自作し、紐で空中に浮かせるテクニックで乗り越えました。長い間運用していましたが、ラッキーなことに何一つ壊れませんでした。

![server](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141013/a1fc10be-0f13-8cfe-ea6b-911d15cc778e.png)



### 2009年〜 Google App Engine + Java

2008年にGoogle App Engineが発表されました。PaaSです。最初はPythonサポートだけでしたが、2009年にJavaが実行できるようになり、そこから乗り換えました。

これが革新的だったのは、かなりの規模まで無料で利用できたことです。私のような~~フリーライダー~~ 節約家には最適でした。

当時、スマホアプリ向けAPIサーバーを運用しており、それなりのトラフィックをさばいてくれました。

![google-app-engine.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141013/41881b0c-0339-f292-aa97-6d4a7eac079f.jpeg)



### 2011年〜 Google App Engine値上げ、でも継続

2011年、GoogleからGoogle App Engineの値上げが発表され、無料での運用が困難になり、有料でもコストが3~10倍になりました。

私はAPIサーバーの仕様を縮小して、コスト構造にあわせて再実装、無料枠に押し込めるという ~~乞食根性~~ 改善で乗り越えました。


### 2013年〜　Heroku、AWS、さくらサーバー、他

それ以降は、いろんなサービスを転々とします。

Herokuは個人開発者のヒーローでした。

![heroku.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141013/8b0cb1b3-253d-61b0-cf97-d859a4db31e9.png)


しかし、Herokuも2022年に無料枠廃止を発表し、無料ユーザーへのサービス提供をギブアップします。以降はサーバーで月7ドル、+データベース5ドルとなり、難民が大量発生しました。

ユースケースによってはAWS Lambdaが有効でした。2018年にAPI GatewayがWebSocketサポートを追加したことにより、さらに使い道が広がりました。ただ、実装は独自になり、開発は大変でした。

<img width=50% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141013/3016d495-3259-6644-841b-12a28b6569b0.png">


## Tencent Cloud Lighthouse

そして、今回初めてTencent Cloudを使ってみて、個人開発サーバーに最適なサービスを見つけました！

[Tencent Cloud Lighthouse](https://www.tencentcloud.com/jp/products/lighthouse)

**月5ドルです。**

（現在、初回限定セールでここから更に60%オフをやっていて、月払い、年払い両方対象です）

スペックは、

- Linux
- 2コア
- 2Gメモリ
- 30Gディスク
- 30M Bandwidth
- データ通信量は1T/月

となっています。個人開発に良さそうです。今まで、このサービスを知らなかったのが不思議なぐらいです。


## Lighthouseを買ってみる

Lighthouseのページからサーバースペックを選ぶと、次はサーバーイメージを選択します。

![Image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141013/3c935eea-0cba-4b8c-e60b-f181c461f6eb.png)

Dockerを選びましたが、他にもLAMPやNode.js、WordPressなど様々なテンプレートがあります。

この後、支払いをすると、すぐにインスタンスが立ち上がりました。

## インスタンス画面

![instance_top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141013/0ae74bc8-5da9-380e-776f-7cf367021542.png)

立ち上がったインスタンスを選ぶと詳細な情報やモニタリング画面が出てきます。

安価なPaaSなので、制限が多いのかと思いきや、インスタンスには普通にターミナルログインできます。（ブラウザ or SSHで）

![Shell](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141013/fc282f46-4d2c-43fa-8470-fda72380ec9e.png)

ファイル転送はブラウザからもできます。

![SCP](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141013/1bd4c770-6812-60fc-dff4-f1302fddfb87.png)

最初に選んだイメージは後から変更できました。購入時にイメージを選ぶので、変えられないかもと思ってDockerを選んだ自分がアホみたいです…

## シェルからDockerコマンドを使う

シェルからdockerコマンドを使おうとすると弾かれます。

```shell
[lighthouse@VM-0-12-centos ~]$ docker images
permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/images/json": dial unix /var/run/docker.sock: connect: permission denied
```

dockerグループにユーザーがいないためです。ユーザー権限でdockerを使えるようにするには以下のようにします。

```shell
$ sudo gpasswd -a $USER docker
$ newgrp docker
```

Dockerが使えるようになったので、ついでにGeekbenchをDockerで実行してみました。

```shell
$ docker run -it --rm davidsarkany/geekbench && docker rmi davidsarkany/geekbench

System Information
  Operating System              Ubuntu 20.04.6 LTS
  Kernel                        Linux 3.10.0-1160.99.1.el7.x86_64 x86_64
  Model                         Tencent Cloud CVM
  Motherboard                   N/A
  BIOS                          SeaBIOS seabios-1.9.1-qemu-project.org

CPU Information
  Name                          Intel(R) Xeon(R) Gold 6133 CPU @ 2.50GHz
  Topology                      1 Processor, 2 Cores
  Identifier                    GenuineIntel Family 6 Model 94 Stepping 3
  Base Frequency                2.49 GHz
  L1 Instruction Cache          32.0 KB x 2
  L1 Data Cache                 32.0 KB x 2
  L2 Cache                      4.00 MB x 2
  L3 Cache                      27.5 MB

Memory Information
  Size                          1.95 GB
```

ベンチマーク結果は
- Single-Core Score 909
- Multi-Core Score 1069

となり、マルチコアが奮っていませんが、Raspberry Pi4程度の性能はありそうです。

以下はアップロードされたスコアです。

https://browser.geekbench.com/v6/cpu/4022465

## 自分で開発したコンテナを使うには？

PublicなDockerイメージではなく、自分のイメージを使う場合は、Tencent Container Registry(TCR) IndividualにイメージをPushする必要があります。

これはAWS ECRみたいなレジストリで、SLAつきのEnterpriseと、SLAなし無料のIndividualが選べますが、LighthouseではIndividualのみが使えます。

![TCR](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141013/a1f7ba28-0696-4281-826e-01670c3f877e.png)

TCR IndividualのInitialize passwordから、パスワードを設定することで、PCからdocker loginして、イメージをTCR IndivisualにPushすることができます。

## コンテナの作成

Lighthouseのインスタンスを開いて、上部のContainer managementからコンテナを作成できます。

ここではnginxを立ち上げます。

![nginx](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141013/54c51daf-3800-926a-42ee-cb47487ab0aa.png)

Portバインディングもここで設定します。

インスタンス内には、コンテナを複数立ち上げることができます。

## ファイヤーウォールの設定

Lighthouseのインスタンスから、上部のFirewallを選択すると、Firewall設定画面が開きます。

![Firewall](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141013/eafb0162-fd7e-4af3-38f4-86f0e794c27f.png)

これはデフォルトのままですが、がっつり開いてるので設定してから利用したほうがいいでしょう。

## ログを見る

様々な機能がありましたが、コンテナログをブラウザからは確認できませんでした。（できるのであれば是非教えてください！）

ブラウザからターミナルログインして、docker logsコマンドで確認はできましたので、そんなには困らないかと思います。



## Tencent Cloudを初めて使ってみて

普段はAWSを使っており、GCPやAzureも少し経験があります。

Tencent Cloudを使ってみた思ったことは、ドキュメントが充実している、UIが洗練されている、ということです。

初めての人が使うなら、AWSより使いやすいんじゃないかと思いました。

何より、月5ドルでここまで使いやすいサーバーが使えるのは個人開発だけでなく、企業でも有用だと思います。

## 最後に

さて、この記事のテーマは以下でした。

> ③あの時Tencent Cloudがあったら苦労しなかった？おじさんエンジニアの昔話

5ドルでこんなに使えるサーバーが当時にあれば、

- 枕元の自宅サーバー騒音と戦ったり
- 無課金になるようにソフトをチューニングしたり
- 無料サービスがなくなってサーバーを乗り換えたり

とか、しなくて済んだのになぁ…