diff --git a/profile/manifests/docker.pp b/profile/manifests/docker.pp
index c2709ada4b8a35e3a8c2e00fb6d5a89f5ed1d188..1f8938ca3151096e59522eb7320b34287cf361dd 100644
--- a/profile/manifests/docker.pp
+++ b/profile/manifests/docker.pp
@@ -1,4 +1,5 @@
 # Install Docker
 class profile::docker {
   include docker
+  include docker::compose
 }
diff --git a/profile/manifests/onlyoffice.pp b/profile/manifests/onlyoffice.pp
new file mode 100644
index 0000000000000000000000000000000000000000..1c0f1b584bee55abb869815790ed85959ed9e8a4
--- /dev/null
+++ b/profile/manifests/onlyoffice.pp
@@ -0,0 +1,81 @@
+# An ONLYOFFICE installation based on Docker
+class profile::onlyoffice (
+  String $image_tag = 'latest',
+  String $jwt_secret = '',
+  Boolean $skip_fonts_generation = false,
+) {
+
+  $network = 'onlyoffice'
+
+  docker_network { $network:
+    ensure   => present,
+    subnet   => '172.19.0.0/24',
+    gateway  => '172.19.0.1',
+    ip_range => '172.19.0.0/29',
+  }
+
+  docker::run { 'onlyoffice-documentserver':
+    image   => "infrarednetwork/onlyoffice-documentserver:${image_tag}",
+    net     => $network,
+    env     => [
+      'RABBITMQ_SERVER_URL=amqp://guest:guest@onlyoffice-rabbitmq',
+      'REDIS_SERVER_HOST=onlyoffice-redis',
+      'REDIS_SERVER_PORT=6379',
+      'POSTGRESQL_SERVER_HOST=onlyoffice-postgresql',
+      'POSTGRESQL_SERVER_PORT=5432',
+      'POSTGRESQL_SERVER_DB_NAME=onlyoffice',
+      'POSTGRESQL_SERVER_USER=onlyoffice',
+      'POSTGRESQL_SERVER_PASS=onlyoffice',
+      "JWT_SECRET=${jwt_secret}",
+      "SKIP_FONTS_GENERATION=${skip_fonts_generation}",
+    ],
+    ports   => [
+      '8000:8000',
+      '8080:8080',
+    ],
+    depends => [
+      'onlyoffice-postgresql',
+      'onlyoffice-redis',
+      'onlyoffice-rabbitmq',
+    ],
+    volumes => [
+      'onlyoffice-log:/var/log/onlyoffice',
+      'onlyoffice-www-data:/var/www/onlyoffice/Data',
+      'onlyoffice-lib:/var/lib/onlyoffice',
+      'system-custom-fonts:/usr/share/fonts/truetype/custom',
+    ],
+    require => [
+      Docker::Run['onlyoffice-redis'],
+      Docker::Run['onlyoffice-rabbitmq'],
+      Docker::Run['onlyoffice-postgresql'],
+    ],
+  }
+
+  docker::run { 'onlyoffice-redis':
+    image   => 'redis:alpine',
+    net     => $network,
+    command => 'redis-server --appendonly yes',
+    expose  => '6379',
+    volumes => [ 'redis-data:/data' ],
+  }
+
+  docker::run { 'onlyoffice-rabbitmq':
+    image   => 'rabbitmq:alpine',
+    net     => $network,
+    expose  => '5672',
+    volumes => [ 'rabbitmq-home:/var/lib/rabbitmq' ],
+  }
+
+  docker::run { 'onlyoffice-postgresql':
+    image   => 'postgres',
+    net     => $network,
+    env     => [
+      'POSTGRES_DB=onlyoffice',
+      'POSTGRES_USER=onlyoffice',
+      'POSTGRES_PASSWORD=onlyoffice',
+    ],
+    expose  => '5432',
+    volumes => [ 'postgresql-data:/var/lib/postgresql/data' ],
+  }
+
+}
diff --git a/role/manifests/onlyoffice.pp b/role/manifests/onlyoffice.pp
index 31c632918d5494f09771f75328bc0b75ee12b6c5..81c1b799bbf827f3567e6ad02152ee5f90b64609 100644
--- a/role/manifests/onlyoffice.pp
+++ b/role/manifests/onlyoffice.pp
@@ -1,4 +1,5 @@
 # Install OnlyOffice
 class role::onlyoffice {
   include profile::docker
+  include profile::onlyoffice
 }