# 分散式部署

有時候您可能會遇到這種情況：您的手機在家裡，而人卻在外地，這時該如何使用呢？您可以透過 FIRERPA 內建的 Frp 或 OpenVPN 客戶端來實現分散式部署，以便在任何地點連線到分散式部署的裝置。這兩種方案都需要您擁有一台具備公用網路 IP 的伺服器，並且需要您設定伺服器端的相關軟體才能正常使用。後續的文件將會描述如何部署 Frp 以及 OpenVPN 伺服器。

```{danger}
本章節的相關操作可能會將您的手機暴露於公用網路上，增加安全風險，請務必仔細閱讀。
```

本章節我們不會提及如何開關防火牆連接埠等基礎操作，我們預設您已了解並按照要求完成設定，且我們預設您對 Frp 以及 OpenVPN 有所了解。關於如何部署這兩種伺服器端，我們在此文和後續的章節裡有詳細介紹。如果您選擇自行部署，我們強烈建議使用 OpenVPN 組網的方式。


## 透過星火平台 Hub

您也可以自行部署 [firerpa/hub](https://github.com/firerpa/hub) + [firerpa/hub-bridge](https://github.com/firerpa/hub-bridge) 來實現裝置間的 P2P 存取，具體操作請參考專案文件。

## 透過 Frp 轉送到內部連接埠

您需要先下載 [fatedier/frp](https://github.com/fatedier/frp) 的伺服器端程式，並嚴格使用我們提供的以下指令啟動。您可以適當修改連接埠以及 token，需要 frps 版本 > v0.45.0。

```{danger}
轉送到公用網路是非常危險的行為，請勿心存僥倖，不要認為 IP 和連接埠非常隱密，請務必為服務啟用憑證驗證！
```

```bash
frps --token lamda --bind_addr 0.0.0.0 --bind_port 6009 --proxy_bind_addr 127.0.0.1 --allow_ports 10000-15000
```

根據指令，編寫 properties.local 設定項如下

```ini
fwd.host=您的伺服器公用網路位址
fwd.port=6009

fwd.rport=轉送目的連接埠（應在 allow_ports 範圍內）
fwd.token=lamda

fwd.protocol=tcp
fwd.enable=true
```

將以上設定附加或寫入到 properties.local，然後重新啟動 FIRERPA 服務即可。


## 透過 Frp 轉送到公用網路連接埠

如果您希望在任何地方都能連線到裝置，基於安全考量我們不建議這麼做。如果確實有此需求，建議使用 OpenVPN 相關功能，將裝置和您的電腦置於同一個網段下來存取。

```{danger}
轉送到公用網路是非常危險的行為，請勿心存僥倖，不要認為 IP 和連接埠非常隱密，請務必為服務啟用憑證驗證！
```

若您仍準備使用上述 frp 的方法來實現任意存取，請先確保 FIRERPA 服務啟動時已使用服務憑證，並將上述內容中啟動 frps 指令的 `--proxy_bind_addr 127.0.0.1` 改為 `--proxy_bind_addr 0.0.0.0`。這將導致上述範例中的 `12345` 連接埠直接綁定到公用網路。如果您未使用服務憑證啟動 FIRERPA，任何人都能存取，這是非常非常危險的。請做好資料可能被惡意存取或毀損的心理準備。

## 連線至使用 Frp 轉送的裝置

由於上述文件將轉送的連接埠綁定到伺服器的 `127.0.0.1`，因此以下內容需要在部署了 frps 的公用網路伺服器本機上進行驗證。我們假設您的 `fwd.rport` 是 `12345` 連接埠，以下將示範如何透過 Python 函式庫連線至裝置。

```python
from lamda.client import *
d = Device("127.0.0.1", port=12345)
```

您也可以在伺服器上的瀏覽器中開啟 `http?s://127.0.0.1:12345` 來存取該裝置的遠端桌面。


## 透過 OpenVPN 組網實現

請查看如何部署 OpenVPN 伺服器的相關章節，以了解如何將裝置接入 OpenVPN 網路。

## 連線至使用 OpenVPN 組網的裝置

OpenVPN 組網後的裝置與您正常使用過程無異，您只需要將您的個人電腦也加入此 OpenVPN 網路，即可透過裝置的 OpenVPN 私有位址直接存取。您可以在 OpenVPN 的官方網站 [openvpn.net/client](https://openvpn.net/client/) 下載 `OpenVPN Connect` 客戶端以接入同一個網路。