<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>OVHcloud Engineering Archives - OVHcloud Blog</title>
	<atom:link href="https://blog.ovhcloud.com/category/engineering/feed/" rel="self" type="application/rss+xml" />
	<link></link>
	<description>Innovation for Freedom</description>
	<lastBuildDate>Mon, 29 Jun 2026 10:47:48 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://blog.ovhcloud.com/wp-content/uploads/2019/07/cropped-cropped-nouveau-logo-ovh-rebranding-32x32.gif</url>
	<title>OVHcloud Engineering Archives - OVHcloud Blog</title>
	<link></link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Secure Image Signing with Cosign and OVHcloud KMS</title>
		<link>https://blog.ovhcloud.com/secure-image-signing-cosign-ovhcloud-kms/</link>
		
		<dc:creator><![CDATA[Aurélie Vache]]></dc:creator>
		<pubDate>Mon, 22 Jun 2026 06:52:50 +0000</pubDate>
				<category><![CDATA[OVHcloud Engineering]]></category>
		<category><![CDATA[Cosign OVHcloud KMS]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[OVHcloud]]></category>
		<category><![CDATA[Public Cloud]]></category>
		<category><![CDATA[Security]]></category>
		<guid isPermaLink="false">https://blog.ovhcloud.com/?p=31702</guid>

					<description><![CDATA[Software supply chains have become more complex and increasingly targeted, making container image security a fundamental requirement for building trust in modern delivery pipelines. By signing images with Cosign and protecting signing keys in OVHcloud KMS, teams can keep cryptographic material out of local environments and CI/CD variables, all while making image signing easier to [&#8230;]<img src="//blog.ovhcloud.com/wp-content/plugins/matomo/app/matomo.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Fblog.ovhcloud.com%2Fsecure-image-signing-cosign-ovhcloud-kms%2F&amp;action_name=Secure%20Image%20Signing%20with%20Cosign%20and%20OVHcloud%20KMS&amp;urlref=https%3A%2F%2Fblog.ovhcloud.com%2Ffeed%2F" style="border:0;width:0;height:0" width="0" height="0" alt="" />]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image aligncenter size-large is-resized"><img fetchpriority="high" decoding="async" width="1018" height="1024" src="https://blog.ovhcloud.com/wp-content/uploads/2026/05/Gribouillis-2026-05-07-14.00.13.759-1018x1024.png" alt="" class="wp-image-31768" style="aspect-ratio:0.9941455602881566;width:456px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/05/Gribouillis-2026-05-07-14.00.13.759-1018x1024.png 1018w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/Gribouillis-2026-05-07-14.00.13.759-298x300.png 298w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/Gribouillis-2026-05-07-14.00.13.759-150x150.png 150w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/Gribouillis-2026-05-07-14.00.13.759-768x772.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/Gribouillis-2026-05-07-14.00.13.759-70x70.png 70w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/Gribouillis-2026-05-07-14.00.13.759.png 1244w" sizes="(max-width: 1018px) 100vw, 1018px" /></figure>



<p class="wp-block-paragraph">Software supply chains have become more complex and increasingly targeted, making container image security a fundamental requirement for building trust in modern delivery pipelines.</p>



<p class="wp-block-paragraph">By signing images with Cosign and protecting signing keys in OVHcloud KMS, teams can keep cryptographic material out of local environments and CI/CD variables, all while making image signing easier to control, audit and integrate into delivery pipelines.</p>



<p class="wp-block-paragraph">In this blog post, you will learn how to use the OVHcloud KMS plugin for Cosign to generate a key, sign a container image with this key and verify that the OCI image has been correctly signed.</p>



<h3 class="wp-block-heading">Cosign</h3>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" width="399" height="126" src="https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-5.png" alt="" class="wp-image-31741" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-5.png 399w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-5-300x95.png 300w" sizes="(max-width: 399px) 100vw, 399px" /></figure>



<p class="wp-block-paragraph"><a href="https://github.com/sigstore/cosign" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Cosign</a> is a tool from the <strong>Sigstore</strong> project used to <strong>sign, verify, and attest</strong> OCI container images and software artifacts.</p>



<p class="wp-block-paragraph">Cosign supports several signing modes, including <strong>keyless</strong> signing through Sigstore, where short-lived certificates are generated at signing time based on your identity (via GitHub, Google or another OIDC provider), as well as ephemeral key generation, hardware and <strong>KMS</strong>-backed signing and custom PKI integration.</p>



<p class="wp-block-paragraph"><code>Cosign</code> supports <a href="https://docs.sigstore.dev/cosign/key_management/overview/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">multiple KMS providers</a> to generate and sign keys. Several external KMS providers are supported, including HashiCorp Vault, AWS KMS, GCP KMS and Azure Key Vault.<br>Cosign can now also be integrated with OVHcloud KMS through the <a href="https://github.com/ovh/sigstore-kms-ovhcloud" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Sigstore Cosign OVHcloud KMS plugin</a> 💪.</p>



<h3 class="wp-block-heading">OVHcloud Key Management Service (KMS)</h3>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" width="100" height="101" src="https://blog.ovhcloud.com/wp-content/uploads/2026/05/Key-Management-Service-KMS@2x.png" alt="" class="wp-image-31711" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/05/Key-Management-Service-KMS@2x.png 100w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/Key-Management-Service-KMS@2x-70x70.png 70w" sizes="(max-width: 100px) 100vw, 100px" /></figure>



<p class="wp-block-paragraph"><a href="https://www.ovhcloud.com/en/identity-security-operations/key-management-service/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">OVHcloud KMS</a>, often called <strong>OKMS</strong>, is a managed service that centralizes the creation, storage, and management of encryption keys. Its main goal is to help businesses secure data and control cryptographic operations from a single platform.</p>



<p class="wp-block-paragraph">Each KMS is associated with a region, so the keys stored in that region are guaranteed to stay in that region. You can order multiple KMSs, either in different regions or in the same region.</p>



<h3 class="wp-block-heading">Prerequisites</h3>



<p class="wp-block-paragraph">To be able to use the Sigstore KMS OVHcloud provider, you need to follow some prerequisites:</p>



<ul class="wp-block-list">
<li>Have an OVHcloud account</li>



<li>Have created an <a href="https://www.ovhcloud.com/en/identity-security-operations/key-management-service/" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">OKMS</a> domain (“<em><code class="">305db938-1234-5678-9012-3a0a29291661</code></em>” for example in this blog post)</li>



<li><a href="https://github.com/ovh/public-cloud-examples/tree/main/iam/create-user-and-generate-pat-token-with-cli" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">Have created an IAM local user</a> (“<em>cosign-</em><code class="">305db938-1234-5678-9012-3a0a29291661</code>” for example in this blog post)</li>



<li>Have installed the <a href="https://github.com/ovh/ovhcloud-cli/?tab=readme-ov-file#installation" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">OVHcloud CLI</a></li>



<li>Have <a href="https://man7.org/linux/man-pages/man1/uuidgen.1.html" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">uuidgen</a> CLI installed</li>
</ul>



<p class="wp-block-paragraph">💡The cosign OVHcloud plugin supports both <code>token</code> and <code>mTLS</code> authentication. For the purposes of this blog post, we will use the token authentication mode. Please follow the <a href="https://external-secrets.io/latest/provider/ovhcloud/" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">Sigstore Cosign KMS plugin for OVHcloud</a> guide if you wish to use mTLS authentication mode.</p>



<h4 class="wp-block-heading">Generate a PAT token (for token authentication only)</h4>



<p class="wp-block-paragraph">List the OKMS domains:</p>



<pre class="wp-block-code"><code class="">$ ovhcloud okms list<br>┌──────────────────────────────────────┬─────────────┐<br>│                  id                  │   region    │<br>├──────────────────────────────────────┼─────────────┤<br>│ 305db938-1234-5678-9012-3a0a29291661 │ eu-west-par │<br>│ xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx │ eu-west-par │<br>└──────────────────────────────────────┴─────────────┘</code></pre>



<p class="wp-block-paragraph">Save the OKMS ID in an environment variable:</p>



<pre class="wp-block-code"><code class="">export KMS_RESTAPI_OKMSID="305db938-1234-5678-9012-3a0a29291661"</code></pre>



<p class="wp-block-paragraph">The cosign OVHcloud plugin needs the permission to create and fetch keys from the OVHcloud KMS.</p>



<p class="wp-block-paragraph">If you want to use token autentication, you’ll need a token (PAT). You can use the <strong>ovhcloud CLI </strong>to do that:</p>



<pre class="wp-block-code"><code class="">PAT_TOKEN=$(ovhcloud iam user token create &lt;iam-local-user-name&gt; --name pat-&lt;iam-local-user-name&gt; --description "PAT cosign for domain $KMS_RESTAPI_OKMSID" -o json  | jq .details.token |  tr -d '"')<br><br>echo $PAT_TOKEN</code></pre>



<p class="wp-block-paragraph">You should have a result like this:</p>



<pre class="wp-block-code"><code class="">$ PAT_TOKEN=$(ovhcloud iam user token create cosign-305db938-1234-5678-9012-3a0a29291661 --name pat-cosign-305db938-1234-5678-9012-3a0a29291661 --description "PAT cosign for domain 305db938-1234-5678-9012-3a0a29291661" -o json  | jq .details.token |  tr -d '"')<br>2026/05/07 08:48:34 Final parameters:<br>{<br> "description": "PAT cosign for domain 305db938-1234-5678-9012-3a0a29291661",<br> "name": "pat-cosign-305db938-1234-5678-9012-3a0a29291661"<br>}<br><br>$ echo $PAT_TOKEN<br>eyJhbGciOiJFZE...ASgXy55_DDFHdy4Z5uSq8lww-Bw</code></pre>



<h4 class="wp-block-heading">Save the KMS information</h4>



<p class="wp-block-paragraph">Save the KMS information in environment variables. For example:</p>



<pre class="wp-block-code"><code class="">export KMS_RESTAPI_ENDPOINT=$(ovhcloud okms get $KMS_RESTAPI_OKMSID -o json | jq .restEndpoint | xargs)<br>export KMS_RESTAPI_TYPE="token"<br>export KMS_RESTAPI_TOKEN=$PAT_TOKEN</code></pre>



<p class="wp-block-paragraph">Display the saved information:</p>



<pre class="wp-block-code"><code class="">$ echo $KMS_RESTAPI_ENDPOINT<br>https://eu-west-par.okms.ovh.net<br><br>$ echo $KMS_RESTAPI_OKMSID<br>305db938-1234-5678-9012-3a0a29291661<br><br>$ echo $KMS_RESTAPI_TYPE<br>token<br><br>$ echo $KMS_RESTAPI_TOKEN<br>eyJ...BIoHCA</code></pre>



<h4 class="wp-block-heading">Cosign KMS plugin installation</h4>



<p class="wp-block-paragraph">Install the plugin locally:</p>



<pre class="wp-block-code"><code class="">curl -fsSL https://raw.githubusercontent.com/ovh/sigstore-kms-ovhcloud/main/install.sh | sh</code></pre>



<p class="wp-block-paragraph">⚠️ The binary is installed in <code>$HOME/.local/bin</code> by default (created if it does not exist). Make sure this directory is in your <code>PATH</code>.</p>



<p class="wp-block-paragraph">Or follow the other <a href="https://github.com/ovh/sigstore-kms-ovhcloud#installation" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">installation methods.</a></p>



<p class="wp-block-paragraph">Now you can use the OVHcloud KMS plugin directly in the cosign command 🎉.</p>



<h3 class="wp-block-heading">Let&#8217;s use Cosign with the OVHcloud KMS!</h3>



<h4 class="wp-block-heading">Generate a key</h4>



<p class="wp-block-paragraph">First, to sign an image, we need to generate a key pair. To do that we need to generate a UUID and use it in the <code>cosign generate-key-pair</code> command.</p>



<pre class="wp-block-code"><code class="">export KEY_ID=$(uuidgen)<br>cosign generate-key-pair --kms ovhcloud://$KEY_ID</code></pre>



<p class="wp-block-paragraph">The signing key is created in OVHcloud KMS, and the public key is written locally.</p>



<p class="wp-block-paragraph">You should see an output like this:</p>



<pre class="wp-block-code"><code class="">$ export KEY_ID=$(uuidgen)<br>$ cosign generate-key-pair --kms ovhcloud://$KEY_ID<br><br>Public key written to cosign.pub</code></pre>



<p class="wp-block-paragraph">The command generates a key pair using the ECDSA algorithm and writes the public key to <code>cosign.pub</code>.</p>



<p class="wp-block-paragraph">Check the keys have been created:</p>



<pre class="wp-block-code"><code class="">$ ls -l cosign.pub<br>-rw-------  1 avache  staff  178 18 juin  16:06 cosign.pub<br><br>$ cat cosign.pub<br><br>-----BEGIN PUBLIC KEY-----<br>MFkw...QgwA==<br>-----END PUBLIC KEY-----<br></code></pre>



<p class="wp-block-paragraph"><br>Once the key pair has been generated, use the corresponding OVHcloud KMS key ID in the <code>ovhcloud://$KEY_ID</code> URI when signing and verifying images.</p>



<h4 class="wp-block-heading">Or get an existing public key (optional)</h4>



<p class="wp-block-paragraph">Instead of creating a new public key, you can retrieve an existing one with the following command:</p>



<pre class="wp-block-code"><code class="">cosign public-key --key ovhcloud://$KEY_ID --outfile cosign-ovhcloud.pub</code></pre>



<h4 class="wp-block-heading">Sign an image</h4>



<p class="wp-block-paragraph">Replace the <code>$IMAGE@sha256:$HASH</code> parameter with the URI to your image and the hash to your image and execute this command:</p>



<pre class="wp-block-code"><code class="">cosign sign --key ovhcloud://$KEY_ID $IMAGE@sha256:$HASH</code></pre>



<p class="wp-block-paragraph">You should see an output like this:</p>



<pre class="wp-block-code"><code class="">$ cosign sign --key ovhcloud://$KEY_ID 12345678.c1.de1.container-registry.ovh.net/my-project/my-image@sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxx</code></pre>



<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="278" height="282" src="https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-6.png" alt="" class="wp-image-31773" style="width:114px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-6.png 278w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-6-70x70.png 70w" sizes="auto, (max-width: 278px) 100vw, 278px" /></figure>



<h4 class="wp-block-heading">Verify the image has been signed</h4>



<pre class="wp-block-code"><code class="">cosign verify --key ovhcloud://$KEY_ID $IMAGE@sha256:$HASH</code></pre>



<p class="wp-block-paragraph">You should see an output like this:</p>



<pre class="wp-block-code"><code class="">$ cosign verify --key ovhcloud://$KEY_ID 12345678.c1.de1.container-registry.ovh.net/my-project/my-image@sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxx<br><br>Verification for 12345678.c1.de1.container-registry.ovh.net/my-project/my-image@sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxx --<br>The following checks were performed on each of these signatures:<br>  - The cosign claims were validated<br>  - Existence of the claims in the transparency log was verified offline<br>  - The signatures were verified against the specified public key<br><br>[{"critical":{"identity":{"docker-reference":"12345678.c1.de1.container-registry.ovh.net/my-project/my-image@sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"},"image":{"docker-manifest-digest":"sha256:b1202...2334e2"},"type":"https://sigstore.dev/cosign/sign/v1"},"optional":{}}]</code></pre>



<h3 class="wp-block-heading">Conclusion</h3>



<p class="wp-block-paragraph">In this blog post, we have shown how to use Cosign with the OVHcloud KMS plugin to generate a key pair, sign a container image and verify its signature.</p>



<p class="wp-block-paragraph">By keeping signing keys in a managed KMS, teams can reduce secret sprawl, protect sensitive cryptographic material and make image signing easier to integrate into secure CI/CD workflows.</p>



<p class="wp-block-paragraph">Feel free to take a look at our <a href="https://github.com/orgs/ovh/projects/16" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">Cloud Roadmap &amp; Changelog</a> to follow the latest features coming to OVHcloud Public Cloud products.</p>
<img loading="lazy" decoding="async" src="//blog.ovhcloud.com/wp-content/plugins/matomo/app/matomo.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Fblog.ovhcloud.com%2Fsecure-image-signing-cosign-ovhcloud-kms%2F&amp;action_name=Secure%20Image%20Signing%20with%20Cosign%20and%20OVHcloud%20KMS&amp;urlref=https%3A%2F%2Fblog.ovhcloud.com%2Ffeed%2F" style="border:0;width:0;height:0" width="0" height="0" alt="" />]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Terraform S3 state locking with OVHcloud Object Storage</title>
		<link>https://blog.ovhcloud.com/terraform-s3-state-locking-ovhcloud-object-storage/</link>
		
		<dc:creator><![CDATA[Aurélie Vache]]></dc:creator>
		<pubDate>Mon, 15 Jun 2026 12:58:44 +0000</pubDate>
				<category><![CDATA[OVHcloud Engineering]]></category>
		<category><![CDATA[OpenTofu S3 state locking]]></category>
		<category><![CDATA[OVHcloud Object Storage]]></category>
		<category><![CDATA[S3-compatible Object Storage]]></category>
		<category><![CDATA[Terraform backend]]></category>
		<category><![CDATA[Terraform S3 state locking]]></category>
		<guid isPermaLink="false">https://blog.ovhcloud.com/?p=32272</guid>

					<description><![CDATA[In a previous blog post, I explained how to use OVHcloud S3-compatible Object Storage as a Terraform backend for storing Terraform/OpenTofu state files. Since then, we&#8217;ve enhanced OVHcloud Object Storage, and one of the coolest improvements is the support for conditional writes. By preventing concurrent overwrites, this feature enables Terraform&#8217;s native S3 state-locking mechanism to [&#8230;]<img src="//blog.ovhcloud.com/wp-content/plugins/matomo/app/matomo.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Fblog.ovhcloud.com%2Fterraform-s3-state-locking-ovhcloud-object-storage%2F&amp;action_name=Terraform%20S3%20state%20locking%20with%20OVHcloud%20Object%20Storage&amp;urlref=https%3A%2F%2Fblog.ovhcloud.com%2Ffeed%2F" style="border:0;width:0;height:0" width="0" height="0" alt="" />]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://blog.ovhcloud.com/wp-content/uploads/2026/06/IMG_1608-1-1024x1024.png" alt="" class="wp-image-32328" style="aspect-ratio:1.0008006079081817;width:430px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/06/IMG_1608-1-1024x1024.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/IMG_1608-1-300x300.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/IMG_1608-1-150x150.png 150w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/IMG_1608-1-768x767.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/IMG_1608-1-70x70.png 70w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/IMG_1608-1.png 1247w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">In a previous blog post, I explained <a href="https://blog.ovhcloud.com/using-ovhcloud-s3-compatible-object-storage-as-terraform-backend-to-store-your-terraform-opentofu-states/" data-wpel-link="internal">how to use OVHcloud S3-compatible Object Storage as a Terraform backend for storing Terraform/OpenTofu state files</a>.</p>



<p class="wp-block-paragraph">Since then, we&#8217;ve enhanced OVHcloud Object Storage, and one of the coolest improvements is the <a href="https://github.com/ovh/public-cloud-roadmap/issues/671" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">support for conditional writes</a>. By preventing concurrent overwrites, this feature enables <a href="https://developer.hashicorp.com/terraform/language/backend/s3#state-locking" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Terraform&#8217;s native S3 state-locking mechanism</a> to work seamlessly with OVHcloud Object Storage.</p>



<p class="wp-block-paragraph">In practice, Terraform/OpenTofu can create a <code>.tflock</code> object only if it does not already exist. If another operation has already created the lock file, the conditional write fails and the second operation is blocked.</p>



<p class="wp-block-paragraph">With this blog post, I explain how we can configure our Terraform/OpenTofu backend to store our states in an OVHcloud S3-compatible Object Storage with S3 state locking.</p>



<h3 class="wp-block-heading">Terraform/OpenTofu S3 State Locking feature</h3>



<p class="wp-block-paragraph">State locking is a critical feature for collaborative Terraform/OpenTofu workflows. It ensures that only one operation can modify a state file at any given time, preventing concurrent writes that could lead to inconsistencies or state corruption.</p>



<p class="wp-block-paragraph">Concretely, when a user runs <code>terraform apply</code> (or <code>tofu apply)</code>, Terraform creates a <code>.tflock</code> file in the S3 bucket. This lock file indicates that an operation is currently in progress and that the state file is being used. If another user attempts to run <code>terraform apply</code> (or <code>tofu apply)</code> while the lock is active, Terraform detects the existing lock and aborts the operation with an error message. This prevents concurrent modifications of the state file and helps avoid state corruption.</p>



<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="791" height="1024" src="https://blog.ovhcloud.com/wp-content/uploads/2026/06/IMG_1610-791x1024.jpeg" alt="" class="wp-image-32336" style="aspect-ratio:0.7724658665702258;width:480px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/06/IMG_1610-791x1024.jpeg 791w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/IMG_1610-232x300.jpeg 232w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/IMG_1610-768x994.jpeg 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/IMG_1610-1187x1536.jpeg 1187w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/IMG_1610-1583x2048.jpeg 1583w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/IMG_1610-scaled.jpeg 1978w" sizes="auto, (max-width: 791px) 100vw, 791px" /></figure>



<h3 class="wp-block-heading">Prerequisites</h3>



<p class="wp-block-paragraph">To be able to store your Terraform/OpenTofu states and activate the <code>use_lockfile</code> feature, you need to follow some prerequisites:</p>



<ul class="wp-block-list">
<li>Have an OVHcloud account</li>



<li>Created <a href="https://blog.ovhcloud.com/using-ovhcloud-s3-compatible-object-storage-as-terraform-backend-to-store-your-terraform-opentofu-states/" data-wpel-link="internal">a S3-compatible Object Storage</a> (<em>enable <strong>bucket versioning</strong> for your state bucket so previous state versions can be recovered if needed</em>)</li>



<li>Installed <a href="https://developer.hashicorp.com/terraform/install" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">the Terraform CLI </a>or <a href="https://opentofu.org/docs/intro/install/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">OpenTofu CLI</a> (version 1.10 or &gt;)</li>



<li>Installed the <a href="https://github.com/ovh/ovhcloud-cli/?tab=readme-ov-file#installation" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">OVHcloud CLI</a></li>
</ul>



<p class="wp-block-paragraph">Save the s3 user credentials in environment variables (that allows you to access and store files in the bucket):</p>



<pre class="wp-block-code"><code class="">export AWS_ACCESS_KEY_ID="xxxxxxxxx"<br>export AWS_SECRET_ACCESS_KEY="yyyyyyyyy"</code></pre>



<h3 class="wp-block-heading">Configure it</h3>



<p class="wp-block-paragraph">Create a new folder, named <code>my-app</code> (for example), and go into it.</p>



<p class="wp-block-paragraph">Create a <code>provider.tf</code> file with the following content, and replace the bucket value witht he name of the bucket you created:</p>



<pre class="wp-block-code"><code class="">terraform {<br>    backend "s3" {<br>      bucket = "terraform-state-3az" # the name of YOUR bucket<br>      key    = "my-app.tfstate" # the name of the state of your app<br>      region = "eu-west-par" # the region of the bucket<br>      endpoints = {<br>        s3 = "https://s3.eu-west-par.io.cloud.ovh.net/" # the endpoint<br>      }<br>      skip_credentials_validation = true<br>      skip_region_validation      = true<br>      skip_requesting_account_id  = true<br>      skip_s3_checksum            = true<br><br>      use_lockfile = true  # activation of the S3 native state locking feature<br>    }<br>}</code></pre>



<p class="wp-block-paragraph">💡The <code>use_lockfile = true </code>argument enables native S3 state locking. Terraform/OpenTofu uses the <code>.tflock</code> object to prevent two operations from writing to the same state file at the same time.</p>



<h3 class="wp-block-heading">Test it!</h3>



<p class="wp-block-paragraph">Create a <code>resource.tf</code> file with an example resource to create (only for the testing purpose):</p>



<pre class="wp-block-code"><code class="">resource "null_resource" "test" {}</code></pre>



<p class="wp-block-paragraph">Initialise Terraform:</p>



<pre class="wp-block-code"><code class="">$ terraform init<br><br>Initializing the backend...<br><br>Successfully configured the backend "s3"! Terraform will automatically<br>use this backend unless the backend configuration changes.<br>Initializing provider plugins...<br>- Finding latest version of hashicorp/null...<br>- Installing hashicorp/null v3.3.0...<br>- Installed hashicorp/null v3.3.0 (signed by HashiCorp)<br>Terraform has created a lock file .terraform.lock.hcl to record the provider<br>selections it made above. Include this file in your version control repository<br>so that Terraform can guarantee to make the same selections by default when<br>you run "terraform init" in the future.<br><br>Terraform has been successfully initialized!<br><br>You may now begin working with Terraform. Try running "terraform plan" to see<br>any changes that are required for your infrastructure. All Terraform commands<br>should now work.<br><br>If you ever set or change modules or backend configuration for Terraform,<br>rerun this command to reinitialize your working directory. If you forget, other<br>commands will detect it and remind you to do so if necessary.</code></pre>



<p class="wp-block-paragraph">As you can see, Terraform is using “s3” backend and initialized the provider plugins. 💪</p>



<p class="wp-block-paragraph">💡<em>Note that </em><code>.terraform.lock.hcl</code><em> is the provider dependency lock file created during initialization. The state lock file used for S3 backend locking is the <code>.tflock</code> file shown in the bucket during <code>terraform apply</code>.</em></p>



<p class="wp-block-paragraph">Execute the apply command (without answering &#8220;yes&#8221;):</p>



<pre class="wp-block-code"><code class="">$ terraform apply<br><br>Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:<br>  + create<br><br>Terraform will perform the following actions:<br><br>  # null_resource.test will be created<br>  + resource "null_resource" "test" {<br>      + id = (known after apply)<br>    }<br><br>Plan: 1 to add, 0 to change, 0 to destroy.<br><br>Do you want to perform these actions?<br>  Terraform will perform the actions described above.<br>  Only 'yes' will be accepted to approve.<br><br>  Enter a value:</code></pre>



<p class="wp-block-paragraph">Check if a new file appears in the S3 bucket:</p>



<pre class="wp-block-code"><code class="">$ ovhcloud cloud storage object object list terraform-state-3az<br><br>┌───────────────────────┬──────┐<br>│          key          │ size │<br>├───────────────────────┼──────┤<br>│ my-app.tfstate.tflock │ 219  │<br>└───────────────────────┴──────┘<br>💡 Use option -o json or -o yaml to get the raw output with all information</code></pre>



<p class="wp-block-paragraph">A <code>.tflock</code> file appears! 💪</p>



<p class="wp-block-paragraph">You can also check it in the OVHcloud Control Panel:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="338" src="https://blog.ovhcloud.com/wp-content/uploads/2026/06/Capture-decran-2026-06-09-a-15.04.19-1024x338.png" alt="" class="wp-image-32322" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/06/Capture-decran-2026-06-09-a-15.04.19-1024x338.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/Capture-decran-2026-06-09-a-15.04.19-300x99.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/Capture-decran-2026-06-09-a-15.04.19-768x253.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/Capture-decran-2026-06-09-a-15.04.19-1536x507.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/Capture-decran-2026-06-09-a-15.04.19-2048x676.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">This <code>.tflock</code> file means that someone is working on this infrastructure. After answering &#8220;yes&#8221; to the <code>terraform apply</code> command, the resources will be deployed, the state will appear and the lock file will disappear:</p>



<pre class="wp-block-code"><code class="">$ terraform apply<br><br>Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:<br>  + create<br><br>Terraform will perform the following actions:<br><br>  # null_resource.test will be created<br>  + resource "null_resource" "test" {<br>      + id = (known after apply)<br>    }<br><br>Plan: 1 to add, 0 to change, 0 to destroy.<br><br>Do you want to perform these actions?<br>  Terraform will perform the actions described above.<br>  Only 'yes' will be accepted to approve.<br><br>  Enter a value: yes<br><br>null_resource.test: Creating...<br>null_resource.test: Creation complete after 0s [id=2048943220587414471]<br><br>Apply complete! Resources: 1 added, 0 changed, 0 destroyed.<br><br><br>$ ovhcloud cloud storage object object list terraform-state-3az<br>┌────────────────┬──────┐<br>│      key       │ size │<br>├────────────────┼──────┤<br>│ my-app.tfstate │ 612  │<br>└────────────────┴──────┘<br>💡 Use option -o json or -o yaml to get the raw output with all information</code></pre>



<p class="wp-block-paragraph">🎉</p>



<h3 class="wp-block-heading">Why this Terraform state locking feature is useful?</h3>



<p class="wp-block-paragraph">If a user executes <code>terraform apply</code> command (without answering yes) and another user executes the same command, an error message will be displayed:</p>



<pre class="wp-block-code"><code class="">$ terraform apply<br><br>╷<br>│ Error: Error acquiring the state lock<br>│<br>│ Error message: operation error S3: PutObject, https response error StatusCode: 412, RequestID: tx7b439680a0104339a2fc7-xxxxxxxxxxxx, HostID: tx7b439680a0104339a2fc7-xxxxxxxxxxxx, api error<br>│ PreconditionFailed: At least one of the pre-conditions you specified did not hold<br>│ Lock Info:<br>│   ID:        xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx<br>│   Path:      terraform-state-3az/my-app.tfstate<br>│   Operation: OperationTypeApply<br>│   Who:       avache@xxxxxxxxxx<br>│   Version:   1.14.9<br>│   Created:   2026-06-09 13:09:05.562244 +0000 UTC<br>│   Info:<br>│<br>│<br>│ Terraform acquires a state lock to protect the state from being written<br>│ by multiple users at the same time. Please resolve the issue above and try<br>│ again. For most commands, you can disable locking with the "-lock=false"<br>│ flag, but this is not recommended.<br>╵</code></pre>



<p class="wp-block-paragraph">This error is expected. It means another Terraform/OpenTofu operation has already acquired the state lock, so the second operation cannot modify the state file at the same time. The user should wait until the first operation is complete and the lock file has been released, then retry. Although Terraform allows locking to be disabled with <code>-lock=false</code>, this is not recommended because it can lead to concurrent state changes and potential state corruption.</p>



<h3 class="wp-block-heading">Conclusion</h3>



<p class="wp-block-paragraph">In this blog post, we have seen one use case of conditional writes, but the feature goes far beyond that. Support for conditional writes does not only help prevent accidental overwrites; it also enables safer concurrent workflows, such as Terraform/OpenTofu state locking.</p>



<p class="wp-block-paragraph">Our team is working on the improvement of Object Storage, so stay tuned for more. And please, as alays, share your thoughts with us!</p>
<img loading="lazy" decoding="async" src="//blog.ovhcloud.com/wp-content/plugins/matomo/app/matomo.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Fblog.ovhcloud.com%2Fterraform-s3-state-locking-ovhcloud-object-storage%2F&amp;action_name=Terraform%20S3%20state%20locking%20with%20OVHcloud%20Object%20Storage&amp;urlref=https%3A%2F%2Fblog.ovhcloud.com%2Ffeed%2F" style="border:0;width:0;height:0" width="0" height="0" alt="" />]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How can blockchain speed up payments?</title>
		<link>https://blog.ovhcloud.com/blockchain-payments/</link>
		
		<dc:creator><![CDATA[Elena Luoto&nbsp;and&nbsp;Christian Sharp]]></dc:creator>
		<pubDate>Thu, 11 Jun 2026 03:00:00 +0000</pubDate>
				<category><![CDATA[OVHcloud Engineering]]></category>
		<category><![CDATA[Blockchain]]></category>
		<guid isPermaLink="false">https://blog.ovhcloud.com/?p=32212</guid>

					<description><![CDATA[It’s annoying: a payment often takes seconds to leave your account, but it can take days to reach the person on the other end. Why? It is one of those modern financial mysteries. You tap your phone and the payment looks instant. But if you send money abroad, it can take three to five business [&#8230;]<img src="//blog.ovhcloud.com/wp-content/plugins/matomo/app/matomo.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Fblog.ovhcloud.com%2Fblockchain-payments%2F&amp;action_name=How%20can%20blockchain%20speed%20up%20payments%3F&amp;urlref=https%3A%2F%2Fblog.ovhcloud.com%2Ffeed%2F" style="border:0;width:0;height:0" width="0" height="0" alt="" />]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="1000" height="1000" src="https://blog.ovhcloud.com/wp-content/uploads/2026/06/June_26.png" alt="blockchain payments speeding up cross-border money transfers" class="wp-image-32213" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/06/June_26.png 1000w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/June_26-300x300.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/June_26-150x150.png 150w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/June_26-768x768.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/June_26-70x70.png 70w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure>



<p class="wp-block-paragraph">It’s annoying: a payment often takes seconds to leave your account, but it can take days to reach the person on the other end. Why?</p>



<p class="wp-block-paragraph">It is one of those modern financial mysteries. You tap your phone and the payment looks instant. But if you send money abroad, it can take three to five business days… Moreover, suddenly there are fees, delays, banking cut-off times and a trail of institutions&#8230; In an age of real-time apps and always-on services, traditional payments can still move maddeningly slow.</p>



<p class="wp-block-paragraph">But this is one of the reasons blockchain gets so much attention in today’s financial circles. Put simply, <strong>blockchain has the potential to make some payments faster, cheaper, and easier to track.</strong> It is not perfect, and it will not replace every payment system overnight, but it does offer an alternative way of moving value between parties.<br></p>



<h2 class="wp-block-heading"><strong>Why traditional payments can be slow</strong></h2>



<p class="wp-block-paragraph">To understand why blockchain matters, it helps to look at how many traditional payments work today.</p>



<p class="wp-block-paragraph">If you buy a coffee in your local café, the transaction feels immediate. But behind the scenes, several things are happening. Your bank, the merchant’s bank, the card network and payment processor may all be involved. <strong>The transaction is authorised quickly, but settlement can happen later.</strong></p>



<p class="wp-block-paragraph">Now imagine a more complicated scenario: a freelance designer in France is being paid by a client in the U.S., or a doctor working in London is sending money home to the Philippines. In these cases, the payment often passes through multiple banks, correspondent banking networks, foreign exchange systems, and compliance checks before it reaches the final account.</p>



<p class="wp-block-paragraph">Each step adds time, cost, and complexity.</p>



<p class="wp-block-paragraph">This is why international payments can take days rather than minutes. The money may move across different banking systems, operating in different time zones, with different rules, intermediary fees and business-hour limitations. In short, traditional payments often rely on a chain of trusted institutions updating their own records, one by one.</p>



<h2 class="wp-block-heading"><strong>How blockchain changes the model</strong></h2>



<p class="wp-block-paragraph">Blockchain works differently.</p>



<p class="wp-block-paragraph">Instead of several institutions each keeping their own version of the transaction and then reconciling those records, blockchain uses what’s called a <strong>shared ledger</strong>: a record of transactions that is distributed across a network and updated according to the same rules. In simple terms, <em>the participants in a</em> <em>shared ledger network are looking at the same history of payments</em>, <em>rather than passing information from one private database to another.</em></p>



<p class="wp-block-paragraph">That matters because a lot of delay in traditional payments comes from handoffs. One institution sends instructions to another. A second institution checks them. A third updates its own records. If any part of that chain is closed, delayed, or requires extra review, the payment slows down.</p>



<p class="wp-block-paragraph">With blockchain payments, the process is more direct. A payment request is sent to the network. Computers on that network check that the sender has the funds and that the same money has not already been spent elsewhere. Once the transaction is validated, it is grouped with other verified transactions, added to the ledger, and then reflected across the network. That shared update is what gives both sides a clearer, synchronized view of what has happened.</p>



<p class="wp-block-paragraph">This does not remove every check or every operational requirement. But it can reduce the number of intermediaries involved in moving and confirming value. It can also allow the network to operate continuously, rather than depending on banking hours, weekends or regional cut-off times.</p>



<p class="wp-block-paragraph">Therefore, some blockchain payments can settle far more quickly than traditional international transfers. In the right conditions, they can even happen in minutes or seconds, instead of days.</p>



<h2 class="wp-block-heading"><strong>A simple real-world example</strong></h2>



<p class="wp-block-paragraph">For example, let’s say a woman named Maria works as an architect in Chicago and sends part of her salary every month to her sister and nieces in Mexico. Using a traditional remittance service, she may pay transfer fees, exchange-rate markups, and they have to wait a day or two for the funds to arrive. If the transfer is made before a weekend or public holiday, it may take even longer.</p>



<p class="wp-block-paragraph">With a blockchain-based payment system, the same transfer could move across a digital network much more directly – maybe even instantly. Instead of passing through a long chain of correspondent banks, the transaction is submitted to a shared ledger, validated by the network, and recorded in a way that both sides can verify. Maria’s family does not have to wait for multiple institutions to update separate records in sequence before the payment is considered settled.</p>



<p class="wp-block-paragraph">That does not mean the experience is always instant or frictionless, but it does show why blockchain is relevant to ordinary payments. Not just about crypto trading or speculation, blockchain can also make everyday financial activity more efficient and reliable.</p>



<h2 class="wp-block-heading"><strong>Can blockchain make payments cheaper too?</strong></h2>



<p class="wp-block-paragraph">Oftentimes, yes.</p>



<p class="wp-block-paragraph">Traditional payment systems can be expensive because multiple parties may each take a fee. Currency conversion adds more cost. Smaller cross-border payments can be especially frustrating, because the charges can feel disproportionate to the amount being sent.</p>



<p class="wp-block-paragraph">Blockchain can reduce some of this friction because fewer intermediaries may be involved in moving and confirming the payment. In some systems, the network is handling verification and settlement instead of several institutions performing overlapping roles.</p>



<p class="wp-block-paragraph">That does not mean every blockchain payment is cheap. Costs depend heavily on the network, the design of the application, and how busy the chain is. But the core idea is compelling: fewer middlemen means fewer handoffs, which can mean lower costs.</p>



<h2 class="wp-block-heading"><strong>What blockchain will not fix on its own</strong></h2>



<p class="wp-block-paragraph">However, there are some caveats.</p>



<p class="wp-block-paragraph">Blockchain does not automatically solve every challenge in payments. Regulation, consumer protection, currency volatility, user experience, and integration with existing financial systems all matter. In many markets, blockchain payments still need better interfaces and clearer frameworks before they become truly mainstream.</p>



<p class="wp-block-paragraph">There is also a difference between the underlying technology and the end-user experience. Most people do not want to think about wallets, keys, or protocols when they are paying rent or buying groceries. For blockchain payments to scale, the experience must become simpler and more familiar.</p>



<h2 class="wp-block-heading"><strong>Back to Maria</strong></h2>



<p class="wp-block-paragraph">So let’s go back to Maria, sending money back to her family who might have an important bill they need to pay urgently.</p>



<p class="wp-block-paragraph">In the traditional model, the payment might pass through several institutions, take days to settle, and lose value through fees and exchange costs.</p>



<p class="wp-block-paragraph">In a blockchain-based model, the transfer could move through a shared ledger, be validated by the network rather than reconciled across several separate databases, settle much faster, and give both sides a clearer view of what is happening.</p>



<p class="wp-block-paragraph">That is why this matters to regular people like you, me, and Maria. Blockchain may not replace every payment rail tomorrow, but it offers a serious alternative for a world that increasingly expects transactions to be fast, transparent and borderless.</p>
<img loading="lazy" decoding="async" src="//blog.ovhcloud.com/wp-content/plugins/matomo/app/matomo.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Fblog.ovhcloud.com%2Fblockchain-payments%2F&amp;action_name=How%20can%20blockchain%20speed%20up%20payments%3F&amp;urlref=https%3A%2F%2Fblog.ovhcloud.com%2Ffeed%2F" style="border:0;width:0;height:0" width="0" height="0" alt="" />]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to process large AI requests with Batch Mode on OVHcloud AI Endpoints</title>
		<link>https://blog.ovhcloud.com/ovhcloud-ai-endpoints-batch-mode/</link>
		
		<dc:creator><![CDATA[Stéphane Philippart]]></dc:creator>
		<pubDate>Mon, 01 Jun 2026 12:26:07 +0000</pubDate>
				<category><![CDATA[OVHcloud Engineering]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[AI Endpoints]]></category>
		<category><![CDATA[OVHcloud]]></category>
		<guid isPermaLink="false">https://blog.ovhcloud.com/?p=32115</guid>

					<description><![CDATA[Batch Mode on OVHcloud AI Endpoints helps developers process large volumes of AI requests asynchronously. Learn how to prepare a JSONL file, create a batch job, monitor its status and retrieve results.<img src="//blog.ovhcloud.com/wp-content/plugins/matomo/app/matomo.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Fblog.ovhcloud.com%2Fovhcloud-ai-endpoints-batch-mode%2F&amp;action_name=How%20to%20process%20large%20AI%20requests%20with%20Batch%20Mode%20on%20OVHcloud%20AI%20Endpoints&amp;urlref=https%3A%2F%2Fblog.ovhcloud.com%2Ffeed%2F" style="border:0;width:0;height:0" width="0" height="0" alt="" />]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Let’s say you have 20,000 support tickets to classify before tomorrow morning, or a full product catalog to translate without manually sending each request one by one. That kind of workload can quickly become slow, repetitive and difficult to manage.</p>



<p class="wp-block-paragraph"><strong>Batch Mode</strong> is designed to help in exactly this type of scenario.</p>



<h3 class="wp-block-heading">What is Batch Mode?</h3>



<p class="wp-block-paragraph">When working with LLMs, you often send requests one by one through synchronous endpoints like <mark style="background-color:var(--ast-global-color-6)" class="has-inline-color">/v1/chat/completions</mark> or <mark style="background-color:var(--ast-global-color-6)" class="has-inline-color">/v1/responses</mark>. This works fine for real-time use cases, but what can you do if you need to process hundreds or thousands of prompts? Sending them individually is slow, and you&#8217;re limited by rate limits.</p>



<p class="wp-block-paragraph">Batch mode&nbsp;solves this problem. Instead of sending requests one at a time, you upload a file containing all your requests, submit a batch job, and get the results back asynchronously, within a maximum of 24 hours. And here&#8217;s the cherry on top: batch mode is&nbsp;<strong>50% cheaper</strong>&nbsp;than synchronous requests. Since the platform can schedule your workload more efficiently, you benefit from a significant cost reduction.</p>



<p class="wp-block-paragraph">This is ideal for:</p>



<ul class="wp-block-list">
<li>📊 Bulk classification or summarization tasks</li>



<li>🌍 Large-scale translation jobs</li>



<li>📝 Generating descriptions for a product catalog</li>



<li>🧪 Evaluating model outputs on a test dataset</li>
</ul>



<p class="wp-block-paragraph">ℹ️ The Batch API is compatible with the OpenAI Batch API format, so you can use the official OpenAI SDK to interact with it.</p>



<h3 class="wp-block-heading">When <em>not</em> to use Batch Mode!</h3>



<p class="wp-block-paragraph">Batch Mode is designed for large workloads that do not need an immediate response. This being said, <em>it is not the right choice for real-time use cases such as chatbots, live customer support, interactive assistants or applications where users expect an answer within seconds. </em>For those scenarios, synchronous endpoints remain more appropriate. Use Batch Mode when your requests can be processed asynchronously and retrieved later.</p>



<p class="wp-block-paragraph">ℹ️ The Batch API is currently in beta. You can find more information about the beta on the <a href="https://labs.ovhcloud.com/en/ai-endpoint-batch-api/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">dedicated page</a>.</p>



<h3 class="wp-block-heading">Prerequisites for using Batch Mode</h3>



<p class="wp-block-paragraph">Before getting started, you&#8217;ll need:</p>



<ul class="wp-block-list">
<li>An <strong>AI Endpoints API key</strong></li>



<li>Python 3.10+ installed</li>



<li>The <mark style="background-color:var(--ast-global-color-6)" class="has-inline-color">openai</mark> Python package</li>
</ul>



<p class="wp-block-paragraph">⚠️ You can generate your API key from the <a href="https://www.ovhcloud.com/en/public-cloud/ai-endpoints/catalog/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">AI Endpoints console</a>.</p>



<p class="wp-block-paragraph">Install the dependency:</p>



<pre class="wp-block-code"><code class="">pip install openai</code></pre>



<p class="wp-block-paragraph">Set up your environment variables:</p>



<pre class="wp-block-code"><code class="">export OVH_AI_ENDPOINTS_ACCESS_TOKEN='your_api_key'<br>export OVH_AI_ENDPOINTS_BASE_URL='https://oai.endpoints.kepler.ai.cloud.ovh.net/v1'</code></pre>



<h3 class="wp-block-heading">Step 1: Prepare the Input File</h3>



<p class="wp-block-paragraph">The input file uses the <a href="https://jsonlines.org/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">JSON Lines</a> format (<mark style="background-color:var(--ast-global-color-6)" class="has-inline-color">.jsonl</mark>). Each line is a self-contained request with a unique <mark style="background-color:var(--ast-global-color-6)" class="has-inline-color">custom_id</mark> that lets you match results to their original requests.</p>



<p class="wp-block-paragraph">Here&#8217;s an example <mark style="background-color:var(--ast-global-color-6)" class="has-inline-color">requests.jsonl</mark>:</p>



<pre class="wp-block-code"><code class="">{"custom_id": "request-1", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "gpt-oss-20b", "messages": [{"role": "user", "content": "Summarise the plot of Hamlet in two sentences."}]}}<br>{"custom_id": "request-2", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "gpt-oss-20b", "messages": [{"role": "user", "content": "Translate 'Good morning' into French, Spanish and German."}]}}</code></pre>



<p class="wp-block-paragraph">Key points:</p>



<ul class="wp-block-list">
<li>Each <mark style="background-color:var(--ast-global-color-6);color:#000000" class="has-inline-color">custom_id</mark> <strong>must be unique</strong> within a batch</li>



<li>The <mark style="background-color:var(--ast-global-color-6)" class="has-inline-color">model</mark> field must reference a model available in the <a href="https://www.ovhcloud.com/en/public-cloud/ai-endpoints/catalog/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">AI Endpoints catalog</a></li>



<li>The <mark style="background-color:var(--ast-global-color-6)" class="has-inline-color">url</mark> field indicates which endpoint to call </li>
</ul>



<h3 class="wp-block-heading">Step 2: Upload the File and Create the Batch</h3>



<p class="wp-block-paragraph">Here&#8217;s the complete Python code that handles the full workflow: upload, create, poll, and download:</p>



<pre class="wp-block-code"><code class="">import os<br>import time<br><br>from openai import OpenAI<br><br># Load environment variables<br>_OVH_AI_ENDPOINTS_ACCESS_TOKEN = os.environ["OVH_AI_ENDPOINTS_ACCESS_TOKEN"]<br>_OVH_AI_ENDPOINTS_BASE_URL = os.environ["OVH_AI_ENDPOINTS_BASE_URL"]<br><br># Initialize the OpenAI-compatible client targeting OVHcloud AI Endpoints<br>client = OpenAI(<br>    base_url=_OVH_AI_ENDPOINTS_BASE_URL,<br>    api_key=_OVH_AI_ENDPOINTS_ACCESS_TOKEN,<br>)<br><br># 1. Upload the input JSONL file with purpose="batch"<br>print("📤 Uploading input file...")<br>batch_input_file = client.files.create(<br>    file=open("requests.jsonl", "rb"),<br>    purpose="batch",<br>)<br>print(f"✅ Uploaded file id: {batch_input_file.id}")<br><br># 2. Create the batch referencing the uploaded file<br>print("🚀 Creating batch...")<br>batch = client.batches.create(<br>    input_file_id=batch_input_file.id,<br>    endpoint="/v1/chat/completions",<br>    completion_window="24h",<br>    metadata={"description": "Batch mode example - OVHcloud AI Endpoints"},<br>)<br>print(f"✅ Batch created: {batch.id} (status: {batch.status})")<br><br># 3. Poll the batch status until it reaches a terminal state<br>print("⏳ Polling batch status...")<br>while True:<br>    current = client.batches.retrieve(batch.id)<br>    print(f"   status={current.status} counts={current.request_counts}")<br>    if current.status in ("completed", "failed", "expired", "cancelled"):<br>        break<br>    time.sleep(30)<br><br># 4. Download the results (and errors if any)<br>final = client.batches.retrieve(batch.id)<br><br>if final.output_file_id:<br>    print("📥 Downloading results.jsonl...")<br>    output = client.files.content(final.output_file_id)<br>    with open("results.jsonl", "wb") as f:<br>        f.write(output.read())<br>    print("✅ Results written to results.jsonl")<br><br>if final.error_file_id:<br>    print("🐛 Downloading errors.jsonl...")<br>    errors = client.files.content(final.error_file_id)<br>    with open("errors.jsonl", "wb") as f:<br>        f.write(errors.read())<br>    print("🐛 Errors written to errors.jsonl")<br><br>print(f"🏁 Final batch status: {final.status}")</code></pre>



<p class="wp-block-paragraph">Let&#8217;s break down the key steps:</p>



<h4 class="wp-block-heading">Upload the input file</h4>



<pre class="wp-block-code"><code class="">batch_input_file = client.files.create(<br>    file=open("requests.jsonl", "rb"),<br>    purpose="batch",<br>)</code></pre>



<p class="wp-block-paragraph">The <mark style="background-color:var(--ast-global-color-6)" class="has-inline-color">purpose=&#8221;batch&#8221;</mark> parameter tells the API that this file will be used as batch input.</p>



<h4 class="wp-block-heading">Create the batch</h4>



<pre class="wp-block-code"><code class="">batch = client.batches.create(<br>    input_file_id=batch_input_file.id,<br>    endpoint="/v1/chat/completions",<br>    completion_window="24h",<br>)</code></pre>



<p class="wp-block-paragraph">The <mark style="background-color:var(--ast-global-color-6)" class="has-inline-color">completion_window=&#8221;24h&#8221;</mark> means the batch will be stopped after 24 hours if not completed.</p>



<h4 class="wp-block-heading">Poll the batch status</h4>



<pre class="wp-block-code"><code class="">while True:<br>    current = client.batches.retrieve(batch.id)<br>    print(f"   status={current.status} counts={current.request_counts}")<br>    if current.status in ("completed", "failed", "expired", "cancelled"):<br>        break<br>    time.sleep(30)</code></pre>



<p class="wp-block-paragraph">The <mark style="background-color:var(--ast-global-color-6)" class="has-inline-color">client.batches.retrieve(batch.id)</mark> call returns the current state of the batch. The <em>request_counts</em> field gives you a breakdown of how many requests are completed, failed, or still in progress, useful for monitoring large batches.</p>



<p class="wp-block-paragraph">The possible terminal states are:</p>



<ul class="wp-block-list">
<li><mark style="background-color:var(--ast-global-color-6)" class="has-inline-color">completed</mark>: all requests have been processed successfully</li>



<li><mark style="background-color:var(--ast-global-color-6)" class="has-inline-color">failed</mark>: the batch encountered a fatal error</li>



<li><mark style="background-color:var(--ast-global-color-6)" class="has-inline-color">expired</mark>: the batch exceeded the <mark style="background-color:var(--ast-global-color-6)" class="has-inline-color">completion_window</mark> duration</li>



<li><mark style="background-color:var(--ast-global-color-6)" class="has-inline-color">cancelled</mark>: the batch was manually cancelled via the API</li>
</ul>



<p class="wp-block-paragraph">We poll every 30 seconds here, but you can adjust this interval depending on your use case. For very large batches, a longer interval (e.g., 60–120 seconds) is more appropriate.</p>



<h4 class="wp-block-heading">Download the results</h4>



<pre class="wp-block-code"><code class="">final = client.batches.retrieve(batch.id)<br><br>if final.output_file_id:<br>    output = client.files.content(final.output_file_id)<br>    with open("results.jsonl", "wb") as f:<br>        f.write(output.read())</code></pre>



<p class="wp-block-paragraph">Once the batch is complete, the <mark style="background-color:var(--ast-global-color-6)" class="has-inline-color">output_file_id</mark> field contains the ID of the results file. You download it using <mark style="background-color:var(--ast-global-color-6)" class="has-inline-color">client.files.content()</mark> which returns the raw file content.</p>



<h4 class="wp-block-heading">Download the errors (if any)</h4>



<pre class="wp-block-code"><code class="">if final.error_file_id:<br>    errors = client.files.content(final.error_file_id)<br>    with open("errors.jsonl", "wb") as f:<br>        f.write(errors.read())</code></pre>



<p class="wp-block-paragraph">If some requests in your batch failed (e.g., invalid model name, malformed input, token limit exceeded), their details will be available in a separate error file. The&nbsp;<mark style="background-color:var(--ast-global-color-6)" class="has-inline-color">error_file_id</mark>&nbsp;will be&nbsp;<mark style="background-color:var(--ast-global-color-6)" class="has-inline-color">None</mark>&nbsp;if all requests succeeded. Each line in&nbsp;<mark style="background-color:var(--ast-global-color-6)" class="has-inline-color">errors.jsonl</mark>&nbsp;contains the&nbsp;<mark style="background-color:var(--ast-global-color-6)" class="has-inline-color">custom_id</mark>&nbsp;of the failed request along with the error details, making it easy to identify and retry only the failed ones.</p>



<h3 class="wp-block-heading">Step 3: Read the Results</h3>



<p class="wp-block-paragraph">The output file (<mark style="background-color:var(--ast-global-color-6)" class="has-inline-color">results.jsonl</mark>) contains one JSON object per line. Each object includes:</p>



<ul class="wp-block-list">
<li>The <mark style="background-color:var(--ast-global-color-6)" class="has-inline-color">custom_id</mark> matching your original request</li>



<li>The full response body (same format as a synchronous <mark style="background-color:var(--ast-global-color-6)" class="has-inline-color">/v1/chat/completions</mark><mark style="background-color:var(--ast-global-color-5)" class="has-inline-color"> responses</mark>)</li>
</ul>



<p class="wp-block-paragraph">Here&#8217;s what a result looks like:</p>



<pre class="wp-block-code"><code class="">{<br>  "id": "964e007472a557240221910ba143bb03",<br>  "custom_id": "request-1",<br>  "response": {<br>    "status_code": 200,<br>    "body": {<br>      "id": "chatcmpl-9879ebff777795a3",<br>      "choices": [<br>        {<br>          "index": 0,<br>          "message": {<br>            "role": "assistant",<br>            "content": "Hamlet, the Prince of Denmark, is driven to madness and vengeance after learning that his father was murdered by his uncle Claudius..."<br>          },<br>          "finish_reason": "stop"<br>        }<br>      ],<br>      "model": "gpt-oss-20b",<br>      "usage": {<br>        "prompt_tokens": 78,<br>        "completion_tokens": 297,<br>        "total_tokens": 375<br>      }<br>    }<br>  },<br>  "error": null<br>}</code></pre>



<p class="wp-block-paragraph">If some requests fail, the&nbsp;<mark style="background-color:var(--ast-global-color-6)" class="has-inline-color">errors.jsonl</mark>&nbsp;file will contain details about what went wrong for each failed request.</p>



<h3 class="wp-block-heading">Other Examples Available</h3>



<p class="wp-block-paragraph">The <a href="https://docs.ovhcloud.com/fr/guides/public-cloud/ai-machine-learning/ai-endpoints-batch-mode" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">AI Endpoints &#8211; Batch mode guide</a> also contains examples in:</p>



<ul class="wp-block-list">
<li><strong>JavaScript</strong>: using the OpenAI Node.js SDK</li>



<li><strong>Pure HTTP requests</strong>: using <mark style="background-color:var(--ast-global-color-6)" class="has-inline-color">curl</mark> without any framework, if you prefer a language-agnostic approach</li>
</ul>



<p class="wp-block-paragraph">These examples demonstrate that you can use the Batch API from any language or tool that can make HTTP requests, since it follows the standard OpenAI-compatible API format.</p>



<h3 class="wp-block-heading">Conclusion</h3>



<p class="wp-block-paragraph">Batch mode is a powerful feature when you need to process large volumes of repetitive, non time-sensitive inference requests, without worrying about rate limits or timeout issues. Upload your file, submit the batch, and come back later for the results, it&#8217;s as simple a solution as that.</p>



<p class="wp-block-paragraph">The OpenAI-compatible API makes it straightforward to integrate into existing workflows, and with examples available in Python, JavaScript, and raw HTTP, you can use whichever approach fits your stack best.</p>



<p class="wp-block-paragraph">You have a dedicated Discord channel (#ai-endpoints) on our <a href="https://discord.gg/ovhcloud" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Discord server</a>, see you there!</p>



<p class="wp-block-paragraph"><em>For more info on AI Endpoints, find our&nbsp;</em><a href="https://blog.ovhcloud.com/author/stephane-philippart/" data-wpel-link="internal"><em>previous blog posts</em></a><em>.</em></p>



<p class="wp-block-paragraph"><em>Find the full code example in the GitHub repository:&nbsp;</em><a href="https://github.com/ovh/public-cloud-examples/tree/main/ai/ai-endpoints/batch-mode" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer"><em>public-cloud-examples/ai/ai-endpoints/batch-mode</em></a><em>.</em></p>
<img loading="lazy" decoding="async" src="//blog.ovhcloud.com/wp-content/plugins/matomo/app/matomo.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Fblog.ovhcloud.com%2Fovhcloud-ai-endpoints-batch-mode%2F&amp;action_name=How%20to%20process%20large%20AI%20requests%20with%20Batch%20Mode%20on%20OVHcloud%20AI%20Endpoints&amp;urlref=https%3A%2F%2Fblog.ovhcloud.com%2Ffeed%2F" style="border:0;width:0;height:0" width="0" height="0" alt="" />]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Devoxx France 2026: feedback and highlights</title>
		<link>https://blog.ovhcloud.com/devoxx-france-2026/</link>
		
		<dc:creator><![CDATA[Aurélie Vache]]></dc:creator>
		<pubDate>Tue, 19 May 2026 05:45:45 +0000</pubDate>
				<category><![CDATA[OVHcloud Engineering]]></category>
		<category><![CDATA[Tranches de Tech & Co — Tech bites]]></category>
		<category><![CDATA[Devoxx France]]></category>
		<category><![CDATA[OVHcloud Events]]></category>
		<guid isPermaLink="false">https://blog.ovhcloud.com/?p=31573</guid>

					<description><![CDATA[From April 22 to 24, 2026, the Devoxx France conference took place at the Palais des Congrès in Paris. Aurélie Vache and Stéphane Philippart attended as dit 19 other OVHcloud employees. In this blog post, they share their thoughts and feedback from this 14th edition of Devoxx France. Devoxx France 2026: The AI Edition Devoxx [&#8230;]<img src="//blog.ovhcloud.com/wp-content/plugins/matomo/app/matomo.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Fblog.ovhcloud.com%2Fdevoxx-france-2026%2F&amp;action_name=Devoxx%20France%202026%3A%20feedback%20and%20highlights&amp;urlref=https%3A%2F%2Fblog.ovhcloud.com%2Ffeed%2F" style="border:0;width:0;height:0" width="0" height="0" alt="" />]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">From April 22 to 24, 2026, the <a href="https://www.devoxx.fr/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Devoxx France</a> conference took place at the Palais des Congrès in Paris.</p>



<p class="wp-block-paragraph">Aurélie Vache and Stéphane Philippart attended as dit 19 other OVHcloud employees. In this blog post, they share their thoughts and feedback from this 14th edition of Devoxx France.</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-7387b849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="818" src="https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-1024x818.png" alt="Devoxx France 2026" class="wp-image-31605" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-1024x818.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-300x240.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-768x614.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/image.png 1274w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="768" height="1024" src="https://blog.ovhcloud.com/wp-content/uploads/2026/05/HGv79kIXcAAJ2DT-768x1024.jpg" alt="Devoxx France 2026" class="wp-image-31637" style="aspect-ratio:0.7500000262479178;width:271px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/05/HGv79kIXcAAJ2DT-768x1024.jpg 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/HGv79kIXcAAJ2DT-225x300.jpg 225w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/HGv79kIXcAAJ2DT-1152x1536.jpg 1152w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/HGv79kIXcAAJ2DT.jpg 1536w" sizes="auto, (max-width: 768px) 100vw, 768px" /></figure>
</div>
</div>



<h3 class="wp-block-heading"><strong>Devoxx France 2026: The AI Edition</strong></h3>



<p class="wp-block-paragraph"><strong>Devoxx France 2026</strong> is one of Europe’s biggest independent developer conferences. Formerly focused centrally on Java, over the past few years, the conference has also focused on Architecture, Data &amp; Analytics, Development practices, Front-end &amp; UX, Java/JVM, Security &amp; Privacy, Cloud and non-technical talks about people and culture.</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="576" src="https://blog.ovhcloud.com/wp-content/uploads/2026/05/1777014717443-1024x576.jpg" alt="Devoxx France 2026" class="wp-image-31600" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/05/1777014717443-1024x576.jpg 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/1777014717443-300x169.jpg 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/1777014717443-768x432.jpg 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/1777014717443-1536x864.jpg 1536w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/1777014717443.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Key figures from the 2026 edition:</p>



<ul class="wp-block-list">
<li>4,980 attendees (The largest attendance on record)</li>



<li>307 speakers</li>



<li>259 talks</li>



<li>70+ sponsors</li>
</ul>



<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="576" src="https://blog.ovhcloud.com/wp-content/uploads/2026/05/1777046754791-1024x576.jpg" alt="Devoxx France 2026" class="wp-image-31610" style="aspect-ratio:1.7777426704463952;width:642px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/05/1777046754791-1024x576.jpg 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/1777046754791-300x169.jpg 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/1777046754791-768x432.jpg 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/1777046754791-1536x864.jpg 1536w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/1777046754791.jpg 2000w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">As might be expected, AI was the central theme of this edition, with a large number of the talks focused on AI topics. Indeed, there were 65 sessions out of 259 about AI and Agentic Systems, the most discussed topic!</p>



<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="843" src="https://blog.ovhcloud.com/wp-content/uploads/2026/05/Capture-decran-2026-05-06-a-11.26.15-1024x843.png" alt="The AI talks at Devoxx France 2026" class="wp-image-31621" style="aspect-ratio:1.2147060091174124;width:630px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/05/Capture-decran-2026-05-06-a-11.26.15-1024x843.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/Capture-decran-2026-05-06-a-11.26.15-300x247.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/Capture-decran-2026-05-06-a-11.26.15-768x632.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/Capture-decran-2026-05-06-a-11.26.15-1536x1265.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/Capture-decran-2026-05-06-a-11.26.15.png 1858w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Notably this year, and perhaps even more than in previous years, we could clearly see attendees arriving early to secure seats for their favorite talks. Even so, there ended up being a lot of disappointment – especially on the first day – as several sessions were already at full capacity minutes before they even started.</p>



<p class="wp-block-paragraph">This was particularly true for sessions featuring multiple OVHcloud speakers 💪.</p>



<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="768" height="1024" src="https://blog.ovhcloud.com/wp-content/uploads/2026/05/PXL_20260422_083446173-768x1024.jpg" alt="Full room at Devoxx France 2026" class="wp-image-31596" style="width:335px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/05/PXL_20260422_083446173-768x1024.jpg 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/PXL_20260422_083446173-225x300.jpg 225w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/PXL_20260422_083446173-1152x1536.jpg 1152w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/PXL_20260422_083446173-1536x2048.jpg 1536w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/PXL_20260422_083446173-scaled.jpg 1920w" sizes="auto, (max-width: 768px) 100vw, 768px" /></figure>



<h3 class="wp-block-heading">Keynotes</h3>



<p class="wp-block-paragraph">The keynote sessions (“plenary sessions”) were also heavily centered on <strong>Artificial Intelligence</strong>, but with a notably broader lens beyond pure technology. Rather than focusing only on tools or LLM implementation, the talks explored AI through the intersecting dimensions of <strong>power, governance, cybersecurity, human transformation, and geopolitics</strong>.</p>



<p class="wp-block-paragraph">Some highlights from the keynotes:</p>



<ul class="wp-block-list">
<li><em>“In 50 years, AI has multiplied its power, along with the challenges of governance and cybersecurity”</em> &#8211; Laurence Devillers (<a href="https://x.com/lau_devil" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">@lau_devil</a>)</li>
</ul>



<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="576" src="https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-3-1024x576.png" alt="Laurence Devillers at Devoxx France 2026" class="wp-image-31644" style="aspect-ratio:1.7777426704463952;width:527px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-3-1024x576.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-3-300x169.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-3-768x432.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-3.png 1200w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<ul class="wp-block-list">
<li>Jean-Gabriel Ganascia (<a href="https://x.com/Quecalcoatle" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">@Quecalcoatle</a>) questioned the promise of AI as a force that could free humans from effort, raising deeper reflections on what this means for our relationship with work and meaning.</li>
</ul>



<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="768" src="https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-1-1024x768.png" alt="Jean-Gabriel Ganascia at Devoxx France 2026" class="wp-image-31640" style="width:536px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-1-1024x768.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-1-300x225.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-1-768x576.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-1-1536x1152.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-1.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<ul class="wp-block-list">
<li>Loup Cellard (<a href="https://x.com/CellardLoup" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">@CellardLoup</a>) examined the implications of foreign investments in AI infrastructure, shedding light on the geopolitical and strategic stakes behind these technologies.</li>
</ul>



<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="768" height="1024" src="https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-2-768x1024.png" alt="Loup Cellard at Devoxx France 2026" class="wp-image-31641" style="aspect-ratio:0.7500000158067569;width:258px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-2-768x1024.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-2-225x300.png 225w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-2-1152x1536.png 1152w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-2.png 1536w" sizes="auto, (max-width: 768px) 100vw, 768px" /></figure>



<h3 class="wp-block-heading"><strong>Meet &amp; Greet</strong></h3>



<p class="wp-block-paragraph">Devoxx France consists of three days of conferences, sponsor booths to discover, and Thursday evening’s unmissable annual tradition: the Meet &amp; Greet.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="576" src="https://blog.ovhcloud.com/wp-content/uploads/2026/05/1776962145782-1024x576.jpg" alt="Meet and Greet at Devoxx France 2026" class="wp-image-31607" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/05/1776962145782-1024x576.jpg 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/1776962145782-300x169.jpg 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/1776962145782-768x432.jpg 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/1776962145782-1536x864.jpg 1536w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/1776962145782.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Thursday night’s <strong>Meet &amp; Greet</strong> is a major community event built around networking and social sessions like <strong>BOFs (Birds of a Feather)</strong> and seed networking. It’s one of the signature traditions of the conference, beyond talks and sponsor booths.</p>



<p class="wp-block-paragraph">This evening event is free, open to the public with pre-registration, and offers a genuine moment for connection, sharing, and conversation over a drink and a plate of charcuterie and cheese 😇.</p>



<p class="wp-block-paragraph">It’s also the opportunity to discover the fun of “Voxx Jam”, the community-party, music-oriented side of Devoxx/Voxxed culture 🎸.</p>



<h3 class="wp-block-heading">OVHcloud Presence</h3>



<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="768" height="1024" src="https://blog.ovhcloud.com/wp-content/uploads/2026/05/signal-2026-04-22-08-23-06-896-41-768x1024.jpg" alt="OVHcloud booth at Devoxx France 2026" class="wp-image-31574" style="aspect-ratio:0.7499999738121478;width:360px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/05/signal-2026-04-22-08-23-06-896-41-768x1024.jpg 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/signal-2026-04-22-08-23-06-896-41-225x300.jpg 225w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/signal-2026-04-22-08-23-06-896-41-1152x1536.jpg 1152w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/signal-2026-04-22-08-23-06-896-41.jpg 1536w" sizes="auto, (max-width: 768px) 100vw, 768px" /></figure>



<p class="wp-block-paragraph">At the OVHcloud booth, we were a team of 8 speakers and 11 colleagues from Tech, HR, and Sales, and their dynamic presence really made a difference. Engaging in topics like AI, Public Cloud, Domain Names, Observability, Quantum technologies, and more, we had many insightful conversations throughout the event.</p>



<p class="wp-block-paragraph">We also discussed AI topics at the booth, which was of course the main theme of the conference, but not the only one.</p>



<p class="wp-block-paragraph">A lot of conversations also focused on sovereignty. Three years ago, people were saying: <em>“I don’t care about sovereignty, I’ll just choose the cheapest option.”</em> This year, the tone has clearly changed, <em>“How can we use your sovereign products?”</em></p>



<p class="wp-block-paragraph"><strong>There is a real shift happening,</strong> and once again, being present at events like this is essential to witness and take part in these evolving discussions.</p>



<p class="wp-block-paragraph">It was truly a top-tier booth experience for all of us💪.</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-7387b849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="768" height="1024" src="https://blog.ovhcloud.com/wp-content/uploads/2026/05/signal-2026-04-24-12-34-31-442-768x1024.jpg" alt="OVHcloud booth at Devoxx France 2026" class="wp-image-31666" style="width:305px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/05/signal-2026-04-24-12-34-31-442-768x1024.jpg 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/signal-2026-04-24-12-34-31-442-225x300.jpg 225w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/signal-2026-04-24-12-34-31-442-1152x1536.jpg 1152w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/signal-2026-04-24-12-34-31-442.jpg 1536w" sizes="auto, (max-width: 768px) 100vw, 768px" /></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="768" src="https://blog.ovhcloud.com/wp-content/uploads/2026/05/PXL_20260423_075255077.MP1_-1024x768.jpg" alt="OVHcloud booth at Devoxx France 2026" class="wp-image-31576" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/05/PXL_20260423_075255077.MP1_-1024x768.jpg 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/PXL_20260423_075255077.MP1_-300x225.jpg 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/PXL_20260423_075255077.MP1_-768x576.jpg 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/PXL_20260423_075255077.MP1_-1536x1152.jpg 1536w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/PXL_20260423_075255077.MP1_-2048x1536.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>
</div>



<p class="wp-block-paragraph">Of course, the goal of our booth was so attendees could discuss with our teams, but also so we could engage them through our very own video game, “Gaming Camp: Beat Cloud Villains!”. The specially designed video game’s description: <em>“Join the fight against the villains of the cloud. Take on Hidden Cost, Jailor Stack, and Autonomous Zero, and prove yourself as a true Guardian of the Cloud.”</em></p>



<p class="wp-block-paragraph">Players were welcomed to step into a two-player fighting game inspired by the style of <em>Street Fighter</em>, where strategy and skill are your best weapons. Game on!</p>



<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="768" src="https://blog.ovhcloud.com/wp-content/uploads/2026/05/signal-2026-04-22-10-15-34-094-1024x768.jpg" alt="Gaming Camp cloud villains game at the OVHcloud booth" class="wp-image-31575" style="width:644px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/05/signal-2026-04-22-10-15-34-094-1024x768.jpg 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/signal-2026-04-22-10-15-34-094-300x225.jpg 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/signal-2026-04-22-10-15-34-094-768x576.jpg 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/signal-2026-04-22-10-15-34-094-1536x1152.jpg 1536w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/signal-2026-04-22-10-15-34-094.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">We also wanted to say a word about the success of our Schrödinger cat (Quantum) swag – socks, keychains, badges – they were a huge hit, and often sparked great conversations throughout the event.</p>



<h3 class="wp-block-heading"><strong>OVHcloud Speakers &amp; Talks</strong></h3>



<p class="wp-block-paragraph">Getting accepted to Devoxx France is not easy, so we were proud to be included with 8 speakers and 11 talks! <strong>We were the most represented company</strong> <strong>in terms of talks at Devoxx France 2026,</strong> and ranked in the top 3 by number of speakers 💪.</p>



<p class="wp-block-paragraph">Congratulations to Benoit Masson, Fanny Bouton, Mathieu Busquet, Sébastien Ferrer, Théo Bougé, and Héla Ben Khalfallah, Stéphane Philippart &amp; Aurélie Vache for their talks 👏. A large number of attendees joined, and the sessions were all very high quality.</p>



<p class="wp-block-paragraph">Find here the topics of their talks:</p>



<h4 class="wp-block-heading">&#8220;Question pour un cluster Kubernetes : Quiz sur Kubernetes &amp; ses concepts&#8221;</h4>



<p class="wp-block-paragraph"><em>🏴󠁧󠁢󠁥󠁮󠁧󠁿 &#8220;The Ultimate Kubernetes Challenge: An Interactive Trivia Game on concepts, components, usage&#8230;&#8221;</em></p>



<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="768" src="https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-12-1024x768.png" alt="Aurélie Vache speaking at Devoxx France 2026" class="wp-image-31824" style="width:565px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-12-1024x768.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-12-300x225.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-12-768x576.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-12.png 1200w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">🎤 Speaker: Aurélie Vache</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">&#8220;Kubernetes est devenu le standard de facto pour déployer et exploiter des applications conteneurisées. Nous l&#8217;utilisons, ainsi que son ecosystème, au quotidien, mais le connaît-on si bien ?<br><br>Tout au long de ce talk, avec un mix de quiz et de démos en live, vous découvrirez (ou redécouvrirez) les concepts clés de Kubernetes (pods, secrets, services, namespaces&#8230;), les composants interne mais aussi les bonnes pratiques d&#8217;utilisation.<br><br>Un format original avec un quiz, du fun et des démos, qui conviendra aussi bien aux débutants qu’aux confirmés, afin d&#8217;apprendre, réviser et challenger vos connaissances du merveilleux monde de Kubernetes et de son écosystème, tout en s&#8217;amusant.<br><br>Soyez là ou le plus rapide pour tenter de gagner des cadeaux !&#8221;</p>
</blockquote>



<p class="wp-block-paragraph"></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>🏴󠁧󠁢󠁥󠁮󠁧󠁿 Kubernetes has become the de facto standard for deploying and operating containerized applications. We use it, as well as its ecosystem, on a daily basis, but do we know them as well as we think we do?<br><br>With a mix of quiz and live demos, come learn and/or improve your knowledge. You will discover (or rediscover) the key concepts of Kubernetes (pods, secrets, services&#8230;), internal components but also best practices.<br><br>In this fun and dynamic talk, come compete throughout the quiz and explore the wonderful world of Kubernetes.<br>Icing on the cake: the first will win some swags.</em></p>
</blockquote>



<p class="wp-block-paragraph">🎥 <a href="https://www.youtube.com/watch?v=mS_Nz44cXlM" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Replay</a>.</p>



<h4 class="wp-block-heading">&#8220;QR Codes : suivez les points sans vous perdre !&#8221;</h4>



<p class="wp-block-paragraph"><em>🏴󠁧󠁢󠁥󠁮󠁧󠁿 &#8220;QR codes: follow the dots without getting lost!</em>&#8220;</p>



<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="717" height="690" src="https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-11.png" alt="Benoit Masson speaking at Devoxx France 2026" class="wp-image-31822" style="width:389px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-11.png 717w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-11-300x289.png 300w" sizes="auto, (max-width: 717px) 100vw, 717px" /></figure>



<p class="wp-block-paragraph">🎤 Speaker: Benoît Masson &amp; Sébastien Chedor (OnePoint)</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">&#8220;Les QR Codes, tout le monde connaît et les utilise régulièrement. Mais savez-vous vraiment comment ils fonctionnent, pourquoi c&#8217;est aussi rapide et fiable, même avec une caméra de faible qualité ou un code en partie caché ou détérioré ?<br><br>Nous vous proposons de coder ensemble un lecteur de QR Codes, avec un minimum d&#8217;outils :<br>* capture et analyse de la vidéo issue de la webcam pour détecter la position du code, à l&#8217;aide d&#8217;OpenCV<br>* extraction et décodage du contenu, avec correction d&#8217;erreur grâce à l&#8217;algorithme de Reed-Solomon.<br><br>À la fin de cette session, vous devriez être capables de décoder un QR Code à l&#8217;oeil nu 🕵️ (et un brouillon…)&#8221;.</p>
</blockquote>



<p class="wp-block-paragraph"></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>🏴󠁧󠁢󠁥󠁮󠁧󠁿 <em>“Everyone knows QR codes and uses them regularly. But do you really know how they work, and why they are so fast and reliable, even with a low-quality camera or a partially hidden or damaged code?</em></em><br><br><em>We propose coding a QR code reader together, using a minimum number of tools:</em><br>* <em>capturing and analysing webcam video to detect the position of the code, using OpenCV</em><br>* <em>extracting and decoding the content, with error correction using the Reed-Solomon algorithm</em><br><br><em>By the end of this session, you should be able to decode a QR code with the naked eye 🕵️— and a rough sheet of paper…”</em></p>
</blockquote>



<p class="wp-block-paragraph">🎥 <a href="https://www.youtube.com/watch?v=iSebbzNcojU" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Replay</a>.</p>



<h4 class="wp-block-heading">&#8220;Noms de domaines : la grande histoire des petites extensions&#8221;</h4>



<p class="wp-block-paragraph">🏴󠁧󠁢󠁥󠁮󠁧󠁿 <em><em>“Domain names: the big story behind small extensions”</em></em></p>



<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="626" src="https://blog.ovhcloud.com/wp-content/uploads/2026/05/Devoxx-2026-Benoit-Theo-1024x626.jpg" alt="Benoit Masson and Theo Bougé speaking at Devoxx France 2026" class="wp-image-31799" style="aspect-ratio:1.6357688113413305;width:548px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/05/Devoxx-2026-Benoit-Theo-1024x626.jpg 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/Devoxx-2026-Benoit-Theo-300x183.jpg 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/Devoxx-2026-Benoit-Theo-768x469.jpg 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/Devoxx-2026-Benoit-Theo-1536x939.jpg 1536w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/Devoxx-2026-Benoit-Theo.jpg 1800w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">🎤 Speakers: Benoît Masson &amp; Theo Bougé</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">&#8220;Derrière les quelques lettres qui suivent un point (.com, .fr, .ai…) se cache un univers riche de stratégies techniques, d’enjeux géopolitiques et de batailles commerciales.<br><br>À l’approche du nouveau round de l’ICANN prévu en 2026 qui va autoriser de nouvelles extensions, il est temps de revenir sur les fondations techniques du DNS, ainsi que sur les grands épisodes de cette aventure méconnue. Des TLD historiques aux extensions détournées, des dramas autour du .web aux ambitions du Web3, nous explorerons l’évolution d’un système devenu central dans les logiques de souveraineté numérique et d’innovation commerciale.<br><br>Une plongée dans les coulisses d’un Internet en perpétuelle transformation.&#8221;</p>
</blockquote>



<p class="wp-block-paragraph"></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>🏴󠁧󠁢󠁥󠁮󠁧󠁿 “Behind the few letters that follow a dot — .com, .fr, .ai and others — lies a rich world of technical strategies, geopolitical issues and commercial battles.</em><br><br><em>As the new ICANN round planned for 2026 approaches, which will authorise new extensions, it is time to revisit the technical foundations of DNS, as well as the major episodes in this little-known story. From historic TLDs to repurposed extensions, from the drama around .web to the ambitions of Web3, we will explore the evolution of a system that has become central to digital sovereignty and commercial innovation.</em><br><br><em>A deep dive behind the scenes of an Internet in constant transformation.”</em></p>
</blockquote>



<p class="wp-block-paragraph">🎥 <a href="https://www.youtube.com/watch?v=FZj6VEnxsRI" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Replay</a>.</p>



<h4 class="wp-block-heading">&#8220;Informatique quantique, ce coup-ci on vous dit tout !&#8221;</h4>



<p class="wp-block-paragraph">🏴󠁧󠁢󠁥󠁮󠁧󠁿 <em><em>“Quantum computing: this time, we tell you everything!”</em></em></p>



<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="768" src="https://blog.ovhcloud.com/wp-content/uploads/2026/05/signal-2026-04-23-13-35-06-078-1024x768.jpg" alt="Fanny Bouton speaking at Devoxx France 2026" class="wp-image-31802" style="width:496px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/05/signal-2026-04-23-13-35-06-078-1024x768.jpg 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/signal-2026-04-23-13-35-06-078-300x225.jpg 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/signal-2026-04-23-13-35-06-078-768x576.jpg 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/signal-2026-04-23-13-35-06-078-1536x1152.jpg 1536w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/signal-2026-04-23-13-35-06-078.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">🎤 Speaker: Fanny Bouton, Olivier Ezrati (Quantum Energy Initiative) &amp; Guillaume Schurck (Alice &amp; Bob)</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">&#8220;<strong>Informatique quantique pour développeurs : comprendre, coder, passer à l’échelle</strong><br><br>L’informatique quantique sort du laboratoire et devient progressivement accessible aux développeurs via des SDK open source, des notebooks, des simulateurs et des QPU disponibles dans le cloud. En 2026, la question n’est plus <em>« qu’est-ce que le quantique ? »</em> mais <em>« comment un développeur peut-il s’en emparer concrètement ? »</em><br><br>Nous commencerons par poser les bases essentielles pour comprendre le modèle de calcul quantique : qubit, superposition, intrication, et ce que ces concepts impliquent pour un développeur.<br>Nous passerons ensuite au <strong>code</strong> : écrire et exécuter des circuits quantiques, utiliser des SDK modernes, travailler dans des notebooks, tester sur simulateur puis sur de vrais QPU. Vous verrez à quoi ressemble un workflow quantique aujourd’hui.<br><br>Enfin, nous aborderons les <strong>cas d’usage concrets</strong>, illustrés par le retour d’expérience d’un grand compte : ce qui fonctionne déjà, les limites actuelles, et comment les équipes tech expérimentent le quantique de manière réaliste et industrielle.<br><br>Une session technique pensée pour les développeurs qui veulent anticiper la prochaine évolution majeure du calcul.&#8221;</p>
</blockquote>



<p class="wp-block-paragraph"></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>🏴󠁧󠁢󠁥󠁮󠁧󠁿 “Quantum computing for developers: understand, code and scale up.</em><br><em>Quantum computing is moving out of the laboratory and becoming progressively accessible to developers through open source SDKs, notebooks, simulators and QPUs available in the cloud. In 2026, the question is no longer ‘What is quantum?’ but ‘How can developers make practical use of it?’</em><br><br><em>We will begin by laying out the essential foundations needed to understand the quantum computing model: qubits, superposition, entanglement, and what these concepts mean for developers.</em><br><br><em>We will then move on to code: writing and running quantum circuits, using modern SDKs, working in notebooks, testing on simulators and then on real QPUs. You will see what a quantum workflow looks like today.</em><br><br><em>Finally, we will address concrete use cases, illustrated by the experience of a large account: what already works, the current limitations, and how tech teams are experimenting with quantum computing in a realistic and industrial way.</em><br><br><em>A technical session designed for developers who want to anticipate the next major evolution in computing.”</em></p>
</blockquote>



<p class="wp-block-paragraph">🎥 <a href="https://www.youtube.com/watch?v=zyB2a3rwhYw" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Replay</a>.</p>



<h4 class="wp-block-heading">&#8220;Développer avec l&#8217;IA : et si c&#8217;était aussi simple qu&#8217;ajouter une librairie ?&#8221;</h4>



<p class="wp-block-paragraph"><em>🏴󠁧󠁢󠁥󠁮󠁧󠁿 “Developing with AI: what if it were as simple as adding a library?”</em></p>



<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="576" src="https://blog.ovhcloud.com/wp-content/uploads/2026/05/signal-2026-04-22-13-37-09-682-1024x576.jpg" alt="Stéphane Philippart and Mathieu Busquet speaking at Devoxx France 2026" class="wp-image-31807" style="aspect-ratio:1.7777426704463952;width:600px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/05/signal-2026-04-22-13-37-09-682-1024x576.jpg 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/signal-2026-04-22-13-37-09-682-300x169.jpg 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/signal-2026-04-22-13-37-09-682-768x432.jpg 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/signal-2026-04-22-13-37-09-682-1536x864.jpg 1536w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/signal-2026-04-22-13-37-09-682.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">🎤 Speakers: Mathieu Busquet &amp; Stéphane Philippart</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">&#8220;Intégrer de l&#8217;intelligence artificielle (IA) dans nos développements peut nous paraître plus complexe que de les utiliser dans notre quotidien.<br><br>Dois-je apprendre un nouveau langage ou une nouvelle stack ?<br>Durant ce workshop nous vous proposons de vous donner tous les éléments pour intégrer l&#8217;IA sans quitter votre langage de prédilection : Java 😍. Ce sera l&#8217;occasion de découvrir les Frameworks du moments : LangChain4j, Quarkus, …<br><br>Nous vous invitons à découvrir toutes les facettes d&#8217;un chatbot avec l&#8217;IA générative (customiser un prompt, rajouter vos données (RAG), appeler des outils locaux ou distants (MCP) et créer des agents) mais aussi parce que l’IA ne se limite pas aux chatbots : faire de la transcription, créer de l&#8217;audio ou même faire un traducteur.<br><br>Et, toujours pour vous simplifier la vie, venez juste avec votre ordinateur et un navigateur Internet, on se charge du reste pour vous construire un environnement de développement aux petits oignons grâce aux CDE.<br><br>À la suite de ce talk vous repartirez avec une boîte à outils vous permettant d&#8217;intégrer simplement la puissance des modèles d&#8217;IA au sein de vos développements de tous les jours.&#8221;</p>
</blockquote>



<p class="wp-block-paragraph"></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>🏴󠁧󠁢󠁥󠁮󠁧󠁿 “Integrating artificial intelligence into our developments can seem more complex than using it in our daily lives.</em><br><br><em>Do I need to learn a new language or a new stack?</em><br><br><em>During this workshop, we will give you all the tools you need to integrate AI without leaving your favourite language: Java 😍. It will be an opportunity to discover some of today’s key frameworks, including LangChain4j and Quarkus.</em><br><br><em>We invite you to explore all the facets of a chatbot with generative AI — customising a prompt, adding your own data with RAG, calling local or remote tools with MCP, and creating agents — but also to see that AI is not limited to chatbots: it can also be used for transcription, audio creation and even translation.</em><br><br><em>And to make your life even easier, just bring your computer and an internet browser. We will take care of the rest, building a polished development environment for you thanks to CDEs.</em><br><br><em>After this talk, you will leave with a toolkit that will allow you to integrate the power of AI models into your everyday development work.”</em></p>
</blockquote>



<h4 class="wp-block-heading">&#8220;Détectives de la prod : résoudre l’enquête avant le crash&#8221;</h4>



<p class="wp-block-paragraph"><em>🏴󠁧󠁢󠁥󠁮󠁧󠁿 “Production detectives: solve the case before the crash”</em></p>



<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="768" src="https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-7-1024x768.png" alt="Sébastien Ferrer speaking at Devoxx France 2026" class="wp-image-31809" style="width:590px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-7-1024x768.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-7-300x225.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-7-768x576.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-7-1536x1152.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-7.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">🎤 Speaker: Sébastien Ferrer</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">&#8220;Saviez-vous que, derrière les coulisses de vos outils de travail, se cachent des équipes prêtes à intervenir à tout moment ?<br><br>Ces équipes, souvent discrètes mais essentielles, gèrent des dizaines de projets avec des effectifs réduits. Mais quand une alerte survient, elles doivent réagir vite. Très vite. Comment réussir à diagnostiquer et résoudre un incident en pleine production, sans perdre une précieuse seconde ?<br><br>Dans ce talk je vous emmène au cœur de l’action, où je partage notre méthodologie pour transformer chaque crise en une enquête méthodique et efficace. Nous explorerons comment des outils bien pensés, une organisation affûtée, et un soupçon d’intuition transforment la gestion d’incidents en une véritable enquête… parfois aussi palpitante qu’une partie de Cluedo.<br><br>Au programme : bonnes pratiques de troubleshooting, logging et monitoring, pour que vous repartiez avec des clés concrètes pour dompter les incidents dans vos propres projets.<br><br>Vous verrez qu’en production, chaque problème cache une histoire… à résoudre en équipe !&#8221;</p>
</blockquote>



<p class="wp-block-paragraph"></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>🏴󠁧󠁢󠁥󠁮󠁧󠁿 “Did you know that behind the scenes of your work tools, there are teams ready to intervene at any moment?</em><br><br><em>These teams, often discreet but essential, manage dozens of projects with limited staff. But when an alert occurs, they need to react quickly. Very quickly. How can they diagnose and resolve a production incident without losing precious seconds?</em><br><br><em>In this talk, I will take you into the heart of the action, where I share our methodology for turning every crisis into a structured and efficient investigation. We will explore how well-designed tools, a well-honed organisation and a touch of intuition can transform incident management into a real investigation — sometimes as thrilling as a game of Cluedo.</em><br><br><em>On the agenda: troubleshooting best practices, logging and monitoring, so you leave with concrete keys to taming incidents in your own projects.</em><br><br><em>You will see that in production, every problem hides a story… one to solve as a team!”</em></p>
</blockquote>



<p class="wp-block-paragraph">🎥 <a href="https://www.youtube.com/watch?v=sOQ6oCv0mOU" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Replay</a>.</p>



<h4 class="wp-block-heading">&#8220;Et si écrire du SQL redevenait cool ?&#8221;</h4>



<p class="wp-block-paragraph"><em>🏴󠁧󠁢󠁥󠁮󠁧󠁿 “What if writing SQL became cool again?”</em></p>



<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="800" height="600" src="https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-10.png" alt="Sébastien Ferrer speaking at Devoxx France 2026" class="wp-image-31820" style="width:482px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-10.png 800w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-10-300x225.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-10-768x576.png 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /></figure>



<p class="wp-block-paragraph">🎤 Speaker: Sébastien Ferrer</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">&#8220;On nous l’a répété maintes fois : “écrire du SQL dans du code source, c’est dépassé”.<br><br>Les ORMs sont partout. Ils ont facilité notre quotidien en nous permettant de manipuler nos bases de données sans nous soucier du SQL. Mais parfois, on aimerait un peu plus de contrôle, un peu plus de performance… sans pour autant revenir aux longues heures de mapping manuel et de requêtes préparées à la main.<br><br>SQLC offre une autre approche. Initialement conçu pour du Go, langage dans lequel cette technologie sera présentée dans ce talk, il permet d’écrire des requêtes SQL tout en générant du code type-safe et performant, sans ajouter de lourdeur ni de dépendances. Pas question ici de rejeter les ORMs, mais plutôt d’explorer un nouvel outil qui vient enrichir notre palette de solutions.<br><br>Dans ce talk, nous verrons comment SQLC fonctionne, dans quels cas il brille, et comment il s’intègre parfaitement dans un stack moderne. Vous aimez le SQL ? Vous voulez juste un peu plus de maîtrise sur vos requêtes ? Venez, vous risquez d’être agréablement surpris.&#8221;</p>
</blockquote>



<p class="wp-block-paragraph"></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>🏴󠁧󠁢󠁥󠁮󠁧󠁿 “We have been told many times: ‘Writing SQL in source code is outdated.’</em><br><br><em>ORMs are everywhere. They have made our daily lives easier by allowing us to manipulate databases without worrying about SQL. But sometimes, we would like a little more control, a little more performance — without going back to long hours of manual mapping and hand-written prepared queries.</em><br><br><em>SQLC offers another approach. Initially designed for Go, the language in which this technology will be presented during the talk, it allows you to write SQL queries while generating type-safe and high-performance code, without adding heaviness or dependencies. The goal here is not to reject ORMs, but rather to explore a new tool that enriches our range of solutions.</em><br><br><em>In this talk, we will see how SQLC works, where it shines, and how it integrates perfectly into a modern stack. Do you like SQL? Do you simply want more control over your queries? Come along — you may be pleasantly surprised.”</em></p>
</blockquote>



<p class="wp-block-paragraph">🎥 <a href="https://www.youtube.com/watch?v=H_macw0wqJ0" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Replay</a>.</p>



<h4 class="wp-block-heading">&#8220;🤖 Apprendre à notre IA à &#8230; apprendre 🧠&#8221;</h4>



<p class="wp-block-paragraph"><em>🏴󠁧󠁢󠁥󠁮󠁧󠁿 “🤖 Teaching our AI to… learn 🧠”</em></p>



<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="769" src="https://blog.ovhcloud.com/wp-content/uploads/2026/05/42793-1024x769.jpg" alt="Stéphane Philippart speaking at Devoxx France 2026" class="wp-image-31816" style="aspect-ratio:1.3315973153489673;width:584px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/05/42793-1024x769.jpg 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/42793-300x225.jpg 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/42793-768x576.jpg 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/42793-1536x1153.jpg 1536w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/42793.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">🎤 Speaker: Stéphane Philippart</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">&#8220;RAG, MCP, tooling, function calling, agents, fine tuning, training, …<br>Que de termes barbares mais qui ont tous le même objectif : faire en sorte que le modèle d&#8217;intelligence artificielle que vous utilisez réponde correctement à vos questions et attentes 😅.<br>Et pour ça il va falloir ajouter de la connaissance, des données (privée ou publiques, …).<br><br>Durant ce talk je vous propose d&#8217;y voir un peu plus clair dans cette jungle des acronymes puis, fort de connaître les différences, vous proposer comment l&#8217;implémenter en tant que développeuses et développeurs.<br><br>Chaque approche a ses spécificités, ses avantages et ses inconvénients.<br>A la fin de ce talk, non seulement vous saurez choisir la bonne approche, mais aussi ajouter dans vos développements quotidiens la dose d&#8217;IA utile.&#8221;</p>
</blockquote>



<p class="wp-block-paragraph"></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>🏴󠁧󠁢󠁥󠁮󠁧󠁿 <em>“RAG, MCP, tooling, function calling, agents, fine tuning, training…</em></em><br><br><em>So many intimidating terms, but they all have the same goal: ensuring that the artificial intelligence model you use responds correctly to your questions and expectations 😅.</em><br><br><em>And to do that, you need to add knowledge and data — private, public or otherwise.</em><br><br><em>During this talk, I will help you see more clearly through this jungle of acronyms, and once you understand the differences, I will show you how to implement them as developers.</em><br><br><em>Each approach has its own specificities, advantages and disadvantages.</em><br><br><em>By the end of this talk, you will not only know how to choose the right approach, but also how to add the right dose of useful AI into your daily development work.”</em></p>
</blockquote>



<p class="wp-block-paragraph">🎥 <a href="https://www.youtube.com/watch?v=N3NzgO6M-Ss" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Replay</a>.</p>



<h4 class="wp-block-heading">&#8220;Refactorer sans tout casser: anatomie des patterns de modernisation incrémentale&#8221;</h4>



<p class="wp-block-paragraph"><em>🏴󠁧󠁢󠁥󠁮󠁧󠁿 “Refactoring without breaking everything: anatomy of incremental modernisation patterns”</em></p>



<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="576" src="https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-9-1024x576.png" alt="Héla Ben Khalfallah speaking at Devoxx France 2026" class="wp-image-31818" style="aspect-ratio:1.7777426704463952;width:560px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-9-1024x576.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-9-300x169.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-9-768x432.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-9-1536x864.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-9.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">🎤 Speaker: Héla Ben Khalfallah</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">&#8220;Cette session répond à un problème extrêmement courant mais rarement traité de façon structurée : comment moderniser un système legacy sans big bang, sans freeze de la prod, et sans multiplier les régressions. Plutôt que de parler “microservices” ou “rewrite from scratch” de manière abstraite, la session propose un playbook de modernisation incrémentale, articulé autour de patterns éprouvés : Strangler Fig, Parallel Change (Expand/Contract), Branch by Abstraction, décomposition par capacités métier / sous-domaines / transactions, et les patterns de conception (Facade, Adapter, Proxy, Mediator) utilisés comme briques concrètes de migration.<br><br>Le contenu est ancré dans la pratique : il synthétise à la fois des retours d’expérience industriels (Netflix, Khan Academy, etc.) et des travaux de recherche / rédaction. L’objectif n’est pas de présenter un catalogue de patterns, mais de montrer comment les combiner pour construire une trajectoire de migration observable, réversible et livrable en continu.<br><br>Vous repartirez avec une grille de lecture concrète pour garder des migrations observables, réversibles et compatibles avec le rythme produit.&#8221;</p>
</blockquote>



<p class="wp-block-paragraph"></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>🏴󠁧󠁢󠁥󠁮󠁧󠁿 <em><em>“This session addresses an extremely common problem that is rarely handled in a structured way: how to modernise a legacy system without a big bang, without a production freeze, and without multiplying regressions. Rather than talking abstractly about microservices or rewriting from scratch, the session offers an incremental modernisation playbook built around proven patterns: Strangler Fig, Parallel Change — Expand/Contract — Branch by Abstraction, decomposition by business capabilities, subdomains and transactions, as well as design patterns such as Facade, Adapter, Proxy and Mediator used as concrete building blocks for migration.</em></em></em><br><br><em>The content is rooted in practice: it brings together both industrial feedback from companies such as Netflix and Khan Academy, and research and written work. The goal is not to present a catalogue of patterns, but to show how they can be combined to build a migration path that is observable, reversible and continuously deliverable.</em><br><br><em>You will leave with a concrete framework for keeping migrations observable, reversible and compatible with the pace of product development.”</em></p>
</blockquote>



<p class="wp-block-paragraph">🎥 <a href="https://www.youtube.com/watch?v=X2YyWAh336Y" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Replay</a>.</p>



<p class="wp-block-paragraph">📺 Devoxx France published the 232 videos (keynotes, conferences, tools in action, lunch talks &amp; deep dives) on the <a href="https://www.youtube.com/@devoxxfrvideos" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Devoxx France YouTube channel</a>.</p>



<h3 class="wp-block-heading">Podcast</h3>



<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="768" src="https://blog.ovhcloud.com/wp-content/uploads/2026/05/PXL_20260423_091521008-1024x768.jpg" alt="Podcast recording at Devoxx France 2026" class="wp-image-31598" style="width:428px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/05/PXL_20260423_091521008-1024x768.jpg 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/PXL_20260423_091521008-300x225.jpg 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/PXL_20260423_091521008-768x576.jpg 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/PXL_20260423_091521008-1536x1152.jpg 1536w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/PXL_20260423_091521008-2048x1536.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Devoxx France was also an opportunity for OVHcloud’s Aurélie Vache, Stéphane Philippart, and Magali De Labareyre to be interviewed in the Press space for the “Tech en Pratique” podcast.</p>



<p class="wp-block-paragraph">The episodes will be available on <a href="https://www.youtube.com/@ekit3" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">YouTube</a> starting in September! 🙂</p>



<h3 class="wp-block-heading">Key Trends</h3>



<ul class="wp-block-list">
<li><strong>AI moved from hype to production</strong><br>The focus shifted toward agentic systems, RAG, observability, governance, and enterprise integration, with more emphasis on shipping useful AI than experimenting.</li>
</ul>



<ul class="wp-block-list">
<li><strong><strong>Java evolved for modern AI and cloud workloads</strong><br></strong>LangChain4j, GraalVM, native image, and JDK modernization reinforced Java’s role as a serious platform for AI-enabled enterprise systems.</li>
</ul>



<ul class="wp-block-list">
<li><strong>Platform engineering became a core priority</strong><br>CI/CD maturity, OpenRewrite, modernization, and developer productivity all reflected one goal: faster delivery without losing control.</li>
</ul>



<ul class="wp-block-list">
<li><strong>Security moved deeper into developer workflows</strong><br>Shift-left security, AppSec, authorization, Software Supply Chain Security and secure-by-design approaches gained importance, especially with AI-generated code increasing governance needs.</li>
</ul>



<ul class="wp-block-list">
<li><strong>Cloud &amp; architecture focused on operational resilience</strong><br>Kubernetes, containers, observability, and scalable systems remained central, with a stronger focus on practical engineering over hype.</li>
</ul>



<ul class="wp-block-list">
<li><strong>Front-end discussions matured</strong><br>Accessibility, performance, reactivity, and maintainability took priority over framework wars.</li>
</ul>



<ul class="wp-block-list">
<li><strong>Open source and European digital sovereignty gained traction</strong><br>Open models, self-hosted tooling, privacy, and vendor independence became increasingly important themes.</li>
</ul>



<ul class="wp-block-list">
<li><strong>Developer experience (DX) became strategic</strong><br>Tooling, automation, terminal workflows, and reducing cognitive load were seen as key drivers of productivity and competitiveness.</li>
</ul>



<h3 class="wp-block-heading">Conclusion</h3>



<p class="wp-block-paragraph">This Devoxx France edition was a raging success for the speakers, sponsors, and attendees alike ♥️.</p>



<h3 class="wp-block-heading">💬 Stay in Touch</h3>



<p class="wp-block-paragraph">Want to chat with us, share your thoughts, or just say hi? Here’s how to get in touch with us:</p>



<ul class="wp-block-list">
<li>🟣&nbsp;<strong>Discord</strong>:&nbsp;<a href="https://discord.gg/ovhcloud" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">OVHcloud Discord server</a></li>



<li>🐦&nbsp;<strong>X / Twitter</strong>:&nbsp;<a href="https://twitter.com/OVHcloud" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">@OVHcloud</a></li>



<li>💼&nbsp;<strong>LinkedIn</strong>:&nbsp;<a href="https://www.linkedin.com/company/ovhgroup" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">OVHcloud LinkedIn</a></li>



<li>🐙&nbsp;<strong>GitHub</strong>:&nbsp;<a href="https://github.com/ovh" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">github.com/ovh</a></li>
</ul>



<p class="wp-block-paragraph"></p>
<img loading="lazy" decoding="async" src="//blog.ovhcloud.com/wp-content/plugins/matomo/app/matomo.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Fblog.ovhcloud.com%2Fdevoxx-france-2026%2F&amp;action_name=Devoxx%20France%202026%3A%20feedback%20and%20highlights&amp;urlref=https%3A%2F%2Fblog.ovhcloud.com%2Ffeed%2F" style="border:0;width:0;height:0" width="0" height="0" alt="" />]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Remote development #3 &#8211; Industrialisation and Automation</title>
		<link>https://blog.ovhcloud.com/remote-development-3-industrialisation-automation/</link>
		
		<dc:creator><![CDATA[Rémy Vandepoel]]></dc:creator>
		<pubDate>Wed, 13 May 2026 08:05:05 +0000</pubDate>
				<category><![CDATA[OVHcloud Engineering]]></category>
		<category><![CDATA[Security]]></category>
		<guid isPermaLink="false">https://blog.ovhcloud.com/?p=31565</guid>

					<description><![CDATA[After manually configuring your server step by step, it’s time to automate the entire process. The idea is simple: describe your infrastructure in configuration files and let Terraform take care of managing the resources at OVHcloud. Here is an introductory guide to Terraform, with plenty of useful information: https://support.us.ovhcloud.com/hc/en-us/articles/22648864003219-Using-Terraform-with-OVHcloud.As well as the link to OVHcloud’s [&#8230;]<img src="//blog.ovhcloud.com/wp-content/plugins/matomo/app/matomo.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Fblog.ovhcloud.com%2Fremote-development-3-industrialisation-automation%2F&amp;action_name=Remote%20development%20%233%20%26%238211%3B%20Industrialisation%20and%20Automation&amp;urlref=https%3A%2F%2Fblog.ovhcloud.com%2Ffeed%2F" style="border:0;width:0;height:0" width="0" height="0" alt="" />]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1536" height="1024" src="https://blog.ovhcloud.com/wp-content/uploads/2026/05/3-1024x683.jpg" alt="" class="wp-image-31559" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/05/3-1024x683.jpg 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/3-300x200.jpg 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/3-768x512.jpg 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/3.jpg 1536w" sizes="auto, (max-width: 1536px) 100vw, 1536px" /></figure>



<p class="wp-block-paragraph">After <a href="https://blog.ovhcloud.com/remote-development-2-security-performance/" target="_blank" rel="noreferrer noopener" data-wpel-link="internal">manually configuring your server</a> step by step, it’s time to automate the entire process.</p>



<p class="wp-block-paragraph">The idea is simple: describe your infrastructure in configuration files and let <strong>Terraform</strong> take care of managing the resources at <strong>OVHcloud</strong>.<br><br>Here is an introductory guide to Terraform, with plenty of useful information: <a href="https://support.us.ovhcloud.com/hc/en-us/articles/22648864003219-Using-Terraform-with-OVHcloud" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">https://support.us.ovhcloud.com/hc/en-us/articles/22648864003219-Using-Terraform-with-OVHcloud</a>.<br>As well as the link to OVHcloud’s official Terraform provider: <a href="https://registry.terraform.io/providers/ovh/ovh/latest" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">https://registry.terraform.io/providers/ovh/ovh/latest</a><br><br>There are two steps to automating the deployment:</p>



<ul class="wp-block-list">
<li>Deployment of the Public Cloud instance</li>



<li>Deployment of the application part (vscode-server) and its configuration</li>
</ul>



<h2 class="wp-block-heading">1. The heart of the automation: the Cloud-init script</h2>



<p class="wp-block-paragraph">Before we move onto Terraform, we need to understand how the server self-configures during its initialisation.<br>To do this, use <code>cloud-init</code>, a standard that allows scripts to be executed from the first boot of the instance.</p>



<p class="wp-block-paragraph"><strong>What you will automate in this script:</strong></p>



<ul class="wp-block-list">
<li>The system update (<code>apt update/upgrade</code>)</li>



<li>The installation of <code>code-server</code> via the official script</li>



<li>The installation and configuration of <strong>Caddy</strong> (for automatic SSL)</li>



<li>The configuration of the Uncomplicated Firewall (<strong>UFW</strong>)</li>
</ul>



<p class="wp-block-paragraph">This type of file has a very particular syntax; the cloud-config.yaml will be available further down.</p>



<p class="wp-block-paragraph">However, the important point to remember is: why use this format?</p>



<ul class="wp-block-list">
<li><strong>Idempotence:</strong> <code>cloud-init</code> ensures that everything is ready from the first boot.</li>



<li><strong>Security from the outset:</strong> the <code>UFW</code> is activated immediately, reducing the exposure window.</li>



<li><strong>Terraform Integration:</strong> a single line is required to include this: <code>user_data = file("cloud-config.yaml")</code></li>
</ul>



<h2 class="wp-block-heading">2. Using Terraform for deployment</h2>



<p class="wp-block-paragraph">Terraform allows for a much easier and quicker instance startup.<br>Its configuration also has several advantages:</p>



<ul class="wp-block-list">
<li><strong>Persistent data:</strong> a <code>terraform destroy</code> of the instance can retain the data volume (goal set in chapter 2)</li>



<li><strong>Scalability:</strong> if the project grows, the size of the volume and/or the flavour can be adjusted</li>



<li><strong>Portability:</strong> the data volume can be unmounted and remounted on another machine.</li>
</ul>



<p class="wp-block-paragraph">To keep this post brief we won’t copy-paste the code here, but this link to a GitHub repository contains everything needed to deploy this in a few minutes:<br><a href="https://github.com/RemyAtOVH/blogpost-dev-server" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">https://github.com/RemyAtOVH/blogpost-dev-server</a></p>



<p class="wp-block-paragraph">Its usage:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong>u</strong><code><strong>ubuntu@vscode-server:~$ source openrc.production.sh<br>ubuntu@vscode-server:~$ terraform init<br>ubuntu@vscode-server:~$ terraform plan<br>ubuntu@vscode-server:~$ terraform apply<br>[...]<br>Apply complete! Resources: 4 added, 0 changed, 0 destroyed.</strong></code></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Before applying cloud-init (or without it), there is a secondary volume <strong>/dev/sdb</strong>, sized according to Terraform specifications:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong>ubuntu@vscode-server-automated:~$ lsblk</strong><br><strong>NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS<br>[&#8230;]<br>sda       8:0    0   25G  0 disk <br>[&#8230;]<br>sdb       8:16   0   10G  0 disk </strong></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">This is what will ensure data persistence.</p>



<p class="wp-block-paragraph">You could manually delete the instance and other components, without deleting it.<br>To prevent any deletion in the event of “terraform destroy”, a parameter has been added:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong>lifecycle { prevent_destroy = true }</strong><strong></strong></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">During the first startup, the various installation scripts may take time. You can check their steps with a simple tail:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong><strong>ubuntu@vscode-server-automated:<strong>~</strong>$ tail -f /var/log/cloud-init-output.log</strong></strong></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Once cloud-init has been executed automatically, everything that could have been set up manually in the previous chapters has been done automatically, in a way that can be reproduced!</p>



<p class="wp-block-paragraph">It will therefore be possible to deploy this customised remote development environment if needed (with a few minutes of execution) and potentially delete it after a few hours or days of use.</p>



<p class="wp-block-paragraph">In this series of chapters, we have transformed a simple idea – having access to VS Code wherever you are – into a professional-grade, automated and resilient infrastructure.<br>Below are the steps involved and the progress so far.</p>



<ul class="wp-block-list">
<li><strong><a href="https://blog.ovhcloud.com/remote-development-1-first-deployment/" target="_blank" rel="noreferrer noopener" data-wpel-link="internal">Chapter 1</a>:</strong> first steps in manual installation to understand the mechanics of <code>code-server</code>.</li>



<li><strong><a href="https://blog.ovhcloud.com/remote-development-2-security-performance/" target="_blank" rel="noreferrer noopener" data-wpel-link="internal">Chapter 2</a>:</strong> making it secure, using a Reverse Proxy (Caddy) and a firewall (UFW) to navigate smoothly in HTTPS.</li>



<li><strong>Chapter 3:</strong> this article, in which we’ll use Terraform and OpenStack for better reproducibility.</li>
</ul>



<p class="wp-block-paragraph">The automation we have implemented with an OVHcloud deployment using an OpenStack-based Public Cloud provides a solid foundation.</p>



<p class="wp-block-paragraph">From here, you can go even further: add automatic backups of your volumes (snapshotting), couple this with a CI/CD pipeline, or even explore deploying this environment via docker-compose or even Kubernetes.</p>



<p class="wp-block-paragraph">A step-by-step video version of these blog posts will soon be available on our <a href="https://youtube.com/@ovhgroup" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">YouTube channel</a>. Stay tuned!</p>
<img loading="lazy" decoding="async" src="//blog.ovhcloud.com/wp-content/plugins/matomo/app/matomo.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Fblog.ovhcloud.com%2Fremote-development-3-industrialisation-automation%2F&amp;action_name=Remote%20development%20%233%20%26%238211%3B%20Industrialisation%20and%20Automation&amp;urlref=https%3A%2F%2Fblog.ovhcloud.com%2Ffeed%2F" style="border:0;width:0;height:0" width="0" height="0" alt="" />]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Remote development #2 &#8211; Security and Performance</title>
		<link>https://blog.ovhcloud.com/remote-development-2-security-performance/</link>
		
		<dc:creator><![CDATA[Rémy Vandepoel]]></dc:creator>
		<pubDate>Mon, 11 May 2026 16:00:02 +0000</pubDate>
				<category><![CDATA[OVHcloud Engineering]]></category>
		<category><![CDATA[Security]]></category>
		<guid isPermaLink="false">https://blog.ovhcloud.com/?p=31546</guid>

					<description><![CDATA[In the previous chapter, we started the VSCode Server on a remote instance. That’s a win. However, as it stands, your installation is vulnerable, or at least not optimally secured. Traffic is being sent in clear (HTTP) and port 8080 is exposed to anyone scanning our IP address. To transform this prototype into a daily [&#8230;]<img src="//blog.ovhcloud.com/wp-content/plugins/matomo/app/matomo.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Fblog.ovhcloud.com%2Fremote-development-2-security-performance%2F&amp;action_name=Remote%20development%20%232%20%26%238211%3B%20Security%20and%20Performance&amp;urlref=https%3A%2F%2Fblog.ovhcloud.com%2Ffeed%2F" style="border:0;width:0;height:0" width="0" height="0" alt="" />]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="683" src="https://blog.ovhcloud.com/wp-content/uploads/2026/05/2-1-1024x683.jpg" alt="" class="wp-image-31555" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/05/2-1-1024x683.jpg 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/2-1-300x200.jpg 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/2-1-768x512.jpg 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/2-1.jpg 1536w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">In the <a href="https://blog.ovhcloud.com/remote-development-1-first-deployment/" target="_blank" rel="noreferrer noopener" data-wpel-link="internal">previous chapter</a>, we started the VSCode Server on a remote instance.</p>



<p class="wp-block-paragraph">That’s a win. However, as it stands, your installation is vulnerable, or at least not optimally secured. Traffic is being sent in clear (HTTP) and port 8080 is exposed to anyone scanning our IP address.</p>



<p class="wp-block-paragraph">To transform this prototype into a daily working tool, we need to set up a Reverse Proxy.<br>Its role is simple: to intercept secure connections (HTTPS) on the standard port 443 and redirect them locally to our service.</p>



<h2 class="wp-block-heading">1. Prerequisites: securing the network part</h2>



<p class="wp-block-paragraph">First and foremost, we need to instruct code-server to no longer listen for connections from outside, but only to those coming from the machine itself (the proxy).</p>



<p class="wp-block-paragraph">Modify your configuration file: nano ~/.config/code-server/config.yaml</p>



<p class="wp-block-paragraph">Change the line &#8220;bind-addr&#8221; as follows:&nbsp;</p>



<p class="wp-block-paragraph"><code>bind-addr: 127.0.0.1:8080</code></p>



<p class="wp-block-paragraph">Then restart the service.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><code><strong>ubuntu@vscode-server:~$ sudo systemctl restart code-server@$USER</strong></code></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">This will ensure that vscode-server will indeed only “listen” locally and cannot be contacted directly from outside.</p>



<h2 class="wp-block-heading">2. Implement the reverse proxy</h2>



<p class="wp-block-paragraph">Here, you have two choices:</p>



<ul class="wp-block-list">
<li>NGINX, which has been the standard choice for many years</li>



<li>Caddy, which has a more simplistic (but comprehensive) and newer approach.</li>
</ul>



<p class="wp-block-paragraph">For this blog post, we have selected Caddy for the example and to familiarise ourselves if we have not already!</p>



<p class="wp-block-paragraph">Caddy natively manages SSL certificate renewal – which can be done through OVHcloud!</p>



<p class="wp-block-paragraph"><strong>Installation (Debian/Ubuntu)</strong></p>



<p class="wp-block-paragraph">You will find more comprehensive documentation for other systems or installation methods in the official documentation: <a href="https://caddyserver.com/docs/install" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">https://caddyserver.com/docs/install</a>.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><code><strong>ubuntu@vscode-server:~$ sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https</strong></code><br><code><strong>ubuntu@vscode-server:~$ curl -1sLf </strong></code><strong>&#8216;https://dl.cloudsmith.io/public/caddy/stable/gpg.key&#8217;</strong><code><strong>| sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg</strong></code><br><code><strong>ubuntu@vscode-server:~$ curl -1sLf </strong></code><strong>&#8216;https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt&#8217;</strong><code><strong>| sudo tee /etc/apt/sources.list.d/caddy-stable.list</strong></code><br><code><strong>ubuntu@vscode-server:~$ sudo apt update &amp;&amp; sudo apt install caddy -y</strong></code></td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><strong>Configuration: </strong>modify the file <code>/etc/caddy/Caddyfile</code> (clear it and replace it with this):</p>



<p class="wp-block-paragraph"><em>Replace “<strong>dev.your-domain.uk</strong>” with your own domain name, with the subdomain of your choice pointing to the IP of the instance.</em></p>



<ul class="wp-block-list">
<li>Simple configuration only on HTTP port (80)</li>
</ul>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong><strong>dev.your-domain.uk {<br>    reverse_proxy 127.0.0.1:8080<br>}</strong></strong></td></tr></tbody></table></figure>



<ul class="wp-block-list">
<li>Recommended configuration on HTTPS port (443), using a domain hosted with OVHcloud.</li>
</ul>



<p class="wp-block-paragraph">For creating OVHcloud API tokens, you can refer to this page: <a href="https://eu.api.ovh.com/createToken/" target="_blank" rel="noreferrer noopener" data-wpel-link="exclude">https://eu.api.ovh.com/createToken/</a>.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><code><strong>dev.your-domain.uk </strong></code><strong>{<br>&nbsp; &nbsp; tls {<br>&nbsp; &nbsp; &nbsp; &nbsp; dns ovh {<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; endpoint &#8220;ovh-eu&#8221;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; application_key {$OVH_APPLICATION_KEY}<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; application_secret {$OVH_APPLICATION_SECRET}<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; consumer_key {$OVH_CONSUMER_KEY}<br>&nbsp; &nbsp; &nbsp; &nbsp; }<br>&nbsp; &nbsp; }<br>&nbsp;&nbsp;&nbsp; reverse_proxy&nbsp;<code>127.0.0.1:8080</code><br>}</strong></td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><em>For further details regarding SSL certificate management, consult the official Caddy documentation.<br>Application:</em></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><code><strong>ubuntu@vscode-server:~$ sudo systemctl reload caddy</strong></code><strong></strong></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">If you have opted for the recommended configuration in HTTPS, your environment is now protected by robust SSL encryption.</p>



<p class="wp-block-paragraph">You are no longer at risk of having your password intercepted on public Wi-Fi, which is a considerable step towards our goal.</p>



<h2 class="wp-block-heading">3. Network and firewall</h2>



<p class="wp-block-paragraph">Now that the access point is unique via the HTTPS URL configured just above, the rest of the ports, except for SSH, can be closed.</p>



<p class="wp-block-paragraph">Now, implement the basic rules in the firewall. On Ubuntu, the standard tool is <strong>UFW</strong> (Uncomplicated Firewall).</p>



<p class="wp-block-paragraph">Start by opening the ports related to the functional services.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><code><strong>ubuntu@vscode-server:~$ sudo ufw allow ssh<br>ubuntu@vscode-server:~$ sudo ufw allow http<br>ubuntu@vscode-server:~$ sudo ufw allow https</strong></code><strong></strong></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Activate the firewall:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><code><strong>ubuntu@vscode-server:~$ sudo ufw enable</strong></code><strong></strong></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Check the implementation of the rules.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><code><strong>ubuntu@vscode-server:~$ sudo ufw status<br>Status: active</strong></code><br><code><strong>To &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Action &nbsp; &nbsp; &nbsp;From<br>-- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ------ &nbsp; &nbsp; &nbsp;----<br>22/tcp &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ALLOW &nbsp; &nbsp; &nbsp; Anywhere<br>80/tcp &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ALLOW &nbsp; &nbsp; &nbsp; Anywhere<br>443 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ALLOW &nbsp; &nbsp; &nbsp; Anywhere<br>45876 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ALLOW &nbsp; &nbsp; &nbsp; Anywhere<br>22/tcp (v6) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ALLOW &nbsp; &nbsp; &nbsp; Anywhere (v6)<br>80/tcp (v6) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ALLOW &nbsp; &nbsp; &nbsp; Anywhere (v6)<br>443 (v6) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ALLOW &nbsp; &nbsp; &nbsp; Anywhere (v6)<br>45876 (v6) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ALLOW &nbsp; &nbsp; &nbsp; Anywhere (v6)</strong></code></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">You can also add stricter rules to explicitly reject anything unauthorised in incoming traffic while generally authorising outgoing traffic.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><code><strong>ubuntu@vscode-server:~$ sudo ufw default deny incoming<br>ubuntu@vscode-server:~$ sudo ufw default allow outgoing</strong></code><strong></strong></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">From now on, if someone attempts to access the IP on port <code>8080</code>, the connection will be outright rejected.</p>



<p class="wp-block-paragraph">Only the domain name in HTTPS is the legitimate entry point.<br>This handy little development server now feels more like a fortress.&nbsp;<br><br>But what happens if you decide to delete this instance to move to a more powerful one and/or stop it for an indefinite period, as your project is on hold?</p>



<p class="wp-block-paragraph">This is what you will find out in the next part: how to <strong>isolate your data and configurations</strong> on a persistent storage volume to make your environment completely interchangeable, but also how to <strong>automate the deploymen</strong> of this development environment!</p>



<p class="wp-block-paragraph">The ultimate goal is for a simple <code>terraform apply</code> command to to be enough to generate a development environment that’s ready to use in under two minutes.</p>
<img loading="lazy" decoding="async" src="//blog.ovhcloud.com/wp-content/plugins/matomo/app/matomo.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Fblog.ovhcloud.com%2Fremote-development-2-security-performance%2F&amp;action_name=Remote%20development%20%232%20%26%238211%3B%20Security%20and%20Performance&amp;urlref=https%3A%2F%2Fblog.ovhcloud.com%2Ffeed%2F" style="border:0;width:0;height:0" width="0" height="0" alt="" />]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Navigating OVHcloud Enterprise File Storage (EFS) with Trident CSI On Kubernetes clusters (MKS)</title>
		<link>https://blog.ovhcloud.com/navigating-ovhcloud-enterprise-file-storage-efs-with-trident-csi-on-kubernetes-clusters-mks/</link>
		
		<dc:creator><![CDATA[Aurélie Vache]]></dc:creator>
		<pubDate>Mon, 11 May 2026 12:18:46 +0000</pubDate>
				<category><![CDATA[OVHcloud Engineering]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[OVHcloud]]></category>
		<category><![CDATA[Public Cloud]]></category>
		<category><![CDATA[Storage]]></category>
		<guid isPermaLink="false">https://blog.ovhcloud.com/?p=31391</guid>

					<description><![CDATA[If you find yourself in need of shared persistent storage for applications running on OVHcloud Managed Kubernetes Service (MKS), then OVHcloud Enterprise File Storage (EFS) with Trident CSI offers you a practical way to provision and manage it. This blog post explains how to create and connect OVHcloud EFS to your MKS cluster using Trident [&#8230;]<img src="//blog.ovhcloud.com/wp-content/plugins/matomo/app/matomo.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Fblog.ovhcloud.com%2Fnavigating-ovhcloud-enterprise-file-storage-efs-with-trident-csi-on-kubernetes-clusters-mks%2F&amp;action_name=Navigating%20OVHcloud%20Enterprise%20File%20Storage%20%28EFS%29%20with%20Trident%20CSI%20On%20Kubernetes%20clusters%20%28MKS%29&amp;urlref=https%3A%2F%2Fblog.ovhcloud.com%2Ffeed%2F" style="border:0;width:0;height:0" width="0" height="0" alt="" />]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="1020" src="https://blog.ovhcloud.com/wp-content/uploads/2026/04/IMG_1587-1024x1020.png" alt="" class="wp-image-31461" style="aspect-ratio:1.0039264898357345;width:426px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/04/IMG_1587-1024x1020.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/04/IMG_1587-300x300.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/04/IMG_1587-150x150.png 150w, https://blog.ovhcloud.com/wp-content/uploads/2026/04/IMG_1587-768x765.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/04/IMG_1587-70x70.png 70w, https://blog.ovhcloud.com/wp-content/uploads/2026/04/IMG_1587.png 1253w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">If you find yourself in need of shared persistent storage for applications running on OVHcloud Managed Kubernetes Service (MKS), then OVHcloud Enterprise File Storage (EFS) with Trident CSI offers you a practical way to provision and manage it.</p>



<p class="wp-block-paragraph">This blog post explains how to create and connect OVHcloud EFS to your MKS cluster using Trident CSI, so you can dynamically provision persistent storage for Kubernetes workloads.</p>



<h3 class="wp-block-heading">OVHcloud Enterprise File System (EFS)</h3>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="100" height="100" src="https://blog.ovhcloud.com/wp-content/uploads/2026/04/Enterprise-File-Storage@2x.png" alt="" class="wp-image-31410" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/04/Enterprise-File-Storage@2x.png 100w, https://blog.ovhcloud.com/wp-content/uploads/2026/04/Enterprise-File-Storage@2x-70x70.png 70w" sizes="auto, (max-width: 100px) 100vw, 100px" /></figure>



<p class="wp-block-paragraph"><a href="https://www.ovhcloud.com/fr/storage-solutions/enterprise-file-storage/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">EFS</a> is a high-performance, fully managed file storage solution powered by NetApp ONTAP in an active-active architecture. It is designed for enterprise workloads requiring high availability, predictable performance, and seamless integration with cloud-native environments.</p>



<p class="wp-block-paragraph">The service is available in multiple regions, including Roubaix, Gravelines, Strasbourg, Limbourg, and Beauharnois, with a strong SLA of 99.99% uptime. Storage capacity ranges from 50 GB up to 29 TB.</p>



<p class="wp-block-paragraph">EFS delivers guaranteed performance with 4,000 IOPS and 64 MB/s throughput per TiB, scaling linearly with volume size thanks to NVMe SSD infrastructure.</p>



<p class="wp-block-paragraph">Built for modern infrastructures, <a href="https://help.ovhcloud.com/csm/en-gb-public-cloud-storage-netapp-trident-csi?id=kb_article_view&amp;sysparm_article=KB0074862" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">EFS integrates natively with Kubernetes via Trident CSI</a> (compatible with MKS) and supports ReadWriteMany (RWX) access. It operates within a single availability zone (1AZ) and provides low-latency NFS storage over OVHcloud’s secure vRack network, ensuring strong security and compliance.</p>



<h3 class="wp-block-heading">NetApp Trident CSI</h3>



<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="350" height="387" src="https://blog.ovhcloud.com/wp-content/uploads/2026/04/image-9.png" alt="" class="wp-image-31406" style="width:201px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/04/image-9.png 350w, https://blog.ovhcloud.com/wp-content/uploads/2026/04/image-9-271x300.png 271w" sizes="auto, (max-width: 350px) 100vw, 350px" /></figure>



<p class="wp-block-paragraph"><a href="https://github.com/netApp/trident" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Trident</a> is an open-source, fully supported storage orchestration project maintained by <a href="https://www.netapp.com/fr/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">NetApp</a>. It is designed to help Kubernetes applications consume persistent storage using standard interfaces such as the Container Storage Interface (<a href="https://github.com/container-storage-interface/spec/blob/master/spec.md" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">CSI</a>).</p>



<p class="wp-block-paragraph">Trident runs directly inside Kubernetes clusters as a set of <strong>Pods</strong> and enables dynamic provisioning and management of storage for containerized workloads. It allows applications to easily access persistent storage from NetApp’s ecosystem, including ONTAP systems (like the OVHcloud EFS).</p>



<h3 class="wp-block-heading">Let&#8217;s do it!</h3>



<h4 class="wp-block-heading">EFS creation</h4>



<p class="wp-block-paragraph">We already have a MKS cluster, in GRA11 region, running inside a private network and a subnet, with a gateway.<br>We also already have a vRack and our Public Cloud Project attached to this vRack.<br>So in this blog post we will only create a new EFS in <strong>eu-west-rbx</strong> region, attached to a vRackServices, inside the same subnet that our existing MKS cluster.</p>



<p class="wp-block-paragraph">Here you can see the architecture of all the services:</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="554" src="https://blog.ovhcloud.com/wp-content/uploads/2026/05/Untitled-2026-05-04-11371-1024x554.png" alt="" class="wp-image-31538" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/05/Untitled-2026-05-04-11371-1024x554.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/Untitled-2026-05-04-11371-300x162.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/Untitled-2026-05-04-11371-768x415.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/Untitled-2026-05-04-11371-1536x831.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/Untitled-2026-05-04-11371-2048x1107.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">⚠️ EFS and MKS regions may differ; be aware that latency between different regions may impact your storage workloads performance. <strong>It&#8217;s highly recommended to keep your storage and compute as close as possible.</strong></p>



<p class="wp-block-paragraph">We will deploy the EFS in <strong>eu-west-rbx</strong> instead of in <strong>eu-west-gra</strong> region to show you that it is possible.</p>



<p class="wp-block-paragraph">To deploy the EFS, we will use the <a href="https://registry.terraform.io/modules/ovh/efs/ovh/latest" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Terraform OVHcloud EFS module</a>.</p>



<p class="wp-block-paragraph">The module we will use can deploy all the components necessary to use EFS with a MKS cluster (like you can see in the schema).</p>



<p class="wp-block-paragraph">But in this blog post we will assume that we already deployed:</p>



<ul class="wp-block-list">
<li>a vRack</li>



<li>a Private Network</li>



<li>a Private Subnet</li>



<li>a Gateway</li>



<li>a MKS cluster</li>
</ul>



<p class="wp-block-paragraph">So using the Terraform module we will fill the existing resources information and ask Terraform to create:</p>



<ul class="wp-block-list">
<li>an OAuth2 credential</li>



<li>an IAM policy</li>



<li>an EFS</li>



<li>a vRack Services</li>
</ul>



<p class="wp-block-paragraph">Let&#8217;s deploy our components with Terraform!</p>



<p class="wp-block-paragraph">Create a <strong>provider.tf </strong>file and fill it with the information:</p>



<pre class="wp-block-code"><code class="">terraform {<br>  required_providers {<br>    ovh = {<br>      source  = "ovh/ovh"<br>      version = "&gt;= 2.12.0"<br>    }<br>    null = {<br>      source  = "hashicorp/null"<br>      version = "&gt;= 3.0.0"<br>    }<br>  }<br><br>  required_version = "&gt;= 1.7.0"<br>}<br><br>provider "ovh" {<br>}</code></pre>



<p class="wp-block-paragraph">If you don&#8217;t define the provider information inside this file, as was shown in this example, you can instead set the environment variables with your credentials:</p>



<pre class="wp-block-code"><code class=""># OVHcloud provider needed keys<br>export OVH_ENDPOINT="ovh-eu"<br>export OVH_APPLICATION_KEY="xxx"<br>export OVH_APPLICATION_SECRET="xxx"<br>export OVH_CONSUMER_KEY="xxx"<br>export OVH_CLOUD_PROJECT_SERVICE="xxx"</code></pre>



<p class="wp-block-paragraph">Create a <strong>variable.tf.template</strong> file and fill it with these information:</p>



<pre class="wp-block-code"><code class=""># Existing services<br>variable "service_name" {<br>  default = "$OVH_CLOUD_PROJECT_SERVICE"<br>}<br><br>variable "vrack_id" {<br>  default = "pn-1234567" #ID of your existing vRack<br>}<br><br>variable "vlan_id" {<br>  default = "666" #ID of your VLAN<br>}<br><br>variable "private_network_id" {<br>  default = "d111cb65-1234-5678-9012-dac2e93b8944" #ID of your private network<br>}<br><br>variable "private_subnet_id" {<br>  default = "d8dc2469-1234-5678-9012-1f86551d3466" #ID of your subnet<br>}<br><br>variable "vrackservices_subnet_service_range_cidr" {<br>  default = "192.168.168.248/29" #CIDR of your private network<br>}<br><br>variable "private_subnet_cidr" {<br>  default = "192.168.168.0/24" #CIDR of your subnet<br>} <br><br>variable "mks_region" {<br>  default = "GRA11" #Region of your existing MKS cluster<br>}<br><br>variable "mks_cluster_id" {<br>  default = "7c3e1e6e-1234-5678-9012-4fb5a5b145e7" #ID of your existing MKS cluster<br>}<br><br># Services to create<br><br>variable "oauth2_client_name" {<br>  default = "efs-trident-client-example"<br>}<br><br>variable "oauth2_client_description" {<br>  default = "OAuth2 client for EFS Trident integration"<br>}<br><br>variable "iam_policy_name" {<br>  default = "efs-trident-policy-example"<br>}<br><br>variable "iam_policy_description" {<br>  default = "IAM policy for EFS Trident access"<br>}<br><br>variable "vrackservices_attach_to_efs" {<br>  description = "Whether to attach the EFS service endpoint to vRack Services. Set to false before destroying."<br>  type        = bool<br>  default     = true<br>}<br><br>variable "efs_region" {<br>  default = "eu-west-rbx"<br>}<br><br>variable "efs_name" {<br>  default = "my-efs-storage"<br>}<br><br>variable "efs_plan" {<br>  default = "enterprise-file-storage-premium-1tb"<br>}</code></pre>



<p class="wp-block-paragraph">⚠️ In the file, replace the IDs, CIDR &amp; MKS region with your existing resources information.</p>



<p class="wp-block-paragraph">Replace the value of the <strong>OVH_CLOUD_PROJECT_SERVICE</strong> environment variable in the <strong>variables.tf</strong> file: </p>



<pre class="wp-block-code"><code class="">envsubst &lt; variables.tf.template &gt; variables.tf</code></pre>



<p class="wp-block-paragraph">Create a <strong>efs.tf</strong> file and fill it with the information:</p>



<pre class="wp-block-code"><code class="">module "ovh_efs_trident" {<br>  source = "ovh/efs/ovh//modules/efs-trident"<br><br>  # OVH region for EFS and vRack Services<br>  region = var.efs_region<br><br>  # Public Cloud region for MKS and private network<br>  public_cloud_region = var.mks_region<br><br>  # VLAN ID must be the same for vRack Services and Public Cloud private network<br>  vlan_id = var.vlan_id<br><br>  # Set to false before destroying to detach endpoint first<br>  vrackservices_attach_to_efs = var.vrackservices_attach_to_efs<br><br>  # EFS creation<br>  storage_efs_name      = var.efs_name<br>  storage_efs_plan_code = var.efs_plan<br><br>  # --- vRack ---<br>  create_vrack       = false<br>  vrack_service_name = var.vrack_id<br><br>  # --- Cloud Project ---<br>  create_cloud_project        = false<br>  cloud_project_id            = var.service_name<br>  bind_vrack_to_cloud_project = false # Set to false if already bound<br><br>  # --- Private Network ---<br>  create_private_network      = false<br>  private_network_id = var.private_network_id<br><br>  # --- Private Subnet ---<br>  create_private_subnet      = false<br>  private_subnet_id = var.private_subnet_id<br><br>  # --- Gateway ---<br>  create_gateway = false  # Set to false only if existing network has gateway<br><br>  # --- MKS Cluster ---<br>  create_mks_cluster = false<br>  mks_cluster_id     = var.mks_cluster_id # mks-priv-gra11<br>  create_node_pool   = false # Set to false if using existing node pool<br><br>  # OAuth2 and IAM<br>  oauth2_client_name        = var.oauth2_client_name<br>  oauth2_client_description = var.oauth2_client_description<br>  iam_policy_name           = var.iam_policy_name<br>  iam_policy_description    = var.iam_policy_description<br><br>  # Network (shared between vRack Services and Public Cloud)<br>  private_network_subnet_cidr             = var.private_subnet_cidr<br>  vrackservices_subnet_service_range_cidr = var.vrackservices_subnet_service_range_cidr # EFS gets IPs here<br>}</code></pre>



<p class="wp-block-paragraph">Create an <strong>output.tf</strong> file with the following content:</p>



<pre class="wp-block-code"><code class="">output "client_id" {<br>    value = module.ovh_efs_trident.client_id<br>}<br><br>output "client_secret" {<br>    value = module.ovh_efs_trident.client_secret<br>    sensitive = true<br>}<br><br>output "efs_id" {<br>  value       = module.ovh_efs_trident.efs_id<br>}</code></pre>



<p class="wp-block-paragraph">The Terraform configuration is ready. Let&#8217;s init it:</p>



<pre class="wp-block-code"><code class="">terraform init</code></pre>



<p class="wp-block-paragraph">The output should be like this:</p>



<pre class="wp-block-code"><code class="">$ terraform init<br><br>Initializing the backend...<br>Initializing modules...<br>Initializing provider plugins...<br>- Reusing previous version of hashicorp/null from the dependency lock file<br>- Reusing previous version of ovh/ovh from the dependency lock file<br>- Using previously-installed hashicorp/null v3.2.4<br>- Using previously-installed ovh/ovh v2.13.1<br><br>Terraform has been successfully initialized!<br><br>You may now begin working with Terraform. Try running "terraform plan" to see<br>any changes that are required for your infrastructure. All Terraform commands<br>should now work.<br><br>If you ever set or change modules or backend configuration for Terraform,<br>rerun this command to reinitialize your working directory. If you forget, other<br>commands will detect it and remind you to do so if necessary.</code></pre>



<p class="wp-block-paragraph">Apply it:</p>



<pre class="wp-block-code"><code class="">terraform apply</code></pre>



<p class="wp-block-paragraph">The output should be like this:</p>



<pre class="wp-block-code"><code class="">$ terraform apply<br><br>module.ovh_efs_trident.data.ovh_me.my_account: Reading...<br>module.ovh_efs_trident.data.ovh_cloud_project_kube.existing[0]: Reading...<br>module.ovh_efs_trident.data.ovh_cloud_project.existing[0]: Reading...<br>module.ovh_efs_trident.data.ovh_me.my_account: Read complete after 1s [id=xx12345-ovh]<br>module.ovh_efs_trident.data.ovh_cloud_project.existing[0]: Read complete after 0s<br>module.ovh_efs_trident.data.ovh_order_cart.cart: Reading...<br>module.ovh_efs_trident.data.ovh_order_cart.cart: Read complete after 0s [id=d582ab7c-1234-5678-9012-4a6e702ea4c5]<br>module.ovh_efs_trident.data.ovh_cloud_project_kube.existing[0]: Read complete after 5s [id=7c3e1e6e-1234-5678-9012-4fb5a5b145e7]<br><br>Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:<br>  + create<br><br>Terraform will perform the following actions:<br><br>  # module.ovh_efs_trident.null_resource.config_validation will be created<br>  + resource "null_resource" "config_validation" {<br>      + id = (known after apply)<br>    }<br><br>  # module.ovh_efs_trident.ovh_iam_policy.iam_policy will be created<br>  + resource "ovh_iam_policy" "iam_policy" {<br>      + allow       = [<br>          + "storageNetApp:apiovh:get",<br>          + "storageNetApp:apiovh:serviceInfos/get",<br>          + "storageNetApp:apiovh:share/accessPath/get",<br>          + "storageNetApp:apiovh:share/acl/create",<br>          + "storageNetApp:apiovh:share/acl/delete",<br>          + "storageNetApp:apiovh:share/acl/get",<br>          + "storageNetApp:apiovh:share/create",<br>          + "storageNetApp:apiovh:share/delete",<br>          + "storageNetApp:apiovh:share/edit",<br>          + "storageNetApp:apiovh:share/extend",<br>          + "storageNetApp:apiovh:share/get",<br>          + "storageNetApp:apiovh:share/revertToSnapshot",<br>          + "storageNetApp:apiovh:share/snapshot/create",<br>          + "storageNetApp:apiovh:share/snapshot/delete",<br>          + "storageNetApp:apiovh:share/snapshot/edit",<br>          + "storageNetApp:apiovh:share/snapshot/get",<br>        ]<br>      + created_at  = (known after apply)<br>      + description = "IAM policy for EFS Trident access"<br>      + id          = (known after apply)<br>      + identities  = (known after apply)<br>      + name        = "efs-trident-policy-example"<br>      + owner       = (known after apply)<br>      + read_only   = (known after apply)<br>      + resources   = (known after apply)<br>      + updated_at  = (known after apply)<br>    }<br><br>  # module.ovh_efs_trident.ovh_me_api_oauth2_client.api_oauth2_client will be created<br>  + resource "ovh_me_api_oauth2_client" "api_oauth2_client" {<br>      + client_id     = (known after apply)<br>      + client_secret = (sensitive value)<br>      + description   = "OAuth2 client for EFS Trident integration"<br>      + flow          = "CLIENT_CREDENTIALS"<br>      + id            = (known after apply)<br>      + identity      = (known after apply)<br>      + name          = "efs-trident-client-example"<br>    }<br><br>  # module.ovh_efs_trident.ovh_storage_efs.efs[0] will be created<br>  + resource "ovh_storage_efs" "efs" {<br>      + created_at        = (known after apply)<br>      + iam               = (known after apply)<br>      + id                = (known after apply)<br>      + name              = "my-efs-storage"<br>      + order             = (known after apply)<br>      + ovh_subsidiary    = "FR"<br>      + performance_level = (known after apply)<br>      + plan              = [<br>          + {<br>              + configuration = [<br>                  + {<br>                      + label = "region"<br>                      + value = "eu-west-rbx"<br>                    },<br>                  + {<br>                      + label = "network"<br>                      + value = "vrack"<br>                    },<br>                ]<br>              + duration      = "P1M"<br>              + plan_code     = "enterprise-file-storage-premium-1tb"<br>              + pricing_mode  = "default"<br>            },<br>        ]<br>      + product           = (known after apply)<br>      + quota             = (known after apply)<br>      + region            = (known after apply)<br>      + service_name      = (known after apply)<br>      + status            = (known after apply)<br>    }<br><br>  # module.ovh_efs_trident.ovh_vrack_vrackservices.vrack-vrackservices-binding[0] will be created<br>  + resource "ovh_vrack_vrackservices" "vrack-vrackservices-binding" {<br>      + id             = (known after apply)<br>      + service_name   = "pn-1234567"<br>      + vrack_services = (known after apply)<br>    }<br><br>  # module.ovh_efs_trident.ovh_vrackservices.vrackservices[0] will be created<br>  + resource "ovh_vrackservices" "vrackservices" {<br>      + checksum        = (known after apply)<br>      + created_at      = (known after apply)<br>      + current_state   = (known after apply)<br>      + current_tasks   = (known after apply)<br>      + iam             = (known after apply)<br>      + id              = (known after apply)<br>      + order           = (known after apply)<br>      + ovh_subsidiary  = "FR"<br>      + plan            = [<br>          + {<br>              + configuration = [<br>                  + {<br>                      + label = "region_name"<br>                      + value = "eu-west-rbx"<br>                    },<br>                ]<br>              + duration      = "P1M"<br>              + plan_code     = "vrack-services"<br>              + pricing_mode  = "default"<br>            },<br>        ]<br>      + resource_status = (known after apply)<br>      + target_spec     = {<br>          + subnets = [<br>              + {<br>                  + cidr              = "192.168.168.0/24"<br>                  + service_endpoints = [<br>                      + {<br>                          + managed_service_urn = (known after apply)<br>                        },<br>                    ]<br>                  + service_range     = {<br>                      + cidr = "192.168.168.248/29"<br>                    }<br>                  + vlan              = 666<br>                    # (1 unchanged attribute hidden)<br>                },<br>            ]<br>        }<br>      + updated_at      = (known after apply)<br>    }<br><br>Plan: 6 to add, 0 to change, 0 to destroy.<br><br>Changes to Outputs:<br>  + client_id     = (known after apply)<br>  + client_secret = (sensitive value)<br>  + efs_id        = (known after apply)<br><br>Do you want to perform these actions?<br>  Terraform will perform the actions described above.<br>  Only 'yes' will be accepted to approve.<br><br>  Enter a value: yes<br><br>module.ovh_efs_trident.null_resource.config_validation: Creating...<br>module.ovh_efs_trident.null_resource.config_validation: Creation complete after 0s [id=8553589333890826101]<br>module.ovh_efs_trident.ovh_me_api_oauth2_client.api_oauth2_client: Creating...<br>module.ovh_efs_trident.ovh_storage_efs.efs[0]: Creating...<br>module.ovh_efs_trident.ovh_me_api_oauth2_client.api_oauth2_client: Creation complete after 0s [id=EU.xxxxxxxxxxxxx]<br>module.ovh_efs_trident.ovh_storage_efs.efs[0]: Still creating... [00m10s elapsed]<br>module.ovh_efs_trident.ovh_storage_efs.efs[0]: Still creating... [00m20s elapsed]<br>module.ovh_efs_trident.ovh_storage_efs.efs[0]: Still creating... [00m30s elapsed]<br>...<br>module.ovh_efs_trident.ovh_storage_efs.efs[0]: Still creating... [03m40s elapsed]<br>module.ovh_efs_trident.ovh_storage_efs.efs[0]: Still creating... [03m50s elapsed]<br>module.ovh_efs_trident.ovh_storage_efs.efs[0]: Creation complete after 3m52s [id=c2d759de-cd63-4e28-aaab-a7599aad2ca8]<br>module.ovh_efs_trident.ovh_vrackservices.vrackservices[0]: Creating...<br>module.ovh_efs_trident.ovh_iam_policy.iam_policy: Creating...<br>module.ovh_efs_trident.ovh_iam_policy.iam_policy: Creation complete after 0s [id=a434d1a4-1234-5678-9012-cf54251eee52]<br>module.ovh_efs_trident.ovh_vrackservices.vrackservices[0]: Still creating... [00m10s elapsed]<br>module.ovh_efs_trident.ovh_vrackservices.vrackservices[0]: Still creating... [00m20s elapsed]<br>...<br>module.ovh_efs_trident.ovh_vrackservices.vrackservices[0]: Still creating... [01m20s elapsed]<br>module.ovh_efs_trident.ovh_vrackservices.vrackservices[0]: Creation complete after 1m30s [id=vrs-a00-b11-c22-d33]<br>module.ovh_efs_trident.ovh_vrack_vrackservices.vrack-vrackservices-binding[0]: Creating...<br>module.ovh_efs_trident.ovh_vrack_vrackservices.vrack-vrackservices-binding[0]: Still creating... [00m10s elapsed]<br>module.ovh_efs_trident.ovh_vrack_vrackservices.vrack-vrackservices-binding[0]: Still creating... [00m20s elapsed]<br>...<br>module.ovh_efs_trident.ovh_vrack_vrackservices.vrack-vrackservices-binding[0]: Still creating... [01m40s elapsed]<br>module.ovh_efs_trident.ovh_vrack_vrackservices.vrack-vrackservices-binding[0]: Creation complete after 1m43s [id=vrack_pn-1234567-vrackServices_vrs-a00-b11-c22-d33]<br><br>Apply complete! Resources: 6 added, 0 changed, 0 destroyed.<br><br>Outputs:<br><br>client_id = "EU.xxxxxxxxxxxxx"<br>client_secret = &lt;sensitive&gt;<br>efs_id = "c2d759de-cd63-4e28-aaab-a7599aad2ca8"</code></pre>



<p class="wp-block-paragraph">Save the OAuth2 credentials in environment variables:</p>



<pre class="wp-block-code"><code class="">export EFS_CLIENT_ID=$(terraform output -raw client_id)<br>export EFS_CLIENT_SECRET=$(terraform output -raw client_secret)</code></pre>



<h4 class="wp-block-heading">Trident CSI Installation</h4>



<p class="wp-block-paragraph">Install the Trident operator in your MKS cluster:</p>



<pre class="wp-block-code"><code class="">helm repo add netapp-trident https://netapp.github.io/trident-helm-chart<br><br>helm install trident-operator netapp-trident/trident-operator \<br>  --version 100.2502.1 \<br>  --create-namespace \<br>  --namespace trident \<br>  --set tridentSilenceAutosupport=true \<br>  --set operatorImage="ovhcom/trident-operator:25.02.1-linux-amd64" \<br>  --set tridentImage="ovhcom/trident:25.02.1-linux-amd64"</code></pre>



<p class="wp-block-paragraph">You should have a result like this:</p>



<pre class="wp-block-code"><code class="">$ helm install trident-operator netapp-trident/trident-operator \<br>  --version 100.2502.1 \<br>  --create-namespace \<br>  --namespace trident \<br>  --set tridentSilenceAutosupport=true \<br>  --set operatorImage="ovhcom/trident-operator:25.02.1-linux-amd64" \<br>  --set tridentImage="ovhcom/trident:25.02.1-linux-amd64"<br><br>NAME: trident-operator<br>LAST DEPLOYED: Tue Apr 28 14:01:19 2026<br>NAMESPACE: trident<br>STATUS: deployed<br>REVISION: 1<br>TEST SUITE: None<br>NOTES:<br>Thank you for installing trident-operator, which will deploy and manage NetApp's Trident CSI<br>storage provisioner for Kubernetes.<br><br>Your release is named 'trident-operator' and is installed into the 'trident' namespace.<br>Please note that there must be only one instance of Trident (and trident-operator) in a Kubernetes cluster.<br><br>To configure Trident to manage storage resources, you will need a copy of tridentctl, which is<br>available in pre-packaged Trident releases.  You may find all Trident releases and source code<br>online at https://github.com/NetApp/trident.<br><br>To learn more about the release, try:<br><br>  $ helm status trident-operator<br>  $ helm get all trident-operator</code></pre>



<p class="wp-block-paragraph">Once the installation is complete, verify that all Trident <strong>pods</strong> are in <code><strong>Running</strong></code> state in the trident <strong>namespace</strong> before proceeding:</p>



<pre class="wp-block-code"><code class="">$ kubectl get pods -n trident<br><br>NAME                                  READY   STATUS    RESTARTS      AGE<br>trident-controller-5bf6c8d6f6-g95jq   6/6     Running   0             119s<br>trident-node-linux-4xtjr              2/2     Running   1 (82s ago)   119s<br>trident-node-linux-6w5ff              2/2     Running   1 (82s ago)   119s<br>trident-node-linux-r7hxp              2/2     Running   0             119s<br>trident-operator-859f59c58b-2z2ts     1/1     Running   0             2m31s</code></pre>



<h4 class="wp-block-heading">Trident Backend Creation</h4>



<p class="wp-block-paragraph">The Trident backend connects NetApp Trident to the OVHcloud EFS service using the IAM credentials previously created.</p>



<h5 class="wp-block-heading" id="1-secret-creation">1. Secret Creation</h5>



<p class="wp-block-paragraph">Create a Kubernetes <strong>Secret</strong> containing the connection information that allows Trident to access the OVHcloud API. Create a <strong>trident-secret.yaml.template</strong> file with the following content:</p>



<pre class="wp-block-code"><code class="">apiVersion: v1<br>kind: Secret<br>metadata:<br>  name: ovh-efs-secret<br>type: Opaque<br>stringData:<br>  clientID: "$EFS_CLIENT_ID"         # your clientId<br>  clientSecret: "$EFS_CLIENT_SECRET" # your clientSecret</code></pre>



<p class="wp-block-paragraph">Replace the <code>clientID</code> and <code>clientSecret</code> values by the OAuth2 client we created with Terraform:</p>



<pre class="wp-block-code"><code class="">envsubst &lt; trident-secret.yaml.template &gt; trident-secret.yaml</code></pre>



<p class="wp-block-paragraph">Apply the secret in your cluster:</p>



<pre class="wp-block-code"><code class="">kubectl apply -f trident-secret.yaml -n trident</code></pre>



<p class="wp-block-paragraph">Check that the secret has been correctly created:</p>



<pre class="wp-block-code"><code class="">$ kubectl get secret ovh-efs-secret -n trident<br><br>NAME             TYPE     DATA   AGE<br>ovh-efs-secret   Opaque   2      3s</code></pre>



<h5 class="wp-block-heading" id="2-trident-backend-creation">2. Trident Backend Creation</h5>



<p class="wp-block-paragraph">Create your backend with the command below:</p>



<pre class="wp-block-code"><code class="">cat &lt;&lt;EOF | kubectl create -n trident -f -<br>apiVersion: trident.netapp.io/v1<br>kind: TridentBackendConfig<br>metadata:<br>  name: ovh-efs-rbx<br>spec:<br>  version: 1<br>  backendName: backend-ovh-efs<br>  defaults:<br>    exportRule: "192.168.168.0/24"    # CIDR of your network for NFS ACLs<br>  storageDriverName: ovh-efs<br>  clientLocation: ovh-eu<br>  location: eu-west-rbx         # Location of your EFS service<br>  serviceLevel: premium<br>  nfsMountOptions: rw,hard,rsize=65536,wsize=65536,nfsvers=3,tcp<br>  credentials:<br>    name: ovh-efs-secret<br>  volumeCreateTimeout: "60" <br>EOF</code></pre>



<p class="wp-block-paragraph">⚠️ The <code>ovh-efs</code> storage driver must be used. Replace <code><strong>exportRule</strong></code>, <code><strong>location</strong></code>, and other parameters with values matching your environment.</p>



<p class="wp-block-paragraph">Verify that the backend has been created correctly with the command below:</p>



<pre class="wp-block-code"><code class="">$ kubectl get TridentBackendConfig -n trident<br><br>NAME          BACKEND NAME      BACKEND UUID                           PHASE   STATUS<br>ovh-efs-rbx   backend-ovh-efs   ace12d67-70ea-44e1-abd8-20d016f7f030   Bound   Success</code></pre>



<h4 class="wp-block-heading" id="storageclass-and-usage">Use EFS in your MKS cluster</h4>



<p class="wp-block-paragraph">This section describes how to expose Enterprise File Storage to Kubernetes workloads using Trident.</p>



<h5 class="wp-block-heading" id="1-storageclass">1. StorageClass</h5>



<p class="wp-block-paragraph">In a <strong>sc_efs.yaml</strong> file, define a <code>StorageClass</code> to enable dynamic provisioning via the Trident CSI driver:</p>



<pre class="wp-block-code"><code class="">apiVersion: storage.k8s.io/v1<br>kind: StorageClass<br>metadata:<br>  name: ovh-efs-premium<br>provisioner: csi.trident.netapp.io<br>parameters:<br>  backendType: "ovh-efs"<br>  fsType: "nfs"<br>allowVolumeExpansion: true</code></pre>



<p class="wp-block-paragraph">Apply the StorageClass:</p>



<pre class="wp-block-code"><code class="">kubectl apply -f sc_efs.yaml</code></pre>



<p class="wp-block-paragraph">Check that the StorageClass has been created:</p>



<pre class="wp-block-code"><code class="">$ kubectl get sc ovh-efs-premium<br><br>NAME              PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE<br>ovh-efs-premium   csi.trident.netapp.io   Delete          Immediate           true                   3h13m</code></pre>



<p class="wp-block-paragraph">This <strong>StorageClass</strong> allows volumes to be provisioned on demand and expanded dynamically.</p>



<h4 class="wp-block-heading" id="2-volume-creation-pvc">2. Volume Creation (PVC)</h4>



<p class="wp-block-paragraph">Create a <code>PersistentVolumeClaim</code> with <code>ReadWriteMany</code> (RWX) access mode. Create a <strong>pvc_efs.yaml</strong> file with this content:</p>



<pre class="wp-block-code"><code class="">apiVersion: v1<br>kind: PersistentVolumeClaim<br>metadata:<br>  name: premium-pvc-efs<br>spec:<br>  accessModes:<br>    - ReadWriteMany<br>  resources:<br>    requests:<br>      storage: 100Gi<br>  storageClassName: ovh-efs-premium</code></pre>



<p class="wp-block-paragraph">Apply it:</p>



<pre class="wp-block-code"><code class="">kubectl apply -f pvc_efs.yaml</code></pre>



<p class="wp-block-paragraph">Verify that the <code><strong>PVC</strong></code> has been created with the command below:</p>



<pre class="wp-block-code"><code class="">kubectl get pvc premium-pvc-efs</code></pre>



<p class="wp-block-paragraph">At this point, the <strong>EFS</strong> is creating a volume, attach the correct ACL to it and mount it in the PVC</p>



<p class="wp-block-paragraph">After a little time, the output should show the PVC in <code>Bound</code> state:</p>



<pre class="wp-block-code"><code class="">$ kubectl get pvc<br><br>NAME              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      VOLUMEATTRIBUTESCLASS   AGE<br>premium-pvc-efs   Bound    pvc-faca364d-ad76-44ec-9bc9-959c0d33c515   100Gi      RWX            ovh-efs-premium   &lt;unset&gt;                 3m43s</code></pre>



<p class="wp-block-paragraph">The volume has been created through the <strong>PVC</strong> and you can now mount it in a <strong>Pod</strong> 🎉.</p>



<h3 class="wp-block-heading">Conclusion</h3>



<p class="wp-block-paragraph">In this blog, we’ve explained how to create an EFS and use it in a MKS cluster through Trident CSI. This will give you a flexible, production-ready approach to persistent shared storage in Kubernetes.</p>



<p class="wp-block-paragraph">We recommend you also take a look at our <a href="https://github.com/orgs/ovh/projects/16" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">Cloud Roadmap &amp; Changelog</a> for an overview of all the coming features for OVHcloud Public Cloud products.</p>
<img loading="lazy" decoding="async" src="//blog.ovhcloud.com/wp-content/plugins/matomo/app/matomo.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Fblog.ovhcloud.com%2Fnavigating-ovhcloud-enterprise-file-storage-efs-with-trident-csi-on-kubernetes-clusters-mks%2F&amp;action_name=Navigating%20OVHcloud%20Enterprise%20File%20Storage%20%28EFS%29%20with%20Trident%20CSI%20On%20Kubernetes%20clusters%20%28MKS%29&amp;urlref=https%3A%2F%2Fblog.ovhcloud.com%2Ffeed%2F" style="border:0;width:0;height:0" width="0" height="0" alt="" />]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Remote development #1 &#8211; First Deployment</title>
		<link>https://blog.ovhcloud.com/remote-development-1-first-deployment/</link>
		
		<dc:creator><![CDATA[Rémy Vandepoel]]></dc:creator>
		<pubDate>Thu, 07 May 2026 16:00:42 +0000</pubDate>
				<category><![CDATA[OVHcloud Engineering]]></category>
		<category><![CDATA[Security]]></category>
		<guid isPermaLink="false">https://blog.ovhcloud.com/?p=31612</guid>

					<description><![CDATA[A development environment is an essential day-to-day system, but it can quickly become complex to manage. In this three-part blog post, we will explore how to become more comfortable and productive with it! Endless meetings, slightly differing Docker environments on each machine, and untimely system updates: maintaining a reliable and consistent development workstation can quickly [&#8230;]<img src="//blog.ovhcloud.com/wp-content/plugins/matomo/app/matomo.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Fblog.ovhcloud.com%2Fremote-development-1-first-deployment%2F&amp;action_name=Remote%20development%20%231%20%26%238211%3B%20First%20Deployment&amp;urlref=https%3A%2F%2Fblog.ovhcloud.com%2Ffeed%2F" style="border:0;width:0;height:0" width="0" height="0" alt="" />]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="683" src="https://blog.ovhcloud.com/wp-content/uploads/2026/05/1-1024x683.jpg" alt="" class="wp-image-31613" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/05/1-1024x683.jpg 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/1-300x200.jpg 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/1-768x512.jpg 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/1.jpg 1536w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">A development environment is an essential day-to-day system, but it can quickly become complex to manage. In this three-part blog post, we will explore how to become more comfortable and productive with it!</p>



<p class="wp-block-paragraph">Endless meetings, slightly differing Docker environments on each machine, and untimely system updates: maintaining a reliable and consistent development workstation can quickly become a daily struggle.</p>



<p class="wp-block-paragraph">With each new project, you have to reinstall the same tools, the same CLIs, and reconfigure the same SDKs or frameworks. And above all, hope that the local machine can handle the load when tests, the linter, and the database are all running simultaneously. Meanwhile, with remote work or working while travelling, individuals find themselves developing with a temperamental VPN, from a laptop that is sometimes close to obsolescence.</p>



<p class="wp-block-paragraph">In this series of articles, we aim to transform this reality by building on a complete development environment hosted in the cloud and accessible from any browser via VS Code Server.</p>



<p class="wp-block-paragraph"><strong>The idea is to have a remote, powerful, and, if necessary, reproducible and independent “workstation”.</strong></p>



<p class="wp-block-paragraph">This first chapter demonstrates how to easily deploy a Public Cloud instance manually and install VS Code Server on it. The following chapters will improve its security and automation. &nbsp;</p>



<h2 class="wp-block-heading"><strong>1. Deploying the instance</strong></h2>



<p class="wp-block-paragraph">For the initial tests it may be wise to opt for a smaller, Discovery-type instance so that you can familiarise yourself with the environment and test it. A d2-2 instance will be used here. 1 vCPU and 2 GB of RAM should be enough.</p>



<h2 class="wp-block-heading"><strong>2. Installing the application element</strong></h2>



<p class="wp-block-paragraph">The fountain of knowledge for the following steps is the GitHub for the vscode-server project: <a href="https://github.com/coder/code-server" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">https://github.com/coder/code-server</a></p>



<p class="wp-block-paragraph">There are several options for the installation. In this chapter, to simplify the deployment and for those who are not very familiar with Docker, the installation will be done via the “native” installation script, without using containers.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><code><strong>ubuntu@vscode-server:~$ sudo apt update &amp;&amp; sudo apt upgrade<br>ubuntu@vscode-server:~$ curl -fsSL&nbsp;</strong></code><a href="https://code-server.dev/install.sh" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer"><strong>https://code-server.dev/install.sh</strong></a> <code><strong>| sh</strong></code></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">This step is enough to install the essentials. Activate the service now and check that it is running correctly.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><code><strong>ubuntu@vscode-server:~$ sudo systemctl enable --now code-server@$USER<br>ubuntu@vscode-server:~$ sudo systemctl status code-server@$USER<br>● </strong></code><a href="mailto:code-server@ubuntu.servic"><strong>code-server@ubuntu.servic</strong></a><code><strong>e - code-server<br>&nbsp; &nbsp; &nbsp;Loaded: loaded (/usr/lib/systemd/system/code-server@.service; enabled; preset: enabled)<br>&nbsp; &nbsp; &nbsp;Active: active (running) since Wed 2025-12-03 14:55:37 UTC; 15min ago<br>&nbsp;Invocation: 1b393d84bebe415cbb770a17a0c8d399<br>&nbsp; &nbsp;Main PID: 893 (node)<br>&nbsp; &nbsp; &nbsp; Tasks: 22 (limit: 4532)<br>&nbsp; &nbsp; &nbsp;Memory: 95.1M (peak: 112.1M)<br>&nbsp; &nbsp; &nbsp; &nbsp; CPU: 1.868s<br>&nbsp; &nbsp; &nbsp;CGroup: /system.slice/system-code\x2dserver.slice/code-server@ubuntu.service<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;├─ 893 /usr/lib/code-server/lib/node /usr/lib/code-server<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;└─1130 /usr/lib/code-server/lib/node /usr/lib/code-server/out/node/entry</strong></code><strong></strong></td></tr></tbody></table></figure>



<h2 class="wp-block-heading"><strong>3. Validate the configuration</strong></h2>



<p class="wp-block-paragraph">At this stage, the service is operational; the configuration still needs to be finalised, particularly creating the folder that will contain the code as well as the authentication.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><code><strong>ubuntu@vscode-server:~$ mkdir workspace </strong></code><strong><br></strong><code><strong>ubuntu@vscode-server:~$ cat ~/.config/code-server/config.yaml<br>bind-addr: 127.0.0.1:8080<br>auth: password<br>password:&lt;secure_password&gt;<br>cert: false</strong></code><strong></strong></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">You need to set a secure password here and verify that the <code>bind-addr</code> corresponds to your desired configuration.</p>



<p class="wp-block-paragraph">If you wish to directly test the service in its current state, use <code>0.0.0.0:8080</code>. Then restart the service and access the interface via <code>http://&lt;IP_PUBLIQUE&gt;:8080</code>.</p>



<p class="wp-block-paragraph">After providing the password found in the <code>config.yaml</code> in the authentication window, you will gain direct access to VS Code in the browser.</p>



<p class="wp-block-paragraph">From this deployment, you can then partially address the issue of getting a stable development environment.</p>



<p class="wp-block-paragraph">At this stage, it is possible to directly clone your GitHub repositories or to use the <code>workspace</code> folder to clone them.<br>This is recommended for greater longevity, as you will see in the second chapter.</p>



<p class="wp-block-paragraph">To perform a test commit via the vscode-server interface, you must configure git locally (just once) so that the authentication of the remote repository runs correctly.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><code><strong>ubuntu@vscode-server:~$ git config user.email </strong></code><strong>&#8220;mail@foo.bar&#8221;</strong><br><code><strong>ubuntu@vscode-server:~$ git config --global </strong></code><a href="http://user.name" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer"><strong>user.name</strong></a><code><strong>"John Doe"</strong></code></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">From this step onwards, you can use the remote development environment with vscode-server, while enjoying nearly all the features you might have locally, but with the advantages of having an environment dedicated to this use.</p>



<p class="wp-block-paragraph">⚠️ <strong>Reminder: in its current state, the deployment made here is not “production ready”!</strong></p>



<p class="wp-block-paragraph">The aim of this first chapter is to introduce the service, with the instructions here to help you familiarize yourself with the environment. Therefore, please ensure that you do not operate the service as deployed here for more than a few hours!</p>



<p class="wp-block-paragraph">The environment will need to be secured, as it is directly exposed on the Internet. We’ll talk about this in the <a href="https://blog.ovhcloud.com/remote-development-2-security-performance/" target="_blank" rel="noreferrer noopener" data-wpel-link="internal">following chapters</a>.</p>



<p class="wp-block-paragraph">By now, you have an operational development environment that is already capable of supporting a real application project!</p>



<p class="wp-block-paragraph">The instance is online, VS Code Server is responding in the browser, the workspace is ready, and the first repository has been cloned and opened as if on a local machine. This foundation demonstrates that it is possible to abstract from the hardware to gain portability and more easily share a common configuration within a team or a remote development workstation.</p>



<p class="wp-block-paragraph"><strong>In the upcoming chapters</strong>, this minimum viable environment will be gradually enhanced with persistent storage, backup mechanisms, and secure access via HTTPS. It will then be fully automated through Infrastructure as Code, in order to transition from a simple technical test to a genuine development platform ready for internal production.</p>
<img loading="lazy" decoding="async" src="//blog.ovhcloud.com/wp-content/plugins/matomo/app/matomo.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Fblog.ovhcloud.com%2Fremote-development-1-first-deployment%2F&amp;action_name=Remote%20development%20%231%20%26%238211%3B%20First%20Deployment&amp;urlref=https%3A%2F%2Fblog.ovhcloud.com%2Ffeed%2F" style="border:0;width:0;height:0" width="0" height="0" alt="" />]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Copy.Fail (CVE-2026-31431): How to Rapidly Protect OVHcloud MKS Clusters from the Linux Kernel Zero-Day</title>
		<link>https://blog.ovhcloud.com/copy-fail-cve-2026-31431-how-to-rapidly-protect-ovhcloud-mks-clusters-from-the-linux-kernel-zero-day/</link>
		
		<dc:creator><![CDATA[Aurélie Vache]]></dc:creator>
		<pubDate>Thu, 30 Apr 2026 13:42:17 +0000</pubDate>
				<category><![CDATA[OVHcloud Engineering]]></category>
		<category><![CDATA[Tranches de Tech & Co — Tech bites]]></category>
		<category><![CDATA[OVHcloud]]></category>
		<category><![CDATA[Security]]></category>
		<guid isPermaLink="false">https://blog.ovhcloud.com/?p=31485</guid>

					<description><![CDATA[A newly disclosed Linux kernel zero-day, CVE-2026-31431, &#8220;Copy.Fail&#8221;, is one of the most serious privilege-escalation vulnerabilities in recent years. Discovered by Theori and publicly disclosed on April 29, 2026, Copy.Fail is a Linux kernel zero-day that roots every distribution since 2017. Unlike many local privilege-escalation flaws that depend on race conditions, kernel address leaks, or [&#8230;]<img src="//blog.ovhcloud.com/wp-content/plugins/matomo/app/matomo.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Fblog.ovhcloud.com%2Fcopy-fail-cve-2026-31431-how-to-rapidly-protect-ovhcloud-mks-clusters-from-the-linux-kernel-zero-day%2F&amp;action_name=Copy.Fail%20%28CVE-2026-31431%29%3A%20How%20to%20Rapidly%20Protect%20OVHcloud%20MKS%20Clusters%20from%20the%20Linux%20Kernel%20Zero-Day&amp;urlref=https%3A%2F%2Fblog.ovhcloud.com%2Ffeed%2F" style="border:0;width:0;height:0" width="0" height="0" alt="" />]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="683" src="https://blog.ovhcloud.com/wp-content/uploads/2026/04/ChatGPT-Image-30-avr.-2026-15_38_36-1024x683.png" alt="" class="wp-image-31492" style="aspect-ratio:1.4992503748125936;width:406px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/04/ChatGPT-Image-30-avr.-2026-15_38_36-1024x683.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/04/ChatGPT-Image-30-avr.-2026-15_38_36-300x200.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/04/ChatGPT-Image-30-avr.-2026-15_38_36-768x512.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/04/ChatGPT-Image-30-avr.-2026-15_38_36.png 1536w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">A newly disclosed Linux kernel zero-day, <a href="https://app.opencve.io/cve/CVE-2026-31431" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">CVE-2026-31431</a>, &#8220;<strong>Copy.Fail&#8221;,</strong> is one of the most serious privilege-escalation vulnerabilities in recent years.</p>



<p class="wp-block-paragraph">Discovered by Theori and publicly disclosed on April 29, 2026, <a href="https://copy.fail/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Copy.Fail</a> is a Linux kernel zero-day that roots every distribution since 2017. Unlike many local privilege-escalation flaws that depend on race conditions, kernel address leaks, or distribution-specific behavior, Copy.Fail is alarmingly reliable: it works consistently across mainstream Linux distributions with only a standard user account.</p>



<h3 class="wp-block-heading">Why the CVE-2026-31431 is dangerous?</h3>



<p class="wp-block-paragraph">Copy.Fail abuses a logic flaw in the Linux kernel’s<strong> <code>algif_aead</code></strong> crypto module, introduced through a 2017 optimization. By manipulating the kernel’s AF_ALG crypto interface, an attacker can write controlled data into the Linux page cache (the in-memory representation of trusted system binaries).</p>



<p class="wp-block-paragraph">This allows attackers to temporarily hijack binaries like <code>/usr/bin/su</code> <strong>without modifying the file on disk</strong>.</p>



<p class="wp-block-paragraph">In practical terms:</p>



<ul class="wp-block-list">
<li>A normal user can become root</li>



<li>A compromised container can escape to the host</li>



<li>A malicious CI job can root its runner</li>



<li>Shared infrastructure becomes vulnerable across tenants</li>



<li>Disk forensics may show no file tampering because only RAM is altered</li>
</ul>



<p class="wp-block-paragraph">This makes Copy.Fail especially dangerous for:</p>



<ul class="wp-block-list">
<li>Kubernetes clusters</li>



<li>CI/CD systems</li>



<li>Shared development environments</li>



<li>Cloud notebook platforms</li>



<li>Multi-tenant container infrastructure</li>
</ul>



<h3 class="wp-block-heading">How to patch it easily in your MKS clusters?</h3>



<p class="wp-block-paragraph">OVHcloud is preparing patched MKS versions including the upstream kernel fix. Patched versions are expected to be available <strong>30 April 2026</strong>, at <strong>16:00 UTC+2</strong>.</p>



<p class="wp-block-paragraph">While waiting for the next MKS release, here is a <strong>DaemonSet</strong> manifest that you can apply in your MKS clusters in order to mitigate the vulnerability.</p>



<p class="wp-block-paragraph">Create a <strong>patch-copy-fail-cve </strong>file with the following content:</p>



<pre class="wp-block-code"><code class="">apiVersion: apps/v1<br>kind: DaemonSet<br>metadata:<br>  name: patch-copy-fail-cve<br>  labels:<br>    app: patch-copy-fail-cve<br>  namespace: default<br>spec:<br>  selector:<br>    matchLabels:<br>      app: patch-copy-fail-cve<br>  updateStrategy:<br>    type: RollingUpdate<br>    rollingUpdate:<br>      maxSurge: 0<br>      maxUnavailable: 100%<br>  template:<br>    metadata:<br>      labels:<br>        app: patch-copy-fail-cve<br>    spec:<br>      hostPID: true<br>      priorityClassName: system-node-critical<br>      volumes:<br>        - name: root-mount<br>          hostPath:<br>            path: /<br>            type: Directory<br>      initContainers:<br>        - image: mks.kubernatine.ovh/docker.io/library/busybox:1.36.1<br>          name: patch-copy-fail-cve<br>          command: ["/bin/bash", "-c"]<br>          args:<br>            - |<br>              tee /etc/modprobe.d/disable-algif-aead.conf &lt;&lt;&lt;'install algif_aead /bin/false'<br>              rmmod algif_aead 2&gt;/dev/null<br>              update-initramfs -u<br>          securityContext:<br>            privileged: true<br>            runAsUser: 0<br>          volumeMounts:<br>            - name: root-mount<br>              mountPath: /<br>      containers:<br>        - image: "mks.kubernatine.ovh/registry.k8s.io/pause:3.10.1"<br>          name: pause     </code></pre>



<p class="wp-block-paragraph">Apply it:</p>



<pre class="wp-block-code"><code class="">kubectl apply -f patch-copy-fail-cve.yaml</code></pre>



<p class="wp-block-paragraph">⚠️ This mitigation has been tested on OVHcloud internal test clusters. Applying it to your own service remains under your responsibility.</p>



<p class="wp-block-paragraph">If the vulnerability has already been exploited on your cluster, this mitigation will not remediate any pre-existing compromise.<br>The recommended remediation remains the official security release, which will be made available as soon as possible.</p>



<p class="wp-block-paragraph">Read more about the mitigation: <a href="https://github.com/rootsecdev/cve_2026_31431#mitigation" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">https://github.com/rootsecdev/cve_2026_31431#mitigation</a></p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>
<img loading="lazy" decoding="async" src="//blog.ovhcloud.com/wp-content/plugins/matomo/app/matomo.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Fblog.ovhcloud.com%2Fcopy-fail-cve-2026-31431-how-to-rapidly-protect-ovhcloud-mks-clusters-from-the-linux-kernel-zero-day%2F&amp;action_name=Copy.Fail%20%28CVE-2026-31431%29%3A%20How%20to%20Rapidly%20Protect%20OVHcloud%20MKS%20Clusters%20from%20the%20Linux%20Kernel%20Zero-Day&amp;urlref=https%3A%2F%2Fblog.ovhcloud.com%2Ffeed%2F" style="border:0;width:0;height:0" width="0" height="0" alt="" />]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
