Aller au contenu principal

7 articles tagués avec « cwcloud »

Voir tous les tags

Fork It Tunis 2025, résumé de la journée

· 2 minutes de lecture
Idriss Neumann
founder cwcloud.tech

On l'a fait ! Tunis 🇹🇳 a enfin eu sa journée de conférence orientée pour les développeurs à la cité de la culture le 5 avril.

forkit-tn-2025-hall

Comme annoncé dans un précédent blogpost, nous avions monté un très beau stand dans le but de challenger les conférenciers avec un concours IA, serverless et IoT et on a eu beaucoup de participant(e)s.

forkit-tn-2025-cwcloud-booth

Félicitons encore nos gagnant(e)s: Zayneb, Ala Eddine et Yassmine1!

forkit-tn-2025-winners

Le code source de la démo est disponible sur github et si vous voulez plus d'explications, vous pouvez visionner cette courte vidéo :

forkit-cwcloud-challenge

J'ai également eu la chance d'avoir la scène pour parler de Quickwit, Grafana et OpenTelemetry avec une autre démo. Il était prévu de le faire en anglais mais finalement le public a préféré la langue de molière. Je m'excuse pour les personnes qui auraient souhaité le voir en anglais, il y aura d'autres occasions 😅.

forkit-tn-2025-talk-quickwit

Il y aura un replay, les slides et supports sont disponibles sur github également et si vous souhaitez en apprendre davantage, vous pouvez également lire ce blogpost.

J'ai également pu assister à la keynote très inspirante "how do you learn" d'Olivier et Sonyth Huber et vous recommande de visionner le replay lorsqu'il sera publié.

Et pour finir, j'ai également pu faire visiter Sidi Bou Saïd à mon ami speaker Yacine, la plus belle place de la région de Tunis. Yacine qui a également donné un super talk sur comment il a réussi à porter Doom sur navigateur en utilisant WASM, une merveilleuse technologie.

forkit-tn-2025-sidibou

Si vous souhaitez garder le contact, en particulier si vous avez apprécié les démo et le challenge de CWCloud, nous avons un serveur discord communautaire que vous pouvez rejoindre.

Les prochaines conférences auxquelles j'assisterai seront DevoxxFR comme visiteur, SunnyTech et RivieraDev en tant que speaker. J'espère vous y voir nombreux(se)s comme d'habitude 🤩.

Footnotes

  1. Yassmine n'a pas pu rester pour recevoir son cadeau donc son ami l'a pris à sa place 😅.

L'évènement Fork It 2025 à Tunis

· 2 minutes de lecture
Idriss Neumann
founder cwcloud.tech

Comme vous le savez peut-être déjà avec nos récentes communications, un évenement Fork It aura lieu à la cité de la culture à Tunis 🇹🇳 le 5 avril 2025.

CWCloud aura un stand avec un concours IoT, IA et serverless qui consistera à lire un capteur de température et humidité DHT22 à l'aide d'un Raspberry Pi et de les envoyer à une fonction serverless et lowcode de CWCloud afin qu'elle fasse réagir des LLM avec des emojis pour indiquer s'il fait chaud ou froid. Vous aurez plus d'informations avec cette vidéo :

forkit-cwcloud-challenge

Il y aura des livres d'Aurélie Vache à gagner :

aurelie-books

Je présenterai aussi un talk à 16h55: Découvrons ensemble la relève de l'observabilité avec les logs et traces : Quickwit (le talk sera en anglais mais vous avez une version disponible en Français à BDX/IO).

Il est important de vous inscrire et de récupérer votre ticket ici. C'est vraiment peu cher pour un évènement technique de cette qualité et nous avons également un code promo qui permet de le faire descendre encore de 20% : COMWORK20.

Afin de vous enregistrer, vous devez cliquer sur "Get Tickets" :

forkit-get-tickets

Ensuite vous avez le choix pour payer en ligne soit en TND soit en Euros avec une carte de crédit :

forkit-choose-currency

Si vous utilisez tunis.events afin de payer en TND, voici comment ajouter le code promo en cliquant sur "code secret" :

forkit-ticket-tnd

Et si vous utilisez lu.ma afin de régler en Euros, pour utiliser le code promo vous devez cliquer sur "add a coupon" :

forkit-ticket-euros

On espère vous voir très nombreux à l'évènement !

Nouvelle identité CWCloud

· Une minute de lecture
Idriss Neumann
founder cwcloud.tech

new-identity-cwcloud

Vous l'aurez peut être constaté, nous avons changé d'identité visuelle et commencé à séparer les activités. CWCloud deviens un produit à part entière avec ses propres structures juridiques en cours de création (tant que c'est en cours, le produit reste sous la tutelle de la société comwork).

A cette occasion, CWCloud se munit de sa propre landing page et le blog lui a été transféré ici : cwcloud.tech.

Comwork va continuer à exister en tant que boite de service avec son propre site web qui pour rappel est le suivant : comwork.io.

Beaucoup de choses vont changer notamment vous pourrez le constater l'apparition de deux versions : community edition (opensource en licence MIT) et enterprise (propriétaire) avec des fonctionnalités en plus adaptés aux grands groupes. Les versions SaaS quant à elle pour les marchés européens/internationaux et tunisiens vont directement pointer sur des version enterprise.

Nous vous informons également que nous sommes en train de postuler chez YCombinator afin de mieux faire évoluer le produit. Nous vous tiendrons informer de l'évolution.

Replace Google Analytics with Grafana, Quickwit and CWCloud

· 6 minutes de lecture
Idriss Neumann
founder cwcloud.tech

Hi and Merry Christmas 🎄 (again yes, I didn't thought that I was going to publish another blogpost so soon 😄).

In this blogpost we'll see how to use CWCloud and Quickwit to setup beautiful dashboards like this in replacement of Google Analytics:

grafana-geomap-dashboard

Before going in detail, let's start to give you a bit of context of what brought us to do this transition.

First, Google Analytics ain't comply with the GDPR1. So basically it was becoming illegal to continue to use it despite it was an amazing tool to analyze our websites and application usages.

With the last case law, we started to use Matomo as a replacement and we're still providing Matomo as a Service in our CWCloud SaaS. And it worked pretty well (even if I find the UI a bit old-fashion)...

However I didn't like to maintain multiple stacks which, from my perspective, are serving the same purpose: observability. And yes web analytics should be part of it from my perspective.

I already explained why we choosed Quickwit as our observability core stack in previous blogposts:

So the idea was to use the same observability stack to track visitors data and index and display those on Grafana. And to be able to achieve this, we needed something very easy to add in our various frontend like a one-pixel image:

<img src="https://api.cwcloud.tech/v1/tracker/img/{mywebsite}" style="display: none;"></img>

As you can see, we provided it as an endpoint in CWCloud to complete the observability features and it's documented here.

This endpoint is writing a log which looks like this:

INFO:root:{"status": "ok", "type": "tracker", "time": "2024-12-20T13:46:23.358233", "host": "82.65.240.115", "user_agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 18_1_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.1.1 Mobile/15E148 Safari/604.1", "referrer": "https://www.cwcloud.tech/", "website": "www.cwcloud.tech", "device": "mobile", "browser": "safari", "os": "ios", "details": {"brand": "apple", "type": "iphone"}, "infos": {"status": "ok", "status_code": 200, "city": "Saint-Quentin", "region": "Hauts-de-France", "country": "France", "region_code": "HDF", "country_iso": "FR", "lookup": "FRA", "timezone": "Europe/Paris", "utc_offset": "FR", "currency": "EUR", "asn": "AS12322", "org": "Free SAS", "ip": "xx.xx.xx.xx", "network": "xx.xx.xx.0/24", "version": "IPv4", "hostname": "xx-xx-xx-xx.subs.proxad.net", "loc": "48.8534,2.3488"}, "level": "INFO", "cid": "742b7629-7a26-4bc6-bd2a-3e41bee32517"}

So at the end, it contain a JSON payload we can extract and index:

{
"status": "ok",
"type": "tracker",
"time": "2024-12-20T13:46:23.358233",
"host": "82.65.240.115",
"user_agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 18_1_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.1.1 Mobile/15E148 Safari/604.1",
"referrer": "https://www.cwcloud.tech/",
"website": "www.cwcloud.tech",
"device": "mobile",
"browser": "safari",
"os": "ios",
"details": {
"brand": "apple",
"type": "iphone"
},
"infos": {
"status": "ok",
"status_code": 200,
"city": "Saint-Quentin",
"region": "Hauts-de-France",
"country": "France",
"region_code": "HDF",
"country_iso": "FR",
"lookup": "FRA",
"timezone": "Europe/Paris",
"utc_offset": "FR",
"currency": "EUR",
"asn": "AS12322",
"org": "Free SAS",
"ip": "xx.xx.xx.xx",
"network": "xx.xx.xx.0/24",
"version": "IPv4",
"hostname": "xx-xx-xx-xx.subs.proxad.net",
"loc": "48.8534,2.3488"
},
"level": "INFO",
"cid": "742b7629-7a26-4bc6-bd2a-3e41bee32517"
}

So let's start by creating the Quickwit mapping:

{
"doc_mapping": {
"mode": "lenient",
"field_mappings": [
{
"name": "time",
"type": "datetime",
"fast": true,
"fast_precision": "seconds",
"indexed": true,
"input_formats": [
"rfc3339",
"unix_timestamp"
],
"output_format": "unix_timestamp_nanos",
"stored": true
},
{
"indexed": true,
"fast": true,
"name": "cid",
"type": "text",
"tokenizer": "raw"
},
{
"indexed": true,
"fast": true,
"name": "website",
"type": "text",
"tokenizer": "raw"
},
{
"indexed": true,
"fast": true,
"name": "device",
"type": "text",
"tokenizer": "raw"
},
{
"indexed": true,
"fast": true,
"name": "os",
"type": "text",
"tokenizer": "raw"
},
{
"indexed": true,
"fast": true,
"name": "browser",
"type": "text",
"tokenizer": "raw"
},
{
"indexed": true,
"fast": true,
"name": "host",
"type": "ip"
},
{
"indexed": true,
"fast": true,
"name": "hostname",
"type": "text",
"tokenizer": "raw"
},
{
"indexed": true,
"fast": true,
"name": "user_agent",
"type": "text",
"tokenizer": "raw"
},
{
"indexed": true,
"fast": true,
"name": "referrer",
"type": "text",
"tokenizer": "raw"
},
{
"indexed": true,
"fast": true,
"name": "lookup",
"type": "text",
"tokenizer": "raw"
},
{
"name": "details",
"type": "object",
"field_mappings": [
{
"indexed": true,
"fast": true,
"name": "brand",
"type": "text",
"tokenizer": "raw"
},
{
"indexed": true,
"fast": true,
"name": "type",
"type": "text",
"tokenizer": "raw"
}
]
},
{
"name": "infos",
"type": "object",
"field_mappings": [
{
"indexed": true,
"fast": true,
"name": "status",
"type": "text",
"tokenizer": "raw"
},
{
"name": "status_code",
"fast": true,
"indexed": true,
"type": "u64"
},
{
"indexed": true,
"fast": true,
"name": "city",
"type": "text",
"tokenizer": "raw"
},
{
"indexed": true,
"fast": true,
"name": "region",
"type": "text",
"tokenizer": "raw"
},
{
"indexed": true,
"fast": true,
"name": "country",
"type": "text",
"tokenizer": "raw"
},
{
"indexed": true,
"fast": true,
"name": "region_code",
"type": "text",
"tokenizer": "raw"
},
{
"indexed": true,
"fast": true,
"name": "country_iso",
"type": "text",
"tokenizer": "raw"
},
{
"indexed": true,
"fast": true,
"name": "timezone",
"type": "text",
"tokenizer": "raw"
},
{
"indexed": true,
"fast": true,
"name": "utc_offset",
"type": "text",
"tokenizer": "raw"
},
{
"indexed": true,
"fast": true,
"name": "currency",
"type": "text",
"tokenizer": "raw"
},
{
"indexed": true,
"fast": true,
"name": "asn",
"type": "text",
"tokenizer": "raw"
},
{
"indexed": true,
"fast": true,
"name": "network",
"type": "text",
"tokenizer": "raw"
},
{
"indexed": true,
"fast": true,
"name": "ip",
"type": "ip"
},
{
"indexed": true,
"fast": true,
"name": "org",
"type": "text",
"tokenizer": "raw"
},
{
"indexed": true,
"fast": true,
"name": "version",
"type": "text",
"tokenizer": "raw"
},
{
"indexed": true,
"fast": true,
"name": "loc",
"type": "text",
"tokenizer": "raw"
}
]
}
],
"timestamp_field": "time",
"max_num_partitions": 200,
"index_field_presence": true,
"store_source": false,
"tokenizers": []
},
"index_id": "analytics-v0.4",
"search_settings": {
"default_search_fields": [
"website",
"cid",
"host",
"referrer",
"infos.ip",
"infos.country",
"infos.country_iso",
"infos.city",
"infos.region_code",
"infos.timezone",
"infos.currency",
"infos.version"
]
},
"version": "0.8"
}

Note: as you can see, we moved the lookup field to the root document in order to be able to use the Geomap plugin of Grafana.

Once it's done, we can use Vector, as usual, to parse this log line with the following remap function:

remap_analytics:
inputs:
- "kubernetes_logs"
type: "remap"
source: |
.time, _ = to_unix_timestamp(.timestamp, unit: "nanoseconds")

.message = string!(.message)
.message = replace(.message, r'^[^:]*:[^:]*:', "")

.body, err = parse_json(.message)
if err != null || is_null(.body) || is_null(.body.cid) || is_null(.body.type) || .body.type != "tracker" {
abort
}

.cid = .body.cid
.website = .body.website
.browser = .body.browser
.device = .body.device
.os = .body.os
.host = .body.host
.referrer = .body.referrer
.user_agent = .body.user_agent
.infos = .body.infos
.details = .body.details

if is_string(.infos.lookup) {
.lookup = del(.infos.lookup)
}

del(.timestamp)
del(.body)
del(.message)
del(.source_type)

And then the sink2:

sinks:
analytics:
type: "http"
method: "post"
inputs: ["remap_analytics"]
encoding:
codec: "json"
framing:
method: "newline_delimited"
uri: "https://xxxx:yyyyy@quickwit.yourinstance.com:443/api/v1/analytics-v0.4/ingest"

Once it's done you'll be able to do some visualization in Grafana using the Geomap plugin:

grafana-geomap

Very nice, isn't it?

Have a nice end of year and Merry Christmas 🎄 again!

Footnotes

  1. General Data Protection Regulation, a European law you can find here

  2. A sink is an output of vector which is working like an ETL (for Extract Transform Load)

Installing CWCloud on K8S is so easy!

· 3 minutes de lecture
Idriss Neumann
founder cwcloud.tech

Hi and Merry Christmas 🎄.

With all the demos we've done lately, some people asks us a way to install CWCloud easily on localhost to give it a try, especially for the serverless part.

Let's start with a quick reminder on what is CWCloud: it's an agnostic deployment accelerator platform which provides the following features:

  • DaaS or Deployment as a Service: you can checkout this tutorial to understand how DaaS is working with cwcloud and what's the difference between IaaS, PaaS and DaaS.
  • FaaS or Function as a Service: you can checkout this blogpost to understand what is the purpose of this feature
  • Observability and monitoring: you can checkout this tutorial

At the time of writing, here's the different component used by CWCloud to run:

  • A RESTful API
  • A Web GUI1
  • Some asynchronous workers to schedule run the serverless function
  • ObjectStorage
  • PostgreSQL as relational and JSON database
  • Redis for the cache and message queuing
  • Flyway DB SQL migrations

It can be seen as a bit heavy but believe me it's not, it can run on a single Raspberry PI!

In order to self-host CWCloud, we provide three ways (the three are relying on docker images):

But this is not enough to bootstap it in seconds. In this blogpost we will show you how to run CWCloud with our CLI cwc using kind2 in order to use some feature which doesn't not depends on the external services like the FaaS or the monitor features.

Just a bit of reminder, here's how to install kind, kubect and helm with brew:

brew install kubectl
brew install helm
brew install kind

Then you can also install our cwc cli using brew3:

brew tap cwc/cwc https://gitlab.comwork.io/oss/cwc/homebrew-cwc.git 
brew install cwc

Once it's done, you can create your cluster with kind:

kind create cluster

And then, simply run the following command:

cwc bootstrap

Then, wait until the pods are Running:

kubectl -n cwcloud get pods

cwcloud-pods

Then you can open port-forward to the API and GUI in order to be able to open the GUI in a web browser:

cwc bootstrap pfw

You'll be able to access the GUI through this URL: localhost:3000

cwcloud-k8s-bootstrap

The default user and password are the following:

  • Username: sre-devops@comwork.io
  • Password: cloud456

Of course if you need to override some helm configurations, you can with this command:

cwc bootstrap --values my-values.yaml

It's might be necessary if you want to configure the DaaS feature which is in a "no operation" mode by default. In order to fully use it, you'll have to follow all those configurations tutorials depending on the cloud provider you want to enable.

And finally if you want to uninstall, here's the command:

cwc bootstrap uninstall

Now I'll let you with this five minutes video tutorial on how to use the FaaS, you can fully reproduce on your local environment:

faas-tutorial-player

Enjoy!

Footnotes

  1. Graphical User Interface

  2. Of course you can replace kind, by something equivalent like k3d or minikube as you wish.

  3. We also provide other way to install our cli if you don't have brew available on your operating system, you can refer to this tutorial. We're supporting Linux, MacOS and Windows for both amd64 and arm64 architectures.

Le premier meeting Fork-IT en Tunisie

· 2 minutes de lecture
Ayoub Abidi
fullstack lead developer

Le 24 septembre 2024, CWCloud a eu l'honneur d'accueillir le tout premier Meetup de la communauté Fork It en Tunisie, marquant ainsi le premier événement de la communauté Fork IT en Tunisie.

Fork It est une communauté grandissante de passionnés du développement web et de l'UX, qui a choisi les bureaux de CWCloud à Tunis, comme lieu de rencontre pour une journée dédiée au partage des connaissances, aux discussions perspicaces et au réseautage.

forkit

L'événement a été marqué par deux conférences captivantes données par d'éminents orateurs :

  • Idriss Neumann a présenté un exposé sur le « Déploiement en tant que service (DaaS) », montrant comment transformer l'infrastructure en tant que code en une API et un produit fonctionnels.
  • Sofiane Boukhris a ensuite partagé son expertise sur le thème « Designing Effectively : Maîtriser le temps, le coût et la valeur », apportant un éclairage pratique sur la gestion et l'optimisation des projets.

Entre les sessions, les participants ont eu l'occasion de nouer des contacts et de discuter de leurs expériences au cours d'un cocktail décontracté.

L'événement a été un grand succès, en partie grâce au soutien inestimable des sponsors CWCloud et CamelStudio.

CWCloud, société de services leader dans le développement d'applications, l'automatisation du déploiement dans le nuage et l'externalisation de l'infrastructure de production, était ravie d'accueillir cet événement marquant.

En soutenant de telles initiatives, CWCloud continue de renforcer son rôle dans la construction d'une communauté technologique plus connectée et collaborative.

Vous pouvez visionner l'intégralité de la conférence ici :

forkit-replay-09-2024

Restez à l'écoute pour d'autres événements et collaborations passionnants de CWCloud et de la communauté Fork It !

Deep dive CWCloud avec OVHCloud

· 2 minutes de lecture
Ayoub Abidi
fullstack lead developer

Récemment, CWCloud a collaboré avec OVHCloud pour un événement intitulé « Sous le capot de Comwork.io1 », où Idriss Neumann, PDG de Comwork.io, et Thierry Chantier, DevRel chez OVHCloud, ont partagé un regard approfondi sur le parcours de CWCloud dans le cloud et sur l'évolution de la plateforme.

Au cours de cet événement, Idriss a présenté au public la genèse de CWCloud, en soulignant comment la plateforme s'est développée depuis sa création et comment elle exploite les technologies du cloud pour optimiser les flux de travail et améliorer l'efficacité. Il a également dévoilé des informations passionnantes sur le fonctionnement des équipes, en donnant un aperçu des coulisses de leur processus de développement.

L'un des points clés de l'événement a été la vision d'Idriss d'un ensemble d'outils unifiés pour les environnements en nuage, abordant les complexités du travail avec différents fournisseurs de nuage. Il a souligné l'importance de créer des solutions qui rationalisent l'automatisation du déploiement et la gestion de l'infrastructure, reflétant ainsi la mission de Comwork qui est de simplifier les opérations dans le nuage.

Pour clôturer l'événement, Idriss a partagé une fonctionnalité exclusive d'OVHCloud qui est unique sur la scène mondiale, donnant au public un aperçu des capacités de cloud de pointe qui pourraient remodeler l'avenir des services de cloud.

Cette collaboration entre CWCloud et OVHCloud a non seulement mis en évidence l'utilisation innovante de l'infrastructure cloud par CWCloud, mais a également démontré l'engagement commun à stimuler la transformation numérique dans l'écosystème cloud.

Vous pouvez visionner l'intégralité de l'événement ici :

ovh-live-meetup-06-2023

Restez à l'écoute pour d'autres collaborations et innovations passionnantes de CWCloud et OVHCloud !

Footnotes

  1. Comwork cloud a été renommé en CWCloud depuis, plus d'informations ici