Gyro Containers (ECS), Istanbul tr-ist-1: run Docker images on a node pool dedicated to you (no other customer's containers on your nodes). Services with zero-downtime deploys, revision history and rollback, scaling, environment variables and encrypted secrets, HTTPS address <name>-<code>.gyroapp.net plus your own domains (free certificates), logs and metrics. Order the environment like any product (/cloud/services lists it); manage it here.
Services of the environment with state (running, deploying, failing, pending, stopped, suspended), ready/desired instances, size and public URL. Each item carries internal_address (services with a port); the list carries namespace and cluster_dns. Each service has alerts = {"min_ready": N} at the top level (0 = off; the same value as spec.alerts).
Parameters
Field
in
Type
Description
idrequired
path
integer
Service id
Responses
200
Tool data / result — data: object
404
Not found — also returned for objects owned by someone else
409
State conflict (server_locked, not_actionable, ssh_key_exists, server_limit, idempotency_in_flight)
422
Validation or business rule failure (confirm_required, invalid_image, tool_action_failed ...)
# resource gyro_container_service: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_service
# A web service in your Gyro Containers (ECS) environment (Istanbul).
# service_id is the id of the container environment you ordered (see gyro_services).
variable "db_password" {
type = string
sensitive = true
}
resource "gyro_container_service" "web" {
service_id = 123
name = "web"
image = "ghcr.io/acme/web:1.4"
port = 8080
cpu_m = 500
memory_mi = 512
public = true
health_path = "/healthz"
env = { MODE = "prod" }
secrets = { DB_PASSWORD = var.db_password } # write only, never read back
# Replicas follow the load: 2..6, target 70 % CPU of cpu_m (replicas is ignored while autoscaling is set).
autoscaling = {
min = 2
max = 6
cpu_percent = 70
}
# Alert when fewer than 2 replicas are ready (channels: gyro_container_notifications).
notification = {
min_ready = 2
}
# Point a CNAME from your domain to gyro_container_service.web.host first.
domains = ["app.example.com"]
}
output "web_url" {
value = gyro_container_service.web.url
}
import os, uuid, requests
h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.get("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/services", headers=h, timeout=60)
r.raise_for_status()
print(r.json()["data"])
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/services", {
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
},
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
Create a container serviceScope: services_writetyped_post_containers__id__servicesOpenAPI for this operation
Starts a new service on your dedicated node pool. Name: lowercase letters, digits and '-', max 40. Fails with 409 quota_exceeded when the pool has no room. Secret values are set separately (PUT .../secrets). Serverless environments:cpu_m / memory_mi must be one of the pairs from GET /cloud/billing/container-sizes (0.25-4 vCPU); billing is per running copy per hour (POST /cloud/billing/estimate with type: serverless). Refused with 422 invalid_replicas (details.max = your plan's limit) when the count is outside 0..max copies per service. alerts takes one field, min_ready (0 = off); autoscaling takes enabled, min, max, cpu_percent, memory_percent. Any other field inside them is refused with 422 invalid_alerts / invalid_autoscaling (it used to be dropped silently).
Parameters
Field
in
Type
Description
idrequired
path
integer
Service id
Request body
Field
Type
Description
namerequired
string
Service name
imagerequired
string
Image reference, e.g. ghcr.io/acme/web:1.4 (public registries or your private registry)
port
integer
Container port (0 = no network port). Containers run as a non-root user: use a port >= 1024
replicas
integer
Number of instances (default 1)
cpu_m
integer
CPU per instance in millicores (250 = 0.25 vCPU)
memory_mi
integer
Memory per instance in MiB
public
boolean
HTTPS address <name>-<code>.gyroapp.net (and your domains)
health_path
string
HTTP health check path (empty = TCP check)
args
array<string>
Arguments for the image's default command. A JSON array of strings, e.g. ["sh","-c","echo a && npm start"]. A plain string is accepted too and split like a shell: whitespace separates, quotes keep text together ("..." with \" escapes, '...' literal): sh -c "echo a && npm start" -> ["sh","-c","echo a && npm start"]. A string starting with [ must be a valid JSON array; an unclosed quote is an error.
command
array<string>
Override the image entrypoint. A JSON array of strings, e.g. ["sh","-c","echo a && npm start"]. A plain string is accepted too and split like a shell: whitespace separates, quotes keep text together ("..." with \" escapes, '...' literal): sh -c "echo a && npm start" -> ["sh","-c","echo a && npm start"]. A string starting with [ must be a valid JSON array; an unclosed quote is an error.
env
object
Plain environment variables (replaces the whole set on update)
run_as_user
integer
User id inside the container (default 10001)
autoscaling
object
Autoscaling (horizontal): replicas follow the average CPU (and optionally memory) use of the reserved size. enabled:false = off (fixed replicas).
autoscaling.enabled
boolean
autoscaling.min
integer
autoscaling.max
integer
<= plan replica limit
autoscaling.cpu_percent
integer
autoscaling.memory_percent
integer
0 = off, else 10-95
alerts
object
Alert threshold: notify when fewer replicas are ready (0 = off). Channels: PUT /cloud/containers/{id}/notifications.
alerts.min_ready
integer
confirm
boolean
Responses
202
Tool data / result — data: object
404
Not found — also returned for objects owned by someone else
409
State conflict (server_locked, not_actionable, ssh_key_exists, server_limit, idempotency_in_flight)
422
Validation or business rule failure (confirm_required, invalid_image, tool_action_failed ...)
gyro container service create 12345 --help # all flags
# resource gyro_container_service: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_service
# A web service in your Gyro Containers (ECS) environment (Istanbul).
# service_id is the id of the container environment you ordered (see gyro_services).
variable "db_password" {
type = string
sensitive = true
}
resource "gyro_container_service" "web" {
service_id = 123
name = "web"
image = "ghcr.io/acme/web:1.4"
port = 8080
cpu_m = 500
memory_mi = 512
public = true
health_path = "/healthz"
env = { MODE = "prod" }
secrets = { DB_PASSWORD = var.db_password } # write only, never read back
# Replicas follow the load: 2..6, target 70 % CPU of cpu_m (replicas is ignored while autoscaling is set).
autoscaling = {
min = 2
max = 6
cpu_percent = 70
}
# Alert when fewer than 2 replicas are ready (channels: gyro_container_notifications).
notification = {
min_ready = 2
}
# Point a CNAME from your domain to gyro_container_service.web.host first.
domains = ["app.example.com"]
}
output "web_url" {
value = gyro_container_service.web.url
}
Get a container serviceScope: services_readtyped_get_containers__id__services__nameOpenAPI for this operation
Spec, state, problem code (ImagePullBackOff, CrashLoopBackOff, OOMKilled, Unschedulable ...), instances, revision, domains and the names of secrets (values are never returned). autoscaling = settings + live status (current/desired replicas, current CPU/memory %, at_max), capacity = {blocked, fits}. The answer carries namespace and, for services with a port, internal = {host, short, port: 80, target_port, address, url}: other services of the same environment reach it at internal.address (<name>.<namespace>.svc.cluster.local:80) or <name>:80. Each service has alerts = {"min_ready": N} at the top level (0 = off; the same value as spec.alerts).
Parameters
Field
in
Type
Description
idrequired
path
integer
Service id
namerequired
path
string
Service name
Responses
200
Tool data / result — data: object
404
Not found — also returned for objects owned by someone else
409
State conflict (server_locked, not_actionable, ssh_key_exists, server_limit, idempotency_in_flight)
422
Validation or business rule failure (confirm_required, invalid_image, tool_action_failed ...)
# resource gyro_container_service: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_service
# A web service in your Gyro Containers (ECS) environment (Istanbul).
# service_id is the id of the container environment you ordered (see gyro_services).
variable "db_password" {
type = string
sensitive = true
}
resource "gyro_container_service" "web" {
service_id = 123
name = "web"
image = "ghcr.io/acme/web:1.4"
port = 8080
cpu_m = 500
memory_mi = 512
public = true
health_path = "/healthz"
env = { MODE = "prod" }
secrets = { DB_PASSWORD = var.db_password } # write only, never read back
# Replicas follow the load: 2..6, target 70 % CPU of cpu_m (replicas is ignored while autoscaling is set).
autoscaling = {
min = 2
max = 6
cpu_percent = 70
}
# Alert when fewer than 2 replicas are ready (channels: gyro_container_notifications).
notification = {
min_ready = 2
}
# Point a CNAME from your domain to gyro_container_service.web.host first.
domains = ["app.example.com"]
}
output "web_url" {
value = gyro_container_service.web.url
}
import os, uuid, requests
h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.get("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/services/1", headers=h, timeout=60)
r.raise_for_status()
print(r.json()["data"])
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/services/1", {
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
},
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
Deploy a new version / change settingsScope: services_writetyped_patch_containers__id__services__nameOpenAPI for this operation
Send only the fields to change (e.g. image). Every change except replicas creates a new revision and rolls out instance by instance without downtime. With autoscaling on, replicas is ignored (the autoscaler owns it). autoscaling / alerts are settings, not revisions. Serverless environments:cpu_m / memory_mi must be one of the pairs from GET /cloud/billing/container-sizes (0.25-4 vCPU); billing is per running copy per hour (POST /cloud/billing/estimate with type: serverless). Refused with 422 invalid_replicas (details.max = your plan's limit) when the count is outside 0..max copies per service. alerts takes one field, min_ready (0 = off); autoscaling takes enabled, min, max, cpu_percent, memory_percent. Any other field inside them is refused with 422 invalid_alerts / invalid_autoscaling (it used to be dropped silently).
Parameters
Field
in
Type
Description
idrequired
path
integer
Service id
namerequired
path
string
Service name
Request body
Field
Type
Description
image
string
Image reference, e.g. ghcr.io/acme/web:1.4 (public registries or your private registry)
port
integer
Container port (0 = no network port). Containers run as a non-root user: use a port >= 1024
replicas
integer
Number of instances (default 1)
cpu_m
integer
CPU per instance in millicores (250 = 0.25 vCPU)
memory_mi
integer
Memory per instance in MiB
public
boolean
HTTPS address <name>-<code>.gyroapp.net (and your domains)
health_path
string
HTTP health check path (empty = TCP check)
args
array<string>
Arguments for the image's default command. A JSON array of strings, e.g. ["sh","-c","echo a && npm start"]. A plain string is accepted too and split like a shell: whitespace separates, quotes keep text together ("..." with \" escapes, '...' literal): sh -c "echo a && npm start" -> ["sh","-c","echo a && npm start"]. A string starting with [ must be a valid JSON array; an unclosed quote is an error.
command
array<string>
Override the image entrypoint. A JSON array of strings, e.g. ["sh","-c","echo a && npm start"]. A plain string is accepted too and split like a shell: whitespace separates, quotes keep text together ("..." with \" escapes, '...' literal): sh -c "echo a && npm start" -> ["sh","-c","echo a && npm start"]. A string starting with [ must be a valid JSON array; an unclosed quote is an error.
env
object
Plain environment variables (replaces the whole set on update)
run_as_user
integer
User id inside the container (default 10001)
reason
string
Free text shown in the revision history (e.g. a git sha)
autoscaling
object
Autoscaling (horizontal): replicas follow the average CPU (and optionally memory) use of the reserved size. enabled:false = off (fixed replicas).
autoscaling.enabled
boolean
autoscaling.min
integer
autoscaling.max
integer
<= plan replica limit
autoscaling.cpu_percent
integer
autoscaling.memory_percent
integer
0 = off, else 10-95
alerts
object
Alert threshold: notify when fewer replicas are ready (0 = off). Channels: PUT /cloud/containers/{id}/notifications.
alerts.min_ready
integer
confirm
boolean
Responses
202
Tool data / result — data: object
404
Not found — also returned for objects owned by someone else
409
State conflict (server_locked, not_actionable, ssh_key_exists, server_limit, idempotency_in_flight)
422
Validation or business rule failure (confirm_required, invalid_image, tool_action_failed ...)
gyro container service update 12345 --help # all flags
# resource gyro_container_service: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_service
# A web service in your Gyro Containers (ECS) environment (Istanbul).
# service_id is the id of the container environment you ordered (see gyro_services).
variable "db_password" {
type = string
sensitive = true
}
resource "gyro_container_service" "web" {
service_id = 123
name = "web"
image = "ghcr.io/acme/web:1.4"
port = 8080
cpu_m = 500
memory_mi = 512
public = true
health_path = "/healthz"
env = { MODE = "prod" }
secrets = { DB_PASSWORD = var.db_password } # write only, never read back
# Replicas follow the load: 2..6, target 70 % CPU of cpu_m (replicas is ignored while autoscaling is set).
autoscaling = {
min = 2
max = 6
cpu_percent = 70
}
# Alert when fewer than 2 replicas are ready (channels: gyro_container_notifications).
notification = {
min_ready = 2
}
# Point a CNAME from your domain to gyro_container_service.web.host first.
domains = ["app.example.com"]
}
output "web_url" {
value = gyro_container_service.web.url
}
gyro container service delete 12345 --help # all flags
# resource gyro_container_service: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_service
# A web service in your Gyro Containers (ECS) environment (Istanbul).
# service_id is the id of the container environment you ordered (see gyro_services).
variable "db_password" {
type = string
sensitive = true
}
resource "gyro_container_service" "web" {
service_id = 123
name = "web"
image = "ghcr.io/acme/web:1.4"
port = 8080
cpu_m = 500
memory_mi = 512
public = true
health_path = "/healthz"
env = { MODE = "prod" }
secrets = { DB_PASSWORD = var.db_password } # write only, never read back
# Replicas follow the load: 2..6, target 70 % CPU of cpu_m (replicas is ignored while autoscaling is set).
autoscaling = {
min = 2
max = 6
cpu_percent = 70
}
# Alert when fewer than 2 replicas are ready (channels: gyro_container_notifications).
notification = {
min_ready = 2
}
# Point a CNAME from your domain to gyro_container_service.web.host first.
domains = ["app.example.com"]
}
output "web_url" {
value = gyro_container_service.web.url
}
import os, uuid, requests
h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.delete("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/services/1", headers=h, json={"confirm": True}, timeout=60)
r.raise_for_status()
print(r.json()["data"])
Scale a serviceScope: services_writetyped_post_containers__id__services__name__scaleOpenAPI for this operation
Sets the number of instances (0 = stop, settings kept). Does not create a revision. Refused with 409 autoscaling_enabled while autoscaling is on (change min/max instead). Refused with 422 invalid_replicas (details.max = your plan's limit) when the count is outside 0..max copies per service.
Parameters
Field
in
Type
Description
idrequired
path
integer
Service id
namerequired
path
string
Service name
Request body
Field
Type
Description
replicasrequired
integer
confirm
boolean
Responses
202
Tool data / result — data: object
404
Not found — also returned for objects owned by someone else
409
State conflict (server_locked, not_actionable, ssh_key_exists, server_limit, idempotency_in_flight)
422
Validation or business rule failure (confirm_required, invalid_image, tool_action_failed ...)
gyro container service scale 12345 --help # all flags
# resource gyro_container_service: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_service
# A web service in your Gyro Containers (ECS) environment (Istanbul).
# service_id is the id of the container environment you ordered (see gyro_services).
variable "db_password" {
type = string
sensitive = true
}
resource "gyro_container_service" "web" {
service_id = 123
name = "web"
image = "ghcr.io/acme/web:1.4"
port = 8080
cpu_m = 500
memory_mi = 512
public = true
health_path = "/healthz"
env = { MODE = "prod" }
secrets = { DB_PASSWORD = var.db_password } # write only, never read back
# Replicas follow the load: 2..6, target 70 % CPU of cpu_m (replicas is ignored while autoscaling is set).
autoscaling = {
min = 2
max = 6
cpu_percent = 70
}
# Alert when fewer than 2 replicas are ready (channels: gyro_container_notifications).
notification = {
min_ready = 2
}
# Point a CNAME from your domain to gyro_container_service.web.host first.
domains = ["app.example.com"]
}
output "web_url" {
value = gyro_container_service.web.url
}
gyro container service restart 12345 --help # all flags
# resource gyro_container_service: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_service
# A web service in your Gyro Containers (ECS) environment (Istanbul).
# service_id is the id of the container environment you ordered (see gyro_services).
variable "db_password" {
type = string
sensitive = true
}
resource "gyro_container_service" "web" {
service_id = 123
name = "web"
image = "ghcr.io/acme/web:1.4"
port = 8080
cpu_m = 500
memory_mi = 512
public = true
health_path = "/healthz"
env = { MODE = "prod" }
secrets = { DB_PASSWORD = var.db_password } # write only, never read back
# Replicas follow the load: 2..6, target 70 % CPU of cpu_m (replicas is ignored while autoscaling is set).
autoscaling = {
min = 2
max = 6
cpu_percent = 70
}
# Alert when fewer than 2 replicas are ready (channels: gyro_container_notifications).
notification = {
min_ready = 2
}
# Point a CNAME from your domain to gyro_container_service.web.host first.
domains = ["app.example.com"]
}
output "web_url" {
value = gyro_container_service.web.url
}
import os, uuid, requests
h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.post("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/services/1/restart", headers=h, json={"confirm": True}, timeout=60)
r.raise_for_status()
print(r.json()["data"])
Roll back to an earlier revisionScope: services_writetyped_post_containers__id__services__name__rollbackOpenAPI for this operation
Restores image, size, command and variables of revision (default: the previous one) as a new revision. Replicas and secrets stay as they are. Needs "confirm": true.
Parameters
Field
in
Type
Description
idrequired
path
integer
Service id
namerequired
path
string
Service name
Request body
Field
Type
Description
revision
integer
Revision number (empty = previous)
confirm
boolean
Responses
202
Tool data / result — data: object
404
Not found — also returned for objects owned by someone else
409
State conflict (server_locked, not_actionable, ssh_key_exists, server_limit, idempotency_in_flight)
422
Validation or business rule failure (confirm_required, invalid_image, tool_action_failed ...)
gyro container service rollback 12345 --help # all flags
# resource gyro_container_service: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_service
# A web service in your Gyro Containers (ECS) environment (Istanbul).
# service_id is the id of the container environment you ordered (see gyro_services).
variable "db_password" {
type = string
sensitive = true
}
resource "gyro_container_service" "web" {
service_id = 123
name = "web"
image = "ghcr.io/acme/web:1.4"
port = 8080
cpu_m = 500
memory_mi = 512
public = true
health_path = "/healthz"
env = { MODE = "prod" }
secrets = { DB_PASSWORD = var.db_password } # write only, never read back
# Replicas follow the load: 2..6, target 70 % CPU of cpu_m (replicas is ignored while autoscaling is set).
autoscaling = {
min = 2
max = 6
cpu_percent = 70
}
# Alert when fewer than 2 replicas are ready (channels: gyro_container_notifications).
notification = {
min_ready = 2
}
# Point a CNAME from your domain to gyro_container_service.web.host first.
domains = ["app.example.com"]
}
output "web_url" {
value = gyro_container_service.web.url
}
# resource gyro_container_service: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_service
# A web service in your Gyro Containers (ECS) environment (Istanbul).
# service_id is the id of the container environment you ordered (see gyro_services).
variable "db_password" {
type = string
sensitive = true
}
resource "gyro_container_service" "web" {
service_id = 123
name = "web"
image = "ghcr.io/acme/web:1.4"
port = 8080
cpu_m = 500
memory_mi = 512
public = true
health_path = "/healthz"
env = { MODE = "prod" }
secrets = { DB_PASSWORD = var.db_password } # write only, never read back
# Replicas follow the load: 2..6, target 70 % CPU of cpu_m (replicas is ignored while autoscaling is set).
autoscaling = {
min = 2
max = 6
cpu_percent = 70
}
# Alert when fewer than 2 replicas are ready (channels: gyro_container_notifications).
notification = {
min_ready = 2
}
# Point a CNAME from your domain to gyro_container_service.web.host first.
domains = ["app.example.com"]
}
output "web_url" {
value = gyro_container_service.web.url
}
import os, uuid, requests
h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.get("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/services/1/revisions", headers=h, timeout=60)
r.raise_for_status()
print(r.json()["data"])
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/services/1/revisions", {
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
},
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
Set environment variablesScope: services_writetyped_put_containers__id__services__name__envOpenAPI for this operation
set merges variables ({"KEY": "value"} or KEY=VALUE lines), unset removes names, replace: 1 replaces the whole set. Creates a revision and restarts the service. Only set, unset and replace are accepted: an unknown field (e.g. env) or a body that changes nothing (no set, no unset, no replace: 1) is rejected with 422 invalid_env (details.expected lists the fields); nothing is saved and the service does not restart.
Parameters
Field
in
Type
Description
idrequired
path
integer
Service id
namerequired
path
string
Service name
Request body
Field
Type
Description
set
object
unset
array<string>
replace
integer (0, 1)
confirm
boolean
Responses
202
Tool data / result — data: object
404
Not found — also returned for objects owned by someone else
409
State conflict (server_locked, not_actionable, ssh_key_exists, server_limit, idempotency_in_flight)
422
invalid_env: unknown field or nothing to change (details.expected lists set / unset / replace)
# resource gyro_container_service: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_service
# A web service in your Gyro Containers (ECS) environment (Istanbul).
# service_id is the id of the container environment you ordered (see gyro_services).
variable "db_password" {
type = string
sensitive = true
}
resource "gyro_container_service" "web" {
service_id = 123
name = "web"
image = "ghcr.io/acme/web:1.4"
port = 8080
cpu_m = 500
memory_mi = 512
public = true
health_path = "/healthz"
env = { MODE = "prod" }
secrets = { DB_PASSWORD = var.db_password } # write only, never read back
# Replicas follow the load: 2..6, target 70 % CPU of cpu_m (replicas is ignored while autoscaling is set).
autoscaling = {
min = 2
max = 6
cpu_percent = 70
}
# Alert when fewer than 2 replicas are ready (channels: gyro_container_notifications).
notification = {
min_ready = 2
}
# Point a CNAME from your domain to gyro_container_service.web.host first.
domains = ["app.example.com"]
}
output "web_url" {
value = gyro_container_service.web.url
}
gyro container secret set 12345 --help # all flags
# resource gyro_container_service: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_service
# A web service in your Gyro Containers (ECS) environment (Istanbul).
# service_id is the id of the container environment you ordered (see gyro_services).
variable "db_password" {
type = string
sensitive = true
}
resource "gyro_container_service" "web" {
service_id = 123
name = "web"
image = "ghcr.io/acme/web:1.4"
port = 8080
cpu_m = 500
memory_mi = 512
public = true
health_path = "/healthz"
env = { MODE = "prod" }
secrets = { DB_PASSWORD = var.db_password } # write only, never read back
# Replicas follow the load: 2..6, target 70 % CPU of cpu_m (replicas is ignored while autoscaling is set).
autoscaling = {
min = 2
max = 6
cpu_percent = 70
}
# Alert when fewer than 2 replicas are ready (channels: gyro_container_notifications).
notification = {
min_ready = 2
}
# Point a CNAME from your domain to gyro_container_service.web.host first.
domains = ["app.example.com"]
}
output "web_url" {
value = gyro_container_service.web.url
}
gyro container secret delete 12345 --help # all flags
# resource gyro_container_service: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_service
# A web service in your Gyro Containers (ECS) environment (Istanbul).
# service_id is the id of the container environment you ordered (see gyro_services).
variable "db_password" {
type = string
sensitive = true
}
resource "gyro_container_service" "web" {
service_id = 123
name = "web"
image = "ghcr.io/acme/web:1.4"
port = 8080
cpu_m = 500
memory_mi = 512
public = true
health_path = "/healthz"
env = { MODE = "prod" }
secrets = { DB_PASSWORD = var.db_password } # write only, never read back
# Replicas follow the load: 2..6, target 70 % CPU of cpu_m (replicas is ignored while autoscaling is set).
autoscaling = {
min = 2
max = 6
cpu_percent = 70
}
# Alert when fewer than 2 replicas are ready (channels: gyro_container_notifications).
notification = {
min_ready = 2
}
# Point a CNAME from your domain to gyro_container_service.web.host first.
domains = ["app.example.com"]
}
output "web_url" {
value = gyro_container_service.web.url
}
import os, uuid, requests
h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.delete("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/services/1/secrets", headers=h, json={"confirm": True}, timeout=60)
r.raise_for_status()
print(r.json()["data"])
# resource gyro_container_service: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_service
# A web service in your Gyro Containers (ECS) environment (Istanbul).
# service_id is the id of the container environment you ordered (see gyro_services).
variable "db_password" {
type = string
sensitive = true
}
resource "gyro_container_service" "web" {
service_id = 123
name = "web"
image = "ghcr.io/acme/web:1.4"
port = 8080
cpu_m = 500
memory_mi = 512
public = true
health_path = "/healthz"
env = { MODE = "prod" }
secrets = { DB_PASSWORD = var.db_password } # write only, never read back
# Replicas follow the load: 2..6, target 70 % CPU of cpu_m (replicas is ignored while autoscaling is set).
autoscaling = {
min = 2
max = 6
cpu_percent = 70
}
# Alert when fewer than 2 replicas are ready (channels: gyro_container_notifications).
notification = {
min_ready = 2
}
# Point a CNAME from your domain to gyro_container_service.web.host first.
domains = ["app.example.com"]
}
output "web_url" {
value = gyro_container_service.web.url
}
import os, uuid, requests
h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.get("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/services/1/logs", headers=h, timeout=60)
r.raise_for_status()
print(r.json()["data"])
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/services/1/logs", {
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
},
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
# resource gyro_container_service: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_service
# A web service in your Gyro Containers (ECS) environment (Istanbul).
# service_id is the id of the container environment you ordered (see gyro_services).
variable "db_password" {
type = string
sensitive = true
}
resource "gyro_container_service" "web" {
service_id = 123
name = "web"
image = "ghcr.io/acme/web:1.4"
port = 8080
cpu_m = 500
memory_mi = 512
public = true
health_path = "/healthz"
env = { MODE = "prod" }
secrets = { DB_PASSWORD = var.db_password } # write only, never read back
# Replicas follow the load: 2..6, target 70 % CPU of cpu_m (replicas is ignored while autoscaling is set).
autoscaling = {
min = 2
max = 6
cpu_percent = 70
}
# Alert when fewer than 2 replicas are ready (channels: gyro_container_notifications).
notification = {
min_ready = 2
}
# Point a CNAME from your domain to gyro_container_service.web.host first.
domains = ["app.example.com"]
}
output "web_url" {
value = gyro_container_service.web.url
}
import os, uuid, requests
h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.get("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/services/1/metrics", headers=h, timeout=60)
r.raise_for_status()
print(r.json()["data"])
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/services/1/metrics", {
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
},
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
# resource gyro_container_service: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_service
# A web service in your Gyro Containers (ECS) environment (Istanbul).
# service_id is the id of the container environment you ordered (see gyro_services).
variable "db_password" {
type = string
sensitive = true
}
resource "gyro_container_service" "web" {
service_id = 123
name = "web"
image = "ghcr.io/acme/web:1.4"
port = 8080
cpu_m = 500
memory_mi = 512
public = true
health_path = "/healthz"
env = { MODE = "prod" }
secrets = { DB_PASSWORD = var.db_password } # write only, never read back
# Replicas follow the load: 2..6, target 70 % CPU of cpu_m (replicas is ignored while autoscaling is set).
autoscaling = {
min = 2
max = 6
cpu_percent = 70
}
# Alert when fewer than 2 replicas are ready (channels: gyro_container_notifications).
notification = {
min_ready = 2
}
# Point a CNAME from your domain to gyro_container_service.web.host first.
domains = ["app.example.com"]
}
output "web_url" {
value = gyro_container_service.web.url
}
import os, uuid, requests
h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.get("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/services/1/domains", headers=h, timeout=60)
r.raise_for_status()
print(r.json()["data"])
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/services/1/domains", {
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
},
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
Attach a domainScope: services_writetyped_post_containers__id__services__name__domainsOpenAPI for this operation
Point a CNAME to the service host (<name>-<code>.gyroapp.net) first; the domain is activated (with a free certificate) once its DNS points to us, checked hourly or with .../domains/verify.
Parameters
Field
in
Type
Description
idrequired
path
integer
Service id
namerequired
path
string
Service name
Request body
Field
Type
Description
domainrequired
string
confirm
boolean
Responses
202
Tool data / result — data: object
404
Not found — also returned for objects owned by someone else
409
State conflict (server_locked, not_actionable, ssh_key_exists, server_limit, idempotency_in_flight)
422
Validation or business rule failure (confirm_required, invalid_image, tool_action_failed ...)
gyro container domain add 12345 --help # all flags
# resource gyro_container_service: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_service
# A web service in your Gyro Containers (ECS) environment (Istanbul).
# service_id is the id of the container environment you ordered (see gyro_services).
variable "db_password" {
type = string
sensitive = true
}
resource "gyro_container_service" "web" {
service_id = 123
name = "web"
image = "ghcr.io/acme/web:1.4"
port = 8080
cpu_m = 500
memory_mi = 512
public = true
health_path = "/healthz"
env = { MODE = "prod" }
secrets = { DB_PASSWORD = var.db_password } # write only, never read back
# Replicas follow the load: 2..6, target 70 % CPU of cpu_m (replicas is ignored while autoscaling is set).
autoscaling = {
min = 2
max = 6
cpu_percent = 70
}
# Alert when fewer than 2 replicas are ready (channels: gyro_container_notifications).
notification = {
min_ready = 2
}
# Point a CNAME from your domain to gyro_container_service.web.host first.
domains = ["app.example.com"]
}
output "web_url" {
value = gyro_container_service.web.url
}
gyro container domain verify 12345 --help # all flags
# resource gyro_container_service: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_service
# A web service in your Gyro Containers (ECS) environment (Istanbul).
# service_id is the id of the container environment you ordered (see gyro_services).
variable "db_password" {
type = string
sensitive = true
}
resource "gyro_container_service" "web" {
service_id = 123
name = "web"
image = "ghcr.io/acme/web:1.4"
port = 8080
cpu_m = 500
memory_mi = 512
public = true
health_path = "/healthz"
env = { MODE = "prod" }
secrets = { DB_PASSWORD = var.db_password } # write only, never read back
# Replicas follow the load: 2..6, target 70 % CPU of cpu_m (replicas is ignored while autoscaling is set).
autoscaling = {
min = 2
max = 6
cpu_percent = 70
}
# Alert when fewer than 2 replicas are ready (channels: gyro_container_notifications).
notification = {
min_ready = 2
}
# Point a CNAME from your domain to gyro_container_service.web.host first.
domains = ["app.example.com"]
}
output "web_url" {
value = gyro_container_service.web.url
}
import os, uuid, requests
h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.post("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/services/1/domains/verify", headers=h, json={"confirm": True}, timeout=60)
r.raise_for_status()
print(r.json()["data"])
gyro container domain remove 12345 --help # all flags
# resource gyro_container_service: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_service
# A web service in your Gyro Containers (ECS) environment (Istanbul).
# service_id is the id of the container environment you ordered (see gyro_services).
variable "db_password" {
type = string
sensitive = true
}
resource "gyro_container_service" "web" {
service_id = 123
name = "web"
image = "ghcr.io/acme/web:1.4"
port = 8080
cpu_m = 500
memory_mi = 512
public = true
health_path = "/healthz"
env = { MODE = "prod" }
secrets = { DB_PASSWORD = var.db_password } # write only, never read back
# Replicas follow the load: 2..6, target 70 % CPU of cpu_m (replicas is ignored while autoscaling is set).
autoscaling = {
min = 2
max = 6
cpu_percent = 70
}
# Alert when fewer than 2 replicas are ready (channels: gyro_container_notifications).
notification = {
min_ready = 2
}
# Point a CNAME from your domain to gyro_container_service.web.host first.
domains = ["app.example.com"]
}
output "web_url" {
value = gyro_container_service.web.url
}
import os, uuid, requests
h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.delete("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/services/1/domains/1", headers=h, json={"confirm": True}, timeout=60)
r.raise_for_status()
print(r.json()["data"])
Autoscaling / alert threshold of a serviceScope: services_writetyped_put_containers__id__services__name__autoscalingOpenAPI for this operation
Body {"autoscaling": {"enabled": true, "min": 1, "max": 5, "cpu_percent": 70, "memory_percent": 0}, "alerts": {"min_ready": 2}}. Replicas are added when the average use exceeds the target (at most double per 30 s) and removed one per minute after 3 calm minutes. Max cannot exceed the plan replica limit; replicas that do not fit in the node pool wait (warnings: max_exceeds_capacity, alert capacity). Not a revision. Switching off keeps the current replica count (or replicas). Refused with 422 invalid_replicas (details.max = your plan's limit) when the count is outside 0..max copies per service. alerts takes one field, min_ready (0 = off); autoscaling takes enabled, min, max, cpu_percent, memory_percent. Any other field inside them is refused with 422 invalid_alerts / invalid_autoscaling (it used to be dropped silently).
Parameters
Field
in
Type
Description
idrequired
path
integer
Service id
namerequired
path
string
Service name
Request body
Field
Type
Description
autoscaling
object
Autoscaling (horizontal): replicas follow the average CPU (and optionally memory) use of the reserved size. enabled:false = off (fixed replicas).
autoscaling.enabled
boolean
autoscaling.min
integer
autoscaling.max
integer
<= plan replica limit
autoscaling.cpu_percent
integer
autoscaling.memory_percent
integer
0 = off, else 10-95
alerts
object
Alert threshold: notify when fewer replicas are ready (0 = off). Channels: PUT /cloud/containers/{id}/notifications.
alerts.min_ready
integer
replicas
integer
Fixed replicas when switching autoscaling off
confirm
boolean
Responses
202
Tool data / result — data: object
404
Not found — also returned for objects owned by someone else
409
State conflict (server_locked, not_actionable, ssh_key_exists, server_limit, idempotency_in_flight)
422
Validation or business rule failure (confirm_required, invalid_image, tool_action_failed ...)
gyro container service autoscale 12345 --help # all flags
# resource gyro_container_service: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_service
# A web service in your Gyro Containers (ECS) environment (Istanbul).
# service_id is the id of the container environment you ordered (see gyro_services).
variable "db_password" {
type = string
sensitive = true
}
resource "gyro_container_service" "web" {
service_id = 123
name = "web"
image = "ghcr.io/acme/web:1.4"
port = 8080
cpu_m = 500
memory_mi = 512
public = true
health_path = "/healthz"
env = { MODE = "prod" }
secrets = { DB_PASSWORD = var.db_password } # write only, never read back
# Replicas follow the load: 2..6, target 70 % CPU of cpu_m (replicas is ignored while autoscaling is set).
autoscaling = {
min = 2
max = 6
cpu_percent = 70
}
# Alert when fewer than 2 replicas are ready (channels: gyro_container_notifications).
notification = {
min_ready = 2
}
# Point a CNAME from your domain to gyro_container_service.web.host first.
domains = ["app.example.com"]
}
output "web_url" {
value = gyro_container_service.web.url
}
Notification settings and current alertsScope: services_readtyped_get_containers__id__notificationsOpenAPI for this operation
settings (channels, events, cooldown; the webhook secret is never returned), conditions = what is wrong right now, history = last 30 alerts. Events: down (no ready replica for >3 min), crashloop (keeps restarting / image pull fails / out of memory), replicas_low (below alerts.min_ready), scale_max (autoscaling wants more than max), capacity (replicas wait for room in the node pool), egress (the egress IPs of the environment changed; one message, no resolved). An event is announced after ~2 minutes, at most once per cooldown per service + event (flapping included), with a 'resolved' message.
Parameters
Field
in
Type
Description
idrequired
path
integer
Service id
Responses
200
Tool data / result — data: object
404
Not found — also returned for objects owned by someone else
409
State conflict (server_locked, not_actionable, ssh_key_exists, server_limit, idempotency_in_flight)
422
Validation or business rule failure (confirm_required, invalid_image, tool_action_failed ...)
Set notification channelsScope: services_writetyped_put_containers__id__notificationsOpenAPI for this operation
Send only the fields to change. A webhook secret is generated when a webhook URL is first set (POST .../notifications/webhook-secret returns it). No WhatsApp.
Parameters
Field
in
Type
Description
idrequired
path
integer
Service id
Request body
Field
Type
Description
email
boolean
Account e-mail (default on)
sms
boolean
Account phone
telegram
string
Telegram chat id (send /start to the platform bot, e.g. @gyrouptime_bot); empty = off
webhook_url
string
https URL of a public server; JSON POST signed with X-Gyro-Signature: sha256=HMAC(secret, X-Gyro-Timestamp + '.' + body)
Your dedicated nodes (aliases node-1..n), pool capacity and usage, ingress IPs for apex A records, private registry (user only). Also namespace, cluster_dns and egress (schema ContainerEgress).
Parameters
Field
in
Type
Description
idrequired
path
integer
Service id
Responses
200
Tool data / result — data: object
404
Not found — also returned for objects owned by someone else
409
State conflict (server_locked, not_actionable, ssh_key_exists, server_limit, idempotency_in_flight)
422
Validation or business rule failure (confirm_required, invalid_image, tool_action_failed ...)
Adds or removes extra nodes of the plan's node size (absolute extra_nodes, 0 = plan only; at most 20 nodes per environment in total, GyroKota may lower it). An extra node costs the same as a plan node, billed hourly from the prepaid balance. Removing drains first: replicas move to the remaining nodes (services restart one by one, health checked), then the node is deleted; it is not billed while drained. Refused with 409 quota_in_use when the remaining nodes cannot hold the running services. Serverless environments have no nodes. Needs "confirm": true. Every change of a dedicated environment's node set (plan change, extra node added or removed) is announced BEFORE the old nodes go: as soon as the new nodes' addresses are known (usually under a minute) the owner is notified (Alerts channels, event egress) and egress_change / pending_egress_ips show them. With the approval step on (PUT /cloud/containers/{id}/egress-approval, 1-72 hours, 24 recommended) the new nodes take no traffic and the old nodes keep serving until POST /cloud/containers/{id}/egress-change/approve or the deadline (then it continues by itself). A removal only never waits.
Parameters
Field
in
Type
Description
idrequired
path
integer
Service id
Request body
Field
Type
Description
extra_nodesrequired
integer
confirm
boolean
Responses
202
Tool data / result — data: object
404
Not found — also returned for objects owned by someone else
409
State conflict (server_locked, not_actionable, ssh_key_exists, server_limit, idempotency_in_flight)
422
Validation or business rule failure (confirm_required, invalid_image, tool_action_failed ...)
Container environment detail (namespace, internal addressing, egress IPs)Scope: services_readgetContainerEnvironmentOpenAPI for this operation
Environment code, Kubernetes namespace, in-cluster addressing (cluster_dns), plan limits, nodes, quota, ingress IPs and the current egress IPs. Egress IPs of a dedicated environment = the public IPs of its own nodes + the shared pool node(s) used while an update rolls out (the new copy starts there for about a minute, then moves back to your node). Serverless = the shared sandboxed pool nodes (the pool can grow: a new address can appear). Build machines of Gyro Pipeline are listed separately (build_ips). The list changes when the nodes change (plan change, node replacement, pool scaling); the owner is notified (Alerts channels, event egress). No IPv6 egress; outbound TCP 25 is closed. A fixed egress address is not offered yet.
Parameters
Field
in
Type
Description
idrequired
path
integer
Service id
Responses
200
OK — data: ContainerEnvironment
404
Not found — also returned for objects owned by someone else
# data source gyro_container_environment: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/data-sources/container_environment
data "gyro_container_environment" "app" {
service_id = 12345
}
# Egress IPs: put them on the IP allow list of an external service (database, payment provider, partner API).
# They change when the environment's nodes change; the owner is notified and this list is always current.
output "egress_ips" {
value = data.gyro_container_environment.app.egress_ips
}
# Other services of the same environment reach a service at <service>.<namespace>.svc.cluster.local:80 (or <service>:80).
output "api_internal_url" {
value = "http://api.${data.gyro_container_environment.app.service_domain}"
}
import os, uuid, requests
h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.get("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345", headers=h, timeout=60)
r.raise_for_status()
print(r.json()["data"])
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345", {
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
},
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
Delete a container environment (prepaid)Scope: cloud_deletedeleteContainerEnvironmentOpenAPI for this operation
Same as the panel's Spending > Delete: hourly charges stop at once and the environment is deleted right away with every service, node, registry image, pipeline and custom domain binding (no retention period). Needs "confirm": true (body or query) and an Idempotency-Key header; repeating returns 202 deleted. Environments billed by invoice answer 409 not_prepaid. Terraform: destroying gyro_container_environment calls this.
Parameters
Field
in
Type
Description
idrequired
path
integer
Service id
Idempotency-Keyrequired
header
string
confirm
query
boolean
Request body
Field
Type
Description
confirm
boolean
Responses
202
Deleting — data: object
400
idempotency_key_required
404
Not found — also returned for objects owned by someone else
409
State conflict (server_locked, not_actionable, ssh_key_exists, server_limit, idempotency_in_flight)
422
Validation or business rule failure (confirm_required, invalid_image, tool_action_failed ...)
Egress IPs of a container environmentScope: services_readgetContainerEgressIpsOpenAPI for this operation
Current public IPv4 addresses the containers reach the internet from - add them to the IP allow list of an external service. Egress IPs of a dedicated environment = the public IPs of its own nodes + the shared pool node(s) used while an update rolls out (the new copy starts there for about a minute, then moves back to your node). Serverless = the shared sandboxed pool nodes (the pool can grow: a new address can appear). Build machines of Gyro Pipeline are listed separately (build_ips). The list changes when the nodes change (plan change, node replacement, pool scaling); the owner is notified (Alerts channels, event egress). No IPv6 egress; outbound TCP 25 is closed. A fixed egress address is not offered yet.
Parameters
Field
in
Type
Description
idrequired
path
integer
Service id
Responses
200
OK — data: object
404
Not found — also returned for objects owned by someone else
# data source gyro_container_environment: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/data-sources/container_environment
data "gyro_container_environment" "app" {
service_id = 12345
}
# Egress IPs: put them on the IP allow list of an external service (database, payment provider, partner API).
# They change when the environment's nodes change; the owner is notified and this list is always current.
output "egress_ips" {
value = data.gyro_container_environment.app.egress_ips
}
# Other services of the same environment reach a service at <service>.<namespace>.svc.cluster.local:80 (or <service>:80).
output "api_internal_url" {
value = "http://api.${data.gyro_container_environment.app.service_domain}"
}
import os, uuid, requests
h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.get("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/egress-ips", headers=h, timeout=60)
r.raise_for_status()
print(r.json()["data"])
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/egress-ips", {
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
},
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
Approval step for egress changesScope: services_writesetContainerEgressApprovalOpenAPI for this operation
hours 1-72 turns the approval step on (24 recommended), 0 turns it off. Every change of a dedicated environment's node set (plan change, extra node added or removed) is announced BEFORE the old nodes go: as soon as the new nodes' addresses are known (usually under a minute) the owner is notified (Alerts channels, event egress) and egress_change / pending_egress_ips show them. With the approval step on (PUT /cloud/containers/{id}/egress-approval, 1-72 hours, 24 recommended) the new nodes take no traffic and the old nodes keep serving until POST /cloud/containers/{id}/egress-change/approve or the deadline (then it continues by itself). A removal only never waits.
Parameters
Field
in
Type
Description
idrequired
path
integer
Service id
Request body
Field
Type
Description
hoursrequired
integer
confirm
boolean
Responses
202
Tool data / result — data: object
404
Not found — also returned for objects owned by someone else
409
State conflict (server_locked, not_actionable, ssh_key_exists, server_limit, idempotency_in_flight)
422
Validation or business rule failure (confirm_required, invalid_image, tool_action_failed ...)
Approve the pending egress changeScope: services_writeapproveContainerEgressChangeOpenAPI for this operation
Continue now: the new nodes start taking traffic, the old ones are drained and removed. id (optional) must match egress_change.id (409 change_mismatch when a newer change replaced it). 409 no_pending_change / change_preparing. Every change of a dedicated environment's node set (plan change, extra node added or removed) is announced BEFORE the old nodes go: as soon as the new nodes' addresses are known (usually under a minute) the owner is notified (Alerts channels, event egress) and egress_change / pending_egress_ips show them. With the approval step on (PUT /cloud/containers/{id}/egress-approval, 1-72 hours, 24 recommended) the new nodes take no traffic and the old nodes keep serving until POST /cloud/containers/{id}/egress-change/approve or the deadline (then it continues by itself). A removal only never waits.
Parameters
Field
in
Type
Description
idrequired
path
integer
Service id
Request body
Field
Type
Description
id
string
confirm
boolean
Responses
202
Tool data / result — data: object
404
Not found — also returned for objects owned by someone else
409
State conflict (server_locked, not_actionable, ssh_key_exists, server_limit, idempotency_in_flight)
422
Validation or business rule failure (confirm_required, invalid_image, tool_action_failed ...)
Gyro image registry of the environmentScope: services_readtyped_get_containers__id__registryOpenAPI for this operation
Host, image prefix <host>/<code>/, username, usage (used_gb, free_gb = 2, billable_gb, cap_gb = 50), push_allowed and the clean-up policy. Only this environment can push/pull its repositories. Above 2 GB: €0.05 per GB per month, charged hourly from the prepaid balance. The password is returned only by POST .../registry/credentials.
Parameters
Field
in
Type
Description
idrequired
path
integer
Service id
Responses
200
Tool data / result — data: object
404
Not found — also returned for objects owned by someone else
409
State conflict (server_locked, not_actionable, ssh_key_exists, server_limit, idempotency_in_flight)
422
Validation or business rule failure (confirm_required, invalid_image, tool_action_failed ...)
Image clean-up policyScope: services_writetyped_put_containers__id__registry_policyOpenAPI for this operation
enabled (default true), keep 1-50 (images of the last N revisions of every service are kept, default 10), untagged_days 1-90 (images used by no revision are deleted after, default 7).
Parameters
Field
in
Type
Description
idrequired
path
integer
Service id
Request body
Field
Type
Description
enabled
boolean
keep
integer
untagged_days
integer
confirm
boolean
Responses
202
Tool data / result — data: object
404
Not found — also returned for objects owned by someone else
409
State conflict (server_locked, not_actionable, ssh_key_exists, server_limit, idempotency_in_flight)
422
Validation or business rule failure (confirm_required, invalid_image, tool_action_failed ...)
# resource gyro_container_image: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_image
# Copy an image into the environment's private Gyro registry (no docker push), then run it.
resource "gyro_container_image" "web" {
service_id = 12345 # container environment (gyro-ecs-1)
source = "nginxinc/nginx-unprivileged:1.27-alpine"
repo = "web"
tag = "1.27"
}
# A private image: the token is used only for the copy (prefer a read-only token).
resource "gyro_container_image" "app" {
service_id = 12345
source = "ghcr.io/gyro-ornek/uygulama:1.0"
username = "gyro-ornek"
password = var.ghcr_read_token
}
resource "gyro_container_service" "web" {
service_id = 12345
name = "web"
image = gyro_container_image.web.image
port = 8080
public = true
}
import os, uuid, requests
h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.get("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/registry/images", headers=h, timeout=60)
r.raise_for_status()
print(r.json()["data"])
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/registry/images", {
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
},
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
gyro container registry image-delete 12345 --help # all flags
# resource gyro_container_image: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_image
# Copy an image into the environment's private Gyro registry (no docker push), then run it.
resource "gyro_container_image" "web" {
service_id = 12345 # container environment (gyro-ecs-1)
source = "nginxinc/nginx-unprivileged:1.27-alpine"
repo = "web"
tag = "1.27"
}
# A private image: the token is used only for the copy (prefer a read-only token).
resource "gyro_container_image" "app" {
service_id = 12345
source = "ghcr.io/gyro-ornek/uygulama:1.0"
username = "gyro-ornek"
password = var.ghcr_read_token
}
resource "gyro_container_service" "web" {
service_id = 12345
name = "web"
image = gyro_container_image.web.image
port = 8080
public = true
}
import os, uuid, requests
h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.delete("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/registry/images", headers=h, json={"confirm": True}, timeout=60)
r.raise_for_status()
print(r.json()["data"])
Image imports (progress and history)Scope: services_readlistContainerImageImportsOpenAPI for this operation
active = the running import (or null) with phase, bytes_done/bytes_total, layers_done/layers; jobs = the last 20 imports (newest first) with state and, when failed, error + message; limits.
Parameters
Field
in
Type
Description
idrequired
path
integer
Container environment (service) id
Responses
200
OK — data: object
404
Not found — also returned for objects owned by someone else
409
State conflict (server_locked, not_actionable, ssh_key_exists, server_limit, idempotency_in_flight)
422
Validation or business rule failure (confirm_required, invalid_image, tool_action_failed ...)
# resource gyro_container_image: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_image
# Copy an image into the environment's private Gyro registry (no docker push), then run it.
resource "gyro_container_image" "web" {
service_id = 12345 # container environment (gyro-ecs-1)
source = "nginxinc/nginx-unprivileged:1.27-alpine"
repo = "web"
tag = "1.27"
}
# A private image: the token is used only for the copy (prefer a read-only token).
resource "gyro_container_image" "app" {
service_id = 12345
source = "ghcr.io/gyro-ornek/uygulama:1.0"
username = "gyro-ornek"
password = var.ghcr_read_token
}
resource "gyro_container_service" "web" {
service_id = 12345
name = "web"
image = gyro_container_image.web.image
port = 8080
public = true
}
import os, uuid, requests
h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.get("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/registry/imports", headers=h, timeout=60)
r.raise_for_status()
print(r.json()["data"])
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/registry/imports", {
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
},
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
Import an image from another registryScope: services_writeimportContainerImageOpenAPI for this operation
Copies an image (e.g. nginx:1.27, docker.io/library/redis:7, ghcr.io/gyro-ornek/uygulama:1.0) into the environment's Gyro registry without docker push. HTTPS registries only; only the linux/amd64 variant of multi-platform images is copied. repo (default: last part of the source name) and tag (default: source tag) name the copy under <host>/<code>/; an existing name:tag needs overwrite: true. Private images: username + password (token) are used only for this copy, never stored or returned, and redacted in the API log. Runs in the background: poll GET .../registry/imports. Limits: 1 running import per environment (409 import_running), 10 per hour (429 import_rate_limited), 15 minutes, 128 layers, size within the free registry space (50 GB cap, 2 GB free, then the usual €0.05/GB-month). Sources that resolve to private, internal or Gyro infrastructure addresses are refused (source_blocked).
Parameters
Field
in
Type
Description
idrequired
path
integer
Container environment (service) id
Request body
Field
Type
Description
sourcerequired
string
source image (host/repo:tag or @sha256:...); docker.io when no host
repo
string
target name under your prefix (lowercase, max 3 levels)
tag
string
target tag (default: source tag, latest for a digest)
username
string
private source: username (not stored)
password
string
private source: token / password (not stored, redacted in logs)
overwrite
boolean
replace an existing name:tag
Responses
202
OK — data: object
404
Not found — also returned for objects owned by someone else
409
State conflict (server_locked, not_actionable, ssh_key_exists, server_limit, idempotency_in_flight)
422
Validation or business rule failure (confirm_required, invalid_image, tool_action_failed ...)
gyro container registry import 12345 --help # all flags
# resource gyro_container_image: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_image
# Copy an image into the environment's private Gyro registry (no docker push), then run it.
resource "gyro_container_image" "web" {
service_id = 12345 # container environment (gyro-ecs-1)
source = "nginxinc/nginx-unprivileged:1.27-alpine"
repo = "web"
tag = "1.27"
}
# A private image: the token is used only for the copy (prefer a read-only token).
resource "gyro_container_image" "app" {
service_id = 12345
source = "ghcr.io/gyro-ornek/uygulama:1.0"
username = "gyro-ornek"
password = var.ghcr_read_token
}
resource "gyro_container_service" "web" {
service_id = 12345
name = "web"
image = gyro_container_image.web.image
port = 8080
public = true
}
Pipelines of the environment with the last run, plan limits (concurrent, monthly_minutes, max_timeout, max_cpu_m, max_memory_mi, max_pipelines) and this month's build minutes.
Parameters
Field
in
Type
Description
idrequired
path
integer
Service id
Responses
200
OK — data: object
404
Not found — also returned for objects owned by someone else
409
State conflict (server_locked, not_actionable, ssh_key_exists, server_limit, idempotency_in_flight)
422
Validation or business rule failure (confirm_required, invalid_image, tool_action_failed ...)
# resource gyro_container_pipeline: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_pipeline
# Build the repository's Dockerfile on every push to main (or a v* tag) and roll the "web" service out to it.
resource "gyro_container_pipeline" "web" {
service_id = 12345 # container environment (gyro-ecs-1)
name = "web"
repo = "https://github.com/gyro-ornek/uygulama"
token = var.github_read_token # private repository only (read access)
branch = "main"
tags = "v*"
image = "web"
targets = ["web"]
# multi-stage Dockerfile: build the "production" stage (FROM node:20 AS production) instead of the last one
build_target = "production"
build_args = { APP_VERSION = "1.2.0" } # Dockerfile ARG (not for secrets)
# optional build step before the Dockerfile (tests ...); secrets are environment variables here
build_image = "node:22-alpine"
commands = ["npm ci", "npm test"]
secrets = { NPM_TOKEN = var.npm_token }
}
# Add these to the repository: Settings > Webhooks (application/json, push event)
output "webhook_url" { value = gyro_container_pipeline.web.webhook_url }
output "webhook_secret" {
value = gyro_container_pipeline.web.webhook_secret
sensitive = true
}
# Private repository over SSH: Gyro creates a read-only deploy key (the private key never leaves Gyro).
# GitHub / GitLab / Bitbucket host keys are pinned; for your own git server set ssh_host_fingerprint.
resource "gyro_container_pipeline" "api" {
service_id = 12345
name = "api"
repo = "[email protected]:gyro-ornek/api.git"
deploy_key = true
image = "api"
targets = ["api"]
}
# Add this to the repository: Settings > Deploy keys (read only)
output "deploy_key" { value = gyro_container_pipeline.api.deploy_key_public }
# Archive builds only (no repository): upload with the API (POST .../pipelines/{id}/uploads) and run with the upload id.
resource "gyro_container_pipeline" "site" {
service_id = 12345
name = "site"
git_provider = "archive"
image = "site"
targets = ["web"]
}
import os, uuid, requests
h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.get("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/pipelines", headers=h, timeout=60)
r.raise_for_status()
print(r.json()["data"])
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/pipelines", {
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
},
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
Connects a repository. The answer contains webhook_url and (only here and in GET .../webhook) webhook_secret: add both to the repository's webhook (GitHub: application/json + Secret, push event; GitLab: Secret token, push + tag push; Gitea: secret; other: X-Gyro-Signature HMAC). Optional token for a private repository. repo is required unless provider is archive (archive pipelines build only uploaded archives: POST .../uploads, then a run with upload_id).
Parameters
Field
in
Type
Description
idrequired
path
integer
Service id
Request body
Field
Type
Description
namerequired
string
Display name (1-48)
provider
string (github, gitlab, gitea, git, archive)
repo
string
Required for github / gitlab / gitea / git: https clone URL (no credentials) or SSH address git@host:org/repo.git / ssh://user@host[:port]/path (needs a deploy key). Leave it out for provider archive (an archive pipeline has no repository; a value sent with archive is ignored and the answer shows repo empty).
token
string
Read-only access token for a private repository (stored encrypted, never returned; "-" on update removes it)
git_user
string
User name for the token (default: x-access-token / oauth2 / git)
Read gyro-pipeline.yml from the repository (GitHub, GitLab, Gitea)
imagerequired
string
Image name in the environment registry (<registry>/<code>/<image>:<sha7> + :latest)
dockerfile
string
context
string
Build folder (empty = repository root)
build_target
string
Stage of a multi-stage Dockerfile to build (FROM node:20 AS production -> production, same as docker build --target). Empty = the last stage. Stage names are case-insensitive (stored lowercase). A stage the Dockerfile does not have fails the run with build_target_not_found. gyro-pipeline.yml: build_target: overrides it per run. CLI: --target (or --build-target).
targets
array<string>
Services that get the new image (empty = build only)
approval
boolean
Wait for approval before deploying (24 h)
auto_rollback
boolean
Roll back when the new version is unhealthy
build_image
string
Image that runs commands (e.g. node:22-alpine)
commands
array<string>
Shell commands run in the repository root before the Dockerfile (tests, npm ci ...); build secrets are environment variables here
build_env
object
Variables for commands
build_args
object
Dockerfile ARG values (visible in the image history)
gyro container pipeline create 12345 --help # all flags
# resource gyro_container_pipeline: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_pipeline
# Build the repository's Dockerfile on every push to main (or a v* tag) and roll the "web" service out to it.
resource "gyro_container_pipeline" "web" {
service_id = 12345 # container environment (gyro-ecs-1)
name = "web"
repo = "https://github.com/gyro-ornek/uygulama"
token = var.github_read_token # private repository only (read access)
branch = "main"
tags = "v*"
image = "web"
targets = ["web"]
# multi-stage Dockerfile: build the "production" stage (FROM node:20 AS production) instead of the last one
build_target = "production"
build_args = { APP_VERSION = "1.2.0" } # Dockerfile ARG (not for secrets)
# optional build step before the Dockerfile (tests ...); secrets are environment variables here
build_image = "node:22-alpine"
commands = ["npm ci", "npm test"]
secrets = { NPM_TOKEN = var.npm_token }
}
# Add these to the repository: Settings > Webhooks (application/json, push event)
output "webhook_url" { value = gyro_container_pipeline.web.webhook_url }
output "webhook_secret" {
value = gyro_container_pipeline.web.webhook_secret
sensitive = true
}
# Private repository over SSH: Gyro creates a read-only deploy key (the private key never leaves Gyro).
# GitHub / GitLab / Bitbucket host keys are pinned; for your own git server set ssh_host_fingerprint.
resource "gyro_container_pipeline" "api" {
service_id = 12345
name = "api"
repo = "[email protected]:gyro-ornek/api.git"
deploy_key = true
image = "api"
targets = ["api"]
}
# Add this to the repository: Settings > Deploy keys (read only)
output "deploy_key" { value = gyro_container_pipeline.api.deploy_key_public }
# Archive builds only (no repository): upload with the API (POST .../pipelines/{id}/uploads) and run with the upload id.
resource "gyro_container_pipeline" "site" {
service_id = 12345
name = "site"
git_provider = "archive"
image = "site"
targets = ["web"]
}
# resource gyro_container_pipeline: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_pipeline
# Build the repository's Dockerfile on every push to main (or a v* tag) and roll the "web" service out to it.
resource "gyro_container_pipeline" "web" {
service_id = 12345 # container environment (gyro-ecs-1)
name = "web"
repo = "https://github.com/gyro-ornek/uygulama"
token = var.github_read_token # private repository only (read access)
branch = "main"
tags = "v*"
image = "web"
targets = ["web"]
# multi-stage Dockerfile: build the "production" stage (FROM node:20 AS production) instead of the last one
build_target = "production"
build_args = { APP_VERSION = "1.2.0" } # Dockerfile ARG (not for secrets)
# optional build step before the Dockerfile (tests ...); secrets are environment variables here
build_image = "node:22-alpine"
commands = ["npm ci", "npm test"]
secrets = { NPM_TOKEN = var.npm_token }
}
# Add these to the repository: Settings > Webhooks (application/json, push event)
output "webhook_url" { value = gyro_container_pipeline.web.webhook_url }
output "webhook_secret" {
value = gyro_container_pipeline.web.webhook_secret
sensitive = true
}
# Private repository over SSH: Gyro creates a read-only deploy key (the private key never leaves Gyro).
# GitHub / GitLab / Bitbucket host keys are pinned; for your own git server set ssh_host_fingerprint.
resource "gyro_container_pipeline" "api" {
service_id = 12345
name = "api"
repo = "[email protected]:gyro-ornek/api.git"
deploy_key = true
image = "api"
targets = ["api"]
}
# Add this to the repository: Settings > Deploy keys (read only)
output "deploy_key" { value = gyro_container_pipeline.api.deploy_key_public }
# Archive builds only (no repository): upload with the API (POST .../pipelines/{id}/uploads) and run with the upload id.
resource "gyro_container_pipeline" "site" {
service_id = 12345
name = "site"
git_provider = "archive"
image = "site"
targets = ["web"]
}
import os, uuid, requests
h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.get("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/pipelines/1", headers=h, timeout=60)
r.raise_for_status()
print(r.json()["data"])
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/pipelines/1", {
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
},
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
Send only the fields to change. token: new value, or "-" to remove.
Parameters
Field
in
Type
Description
idrequired
path
integer
Service id
pipelinerequired
path
string
Pipeline id (p + 8)
Request body
Field
Type
Description
name
string
Display name (1-48)
provider
string (github, gitlab, gitea, git, archive)
repo
string
Required for github / gitlab / gitea / git: https clone URL (no credentials) or SSH address git@host:org/repo.git / ssh://user@host[:port]/path (needs a deploy key). Leave it out for provider archive (an archive pipeline has no repository; a value sent with archive is ignored and the answer shows repo empty).
token
string
Read-only access token for a private repository (stored encrypted, never returned; "-" on update removes it)
git_user
string
User name for the token (default: x-access-token / oauth2 / git)
Read gyro-pipeline.yml from the repository (GitHub, GitLab, Gitea)
image
string
Image name in the environment registry (<registry>/<code>/<image>:<sha7> + :latest)
dockerfile
string
context
string
Build folder (empty = repository root)
build_target
string
Stage of a multi-stage Dockerfile to build (FROM node:20 AS production -> production, same as docker build --target). Empty = the last stage. Stage names are case-insensitive (stored lowercase). A stage the Dockerfile does not have fails the run with build_target_not_found. gyro-pipeline.yml: build_target: overrides it per run. CLI: --target (or --build-target).
targets
array<string>
Services that get the new image (empty = build only)
approval
boolean
Wait for approval before deploying (24 h)
auto_rollback
boolean
Roll back when the new version is unhealthy
build_image
string
Image that runs commands (e.g. node:22-alpine)
commands
array<string>
Shell commands run in the repository root before the Dockerfile (tests, npm ci ...); build secrets are environment variables here
build_env
object
Variables for commands
build_args
object
Dockerfile ARG values (visible in the image history)
gyro container pipeline update 12345 --help # all flags
# resource gyro_container_pipeline: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_pipeline
# Build the repository's Dockerfile on every push to main (or a v* tag) and roll the "web" service out to it.
resource "gyro_container_pipeline" "web" {
service_id = 12345 # container environment (gyro-ecs-1)
name = "web"
repo = "https://github.com/gyro-ornek/uygulama"
token = var.github_read_token # private repository only (read access)
branch = "main"
tags = "v*"
image = "web"
targets = ["web"]
# multi-stage Dockerfile: build the "production" stage (FROM node:20 AS production) instead of the last one
build_target = "production"
build_args = { APP_VERSION = "1.2.0" } # Dockerfile ARG (not for secrets)
# optional build step before the Dockerfile (tests ...); secrets are environment variables here
build_image = "node:22-alpine"
commands = ["npm ci", "npm test"]
secrets = { NPM_TOKEN = var.npm_token }
}
# Add these to the repository: Settings > Webhooks (application/json, push event)
output "webhook_url" { value = gyro_container_pipeline.web.webhook_url }
output "webhook_secret" {
value = gyro_container_pipeline.web.webhook_secret
sensitive = true
}
# Private repository over SSH: Gyro creates a read-only deploy key (the private key never leaves Gyro).
# GitHub / GitLab / Bitbucket host keys are pinned; for your own git server set ssh_host_fingerprint.
resource "gyro_container_pipeline" "api" {
service_id = 12345
name = "api"
repo = "[email protected]:gyro-ornek/api.git"
deploy_key = true
image = "api"
targets = ["api"]
}
# Add this to the repository: Settings > Deploy keys (read only)
output "deploy_key" { value = gyro_container_pipeline.api.deploy_key_public }
# Archive builds only (no repository): upload with the API (POST .../pipelines/{id}/uploads) and run with the upload id.
resource "gyro_container_pipeline" "site" {
service_id = 12345
name = "site"
git_provider = "archive"
image = "site"
targets = ["web"]
}
gyro container pipeline delete 12345 --help # all flags
# resource gyro_container_pipeline: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_pipeline
# Build the repository's Dockerfile on every push to main (or a v* tag) and roll the "web" service out to it.
resource "gyro_container_pipeline" "web" {
service_id = 12345 # container environment (gyro-ecs-1)
name = "web"
repo = "https://github.com/gyro-ornek/uygulama"
token = var.github_read_token # private repository only (read access)
branch = "main"
tags = "v*"
image = "web"
targets = ["web"]
# multi-stage Dockerfile: build the "production" stage (FROM node:20 AS production) instead of the last one
build_target = "production"
build_args = { APP_VERSION = "1.2.0" } # Dockerfile ARG (not for secrets)
# optional build step before the Dockerfile (tests ...); secrets are environment variables here
build_image = "node:22-alpine"
commands = ["npm ci", "npm test"]
secrets = { NPM_TOKEN = var.npm_token }
}
# Add these to the repository: Settings > Webhooks (application/json, push event)
output "webhook_url" { value = gyro_container_pipeline.web.webhook_url }
output "webhook_secret" {
value = gyro_container_pipeline.web.webhook_secret
sensitive = true
}
# Private repository over SSH: Gyro creates a read-only deploy key (the private key never leaves Gyro).
# GitHub / GitLab / Bitbucket host keys are pinned; for your own git server set ssh_host_fingerprint.
resource "gyro_container_pipeline" "api" {
service_id = 12345
name = "api"
repo = "[email protected]:gyro-ornek/api.git"
deploy_key = true
image = "api"
targets = ["api"]
}
# Add this to the repository: Settings > Deploy keys (read only)
output "deploy_key" { value = gyro_container_pipeline.api.deploy_key_public }
# Archive builds only (no repository): upload with the API (POST .../pipelines/{id}/uploads) and run with the upload id.
resource "gyro_container_pipeline" "site" {
service_id = 12345
name = "site"
git_provider = "archive"
image = "site"
targets = ["web"]
}
import os, uuid, requests
h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.delete("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/pipelines/1", headers=h, json={"confirm": True}, timeout=60)
r.raise_for_status()
print(r.json()["data"])
# resource gyro_container_pipeline: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_pipeline
# Build the repository's Dockerfile on every push to main (or a v* tag) and roll the "web" service out to it.
resource "gyro_container_pipeline" "web" {
service_id = 12345 # container environment (gyro-ecs-1)
name = "web"
repo = "https://github.com/gyro-ornek/uygulama"
token = var.github_read_token # private repository only (read access)
branch = "main"
tags = "v*"
image = "web"
targets = ["web"]
# multi-stage Dockerfile: build the "production" stage (FROM node:20 AS production) instead of the last one
build_target = "production"
build_args = { APP_VERSION = "1.2.0" } # Dockerfile ARG (not for secrets)
# optional build step before the Dockerfile (tests ...); secrets are environment variables here
build_image = "node:22-alpine"
commands = ["npm ci", "npm test"]
secrets = { NPM_TOKEN = var.npm_token }
}
# Add these to the repository: Settings > Webhooks (application/json, push event)
output "webhook_url" { value = gyro_container_pipeline.web.webhook_url }
output "webhook_secret" {
value = gyro_container_pipeline.web.webhook_secret
sensitive = true
}
# Private repository over SSH: Gyro creates a read-only deploy key (the private key never leaves Gyro).
# GitHub / GitLab / Bitbucket host keys are pinned; for your own git server set ssh_host_fingerprint.
resource "gyro_container_pipeline" "api" {
service_id = 12345
name = "api"
repo = "[email protected]:gyro-ornek/api.git"
deploy_key = true
image = "api"
targets = ["api"]
}
# Add this to the repository: Settings > Deploy keys (read only)
output "deploy_key" { value = gyro_container_pipeline.api.deploy_key_public }
# Archive builds only (no repository): upload with the API (POST .../pipelines/{id}/uploads) and run with the upload id.
resource "gyro_container_pipeline" "site" {
service_id = 12345
name = "site"
git_provider = "archive"
image = "site"
targets = ["web"]
}
import os, uuid, requests
h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.get("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/pipelines/1/webhook", headers=h, timeout=60)
r.raise_for_status()
print(r.json()["data"])
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/pipelines/1/webhook", {
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
},
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
gyro container pipeline rotate-secret 12345 --help # all flags
# resource gyro_container_pipeline: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_pipeline
# Build the repository's Dockerfile on every push to main (or a v* tag) and roll the "web" service out to it.
resource "gyro_container_pipeline" "web" {
service_id = 12345 # container environment (gyro-ecs-1)
name = "web"
repo = "https://github.com/gyro-ornek/uygulama"
token = var.github_read_token # private repository only (read access)
branch = "main"
tags = "v*"
image = "web"
targets = ["web"]
# multi-stage Dockerfile: build the "production" stage (FROM node:20 AS production) instead of the last one
build_target = "production"
build_args = { APP_VERSION = "1.2.0" } # Dockerfile ARG (not for secrets)
# optional build step before the Dockerfile (tests ...); secrets are environment variables here
build_image = "node:22-alpine"
commands = ["npm ci", "npm test"]
secrets = { NPM_TOKEN = var.npm_token }
}
# Add these to the repository: Settings > Webhooks (application/json, push event)
output "webhook_url" { value = gyro_container_pipeline.web.webhook_url }
output "webhook_secret" {
value = gyro_container_pipeline.web.webhook_secret
sensitive = true
}
# Private repository over SSH: Gyro creates a read-only deploy key (the private key never leaves Gyro).
# GitHub / GitLab / Bitbucket host keys are pinned; for your own git server set ssh_host_fingerprint.
resource "gyro_container_pipeline" "api" {
service_id = 12345
name = "api"
repo = "[email protected]:gyro-ornek/api.git"
deploy_key = true
image = "api"
targets = ["api"]
}
# Add this to the repository: Settings > Deploy keys (read only)
output "deploy_key" { value = gyro_container_pipeline.api.deploy_key_public }
# Archive builds only (no repository): upload with the API (POST .../pipelines/{id}/uploads) and run with the upload id.
resource "gyro_container_pipeline" "site" {
service_id = 12345
name = "site"
git_provider = "archive"
image = "site"
targets = ["web"]
}
import os, uuid, requests
h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.post("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/pipelines/1/webhook/rotate", headers=h, json={"confirm": True}, timeout=60)
r.raise_for_status()
print(r.json()["data"])
gyro container pipeline test 12345 --help # all flags
# resource gyro_container_pipeline: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_pipeline
# Build the repository's Dockerfile on every push to main (or a v* tag) and roll the "web" service out to it.
resource "gyro_container_pipeline" "web" {
service_id = 12345 # container environment (gyro-ecs-1)
name = "web"
repo = "https://github.com/gyro-ornek/uygulama"
token = var.github_read_token # private repository only (read access)
branch = "main"
tags = "v*"
image = "web"
targets = ["web"]
# multi-stage Dockerfile: build the "production" stage (FROM node:20 AS production) instead of the last one
build_target = "production"
build_args = { APP_VERSION = "1.2.0" } # Dockerfile ARG (not for secrets)
# optional build step before the Dockerfile (tests ...); secrets are environment variables here
build_image = "node:22-alpine"
commands = ["npm ci", "npm test"]
secrets = { NPM_TOKEN = var.npm_token }
}
# Add these to the repository: Settings > Webhooks (application/json, push event)
output "webhook_url" { value = gyro_container_pipeline.web.webhook_url }
output "webhook_secret" {
value = gyro_container_pipeline.web.webhook_secret
sensitive = true
}
# Private repository over SSH: Gyro creates a read-only deploy key (the private key never leaves Gyro).
# GitHub / GitLab / Bitbucket host keys are pinned; for your own git server set ssh_host_fingerprint.
resource "gyro_container_pipeline" "api" {
service_id = 12345
name = "api"
repo = "[email protected]:gyro-ornek/api.git"
deploy_key = true
image = "api"
targets = ["api"]
}
# Add this to the repository: Settings > Deploy keys (read only)
output "deploy_key" { value = gyro_container_pipeline.api.deploy_key_public }
# Archive builds only (no repository): upload with the API (POST .../pipelines/{id}/uploads) and run with the upload id.
resource "gyro_container_pipeline" "site" {
service_id = 12345
name = "site"
git_provider = "archive"
image = "site"
targets = ["web"]
}
import os, uuid, requests
h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.post("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/pipelines/1/test", headers=h, json={"confirm": True}, timeout=60)
r.raise_for_status()
print(r.json()["data"])
gyro container pipeline secret set 12345 --help # all flags
# resource gyro_container_pipeline: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_pipeline
# Build the repository's Dockerfile on every push to main (or a v* tag) and roll the "web" service out to it.
resource "gyro_container_pipeline" "web" {
service_id = 12345 # container environment (gyro-ecs-1)
name = "web"
repo = "https://github.com/gyro-ornek/uygulama"
token = var.github_read_token # private repository only (read access)
branch = "main"
tags = "v*"
image = "web"
targets = ["web"]
# multi-stage Dockerfile: build the "production" stage (FROM node:20 AS production) instead of the last one
build_target = "production"
build_args = { APP_VERSION = "1.2.0" } # Dockerfile ARG (not for secrets)
# optional build step before the Dockerfile (tests ...); secrets are environment variables here
build_image = "node:22-alpine"
commands = ["npm ci", "npm test"]
secrets = { NPM_TOKEN = var.npm_token }
}
# Add these to the repository: Settings > Webhooks (application/json, push event)
output "webhook_url" { value = gyro_container_pipeline.web.webhook_url }
output "webhook_secret" {
value = gyro_container_pipeline.web.webhook_secret
sensitive = true
}
# Private repository over SSH: Gyro creates a read-only deploy key (the private key never leaves Gyro).
# GitHub / GitLab / Bitbucket host keys are pinned; for your own git server set ssh_host_fingerprint.
resource "gyro_container_pipeline" "api" {
service_id = 12345
name = "api"
repo = "[email protected]:gyro-ornek/api.git"
deploy_key = true
image = "api"
targets = ["api"]
}
# Add this to the repository: Settings > Deploy keys (read only)
output "deploy_key" { value = gyro_container_pipeline.api.deploy_key_public }
# Archive builds only (no repository): upload with the API (POST .../pipelines/{id}/uploads) and run with the upload id.
resource "gyro_container_pipeline" "site" {
service_id = 12345
name = "site"
git_provider = "archive"
image = "site"
targets = ["web"]
}
gyro container pipeline secret delete 12345 --help # all flags
# resource gyro_container_pipeline: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_pipeline
# Build the repository's Dockerfile on every push to main (or a v* tag) and roll the "web" service out to it.
resource "gyro_container_pipeline" "web" {
service_id = 12345 # container environment (gyro-ecs-1)
name = "web"
repo = "https://github.com/gyro-ornek/uygulama"
token = var.github_read_token # private repository only (read access)
branch = "main"
tags = "v*"
image = "web"
targets = ["web"]
# multi-stage Dockerfile: build the "production" stage (FROM node:20 AS production) instead of the last one
build_target = "production"
build_args = { APP_VERSION = "1.2.0" } # Dockerfile ARG (not for secrets)
# optional build step before the Dockerfile (tests ...); secrets are environment variables here
build_image = "node:22-alpine"
commands = ["npm ci", "npm test"]
secrets = { NPM_TOKEN = var.npm_token }
}
# Add these to the repository: Settings > Webhooks (application/json, push event)
output "webhook_url" { value = gyro_container_pipeline.web.webhook_url }
output "webhook_secret" {
value = gyro_container_pipeline.web.webhook_secret
sensitive = true
}
# Private repository over SSH: Gyro creates a read-only deploy key (the private key never leaves Gyro).
# GitHub / GitLab / Bitbucket host keys are pinned; for your own git server set ssh_host_fingerprint.
resource "gyro_container_pipeline" "api" {
service_id = 12345
name = "api"
repo = "[email protected]:gyro-ornek/api.git"
deploy_key = true
image = "api"
targets = ["api"]
}
# Add this to the repository: Settings > Deploy keys (read only)
output "deploy_key" { value = gyro_container_pipeline.api.deploy_key_public }
# Archive builds only (no repository): upload with the API (POST .../pipelines/{id}/uploads) and run with the upload id.
resource "gyro_container_pipeline" "site" {
service_id = 12345
name = "site"
git_provider = "archive"
image = "site"
targets = ["web"]
}
import os, uuid, requests
h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.delete("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/pipelines/1/secrets/1", headers=h, json={"confirm": True}, timeout=60)
r.raise_for_status()
print(r.json()["data"])
# resource gyro_container_pipeline: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_pipeline
# Build the repository's Dockerfile on every push to main (or a v* tag) and roll the "web" service out to it.
resource "gyro_container_pipeline" "web" {
service_id = 12345 # container environment (gyro-ecs-1)
name = "web"
repo = "https://github.com/gyro-ornek/uygulama"
token = var.github_read_token # private repository only (read access)
branch = "main"
tags = "v*"
image = "web"
targets = ["web"]
# multi-stage Dockerfile: build the "production" stage (FROM node:20 AS production) instead of the last one
build_target = "production"
build_args = { APP_VERSION = "1.2.0" } # Dockerfile ARG (not for secrets)
# optional build step before the Dockerfile (tests ...); secrets are environment variables here
build_image = "node:22-alpine"
commands = ["npm ci", "npm test"]
secrets = { NPM_TOKEN = var.npm_token }
}
# Add these to the repository: Settings > Webhooks (application/json, push event)
output "webhook_url" { value = gyro_container_pipeline.web.webhook_url }
output "webhook_secret" {
value = gyro_container_pipeline.web.webhook_secret
sensitive = true
}
# Private repository over SSH: Gyro creates a read-only deploy key (the private key never leaves Gyro).
# GitHub / GitLab / Bitbucket host keys are pinned; for your own git server set ssh_host_fingerprint.
resource "gyro_container_pipeline" "api" {
service_id = 12345
name = "api"
repo = "[email protected]:gyro-ornek/api.git"
deploy_key = true
image = "api"
targets = ["api"]
}
# Add this to the repository: Settings > Deploy keys (read only)
output "deploy_key" { value = gyro_container_pipeline.api.deploy_key_public }
# Archive builds only (no repository): upload with the API (POST .../pipelines/{id}/uploads) and run with the upload id.
resource "gyro_container_pipeline" "site" {
service_id = 12345
name = "site"
git_provider = "archive"
image = "site"
targets = ["web"]
}
import os, uuid, requests
h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.get("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/pipelines/1/runs", headers=h, timeout=60)
r.raise_for_status()
print(r.json()["data"])
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/pipelines/1/runs", {
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
},
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
ref: branch (main), tag (tag:v1.2.0) or full ref; sha: optional 40 character commit. Without both the first branch of the rule builds. Queued runs start when the environment's parallel build limit allows. With upload_id the uploaded archive is built (gyro-pipeline.yml is not read for archives).
Parameters
Field
in
Type
Description
idrequired
path
integer
Service id
pipelinerequired
path
string
Pipeline id (p + 8)
Request body
Field
Type
Description
ref
string
sha
string
confirm
boolean
upload_id
string
Build an uploaded archive (from POST .../uploads) instead of a git ref
archive_name
string
Shown in the run list
Responses
200
OK — data: object
404
Not found — also returned for objects owned by someone else
409
State conflict (server_locked, not_actionable, ssh_key_exists, server_limit, idempotency_in_flight)
422
Validation or business rule failure (confirm_required, invalid_image, tool_action_failed ...)
gyro container pipeline run 12345 --help # all flags
# resource gyro_container_pipeline: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_pipeline
# Build the repository's Dockerfile on every push to main (or a v* tag) and roll the "web" service out to it.
resource "gyro_container_pipeline" "web" {
service_id = 12345 # container environment (gyro-ecs-1)
name = "web"
repo = "https://github.com/gyro-ornek/uygulama"
token = var.github_read_token # private repository only (read access)
branch = "main"
tags = "v*"
image = "web"
targets = ["web"]
# multi-stage Dockerfile: build the "production" stage (FROM node:20 AS production) instead of the last one
build_target = "production"
build_args = { APP_VERSION = "1.2.0" } # Dockerfile ARG (not for secrets)
# optional build step before the Dockerfile (tests ...); secrets are environment variables here
build_image = "node:22-alpine"
commands = ["npm ci", "npm test"]
secrets = { NPM_TOKEN = var.npm_token }
}
# Add these to the repository: Settings > Webhooks (application/json, push event)
output "webhook_url" { value = gyro_container_pipeline.web.webhook_url }
output "webhook_secret" {
value = gyro_container_pipeline.web.webhook_secret
sensitive = true
}
# Private repository over SSH: Gyro creates a read-only deploy key (the private key never leaves Gyro).
# GitHub / GitLab / Bitbucket host keys are pinned; for your own git server set ssh_host_fingerprint.
resource "gyro_container_pipeline" "api" {
service_id = 12345
name = "api"
repo = "[email protected]:gyro-ornek/api.git"
deploy_key = true
image = "api"
targets = ["api"]
}
# Add this to the repository: Settings > Deploy keys (read only)
output "deploy_key" { value = gyro_container_pipeline.api.deploy_key_public }
# Archive builds only (no repository): upload with the API (POST .../pipelines/{id}/uploads) and run with the upload id.
resource "gyro_container_pipeline" "site" {
service_id = 12345
name = "site"
git_provider = "archive"
image = "site"
targets = ["web"]
}
Returns a presigned url (valid 15 minutes) for one PUT of exactly size bytes (tar.gz / tgz / zip, max 200 MB; send Content-Length: size, e.g. curl -T site.tar.gz "<url>"). Then start the build with POST .../runs {"upload_id": ...}. Archives are deleted after 24 hours. Do not send an Idempotency-Key here (the URL would be withheld from the replayed answer).
Parameters
Field
in
Type
Description
idrequired
path
integer
Service id
pipelinerequired
path
string
Pipeline id (p + 8)
Request body
Field
Type
Description
sizerequired
integer
archive size in bytes (1 - 209715200)
confirm
boolean
Responses
200
OK — data: object
404
Not found — also returned for objects owned by someone else
409
State conflict (server_locked, not_actionable, ssh_key_exists, server_limit, idempotency_in_flight)
422
Validation or business rule failure (confirm_required, invalid_image, tool_action_failed ...)
gyro container pipeline upload 12345 --help # all flags
# resource gyro_container_pipeline: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_pipeline
# Build the repository's Dockerfile on every push to main (or a v* tag) and roll the "web" service out to it.
resource "gyro_container_pipeline" "web" {
service_id = 12345 # container environment (gyro-ecs-1)
name = "web"
repo = "https://github.com/gyro-ornek/uygulama"
token = var.github_read_token # private repository only (read access)
branch = "main"
tags = "v*"
image = "web"
targets = ["web"]
# multi-stage Dockerfile: build the "production" stage (FROM node:20 AS production) instead of the last one
build_target = "production"
build_args = { APP_VERSION = "1.2.0" } # Dockerfile ARG (not for secrets)
# optional build step before the Dockerfile (tests ...); secrets are environment variables here
build_image = "node:22-alpine"
commands = ["npm ci", "npm test"]
secrets = { NPM_TOKEN = var.npm_token }
}
# Add these to the repository: Settings > Webhooks (application/json, push event)
output "webhook_url" { value = gyro_container_pipeline.web.webhook_url }
output "webhook_secret" {
value = gyro_container_pipeline.web.webhook_secret
sensitive = true
}
# Private repository over SSH: Gyro creates a read-only deploy key (the private key never leaves Gyro).
# GitHub / GitLab / Bitbucket host keys are pinned; for your own git server set ssh_host_fingerprint.
resource "gyro_container_pipeline" "api" {
service_id = 12345
name = "api"
repo = "[email protected]:gyro-ornek/api.git"
deploy_key = true
image = "api"
targets = ["api"]
}
# Add this to the repository: Settings > Deploy keys (read only)
output "deploy_key" { value = gyro_container_pipeline.api.deploy_key_public }
# Archive builds only (no repository): upload with the API (POST .../pipelines/{id}/uploads) and run with the upload id.
resource "gyro_container_pipeline" "site" {
service_id = 12345
name = "site"
git_provider = "archive"
image = "site"
targets = ["web"]
}
Creates an ed25519 key pair for an SSH repository and returns only the public key (add it to the repository as a read-only deploy key). The private key is stored encrypted and never returned. A pipeline has one key; "rotate": true replaces it (the old key stops working).
Parameters
Field
in
Type
Description
idrequired
path
integer
Service id
pipelinerequired
path
string
Pipeline id (p + 8)
Request body
Field
Type
Description
rotate
boolean
confirm
boolean
Responses
200
OK — data: object
404
Not found — also returned for objects owned by someone else
409
State conflict (server_locked, not_actionable, ssh_key_exists, server_limit, idempotency_in_flight)
422
Validation or business rule failure (confirm_required, invalid_image, tool_action_failed ...)
gyro container pipeline deploy-key create 12345 --help # all flags
# resource gyro_container_pipeline: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_pipeline
# Build the repository's Dockerfile on every push to main (or a v* tag) and roll the "web" service out to it.
resource "gyro_container_pipeline" "web" {
service_id = 12345 # container environment (gyro-ecs-1)
name = "web"
repo = "https://github.com/gyro-ornek/uygulama"
token = var.github_read_token # private repository only (read access)
branch = "main"
tags = "v*"
image = "web"
targets = ["web"]
# multi-stage Dockerfile: build the "production" stage (FROM node:20 AS production) instead of the last one
build_target = "production"
build_args = { APP_VERSION = "1.2.0" } # Dockerfile ARG (not for secrets)
# optional build step before the Dockerfile (tests ...); secrets are environment variables here
build_image = "node:22-alpine"
commands = ["npm ci", "npm test"]
secrets = { NPM_TOKEN = var.npm_token }
}
# Add these to the repository: Settings > Webhooks (application/json, push event)
output "webhook_url" { value = gyro_container_pipeline.web.webhook_url }
output "webhook_secret" {
value = gyro_container_pipeline.web.webhook_secret
sensitive = true
}
# Private repository over SSH: Gyro creates a read-only deploy key (the private key never leaves Gyro).
# GitHub / GitLab / Bitbucket host keys are pinned; for your own git server set ssh_host_fingerprint.
resource "gyro_container_pipeline" "api" {
service_id = 12345
name = "api"
repo = "[email protected]:gyro-ornek/api.git"
deploy_key = true
image = "api"
targets = ["api"]
}
# Add this to the repository: Settings > Deploy keys (read only)
output "deploy_key" { value = gyro_container_pipeline.api.deploy_key_public }
# Archive builds only (no repository): upload with the API (POST .../pipelines/{id}/uploads) and run with the upload id.
resource "gyro_container_pipeline" "site" {
service_id = 12345
name = "site"
git_provider = "archive"
image = "site"
targets = ["web"]
}
gyro container pipeline deploy-key delete 12345 --help # all flags
# resource gyro_container_pipeline: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_pipeline
# Build the repository's Dockerfile on every push to main (or a v* tag) and roll the "web" service out to it.
resource "gyro_container_pipeline" "web" {
service_id = 12345 # container environment (gyro-ecs-1)
name = "web"
repo = "https://github.com/gyro-ornek/uygulama"
token = var.github_read_token # private repository only (read access)
branch = "main"
tags = "v*"
image = "web"
targets = ["web"]
# multi-stage Dockerfile: build the "production" stage (FROM node:20 AS production) instead of the last one
build_target = "production"
build_args = { APP_VERSION = "1.2.0" } # Dockerfile ARG (not for secrets)
# optional build step before the Dockerfile (tests ...); secrets are environment variables here
build_image = "node:22-alpine"
commands = ["npm ci", "npm test"]
secrets = { NPM_TOKEN = var.npm_token }
}
# Add these to the repository: Settings > Webhooks (application/json, push event)
output "webhook_url" { value = gyro_container_pipeline.web.webhook_url }
output "webhook_secret" {
value = gyro_container_pipeline.web.webhook_secret
sensitive = true
}
# Private repository over SSH: Gyro creates a read-only deploy key (the private key never leaves Gyro).
# GitHub / GitLab / Bitbucket host keys are pinned; for your own git server set ssh_host_fingerprint.
resource "gyro_container_pipeline" "api" {
service_id = 12345
name = "api"
repo = "[email protected]:gyro-ornek/api.git"
deploy_key = true
image = "api"
targets = ["api"]
}
# Add this to the repository: Settings > Deploy keys (read only)
output "deploy_key" { value = gyro_container_pipeline.api.deploy_key_public }
# Archive builds only (no repository): upload with the API (POST .../pipelines/{id}/uploads) and run with the upload id.
resource "gyro_container_pipeline" "site" {
service_id = 12345
name = "site"
git_provider = "archive"
image = "site"
targets = ["web"]
}
import os, uuid, requests
h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.delete("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/pipelines/1/deploy-key", headers=h, json={"confirm": True}, timeout=60)
r.raise_for_status()
print(r.json()["data"])
Connects to the repository's SSH server (public addresses only) and returns the host key fingerprint. GitHub / GitLab / Bitbucket keys are pinned (pinned: true). Other servers: compare the fingerprint with your own record, then confirm it with PUT.
Parameters
Field
in
Type
Description
idrequired
path
integer
Service id
pipelinerequired
path
string
Pipeline id (p + 8)
Responses
200
OK — data: object
404
Not found — also returned for objects owned by someone else
409
State conflict (server_locked, not_actionable, ssh_key_exists, server_limit, idempotency_in_flight)
422
Validation or business rule failure (confirm_required, invalid_image, tool_action_failed ...)
# resource gyro_container_pipeline: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_pipeline
# Build the repository's Dockerfile on every push to main (or a v* tag) and roll the "web" service out to it.
resource "gyro_container_pipeline" "web" {
service_id = 12345 # container environment (gyro-ecs-1)
name = "web"
repo = "https://github.com/gyro-ornek/uygulama"
token = var.github_read_token # private repository only (read access)
branch = "main"
tags = "v*"
image = "web"
targets = ["web"]
# multi-stage Dockerfile: build the "production" stage (FROM node:20 AS production) instead of the last one
build_target = "production"
build_args = { APP_VERSION = "1.2.0" } # Dockerfile ARG (not for secrets)
# optional build step before the Dockerfile (tests ...); secrets are environment variables here
build_image = "node:22-alpine"
commands = ["npm ci", "npm test"]
secrets = { NPM_TOKEN = var.npm_token }
}
# Add these to the repository: Settings > Webhooks (application/json, push event)
output "webhook_url" { value = gyro_container_pipeline.web.webhook_url }
output "webhook_secret" {
value = gyro_container_pipeline.web.webhook_secret
sensitive = true
}
# Private repository over SSH: Gyro creates a read-only deploy key (the private key never leaves Gyro).
# GitHub / GitLab / Bitbucket host keys are pinned; for your own git server set ssh_host_fingerprint.
resource "gyro_container_pipeline" "api" {
service_id = 12345
name = "api"
repo = "[email protected]:gyro-ornek/api.git"
deploy_key = true
image = "api"
targets = ["api"]
}
# Add this to the repository: Settings > Deploy keys (read only)
output "deploy_key" { value = gyro_container_pipeline.api.deploy_key_public }
# Archive builds only (no repository): upload with the API (POST .../pipelines/{id}/uploads) and run with the upload id.
resource "gyro_container_pipeline" "site" {
service_id = 12345
name = "site"
git_provider = "archive"
image = "site"
targets = ["web"]
}
import os, uuid, requests
h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.get("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/pipelines/1/host-key", headers=h, timeout=60)
r.raise_for_status()
print(r.json()["data"])
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/containers/12345/pipelines/1/host-key", {
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
},
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
Confirm (or forget) the SSH host keyScope: services_writepipeline_host_key_trustOpenAPI for this operation
fingerprint: the SHA256 fingerprint you verified (the server is scanned again and must present it); forget: true removes the confirmation. Builds stop if the server key changes later.
Parameters
Field
in
Type
Description
idrequired
path
integer
Service id
pipelinerequired
path
string
Pipeline id (p + 8)
Request body
Field
Type
Description
fingerprint
string
forget
boolean
confirm
boolean
Responses
200
OK — data: object
404
Not found — also returned for objects owned by someone else
409
State conflict (server_locked, not_actionable, ssh_key_exists, server_limit, idempotency_in_flight)
422
Validation or business rule failure (confirm_required, invalid_image, tool_action_failed ...)
gyro container pipeline host-key trust 12345 --help # all flags
# resource gyro_container_pipeline: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/container_pipeline
# Build the repository's Dockerfile on every push to main (or a v* tag) and roll the "web" service out to it.
resource "gyro_container_pipeline" "web" {
service_id = 12345 # container environment (gyro-ecs-1)
name = "web"
repo = "https://github.com/gyro-ornek/uygulama"
token = var.github_read_token # private repository only (read access)
branch = "main"
tags = "v*"
image = "web"
targets = ["web"]
# multi-stage Dockerfile: build the "production" stage (FROM node:20 AS production) instead of the last one
build_target = "production"
build_args = { APP_VERSION = "1.2.0" } # Dockerfile ARG (not for secrets)
# optional build step before the Dockerfile (tests ...); secrets are environment variables here
build_image = "node:22-alpine"
commands = ["npm ci", "npm test"]
secrets = { NPM_TOKEN = var.npm_token }
}
# Add these to the repository: Settings > Webhooks (application/json, push event)
output "webhook_url" { value = gyro_container_pipeline.web.webhook_url }
output "webhook_secret" {
value = gyro_container_pipeline.web.webhook_secret
sensitive = true
}
# Private repository over SSH: Gyro creates a read-only deploy key (the private key never leaves Gyro).
# GitHub / GitLab / Bitbucket host keys are pinned; for your own git server set ssh_host_fingerprint.
resource "gyro_container_pipeline" "api" {
service_id = 12345
name = "api"
repo = "[email protected]:gyro-ornek/api.git"
deploy_key = true
image = "api"
targets = ["api"]
}
# Add this to the repository: Settings > Deploy keys (read only)
output "deploy_key" { value = gyro_container_pipeline.api.deploy_key_public }
# Archive builds only (no repository): upload with the API (POST .../pipelines/{id}/uploads) and run with the upload id.
resource "gyro_container_pipeline" "site" {
service_id = 12345
name = "site"
git_provider = "archive"
image = "site"
targets = ["web"]
}
Orderable Gyro Container (ECS) environment plans with prepaid prices. A plan is ONE environment (a dedicated node pool); max_services is the most apps you can define, max_replicas the most replicas per service; all of them share the pool.
Create container environments (batch)Scope: cloud_ordercreateContainerEnvironmentsOpenAPI for this operation
Orders 1..N environments of a plan in ONE order (quantity, default 1, max 25 per request). Prepaid: the order is 0 and usage is charged hourly from the balance; the balance must cover the first 24 hours of every environment and new accounts are limited in their first days. name (with {n}) and tags label every environment; project_id puts them in a project. Send "dry_run": true for a quote; a real order needs "confirm": true and an Idempotency-Key header.
Parameters
Field
in
Type
Description
Idempotency-Keyrequired
header
string
Unique per logical request (e.g. a UUID). Replays within 24 hours return the stored answer.
Request body
Field
Type
Description
plan
string
plan from GET /cloud/containers/plans (mini-1-1, small-1-2, starter, standart, pro, serverless)
product_id
integer
product id instead of plan
quantity
integer
environments to create in one order (--count), default 1, max 25
name
string
name (nickname); {n} = number in a batch
tags
array<string>
tags (max 10)
project_id
integer | null
project (0 = default project)
confirm
boolean
dry_run
boolean
Responses
200
Dry-run quote
202
Ordered; environments are being set up — data: object
403
Key lacks the scope, IP not allowed, or feature disabled
422
confirm_required | limit_exceeded (new-account limit of the prepaid cloud; details = LimitHint, raise it with a support ticket) | validation errors