diff --git a/README.md b/README.md
index b8ff0f17f..1740ea006 100644
--- a/README.md
+++ b/README.md
@@ -183,8 +183,8 @@ Open the dstack-vmm webpage [http://localhost:9080](http://localhost:9080) (chan
After the container is deployed, it should take some time to start the CVM and the containers. Time would be vary depending on your workload.
-- **[Logs]**: Click the button to see the logs of the CVM, you can see if the container is finished starting there
-- **[Dashboard]**: Once the container is running, you can click the button to see some information about the container. The logs of the containers can be seen in the Dashboard page
+- **[Logs]**: Click this button to view the CVM logs and monitor container startup progress
+- **[Dashboard]**: Once the container is running, click this button to view container information and logs. (Note: This button is only visible when dstack-gateway is enabled. If disabled, you'll need to add a port mapping to port 8090 to access the CVM dashboard)
@@ -192,14 +192,6 @@ After the container is deployed, it should take some time to start the CVM and t
-- **Gateway Dashboard**: You can open dstack-gateway's dashboard at [https://localhost:9070](https://localhost:9070) to see the CVM's wireguard ip address:
-
-
-
-

-
-
-
### Pass Secrets to Apps
When deploying a new App, you can pass private data via Encrypted Environment Variables. These variables can be referenced in the docker-compose.yaml file as shown below:
@@ -214,19 +206,24 @@ The environment variables will be encrypted in the client-side and decrypted in
### Access the App
-Once the app is deployed and listening on an HTTP port, you can access the HTTP service via dstack-gateway's public domain. The ingress mapping rules are:
+Once your app is deployed and listening on an HTTP port, you can access it through dstack-gateway's public domain using these ingress mapping rules:
+
+- `[-[][s|g]].` → maps to port `` in the CVM
+
+**Examples**:
-- `[s].` maps to port `80` or `443` if with `s` in the CVM
-- `-[s].` maps to port `` in the CVM
+- `3327603e03f5bd1f830812ca4a789277fc31f577-8080.app.kvin.wang` → port `8080` (TLS termination to any TCP)
+- `3327603e03f5bd1f830812ca4a789277fc31f577-8080g.app.kvin.wang` → port `8080` (TLS termination with HTTP/2 negotiation)
+- `3327603e03f5bd1f830812ca4a789277fc31f577-8080s.app.kvin.wang` → port `8080` (TLS passthrough to any TCP)
-**Example**: `3327603e03f5bd1f830812ca4a789277fc31f577-8080.app.kvin.wang` maps to port `8080` in the CVM.
+The `` can be either the app ID or instance ID. When using the app ID, the load balancer will select one of the available instances. Adding an `s` suffix enables TLS passthrough to the app instead of terminating at dstack-gateway. Adding a `g` suffix enables HTTPS/2 with TLS termination for gRPC applications.
-Where the `` can be either the app id or the instance id. If the app id is used, one of the instances will be selected by the load balancer. If the `id-port` part ends with `s`, it means the TLS connection will be passthrough to the app rather than terminating at dstack-gateway.
+**Note**: If dstack-gateway is disabled, you'll need to use port mappings configured during deployment to access your application via the host's IP address and mapped ports.
-You can also ssh into the CVM to inspect more information, if your deployment uses the image `dstack-x.x.x-dev`:
+For development images (`dstack-x.x.x-dev`), you can SSH into the CVM for inspection:
```bash
-# The IP address of the CVM can be found in the dstack-gateway dashboard
+# Find the CVM wg IP address in the dstack-vmm dashboard
ssh root@10.0.3.2
```