---
# System prepended metadata

title: private CaaSをつくる
tags: [Blog]

---

---
title: private CaaSをつくる
tags: ["blog","Cloudflare","portainer"]
description: 
release-date: 2023-12-14
---
###### tags: `Blog` `Cloudflare` `portainer`

#  private CaaSをつくる

こちらは[大阪工業大学アドベントカレンダー2023の2枚目](https://adventar.org/calendars/9140)14日目の記事です。
どうもSiberiy4([twitter](https://twitter.com/siberiy4),[bsky](https://bsky.app/profile/siberiy4.bsky.social))です。


今回できるものは、ポート開放しなくてもできるVPNです。  

## 動機
自宅マシンのリソースを他人に貸し出したい。
ただし、サーバーそのまま触らせるのはちょっと嫌かもなー
＝＞アクセス制御つきContainer as a Serviceがあれば便利じゃないか？

## 使うもの
- Cloudflare Tunnel + Cloudflare Access
  アクセス制御付きVPN
  PCやサーバーにソフトをインストールし設定すれば、ポート開放などルーターの設定をいじらずにインターネットから自宅PCにアクセスできる。  
  IPアドレスによるアクセス制御、メールでのユーザー認証にGitHub認証なども使える。  
  多分ドメイン名が必要(.netだと年1000円ぐらい)
  
  - 使える認証一覧
  ![image](https://hackmd.io/_uploads/HyvPrYsB6.png)

- portainer
  Docker・Docker Swarm・K8sをWebから操作できるダッシュボード

## portainer構築
まず、VPN越しに利用したいダッシュボードの構築をします。  
自宅のマシンにDocker（仮想環境を作るやつ）とportainer(仮想環境をブラウザで操作できるようにするソフト）をいれます。  
portainerはDocker composeを使って起動します。

### Docker install
今回はRocky Linuxを利用したので以下のコマンドでDockerを入れる。

```bash!
 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin
 sudo systemctl --now enable docker

```

Ubuntuなどは
```bash

curl https://get.docker.com | sudo sh
# たぶん sudo systemctl --now enable docker
```
でインストール可能のはず

### portainerの実行
portainerはDockerイメージが配布されているので、それを利用する。  
[公式ドキュメントにdockerコマンドによるデプロイ](https://docs.portainer.io/start/install-ce/server/docker/linux#deployment)がありますが、今回は[docker composeを使ったもの](https://earthly.dev/blog/portainer-for-docker-container-management/#installing-docker-compose)があったのでこちらの`compose.yaml`を利用しました。  


```yaml=

version: "3"
services:
  portainer:
    image: portainer/portainer-ce:latest
    ports:
    - 9443:9443
    volumes:
    - data:/data
    - /var/run/docker.sock:/var/run/docker.sock
    restart: unless-stopped
volumes:
  data:
```

あとは実行するだけ
```bash
sudo docker compose up -d
```

適当に`https://localohost:9443`,`http://localhost::9000`にアクセスすると、アカウント作成画面がでてきて、Adminユーザーのパスワード設定ができる。

そうすれば、以下のように管理画面が出てくるので構築完了です。
![image](https://hackmd.io/_uploads/SkSYBnvVa.png)


### portainerの使い方
portainerではコンテナイメージを普通のDockerと同じように、Dockerfileを用意してビルドもしくはDockerHubなどのイメージを使用することができます。  

Dockerfileから作成する場合はこのようにダッシュボードのエディタ、ファイルのアップロード、URLの指定が選べる。   
![image](https://hackmd.io/_uploads/Bya8iK_LT.png)


## cloudflare tunnel/cloudflare access
CloudflareはDNS、CDN、ZeroTrustを提供する会社。  
1.1.1.1というパブリックキャッシュDNSサーバーを提供したり、Warpという無料のVPNを提供している。  
レジストラでもあるので.netなどのドメイン名を買うこともできる。  

### 使うサービス
ダッシュボードの表示に階層をあわせる
- Zero Trust
    - Access
        - Tunnels: ローカルを外部にProxy
        - Access Group: ACL、認証認可
        - Application: サービス（指定のサブドメインなど)へのアクセスのかけ方などを設定するか)
    - Settings
        - Authentication: GitHubなどつかいたいIdpの設定

### cloudflared のインストール

自宅マシンからCloudflareまでVPNを張るために、cloudflaredというツールをインストールする。  

[OSごとのインストール方法がここにある](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/get-started/create-local-tunnel/#1-download-and-install-cloudflared)

今回はRockyを使っていたので

```bash!

curl -fsSL https://pkg.cloudflare.com/cloudflared-ascii.repo | sudo tee /etc/yum.repos.d/cloudflared.repo
sudo yum update && sudo yum install cloudflared
```


インストール方法のページと[こちらも参考にした](https://akkyorz.hatenablog.com/entry/2022/12/15/012728)
ただ、LinuxでVPNを常に起動させたい場合systemdのサービスにしたいので`root`ユーザーで実行したほうが後が楽です。  

```bash!
cloudflared tunnel login
cloudflared tunnel create <好きなトンネルの名前>
# 今回はportainerで作る
# cloudflared tunnel create portainer
```


すると、`~/.cloudflared/config.yml`が作成される。  

中身は以下のようなものができるので
```
以上となります。

name: <トンネル名>
url: http://localhost:9000
tunnel: <tunnel UUID>
credentials-file: /hoge/.cloudflared/<tunnel UUID>.json


```

ポートを使いたいものに変えよう。今回は8080を9000に変更した。  

上のサイトのようにPathに対してProxyすることもできるっポイ

次に自分が持っているドメイン名のサブドメインにプロキシさせる
```
cloudflared tunnel route dns <TunnelID> <使いたいサブドメイン名>
```

```
# トンネル名か設定した名前でトンネルを起動できる
cloudflared tunnel run <UUID or NAME>
# もしくは
cloudflared tunnel --config ~/.cloudflared/config.yaml run
```
ただし、上記では常時起動できないので

```
 service install
# sudo cloudflared --config ~/.cloudflared/config.yml service install
# のようにオプションでコンフィグファイルの位置を指定できる
```


これまでのコマンドでCloudflareと自宅マシンがVPNを張ってくれる。  
![image](https://hackmd.io/_uploads/H10xLPwLT.png)
Zeto Trust > Access > TunnelsでStatusがHealthyであればOK

[追加で参考にした](https://zenn.dev/yakumo/articles/b1f0e1115cb5b6)

### 手元端末からCloudflareまでの接続

Zero TrustのAccess Groupで許可したい範囲を指定できる。 例えばGitHub Orgとか
![image](https://hackmd.io/_uploads/HyofN5OLp.png)

GitHub orgなどを使いたい場合は、Zero TrustのSettings> Authentication >Login methodsから自分のアカウントをOAuth認証して使うっぽい。  
GitHub Orgを使いたい場合、追加時に使いたいOrgと連携ボタンを押すのを忘れずに。  

次にAccessのapplicationで、自分のドメイン名（公開しているアプリ、今回ＶＰＮでインターネットに公開したいもの）にたいして 先ほどのAccess Groupを適応してあげれば完了。  

### ログインしてみる
作成したドメインにアクセスすると設定したGitHub認証が表示される。
![image](https://hackmd.io/_uploads/rkVJ-wDIa.png)
アカウントを認証すると、無事にportainerの画面が表示される。

![image](https://hackmd.io/_uploads/SyQHbDvLp.png)




## まとめ

これを応用したら、簡単に自宅にSSHできたりマインクラフトサーバーを身内に公開できそう。  

