# サービス設定

properties サービス設定は FIRERPA サービスのシステム設定であり、**ini** 形式の設定ファイルです。このファイルを記述することで、FIRERPA が起動時に自動的に VPN やプロキシに接続したり、自動的に FRP ポート転送を行ったり、ログインパスワードや証明書などのシステム設定を設定したりできます。設定可能な項目は、プロジェクト内の [properties.example](https://github.com/firerpa/lamda/blob/HEAD/properties.example) ファイル、または以下の説明で確認できます。

## ファイル形式

サービスが設定を読み込む際の処理ロジックについて説明し、混乱を防ぎます。サービス設定は標準の **ini** 形式を使用し、必ず `[DEFAULT]` セクションを含める必要があります。設定項目は直接 `DEFAULT` セクションに記述することも、新しいセクションを作成して記述することもできます。これにより、設定の出所を把握しやすくなり、すべてが混在するのを避けられます。
<br>
<br>
以下の設定例では、各セクションに `port` 設定がありますが、これは許可されています。最終的にサービスは `65001` をポートとして使用します。異なるセクションで設定が重複する場合、サービスは最後のセクションの設定を優先して読み込むためです。そのため、設定が反映されていないと感じた場合は、後続の設定によって上書きされていないか確認してください。
```ini
[DEFAULT]
port=65000

[abc]
port=65001
```

この基準に従って、各サービスの設定をグループ化することもできます。例えば、以下のように `fwd` サービス用のセクションを作成できます。
```ini
[DEFAULT]
port=65000

[fwd]
fwd.enable=true
fwd.host=123.123.123.123
fwd.port=9911
fwd.token=abc123
fwd.rport=8080
```


## 設定方法

以下にサービス設定のいくつかの方法を紹介します。通常は WebUI を使用した設定を推奨しており、最もミスが少なくなります。しかし、一括展開などの高度な要件がある場合、WebUI が適さないこともありますので、**手動設定** を参照してください。

### アプリ内設定

アプリ内設定は比較的簡単です。ただし、最初に設定ファイルを作成し、テキスト形式でインストール先のスマートフォンにコピーする必要があります。アプリを開き、設定ページに移動して、設定文字列を編集ボックスに貼り付け、「設定を適用」ボタンをクリックします。その際、必ず `[DEFAULT]` セクションを保持してください。もちろん、ミスが心配な場合は、WebUI で設定することもできます。

<p align="center">
<img src="/assets/images/app-config.png" alt="APP 設定" width="35%">
</p>

### WebUI 内設定

WebUI リモートデスクトップを開き、右上の設定アイコンをクリックして設定を行います。以下の図のように、ビジュアル編集を行うことも、`Raw Text` モードをクリックしてテキストモード編集に切り替えることもできます。設定が完了したら、直接 `Apply Config` をクリックして保存します。ただし、プロキシや FRP などのサービス系設定は即座に反映されません。すぐに反映させたい場合は、`Reload Service` にチェックを入れてから `Apply Config` ボタンをクリックしてください。これにより、サービスが完全に再読み込みされ、リモートデスクトップが一時的に切断されます。

<p align="center">
<img src="/assets/images/webui-config.png" alt="WebUI 設定">
</p>

### 手動設定

手動設定では、作成した設定ファイルの形式が正しいことを確認する必要があります。正しくない場合、サービスは設定を使用しません。まず、設定ファイルに `[DEFAULT]` セクションが含まれていることを確認してください。このセクションが空であっても問題ありません。次に、使用しているエディタが余分な隠し文字を追加しないことを確認してください。notepad などの基本的なエディタは使用しないでください。正しい設定ファイルは UTF-8 エンコーディングを使用し、改行コードは `\n` または `\r\n` である必要があります。`\n` の使用を推奨します。以下に設定ファイルの例を示します。

```ini
[DEFAULT]

[fwd]
fwd.enable=true
fwd.host=123.123.123.123
fwd.port=9911
fwd.token=abc123
fwd.rport=8080
```

あるいは、面倒であれば、すべてを DEFAULT セクションにまとめてしまっても問題ありません。

```ini
[DEFAULT]
fwd.enable=true
fwd.host=123.123.123.123
fwd.port=9911
fwd.token=abc123
fwd.rport=8080
```

設定ファイルの作成が完了したら、スマートフォン上の特定のディレクトリに手動で配置する必要があります。デフォルトでは2つのケースがあります。サービスを root 権限で起動する予定の場合、設定ファイルは `/data/usr/.local/` に保存します。シェル権限の場合は `/data/local/tmp/usr/.local/` に保存します。該当するディレクトリが存在することを確認し、存在しない場合は手動で作成してください。その後、設定ファイルを `properties` という名前に変更し、adb push で該当ディレクトリに配置します。

```{attention}
ここで特殊なケースがあります。アプリを使用してサービスを展開した場合、アプリはランダムな親ディレクトリをサービス実行ディレクトリとして使用するため、設定ファイルのディレクトリがランダムになります。そのため、デバイスに対して一律に設定することはできません。
```

## 設定パラメータ

以下はサービスで利用可能な全設定項目です。この内容をそのままコピーせず、必要な部分やサービスのみを選択してコピー・変更してください。内容全体をそのままコピーすると、サービスが異常動作する可能性があります。

```ini
[DEFAULT]
port=65000                      ; サービスのリスニングポートを設定します。

; webui.* キーは DEFAULT セクションでのみ使用できます。リモートデスクトップの各種パラメータを事前設定できます。

webui.darkmode = off            ; リモートデスクトップのダークテーマを有効にするかどうか。
webui.audio = on                ; リモートデスクトップの音声を有効にするかどうか (Android 10 以降が必要)。
webui.upload-path = /data/local/tmp/uploads ; リモートデスクトップのドラッグ＆ドロップアップロードのデフォルトディレクトリを設定します (ディレクトリが存在する必要があります)。
webui.share-clipboard = off     ; リモートデスクトップの双方向クリップボード共有を有効にするかどうか。
webui.touch.use-screen-size = off ; タッチ座標の計算に元の画面サイズを使用するかどうか (特別な状況で有効にします)。
webui.webrtc = on               ; リモートデスクトップの WebRTC を有効にするかどうか。

; WebRTC STUN/TURN サーバーアドレスを設定します (複数アドレスはカンマで区切ります)。
; STUN サーバーの例: stun:stun.device-farm.com
; TURN サーバーの例: turn://user:pass@example.com:3478?transport=tcp
webui.webrtc.ice-server = stun:stun.device-farm.com 

webui.video.h264 = on           ; H264 エンコーディングを有効にするかどうか。
webui.video.backend = 0         ; ビデオバックエンドの実装を設定します (0=デフォルト, 1=ハードウェア)。
webui.video.scale = 0.5         ; ビデオのスケーリング比を設定します (0.1-1.0, 1.0 はフル解像度)。
webui.video.quality = 50        ; ビデオ品質を設定します (10-100)。
webui.video.fps = 35            ; 希望するビデオフレームレートを設定します (10-60)。

; サービス証明書を設定します。リモートデスクトップと API トラフィックを暗号化し、パスワード認証を有効にします。以下の設定値は 'base64 -w0 lamda.pem' を実行して取得できます。
cert=TEFNREEgU1NMIENFUlRJRklDQVRFIChDTj10ZXN0LFBBU1NXRD1hMWMwZTNlYTcwN2E1NGRlN2EwZjk1KQotLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS0KTUlJRXZnSUJBREFOQmdrcWhraUc5dzBCQVFFRkFBU0NCS2d3Z2dTa0FnRUFBb0lCQVFEVmNMWlA5b0xRWkRIRgp5V0pTa2U0Z0crSUpmSCtMWlk0cXUzdS9OckRwSHZCN2k5V01rMWxRL2FMSGI0V3ZqelBLK1RITm9rRzc2MENRClhBTUpWS0dmYXRwcmNLUXdvMGhvWDZ2NlhsTVlZUlNRbW9wN3pSaUtnN3ZxKzV2S09DQ2RKcDFlSVNiZXcyTEgKTmYxL3JZelpwa1Q1bHoxTGZkem00eXJBS3VNa0tyZ3pnTzJRcE9CQVdYdmdiWG9BMDdidDdOODZZOGdNZFUwdAp6Ui9EcmhLTi9JMVdYSk11MU4wQW5UbDJRdEhEb0dCN0UyS0xpdmwybDZJdnRrYWJ4RE55Y2lHbUxOUGlMRklrCllPSHlnMUg3MUJ2NU04NE5TWDc1c2xuOXVNUGUzOVNFVlJoU0ptNHcvT2tXZnA5dGpZRUx3dHphdFhoSWJoS3MKaC9OZU1lOWRBZ01CQUFFQ2dnRUFCYlFuWUdlcFdKYjAydURtSnhLNGx2OFNhL0o1dzJpSldMYjk0dW1SUExRKwpTa1E5c1Zpc0JiQU1JNHc2dWFyNEFBVTh3WGxaTndPekMvM2V6dWNHRXFreEFReXM0VDB4SXRPUkF2WExxVlowCkl1WnpxNW53Si9OeFFzeEtmaWhBZkRLYlRmZjdmcG5MWlV0dlpNbG5LWUhQVExtRlFua3drckwyRE5YdDVVOTYKYXJUUDVOY0x1aDQ2dU93alJUOWhaNytYQi9ubU9LeTV4V3hoNWVMQmJJUTJrS0UvdWViUlVYRGZNdG5tbTh2aApRSG9VM3N5dzlZcE1xRDlWQWppcGlqQXRwbUlwa2w1emRWSE52Q1dCSGk2NjZxKzF6cUpHeFVUODBseHo1N2R1ClRvRFFQc1l0OFFEL3ZjNGkxajd0bDZyRzNQWkJNM05LNVR5ZFYyRnlnUUtCZ1FEYUcycnV3aWxyYUdZRzZNQWwKNEF2WW1BY0hHQWUwQjR0ZmtkdS9QandlRWQyWUF2TjJIQWV1Z1ZUSWg1eFplUlIwNFE4ZVNGenBTaEpwREpkNAp1TEhHcXJ2cmpXL1greEVIc081NnNjNjRiem1weWJWQXBlQnA4NlFGSTk4V3FmZkFyN3FzbzhweFJjNmdTRU1uCk5TcXV1Z2psYU05TlJmcUo4ci82RklmQkxRS0JnUUQ2aGJ0Z2dIdVJoTHhHYWNNaERvOVppcXJlNi9HN1dvZnQKR2FGZmFQM2xZNTNmM0hPdSsyNTZMWDY1ZWFYRTdrbXlQOGRDM2VWL24xT3dvTHdBYm1BZ2pEWVd1N09KdGk4QQpPbG9VNmtnTkVwNWcwOHpVWlBaR3NSMkZMd2VpUkgrQ3ZOdFBZakJydmFIQUtVU2lLa3BKdEpWeFpIdUl6SlpGCjVUZkM2VjNrOFFLQmdEeWp0TlpPKzA4V2hvOVROT0VTNnBnOHBHK1BlY3pPOEN3UkZJU1dYQWFNTnd6bGZTVVEKWS81YmpPUDMrRHRVRTZEdlZkRzRrc1IxeUtxV1NxTFF6dlNLVVpjTEN0YUV3bFplRmQvZEFibDdpdyt1dWdzUQpVMVdCM005bENzaDFWeUdtZWdNM3dyZzlqVlk0NFJyTWlHSnQ3TDFEcDZjM1ZwSDJBUFFac3lpOUFvR0JBTk9pCmpmeWtEYitNNXBDRllEWlkybmpHVURzcUQzZzZyb0Y2R1gxRWNOaU1JeDZ1V1h3RkkvdEsyN2RNTU9JQWUzbDkKcjVPcGFPczdhYlBZMVhsM3hQVTUvYWVPd2NrZ2d1d3FYMWN6NDlKSFhFeG9JSzE4N1NBakY5RWZQYyt6RmhVWAovaDA5MGJIeTdPWXM5cklZRDlIY0lETStzNjJKUjVtY1hsTG1Xay9CQW9HQkFKRVhQV05IWEwra1l6My91R1c3CnRKd0hUQzFlbEJjclcvaHpJMWt4ZEhXem5VaXNTWlcyVnA5b0wwSWNrQXVWQkx6eGUvR1h6OGJRTjZkOWwyZDAKdGtmUmo1TmpDOTUzS2N1cTNSekRmVU40cTcyUlVWTWlFOHVvSTBkVVZpalczN0tVMEhLcm1pbDBocU01eW9iNQpVZlhPQ2Q5SlRRSWx5Y2dNWER6Tm00S3oKLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ3FEQ0NBWkNnQXdJQkFnSVJBUHNjMVBRNXBuSDNhNk1GZkdVTXA2WXdEUVlKS29aSWh2Y05BUUVMQlFBdwpFREVPTUF3R0ExVUVDZ3dGVEVGTlJFRXdIaGNOTWpBd01UQXhNREF3TURBeFdoY05Namt4TWpJNU1EQXdNREF4CldqQVBNUTB3Q3dZRFZRUUREQVIwWlhOME1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0MKQVFFQTFYQzJUL2FDMEdReHhjbGlVcEh1SUJ2aUNYeC9pMldPS3J0N3Z6YXc2Ujd3ZTR2VmpKTlpVUDJpeDIrRgpyNDh6eXZreHphSkJ1K3RBa0Z3RENWU2huMnJhYTNDa01LTklhRityK2w1VEdHRVVrSnFLZTgwWWlvTzc2dnViCnlqZ2duU2FkWGlFbTNzTml4elg5ZjYyTTJhWkUrWmM5UzMzYzV1TXF3Q3JqSkNxNE00RHRrS1RnUUZsNzRHMTYKQU5PMjdlemZPbVBJREhWTkxjMGZ3NjRTamZ5TlZseVRMdFRkQUowNWRrTFJ3NkJnZXhOaWk0cjVkcGVpTDdaRwptOFF6Y25JaHBpelQ0aXhTSkdEaDhvTlIrOVFiK1RQT0RVbCsrYkpaL2JqRDN0L1VoRlVZVWladU1QenBGbjZmCmJZMkJDOExjMnJWNFNHNFNySWZ6WGpIdlhRSURBUUFCTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFBWEQ0L1cKQjBhSW1aWGpQbTRxUnBOazJmUnpjU1g4MGw2TlZaWWxJV3ZYalFxUXdXZnMvSGczZDVzYUpickFmcWVPa1lQdQpjeXJEWFZPdC9RTEVDOTFBSGtjRWJ1R0dPMGNFU2YyOHdUM1UzRnJJb2cxS1VyTURqWFFIb09vZEJpOGdNaVBmCmROcWhMSTdkNDJBTXJKU3dZUTlSUG9vWG9UZ2xDa0d3R291RDhuS0V5MmNHeVMxM3lQcDRseC9TWTR1QkRFU0sKRlErR0ZRTExGQktQZHZNc2x0cHYyQWFMWmR3clF4aFQ2aTU1U1puNStLb3c1TGxYL0RHdUw5UnRPdmZ2T0tzZQpRZ3pOQUg3QkYzbGdvQmJjYk9yZkVQazY1ZEZRN0NXYi91aDZjVmlmSjdxQzkvL0xhdElmb1VQVnJiRXdZL2dRCk5BRXFYclduMGZuYUc0cUEKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ2xEQ0NBWHdDQVFBd0RRWUpLb1pJaHZjTkFRRUxCUUF3RURFT01Bd0dBMVVFQ2d3RlRFRk5SRUV3SGhjTgpNakF3TVRBeE1EQXdNREF4V2hjTk1qa3hNakk1TURBd01EQXhXakFRTVE0d0RBWURWUVFLREFWTVFVMUVRVENDCkFTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTG5xZkJadnJHWmFxZ2s1bXNDUlJwUHoKcC8rNDY0akJrbmxtVEtldE9ja0RUVXE4VjZmSC8yR2ZiNkhqam9ENXBrQ3RENW1TS2thSE5odXhMWHNGZkVmYwpLbG1ubjNacGp5Tk9IRUEvaUFPMkR5RVlhMDh4U2V2TTdXb2piRjdjTmo1L0RZZzdlYjBpMCsvL2JCbGg4bmxPCmdoU1VoQ1RNNVBDb2ZMRFU4c1ZYdVlBaUdVNlV6QnJJQzB2SEVsdERraUpWTHBjQ3RzS2pFWk9za1BkQWM3dTYKL2FBMFA1R29uWjVVa1JEWXBhK2plSlVhYnFXWlFRRWd0bXZqbG1VVWlYd3UwalJuajFuMFQzZlBRRDNnQStMSQp2QUU5dmd2cFk1WFFqNm90cEJ2c1ozTUpKTktjVU1RdTF6T0FOVHpPMThUbEE4S29CTnNCeThaOURRWktYRjhDCkF3RUFBVEFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBZUduL055cUlSSS8wQUdxdkhQOTdLdFE3NlRqNmFjaGIKMzBMSVhXcCtZSFVhTWVBVmpkMlo3alNRcDVtWlpGbCtrMWZiMzM3SWVhR1hvZlZJMjFlSzUyUVgydGVOb0JrQQovVi9PMUh1MzUvK2FpejB4c2RENndXdndvNEZ5MWpsbWFlSmh3ZFFhY0JsREdGQTJqRkp4dUVwYWhmeFp2VXNiCjNqNXpVMFdLVFVDZkVEZ1hGd0J3MTJ4a3UvN1RNZENFYlJzWWFaM3pGVEMyMjZsUWJVRE43d2VxRndTRCt0QjYKUnVoSXhlOCtjRndBc0FXSENsZXJLZ1pucjN0NVFGMDc4cFcyR0h5OENzSjdWM01aVDVsWjQzbFM1TklCOUp6WgpTWXhaL2l6aFJ5aDVxUjczdUFnc0phTDU2QmorY1Fxbm9UcWhMWlZsN0orTTZXaFdLem9qc0E9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==

; カスタムリモートデスクトップログインパスワードを設定します。6～32 文字で、覚えやすいものを使用してください。このパスワードはサービス証明書を使用している場合にのみ有効です。
ssl-web-credential=password123

; firerpa WebUI およびその API の Access-Control-Allow-Origin ヘッダーを設定し、firerpa の機能をあなたの Web アプリケーションに埋め込めるようにします。
; 参照: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin
allow_origin=https://example.com

; リモートデスクトップでタッチスクリーンにオフセットや無反応が発生する場合は、touch.backend を system に設定してください。利用可能なオプション: system | native (デフォルト)
touch.backend=system

; サービスログファイルを設定します (ディレクトリが存在する必要があります)
logfile=/data/local/tmp/server.log

; 以下の設定は手動で記述しないでください。弊社提供の OpenVPN サーバー展開ソリューションを使用し、その組み込みコマンドで生成してください。
[openvpn]
openvpn.proto=udp
openvpn.cipher=AES-256-GCM
openvpn.host=123.123.123.123
openvpn.port=1190
openvpn.ca=LS0tLS1CRU...
openvpn.cert=LS0tLS1CRU...
openvpn.key=LS0tLS1CRU...
openvpn.tls_encryption=
openvpn.tls_key_direction=
openvpn.tls_key=

; 以下の設定項目は手動でのみ設定可能です。
openvpn.global=false            ; グローバル VPN を有効にするかどうか。
openvpn.enable=true             ; サービスを有効にするかどうか true | false

; この設定は、デバイスが起動時に自動的にプロキシサーバーを使用するためのものです。
[gproxy]
gproxy.enable=true              ; サービスを有効にするかどうか true | false
gproxy.type=http-connect        ; プロキシタイプ。オプション: http-connect, https-connect, socks5, shadowsocks
gproxy.host=172.1.1.1           ; プロキシサーバーアドレス
gproxy.port=8080                ; プロキシサーバーポート
gproxy.password=                ; プロキシサーバーのログインパスワード (空の場合は認証不要)
gproxy.login=                   ; プロキシサーバーのログインユーザー名 (空の場合は認証不要、タイプが shadowsocks の場合は暗号化方式)
gproxy.nameserver=              ; カスタム DNS サーバー
gproxy.drop_udp=false           ; UDP パケットを破棄するかどうか。
gproxy.udp_proxy=false          ; UDP パケットをプロキシするかどうか (socks5, shadowsocks など、プロキシのサポートが必要)。
gproxy.bypass_local_subnet=true ; ローカル LAN トラフィックをプロキシしない。
gproxy.dns_proxy=false          ; DNS クエリをプロキシ経由にする (UDP および TCP 対応の DNS サーバーが必要)。
gproxy.uid=                     ; 指定した UID のみプロキシする (デフォルトはグローバル)。

[cron]
cron.enable=true                ; サービスを有効にするかどうか true | false

[sshd]
sshd.enable=true                ; サービスを有効にするかどうか true | false

[fwd]
fwd.enable=true                 ; サービスを有効にするかどうか true | false
fwd.rport=0                     ; 転送先のリモートポート (0 はランダム割り当て)
fwd.host=123.123.123.123        ; FRP サーバーアドレス
fwd.port=9911                   ; FRP サーバーポート
fwd.protocol=tcp                ; FRP プロトコル
fwd.token=abc123                ; FRP ログイン認証 (token)

[adb]
adb.enable=true                 ; サービスを有効にするかどうか true | false
adb.directory=/data/local/tmp   ; 組み込み ADB のデフォルト作業ディレクトリ (adb shell 作業ディレクトリ)
; 警告: true に設定すると、ADB 接続は root 権限を持ちます。それ以外の場合はシェル権限になります。このオプションを false に設定すると、
; ネイティブに近い adb shell を使用し、組み込みコマンドは使用できません。注意: ADB は TLS 接続を使用しないため、トラフィックが監視される可能性があります。セキュリティ上の理由から、サービスが証明書を使用して起動されている場合、この値はデフォルトで false に設定されます。ただし、properties.local ファイルで指定した場合、ファイル内の設定が優先されます。その場合、セキュリティはユーザーの責任となります。
adb.privileged=true

[tunnel2]
tunnel2.enable=true             ; サービスを有効にするかどうか true | false
; ログイン名とパスワードの両方が設定されている場合のみ、ブリッジプロキシにログイン認証が必要です。どちらかが空の場合、認証は不要です。
tunnel2.login=lamda
tunnel2.password=1234           ; ブリッジプロキシのログインパスワード
; アウトバウンドインターフェース (rmnet|wlan)。アウトバウンドインターフェースが rmnet の場合、プロキシはモバイルデータ経由でリクエストを転送しようとします。wlan の場合、リクエストは wlan インターフェース経由で転送されます。設定が空の場合、デフォルトネットワークを使用してリクエストが転送されます。
tunnel2.iface=rmnet

[mdns]
mdns.enable=false               ; 有効または無効 true | false
mdns.meta=false                 ; mDNS に TXT メタデータを追加します。有効にすると、python-zeroconf などのツールでデバイス情報 (モデル、ABI、デバイス ID など) の取得がサポートされます。デフォルトは無効です。
mdns.name=DEVICEID-UNIQUE.lamda ; ローカル一意 ID を使用してブロードキャストドメイン名を設定します。デフォルトは {DEVICEID-UNIQUE}.lamda です。ローカルネットワークで名前が重複すると、自動的にサフィックス ID が追加されます。
mdns.service=lamda              ; ブロードキャストサービス名を設定します。デフォルトは lamda、つまり _lamda._tcp.local です。
```