Experimental Scaleway target (Kapsule)¶
Catalog ownership: certification-scaleway cells in the capability matrix
plus evidence. Certified subset is
empty. scaleway / kapsule stays experimental. Bootstrap remains
ErrNotSupported. Cache family is Redis (cacheMode: redis); do not relabel
it Valkey. Magento runtime is not-run until a Magento-compatible digest is
exercised inside the $50 own-money cap; current proof is
infrastructure-only.
Live bar is at most one Kapsule preview, then destroy. No KEEP. Vendors attach
to a GCP origin.
Status: experimental (ADR 0002). Not Magento-acceptance certified.
Certified paths remain AWS ECS Fargate and GCP GKE Autopilot. Validated with Pulumi
WithMocks graph tests, so CI needs no Scaleway account.
Target¶
target:
provider: scaleway
runtime: kapsule
scaleway:
projectId: 11111111-1111-1111-1111-111111111111
region: fr-par
zone: fr-par-1 # primary managed-cache zone
zones: [fr-par-1, fr-par-2] # one Kapsule pool per listed zone
networkCidr: 10.40.0.0/16
cacheMode: redis # escape hatch: Scaleway has no managed Valkey yet
redisVersion: 8.6.6 # query the provider catalog before changing this
kapsuleVersion: 1.36.4 # query the provider catalog before changing this
imageDigest: ghcr.io/org/magento@sha256:...
encryptionKeySecret: magento-crypt-key
What this stack provisions¶
| Magento need | Scaleway product |
|---|---|
| Network | VPC + Private Network |
| MySQL | Managed Database for MySQL |
| Cache | Managed Redis (cacheMode: redis escape hatch) |
| Compute | Kubernetes Kapsule + pool |
| Ingress | Kubernetes Service LoadBalancer |
Cache caveat: Adobe Commerce 2.4.9+ prefers Valkey. Scaleway offers Managed Redis
only; MageLift documents cacheMode: redis explicitly rather than pretending Valkey
exists. Wire-compatible for older Magento lines; reassess when Scaleway ships Valkey.
Provider caveat: Pulumi package is community pulumiverse/pulumi-scaleway (pinned
in go.mod), not an official Scaleway-owned provider.
Deferred: search, RabbitMQ, Edge Services/CDN, Bootstrap and live Cost
pricing, DNS/managed dump (Phase 7). Magento deploy Steps exist offline via shared
kube.Steps. Not live-acceptance certified.
Day-2: Observe (logs/exec/health), Magento deploy Steps, DIY State /
AcquireLock, provider-backed application Secrets, and account-free Cost work
offline (unit/Floci). Bootstrap remains ErrNotSupported; application Secrets
use the planned project/region and ownership tags, while live CRUD/IAM evidence
is still pending. magelift cost --live fails explicitly until Scaleway live
pricing is implemented. Experimental shared kube surface; not certified.
See capability matrix.
Availability-zone shape¶
zone is the primary zone used by the managed Redis adapter. zones controls the
Kapsule worker placement. When more than one zone is configured, MageLift creates
one node pool per zone and distributes nodeCount across those pools; nodeCount
must be at least the number of configured zones. Web and queue Deployments receive
strict Kubernetes zone-spread constraints when their replica count can cover all
configured zones. This keeps the YAML setting connected to the actual worker and
workload topology instead of treating it as metadata.
The preview preset may use one zone. Standard requires at least two configured zones, and high-availability requires at least three; the planner rejects a smaller list before Pulumi creates anything.
Scaleway's current guidance recommends multiple pools for multi-AZ Kapsule and documents important control-plane, gateway, and zone-local persistent-volume limitations. Read the official multi-AZ Kapsule guidance before selecting a production topology. Live multi-AZ failure, backup/restore, and Magento runtime certification remain release-gated.
Verification¶
- Unit/mock:
go test ./internal/cloud/scaleway/... - Offline harness:
MAGELIFT_ACCEPTANCE_DRY_RUN=1 ./scripts/scaleway-acceptance-local.sh - Live infrastructure smoke:
MAGELIFT_K8S_ACCEPTANCE=1 ./scripts/scaleway-acceptance-local.sh
The live command requires a pullable immutable image, an exact unique resource
prefix, and a Scaleway project ID. It accepts one configured service shape at a
time, uses disposable local Pulumi state, runs deploy --infra-only, destroys
the Pulumi stack on exit, and polls Kapsule, managed database, Redis, private
network, and load balancer resources for that prefix. By default it proves
infrastructure lifecycle only and records that runtime health was not
exercised. Set MAGELIFT_K8S_ACCEPTANCE_RUNTIME_HEALTH=true only when the
digest is a Magento-compatible image; the generic NGINX smoke image is
deliberately insufficient for that gate. Provider login/bootstrap and DIY
object state are not implemented yet, so this is not Magento deploy or
release-signing certification. When Magento runtime health is enabled, or when
MAGELIFT_CERTIFICATE_IDENTITY (or MAGELIFT_SCALEWAY_CERTIFICATE_IDENTITY) is
set, the harness signs if a Cosign identity-token source is configured and
promotes the digest before deploy --infra-only. The full shared Kubernetes
deploy path is covered offline. See
scaleway-kapsule-infrastructure-live-2026-09-15.md.
Live runs have a six-hour disposable TTL by default. Set
MAGELIFT_ACCEPTANCE_TTL_SECONDS to a shorter value when the selected shape is
known to converge faster (the guard accepts at most 24 hours). TTL expiry forces
teardown even when debug retention was requested; direct provider inventories
remain the cleanup authority.