Skip to content

CleverCloud/pulumi-clevercloud

Repository files navigation

Pulumi Clever Cloud Provider

Native Pulumi provider for Clever Cloud infrastructure management.

Overview

This provider allows you to manage Clever Cloud resources using Pulumi infrastructure as code. It's a native provider built with the Pulumi Provider Framework, not a bridged Terraform provider.

Features

Application Resources

  • Docker - Deploy containerized applications
  • Node.js - Deploy Node.js/Bun applications
  • PHP - Deploy PHP applications
  • Python - Deploy Python applications
  • Ruby - Deploy Ruby applications
  • Java - Deploy Java/JAR/WAR applications
  • Go - Deploy Go applications
  • Static - Deploy static websites

Addon Resources

  • PostgreSQL - Managed PostgreSQL databases
  • MySQL - Managed MySQL databases
  • MongoDB - Managed MongoDB databases
  • Redis - Managed Redis instances

Installation

TypeScript/JavaScript (Node.js)

npm install @clevercloud/pulumi

Python

pip install pulumi_clevercloud

.NET

dotnet add package Pulumi.CleverCloud

Go

go get github.com/clevercloud/pulumi-clevercloud/sdk/go/clevercloud

Java

<dependency>
    <groupId>com.clever-cloud.pulumi</groupId>
    <artifactId>clevercloud</artifactId>
</dependency>

Configuration

The provider requires Clever Cloud OAuth credentials. You can provide them via:

  1. Provider configuration:
import * as clevercloud from "@clevercloud/pulumi";

const provider = new clevercloud.Provider("clevercloud", {
    token: "your-oauth-token",
    secret: "your-oauth-secret",
    organization: "orga_xxxxx", // optional
});
  1. Environment variables:
export CLEVER_TOKEN="your-oauth-token"
export CLEVER_SECRET="your-oauth-secret"
export CLEVER_ORGANIZATION="orga_xxxxx"  # optional

Usage Examples

Deploy a Node.js Application

import * as clevercloud from "@clevercloud/pulumi";

const app = new clevercloud.NodeJS("my-api", {
    name: "My API",
    minInstanceCount: 1,
    maxInstanceCount: 2,
    smallestFlavor: "S",
    biggestFlavor: "M",
    region: "par",
    packageManager: "npm",
    environment: {
        NODE_ENV: "production",
    },
});

export const deployUrl = app.deployUrl;

Deploy a Docker Application

import * as clevercloud from "@clevercloud/pulumi";

const dockerApp = new clevercloud.Docker("my-docker-app", {
    name: "My Docker App",
    minInstanceCount: 1,
    maxInstanceCount: 1,
    smallestFlavor: "XS",
    biggestFlavor: "XS",
    dockerfile: "Dockerfile",
    containerPort: 8080,
});

Create a PostgreSQL Database

import * as clevercloud from "@clevercloud/pulumi";

const db = new clevercloud.PostgreSQL("my-db", {
    name: "Production Database",
    plan: "S",
    region: "par",
    version: "15",
});

export const dbHost = db.host;
export const dbPort = db.port;
export const dbName = db.database;

Full Stack Example

import * as clevercloud from "@clevercloud/pulumi";

// Create PostgreSQL database
const db = new clevercloud.PostgreSQL("db", {
    name: "App Database",
    plan: "S",
    region: "par",
});

// Create Redis cache
const cache = new clevercloud.Redis("cache", {
    name: "App Cache",
    plan: "S",
    region: "par",
});

// Deploy Node.js API
const api = new clevercloud.NodeJS("api", {
    name: "Backend API",
    minInstanceCount: 2,
    maxInstanceCount: 4,
    smallestFlavor: "S",
    biggestFlavor: "M",
    region: "par",
    environment: {
        DATABASE_URL: pulumi.interpolate`postgresql://${db.user}:${db.password}@${db.host}:${db.port}/${db.database}`,
        REDIS_URL: pulumi.interpolate`redis://:${cache.password}@${cache.host}:${cache.port}`,
        NODE_ENV: "production",
    },
    redirectHttps: true,
});

export const apiUrl = api.deployUrl;

Common Application Fields

All application resources share these common fields:

  • name - Application name (required)
  • description - Application description
  • minInstanceCount - Minimum number of instances (required)
  • maxInstanceCount - Maximum number of instances (required)
  • smallestFlavor - Smallest instance size: XS, S, M, L, XL (required)
  • biggestFlavor - Biggest instance size: XS, S, M, L, XL (required)
  • buildFlavor - Dedicated build instance size
  • region - Deployment region (default: "par")
  • stickySessions - Enable sticky sessions
  • redirectHttps - Force HTTPS redirect
  • appFolder - Application folder in git repository
  • environment - Environment variables
  • dependencies - List of linked application/addon IDs

Available Instance Flavors

  • XS - 1 vCPU, 256MB RAM
  • S - 1 vCPU, 1GB RAM
  • M - 2 vCPU, 2GB RAM
  • L - 4 vCPU, 4GB RAM
  • XL - 6 vCPU, 8GB RAM
  • XXL - 8 vCPU, 16GB RAM

Available Regions

  • par - Paris, France (default)
  • rbx - Roubaix, France
  • mtl - Montreal, Canada
  • sgp - Singapore
  • syd - Sydney, Australia

Examples

Complete, runnable examples are available in the examples/ directory:

Node.js/TypeScript

  • Docker Application - Deploy a Docker container with auto-scaling, custom environment variables, and HTTP port configuration

Python

  • PostgreSQL Addon - Create a PostgreSQL database with specific version and plan

Each example includes:

  • Complete Pulumi program
  • README.md with instructions
  • Configuration examples
  • Expected outputs

Development

Building the Provider

make build_provider

Running Tests

# Unit tests
make test_unit

# E2E tests (requires Clever Cloud credentials)
export CLEVER_TOKEN="your-token"
export CLEVER_SECRET="your-secret"
export CLEVER_ORGANIZATION="your-org-id"

./tests/e2e/docker_nodejs.sh
./tests/e2e/postgresql_python.sh

See TESTING_STATUS.md for complete testing documentation.

Generating SDKs

make build_sdks

This generates SDKs for:

  • Node.js/TypeScript → sdk/nodejs/
  • Python → sdk/python/
  • Go → sdk/go/
  • .NET → sdk/dotnet/
  • Java → sdk/java/

Local Installation

make dev

Architecture

This is a native Pulumi provider built with:

  • Pulumi Provider Framework - Modern provider SDK
  • Clever Cloud SDK - Official Go client (go.clever-cloud.dev/client)
  • Infer-based Resources - Automatic schema generation
  • OAuth Authentication - Using official Clever Cloud consumer credentials

Project Structure

.
├── provider/
│   ├── cmd/pulumi-resource-clevercloud/  # Provider binary
│   ├── pkg/
│   │   ├── config/                        # Provider configuration
│   │   ├── client/                        # API client wrapper
│   │   ├── provider/                      # Provider registration
│   │   └── resources/
│   │       ├── common/                    # Shared fields
│   │       ├── applications/              # Application resources
│   │       └── addons/                    # Addon resources
│   └── go.mod
├── sdk/                                   # Generated SDKs
│   ├── nodejs/
│   ├── python/
│   ├── dotnet/
│   ├── go/
│   └── java/
└── Makefile

Contributing

Contributions are welcome! Please ensure:

  • Field names match exactly the Clever Cloud API
  • All resources implement full CRUD operations
  • Tests cover Create → Refresh → Destroy lifecycle
  • No invented fields - only what the API supports

License

Apache-2.0

Links

About

Pulumi provider

Resources

License

Stars

Watchers

Forks

Packages

No packages published