> ## Documentation Index
> Fetch the complete documentation index at: https://docs.stateset.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Deploy iCommerce on GCP

> Run a persistent StateSet iCommerce Gateway on GCP Compute Engine using Docker with durable state and safe restart behavior.

# Deploy iCommerce on GCP

Run StateSet iCommerce 24/7 for approximately \$5-12/month on Google Cloud Platform. This guide walks you through deploying a persistent iCommerce Gateway on a GCP Compute Engine VM using Docker, with durable state, baked-in binaries, and safe restart behavior.

## Goal

Deploy a production-ready StateSet iCommerce Gateway on GCP Compute Engine with:

* Persistent configuration and workspace data
* Docker-based isolated runtime
* SSH tunnel access for secure administration
* Automatic restart on failure

<Tip>
  Pricing varies by machine type and region. Start with the smallest VM that fits your workload and scale up if you encounter out-of-memory errors.
</Tip>

## What you'll build

<Steps>
  <Step title="Create GCP infrastructure">
    Set up a GCP project, enable billing, and create a Compute Engine VM.
  </Step>

  <Step title="Install Docker runtime">
    Install Docker for isolated, reproducible application runtime.
  </Step>

  <Step title="Configure persistent storage">
    Mount host directories for configuration and workspace data that survives restarts.
  </Step>

  <Step title="Deploy the Gateway">
    Build and launch the iCommerce Gateway with Docker Compose.
  </Step>

  <Step title="Access securely">
    Connect via SSH tunnel from your local machine.
  </Step>
</Steps>

## Prerequisites

Before you begin, ensure you have:

* GCP account (free tier eligible for e2-micro)
* `gcloud` CLI installed, or access to the Cloud Console
* SSH access from your local machine
* Basic familiarity with terminal commands
* StateSet API credentials
* Model provider credentials (OpenAI, Anthropic, etc.)

**Optional integrations:**

* WhatsApp Business API credentials
* Telegram bot token
* Gmail OAuth credentials

***

## Quick path (experienced operators)

If you're familiar with GCP and Docker, follow this condensed workflow:

1. Create GCP project and enable Compute Engine API
2. Create Compute Engine VM (e2-small, Debian 12, 20GB)
3. SSH into the VM
4. Install Docker
5. Clone the StateSet iCommerce repository
6. Create persistent host directories
7. Configure `.env` and `docker-compose.yml`
8. Bake required binaries, build, and launch

***

## 1) Install gcloud CLI

<Tabs>
  <Tab title="gcloud CLI (recommended)">
    Install from the [Google Cloud SDK documentation](https://cloud.google.com/sdk/docs/install).

    Initialize and authenticate:

    ```bash theme={null}
    gcloud init
    gcloud auth login
    ```
  </Tab>

  <Tab title="Cloud Console">
    All steps can be completed via the web UI at [console.cloud.google.com](https://console.cloud.google.com).
  </Tab>
</Tabs>

***

## 2) Create a GCP project

<Tabs>
  <Tab title="CLI">
    ```bash theme={null}
    gcloud projects create my-icommerce-project --name="StateSet iCommerce"
    gcloud config set project my-icommerce-project
    ```

    Enable billing at [console.cloud.google.com/billing](https://console.cloud.google.com/billing) (required for Compute Engine).

    Enable the Compute Engine API:

    ```bash theme={null}
    gcloud services enable compute.googleapis.com
    ```
  </Tab>

  <Tab title="Console">
    1. Go to **IAM & Admin > Create Project**
    2. Name your project and create it
    3. Enable billing for the project
    4. Navigate to **APIs & Services > Enable APIs**
    5. Search for "Compute Engine API" and enable it
  </Tab>
</Tabs>

***

## 3) Create the VM

### Machine type comparison

| Type     | Specs                    | Cost               | Notes                      |
| -------- | ------------------------ | ------------------ | -------------------------- |
| e2-small | 2 vCPU, 2GB RAM          | \~\$12/mo          | Recommended for production |
| e2-micro | 2 vCPU (shared), 1GB RAM | Free tier eligible | May OOM under load         |

<Tabs>
  <Tab title="CLI">
    ```bash theme={null}
    gcloud compute instances create icommerce-gateway \
      --zone=us-central1-a \
      --machine-type=e2-small \
      --boot-disk-size=20GB \
      --image-family=debian-12 \
      --image-project=debian-cloud
    ```
  </Tab>

  <Tab title="Console">
    1. Go to **Compute Engine > VM instances > Create instance**
    2. Name: `icommerce-gateway`
    3. Region: `us-central1`, Zone: `us-central1-a`
    4. Machine type: `e2-small`
    5. Boot disk: Debian 12, 20GB
    6. Click **Create**
  </Tab>
</Tabs>

***

## 4) SSH into the VM

<Tabs>
  <Tab title="CLI">
    ```bash theme={null}
    gcloud compute ssh icommerce-gateway --zone=us-central1-a
    ```
  </Tab>

  <Tab title="Console">
    Click the **SSH** button next to your VM in the Compute Engine dashboard.
  </Tab>
</Tabs>

<Warning>
  SSH key propagation can take 1-2 minutes after VM creation. If the connection is refused, wait and retry.
</Warning>

***

## 5) Install Docker

Run the following commands on the VM:

```bash theme={null}
sudo apt-get update
sudo apt-get install -y git curl ca-certificates
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
```

Log out and back in for the group change to take effect:

```bash theme={null}
exit
```

SSH back in:

```bash theme={null}
gcloud compute ssh icommerce-gateway --zone=us-central1-a
```

Verify the installation:

```bash theme={null}
docker --version
docker compose version
```

***

## 6) Clone the repository

```bash theme={null}
git clone https://github.com/stateset/stateset-icommerce.git
cd stateset-icommerce
```

***

## 7) Create persistent host directories

Docker containers are ephemeral. All long-lived state must live on the host to survive restarts and rebuilds.

```bash theme={null}
mkdir -p ~/.stateset
mkdir -p ~/.stateset/workspace
```

***

## 8) Configure environment variables

Create a `.env` file in the repository root:

```bash theme={null}
STATESET_IMAGE=stateset-icommerce:latest
STATESET_GATEWAY_TOKEN=change-me-now
STATESET_GATEWAY_BIND=lan
STATESET_GATEWAY_PORT=18789

STATESET_CONFIG_DIR=/home/$USER/.stateset
STATESET_WORKSPACE_DIR=/home/$USER/.stateset/workspace

STATESET_KEYRING_PASSWORD=change-me-now
XDG_CONFIG_HOME=/home/node/.stateset
```

Generate strong secrets:

```bash theme={null}
openssl rand -hex 32
```

<Warning>
  Do not commit the `.env` file to version control. It contains sensitive credentials.
</Warning>

***

## 9) Docker Compose configuration

Create or update `docker-compose.yml`:

```yaml theme={null}
services:
  icommerce-gateway:
    image: ${STATESET_IMAGE}
    build: .
    restart: unless-stopped
    env_file:
      - .env
    environment:
      - HOME=/home/node
      - NODE_ENV=production
      - TERM=xterm-256color
      - STATESET_GATEWAY_BIND=${STATESET_GATEWAY_BIND}
      - STATESET_GATEWAY_PORT=${STATESET_GATEWAY_PORT}
      - STATESET_GATEWAY_TOKEN=${STATESET_GATEWAY_TOKEN}
      - STATESET_KEYRING_PASSWORD=${STATESET_KEYRING_PASSWORD}
      - XDG_CONFIG_HOME=${XDG_CONFIG_HOME}
      - PATH=/home/linuxbrew/.linuxbrew/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    volumes:
      - ${STATESET_CONFIG_DIR}:/home/node/.stateset
      - ${STATESET_WORKSPACE_DIR}:/home/node/.stateset/workspace
    ports:
      # Keep the Gateway loopback-only; access via SSH tunnel
      - "127.0.0.1:${STATESET_GATEWAY_PORT}:18789"
    command:
      [
        "node",
        "dist/index.js",
        "gateway",
        "--bind",
        "${STATESET_GATEWAY_BIND}",
        "--port",
        "${STATESET_GATEWAY_PORT}"
      ]
```

<Tip>
  To expose the Gateway publicly, remove the `127.0.0.1:` prefix from the port mapping and configure firewall rules accordingly. See the [security documentation](/security) for guidance.
</Tip>

***

## 10) Bake required binaries into the image

<Warning>
  Installing binaries inside a running container is a common mistake. Anything installed at runtime will be lost on restart. All external binaries required by skills must be installed at image build time.
</Warning>

If you add new skills later that depend on additional binaries, you must:

1. Update the Dockerfile
2. Rebuild the image
3. Restart the containers

### Example Dockerfile

```dockerfile theme={null}
FROM node:22-bookworm

RUN apt-get update && apt-get install -y socat && rm -rf /var/lib/apt/lists/*

# Gmail CLI
RUN curl -L https://github.com/steipete/gog/releases/latest/download/gog_Linux_x86_64.tar.gz \
  | tar -xz -C /usr/local/bin && chmod +x /usr/local/bin/gog

# Google Places CLI
RUN curl -L https://github.com/steipete/goplaces/releases/latest/download/goplaces_Linux_x86_64.tar.gz \
  | tar -xz -C /usr/local/bin && chmod +x /usr/local/bin/goplaces

# WhatsApp CLI
RUN curl -L https://github.com/steipete/wacli/releases/latest/download/wacli_Linux_x86_64.tar.gz \
  | tar -xz -C /usr/local/bin && chmod +x /usr/local/bin/wacli

# Add more binaries as needed using the same pattern

WORKDIR /app
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml .npmrc ./
COPY ui/package.json ./ui/package.json
COPY scripts ./scripts

RUN corepack enable
RUN pnpm install --frozen-lockfile

COPY . .
RUN pnpm build
RUN pnpm ui:install
RUN pnpm ui:build

ENV NODE_ENV=production

CMD ["node","dist/index.js"]
```

***

## 11) Build and launch

```bash theme={null}
docker compose build
docker compose up -d icommerce-gateway
```

Verify binaries are installed:

```bash theme={null}
docker compose exec icommerce-gateway which gog
docker compose exec icommerce-gateway which goplaces
docker compose exec icommerce-gateway which wacli
```

Expected output:

```
/usr/local/bin/gog
/usr/local/bin/goplaces
/usr/local/bin/wacli
```

***

## 12) Verify the Gateway

```bash theme={null}
docker compose logs -f icommerce-gateway
```

Success output:

```
[gateway] listening on ws://0.0.0.0:18789
```

***

## 13) Access from your local machine

Create an SSH tunnel to forward the Gateway port:

```bash theme={null}
gcloud compute ssh icommerce-gateway --zone=us-central1-a -- -L 18789:127.0.0.1:18789
```

Open in your browser:

```
http://127.0.0.1:18789/
```

Enter your gateway token to authenticate.

***

## Persistence reference

All long-lived state must survive restarts, rebuilds, and reboots. Docker is not the source of truth.

| Component           | Location                          | Persistence            | Notes                                |
| ------------------- | --------------------------------- | ---------------------- | ------------------------------------ |
| Gateway config      | `/home/node/.stateset/`           | Host volume mount      | Includes tokens, settings            |
| Model auth profiles | `/home/node/.stateset/`           | Host volume mount      | OAuth tokens, API keys               |
| Skill configs       | `/home/node/.stateset/skills/`    | Host volume mount      | Skill-level state                    |
| Agent workspace     | `/home/node/.stateset/workspace/` | Host volume mount      | Code and agent artifacts             |
| WhatsApp session    | `/home/node/.stateset/`           | Host volume mount      | Preserves QR login                   |
| Keyring             | `/home/node/.stateset/`           | Host volume + password | Requires `STATESET_KEYRING_PASSWORD` |
| External binaries   | `/usr/local/bin/`                 | Docker image           | Must be baked at build time          |
| Node runtime        | Container filesystem              | Docker image           | Rebuilt every image build            |
| OS packages         | Container filesystem              | Docker image           | Do not install at runtime            |

***

## Updates

To update StateSet iCommerce on the VM:

```bash theme={null}
cd ~/stateset-icommerce
git pull
docker compose build
docker compose up -d
```

***

## Troubleshooting

### SSH connection refused

SSH key propagation can take 1-2 minutes after VM creation. Wait and retry.

### OS Login issues

Check your OS Login profile:

```bash theme={null}
gcloud compute os-login describe-profile
```

Ensure your account has the required IAM permissions (`Compute OS Login` or `Compute OS Admin Login`).

### Out of memory (OOM)

If using e2-micro and hitting OOM, upgrade to e2-small or e2-medium:

```bash theme={null}
# Stop the VM
gcloud compute instances stop icommerce-gateway --zone=us-central1-a

# Change machine type
gcloud compute instances set-machine-type icommerce-gateway \
  --zone=us-central1-a \
  --machine-type=e2-small

# Start the VM
gcloud compute instances start icommerce-gateway --zone=us-central1-a
```

### Container fails to start

Check logs for errors:

```bash theme={null}
docker compose logs icommerce-gateway
```

Verify environment variables are set correctly:

```bash theme={null}
docker compose config
```

***

## Service accounts (security best practice)

For personal use, your default user account works fine.

For automation or CI/CD pipelines, create a dedicated service account with minimal permissions:

**Create a service account:**

```bash theme={null}
gcloud iam service-accounts create icommerce-deploy \
  --display-name="iCommerce Deployment"
```

**Grant Compute Instance Admin role:**

```bash theme={null}
gcloud projects add-iam-policy-binding my-icommerce-project \
  --member="serviceAccount:icommerce-deploy@my-icommerce-project.iam.gserviceaccount.com" \
  --role="roles/compute.instanceAdmin.v1"
```

<Warning>
  Avoid using the Owner role for automation. Use the principle of least privilege. See [GCP IAM roles documentation](https://cloud.google.com/iam/docs/understanding-roles) for details.
</Warning>

***

## Next steps

<CardGroup cols={2}>
  <Card title="Messaging Channels" icon="message" href="/stateset-icommerce/stateset-icommerce-messaging-channels">
    Set up WhatsApp, Telegram, and other messaging integrations.
  </Card>

  <Card title="Skills" icon="wand-magic-sparkles" href="/stateset-icommerce/stateset-icommerce-skills">
    Configure and extend agent capabilities with custom skills.
  </Card>

  <Card title="CLI Reference" icon="terminal" href="/stateset-icommerce/stateset-icommerce-cli-reference">
    Learn the full CLI command set for managing your iCommerce instance.
  </Card>

  <Card title="Security" icon="shield" href="/security">
    Review security best practices for production deployments.
  </Card>
</CardGroup>
