mirror of
https://github.com/psviderski/uncloud.git
synced 2026-08-26 11:03:34 +00:00
85 lines
3.2 KiB
Markdown
85 lines
3.2 KiB
Markdown
# Deploy to specific machines
|
|
|
|
Deploy services to specific machines in your cluster using the
|
|
[`x-machines`](../../8-compose-file-reference/2-extensions.md#x-machines) extension in your Compose file.
|
|
|
|
## When to target specific machines
|
|
|
|
By default, Uncloud randomly chooses available machines to run your services on, evenly spreading multiple replicas of a
|
|
service across all machines for high availability. You can restrict which machines can run your service using the
|
|
[`x-machines`](../../8-compose-file-reference/2-extensions.md#x-machines) extension in your Compose file.
|
|
|
|
This is useful when you want to:
|
|
|
|
- Deploy services to machines in a **specific region** or **data center**
|
|
- Run services only on machines with **specific hardware** (for example, GPUs or ARM processors)
|
|
- Specify where to deploy **stateful services** and create their data volumes
|
|
- Keep certain services isolated to **dedicated machines**
|
|
- Deploy to a subset of machines for **testing** before rolling out cluster-wide
|
|
|
|
## Target machines in a Compose file
|
|
|
|
Set `x-machines` to a list of machine names or a single machine name to restrict which machines a service can run on.
|
|
|
|
```yaml title="compose.yaml"
|
|
services:
|
|
web:
|
|
build: .
|
|
x-ports:
|
|
- app.example.com:8000/https
|
|
# Spread 3 replicas across machine-1 and machine-2 only
|
|
x-machines:
|
|
- machine-1
|
|
- machine-2
|
|
scale: 3
|
|
|
|
db:
|
|
image: postgres:18
|
|
environment:
|
|
POSTGRES_PASSWORD: ${DB_PASSWORD}
|
|
volumes:
|
|
- db-data:/var/lib/postgresql
|
|
# Create the db-data volume and run the DB container on machine-db
|
|
x-machines: machine-db
|
|
|
|
volumes:
|
|
db-data:
|
|
```
|
|
|
|
When you deploy this Compose file with [`uc deploy`](../../9-cli-reference/uc_deploy.md):
|
|
|
|
- The `web` service will create and spread its 3 replicas only across `machine-1` and `machine-2`
|
|
- The `db` service will create its `db-data` volume and run only on `machine-db`
|
|
|
|
:::tip
|
|
|
|
Use [`uc machine ls`](../../9-cli-reference/uc_machine_ls.md) to see available machines in your cluster.
|
|
|
|
:::
|
|
|
|
## Push images to specific machines only
|
|
|
|
When [building from source](1-deploy-app.md#deploy-from-source-code), `uc deploy` and `uc build --push` automatically
|
|
push built images to **all** cluster machines by default. This ensures images are available wherever services might be
|
|
deployed.
|
|
|
|
If you're using `x-machines` to restrict deployments to specific machines, `uc deploy` and `uc build --push` push images
|
|
**only to those** machines. This saves time and bandwidth by uploading images only where they're needed.
|
|
|
|
You can also manually push your local Docker images to specific machines using the [
|
|
`uc image push`](../../9-cli-reference/uc_image_push.md) command:
|
|
|
|
```shell
|
|
# Push the local Docker image 'myapp:latest' to machine-1 and machine-2
|
|
uc image push myapp:latest -m machine-1,machine-2
|
|
```
|
|
|
|
See [Push local images to cluster machines](1-deploy-app.md#push-local-images-to-cluster-machines) for more details.
|
|
|
|
## See also
|
|
|
|
- [Deploy an app](1-deploy-app.md): Build and deploy from source code or pre-built images
|
|
- [Deploy a global service](3-deploy-global-services.md): Deploy one service replica on each cluster machine
|
|
- [Compose support matrix](../../8-compose-file-reference/1-support-matrix.md): Supported Compose features and Uncloud
|
|
extensions
|