Enough is a self-hostable infrastructure based on libvirt, OpenStack and Ansible. It provides the following services:

  • Nextcloud, a suite of client-server software for creating and using file hosting services.
  • Discourse, a discussion platform built for the next decade of the Internet. Use it as a mailing list, discussion forum, long-form chat room, and more!
  • Mattermost, a flexible messaging platform that enables secure team collaboration.
  • Hugo, a static web site generator.
  • Weblate, a libre web-based translation tool with tight version control integration. It provides two user interfaces, propagation of translations across components, quality checks and automatic linking to source files.
  • Wekan, a kanban board which allows a card-based task and to-do management.
  • Etherpad, a highly customizable online editor providing collaborative editing in really real-time.
  • GitLab, a web-based DevOps lifecycle tool that provides a Git-repository manager providing wiki, issue-tracking and continuous integration/continuous deployment pipeline features.
  • OpenVPN, that implements virtual private network (VPN) techniques to create secure point-to-point or site-to-site connections in routed or bridged configurations and remote access facilities

The enough CLI controls an OpenStack based infrastructure and the services that run on top of it, with Ansible.


  • An account on a supported OpenStack provider:

  • The clouds.yml credentials for:

Quick start

  • Install Docker.

  • Copy clouds.yml in ~/.enough/ and edit to add password: next to auth_url:, under the production: name. For instance:

    openstack_provider: fuga
          auth_url: ""
          user_id: "ef5cae1b61b8424594a6ddf94a28381c"
          password: "lDk9vOLIXFW09oWcuQEiq0sjB4cV"
          user_domain_id: "b919e18e477a889bf89f89e9d9"
          project_domain_id: "b919e186cb07a889bf89f89e9d9"
          project_id: "25481e67871b4de39ae63fa2008029"
        region_name: "ams"
        interface: "public"
        identity_api_version: 3
  • Add the enough CLI to ~/.bashrc:

    eval "$(docker run --rm enoughcommunity/enough:latest install)"
  • Create the Nextcloud service with:

    $ enough --domain service create cloud


If the command fails, because of a network failure or any other reason, it is safe to run it again. It is idempotent.

  • Login with user admin password mynextcloud

  • Display the hosts that were created and the services they run:

    $ enough --domain info
    bind-host ip= port=22
    cloud-host ip= port=22