<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.osnexus.com/index.php?action=history&amp;feed=atom&amp;title=Resource_Group_Services_%28Multitenancy%29</id>
	<title>Resource Group Services (Multitenancy) - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.osnexus.com/index.php?action=history&amp;feed=atom&amp;title=Resource_Group_Services_%28Multitenancy%29"/>
	<link rel="alternate" type="text/html" href="https://wiki.osnexus.com/index.php?title=Resource_Group_Services_(Multitenancy)&amp;action=history"/>
	<updated>2026-11-02T21:31:36Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.osnexus.com/index.php?title=Resource_Group_Services_(Multitenancy)&amp;diff=28347&amp;oldid=prev</id>
		<title>Qadmin: osn-seo-utilities: creating-services-resource-group-multitenancy @ 5345e164d402 (approved in the portal)</title>
		<link rel="alternate" type="text/html" href="https://wiki.osnexus.com/index.php?title=Resource_Group_Services_(Multitenancy)&amp;diff=28347&amp;oldid=prev"/>
		<updated>2026-11-02T18:45:04Z</updated>

		<summary type="html">&lt;p&gt;osn-seo-utilities: creating-services-resource-group-multitenancy @ 5345e164d402 (approved in the portal)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;This page explains how to run a containerized service (eg. SFTP, FTP, Nextcloud, Resilio, RabbitMQ or Valkey) against the network shares of a [[Create Resource Group|Resource Group]]. QuantaStor runs each service in a container, gives it the group&amp;#039;s shares, publishes its ports only on the group&amp;#039;s network, and moves it with the storage pool when an HA pool fails over.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Section !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| [[#How resource group services work|How resource group services work]] || Service Configs, shares, binding network and pool scope&lt;br /&gt;
|-&lt;br /&gt;
| [[#Available services|Available services]] || The services you can run and their default ports&lt;br /&gt;
|-&lt;br /&gt;
| [[#Before you start|Before you start]] || Shares, addresses and ports to have ready&lt;br /&gt;
|-&lt;br /&gt;
| [[#Step 1: Create the Service Config|Step 1]], [[#Step 2: Create the resource group|Step 2]], [[#Step 3: Add the network shares|Step 3]] || The workflow, start to finish&lt;br /&gt;
|-&lt;br /&gt;
| [[#Adding or changing services on an existing group|Adding or changing services]] || Changing the services on a group that already exists&lt;br /&gt;
|-&lt;br /&gt;
| [[#CLI equivalents|CLI equivalents]] || The same workflow from the {{Code|1=qs}} CLI&lt;br /&gt;
|-&lt;br /&gt;
| [[#Troubleshooting|Troubleshooting]] || A service that does not start or cannot be reached&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== How resource group services work ==&lt;br /&gt;
&lt;br /&gt;
A resource group set up for service container management ties together three things:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Service Configs&amp;#039;&amp;#039;&amp;#039; -- one per service, holding that service&amp;#039;s settings (user name, password, port and so on). A group can hold one Service Config of each service type.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Network shares&amp;#039;&amp;#039;&amp;#039; -- the data the service works on. Each share in the group is bind-mounted into the service&amp;#039;s container.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;A binding network&amp;#039;&amp;#039;&amp;#039; -- a subnet in CIDR form. The service&amp;#039;s ports are published only on the appliance addresses inside that subnet, so a client on another network cannot reach it. Two resource groups cannot bind the same subnet.&lt;br /&gt;
&lt;br /&gt;
The group&amp;#039;s &amp;#039;&amp;#039;&amp;#039;Storage Pool Scope&amp;#039;&amp;#039;&amp;#039; decides which addresses count and where the service keeps its state:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Scope !! Service binds to !! Service state lives on&lt;br /&gt;
|-&lt;br /&gt;
| Local Storage Pool(s) || physical network ports in the binding subnet || the appliance&amp;#039;s local container directory&lt;br /&gt;
|-&lt;br /&gt;
| HA Storage Pool || HA virtual interfaces (VIFs) in the binding subnet || the HA storage pool itself, so it moves with the pool&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Because state for an HA-scoped group lives on the pool, settings such as the SFTP host keys survive a container restart, an upgrade and an HA failover. When the pool fails over, QuantaStor stops the group&amp;#039;s containers on the old owner, imports the pool on the new owner and starts the containers there from the same state.&lt;br /&gt;
&lt;br /&gt;
[[File:havif_overview.png|thumb|right|800px|The High-availability VIF Management tab. An HA-scoped resource group publishes its services only on an HA virtual interface whose address is in the group&amp;#039;s binding subnet.]]&lt;br /&gt;
&lt;br /&gt;
{{Note|&amp;#039;&amp;#039;&amp;#039;An HA-scoped group needs an HA virtual interface in its subnet.&amp;#039;&amp;#039;&amp;#039; For a group scoped to an HA Storage Pool, QuantaStor publishes the service only on a [[High-availability VIF Management|virtual interface]] of that pool whose address falls inside the group&amp;#039;s binding subnet. If the pool has no such VIF, the service does not start. The resource group is still created and no error appears in the web interface; the only sign is a warning in the service log that it could not determine a bind address. Create the VIF before you add the service. This applies to every service type.}}&lt;br /&gt;
&lt;br /&gt;
== Available services ==&lt;br /&gt;
&lt;br /&gt;
We are adding new containerized services with each new release of QuantaStor but those offered at the time of this writing include &amp;#039;&amp;#039;&amp;#039;Service Type&amp;#039;&amp;#039;&amp;#039; of:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Service !! What it is for !! Default port(s)&lt;br /&gt;
|-&lt;br /&gt;
| SFTP Module || SFTP access to the group&amp;#039;s shares for one account, confined (chrooted) to those shares || 2222&lt;br /&gt;
|-&lt;br /&gt;
| FTP Service || FTP access to the group&amp;#039;s shares for one account, with optional passive mode || 20, 21&lt;br /&gt;
|-&lt;br /&gt;
| Nextcloud || Web file sharing and sync; the group&amp;#039;s shares appear as Nextcloud External Storage || 8081 (HTTP)&lt;br /&gt;
|-&lt;br /&gt;
| Resilio Agent || A Resilio Connect agent that synchronizes the group&amp;#039;s shares || --&lt;br /&gt;
|-&lt;br /&gt;
| RabbitMQ Message Broker || An AMQP message broker with its management console, keeping its data on a share || 5672 (AMQP), 15672 (management)&lt;br /&gt;
|-&lt;br /&gt;
| Valkey Data Store || A Redis-compatible key-value store that persists to a share || 6379&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The SFTP, Nextcloud, RabbitMQ and Valkey services are defined by service definition files ({{Code|1=qs_containerhandler_&amp;lt;service&amp;gt;.conf}}) in {{Code|1=/opt/osnexus/quantastor/conf/}}, and their form fields come from those files. Additional definitions for MinIO, Globus Connect Server and a demonstration FTP module ship as {{Code|1=.example}} files and are not offered unless enabled. To build a service of your own, see [[Developing Service Containers]].&lt;br /&gt;
&lt;br /&gt;
== Before you start ==&lt;br /&gt;
&lt;br /&gt;
* Create the [[Network Shares|network shares]] the service will use. For an HA-scoped group, the shares must be on that HA pool; for a local group, on a local pool. QuantaStor refuses a share that is outside the group&amp;#039;s scope.&lt;br /&gt;
* Make sure the appliance has an address in the subnet clients will use -- a physical port for a local group, or an HA virtual interface on the pool for an HA group (see the note above).&lt;br /&gt;
* Pick a port that nothing else on the appliance uses. Do not give Nextcloud port 8080, which the QuantaStor web interface uses, and do not give SFTP port 22, which the appliance&amp;#039;s own SSH service uses.&lt;br /&gt;
&lt;br /&gt;
== Step 1: Create the Service Config ==&lt;br /&gt;
&lt;br /&gt;
{{Navigation|Multitenancy &amp;amp;rarr; Services &amp;#039;&amp;#039;(section)&amp;#039;&amp;#039; &amp;amp;rarr; Services &amp;#039;&amp;#039;(toolbar group)&amp;#039;&amp;#039; &amp;amp;rarr; Create Config &amp;#039;&amp;#039;(toolbar)&amp;#039;&amp;#039;}}&lt;br /&gt;
&lt;br /&gt;
You can also right-click in the &amp;#039;&amp;#039;&amp;#039;Services&amp;#039;&amp;#039;&amp;#039; section, or on a resource group, and choose &amp;#039;&amp;#039;&amp;#039;Create Service Config...&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Name&amp;#039;&amp;#039;&amp;#039; -- a name for this configuration. The default is {{Code|1=service-config-N}}.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Service Type&amp;#039;&amp;#039;&amp;#039; -- the service to run, from the table above.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Service Configuration Options&amp;#039;&amp;#039;&amp;#039; -- the settings for the chosen service. This part of the dialog changes with the service type.&lt;br /&gt;
&lt;br /&gt;
For the SFTP, Nextcloud, RabbitMQ and Valkey services, the options form is built from the service definition, so the fields differ from service to service. The common kinds are:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;User name and password&amp;#039;&amp;#039;&amp;#039; for the account the service creates. Passwords are kept out of the service log and out of the options file the service reads. A password field never shows a default.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Port&amp;#039;&amp;#039;&amp;#039; -- a number field with a default and an allowed range.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Check boxes&amp;#039;&amp;#039;&amp;#039; for on/off settings, such as Valkey&amp;#039;s append-only persistence.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;File uploads&amp;#039;&amp;#039;&amp;#039; for keys and certificates, such as an SFTP public key or host key.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Data share&amp;#039;&amp;#039;&amp;#039; -- for Nextcloud and Valkey, which share holds the service&amp;#039;s own data.&lt;br /&gt;
* An &amp;#039;&amp;#039;&amp;#039;Advanced Settings&amp;#039;&amp;#039;&amp;#039; group on some services. On SFTP it holds &amp;#039;&amp;#039;&amp;#039;read-only&amp;#039;&amp;#039;&amp;#039; access and the UID and GID that own files written through the service.&lt;br /&gt;
&lt;br /&gt;
Fields the definition marks as mandatory are checked when you click &amp;#039;&amp;#039;&amp;#039;OK&amp;#039;&amp;#039;&amp;#039;; the form does not mark them in advance. If one is empty, the dialog reports that one or more mandatory service option fields are empty. An optional field you leave empty takes the service&amp;#039;s default.&lt;br /&gt;
&lt;br /&gt;
For the SFTP service, you must supply a password, a public key, or both. Setting read-only makes QuantaStor mount the shares read-only into the container, so clients cannot write even if the service itself would allow it. SFTP is the only service with a read-only option.&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;FTP Service&amp;#039;&amp;#039;&amp;#039; has fixed fields: &amp;#039;&amp;#039;&amp;#039;FTP Username&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;FTP Password&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;Repeat Password&amp;#039;&amp;#039;&amp;#039;. Tick &amp;#039;&amp;#039;&amp;#039;Use FTP Passive Mode&amp;#039;&amp;#039;&amp;#039; to let clients open passive data connections; you then have to fill in the &amp;#039;&amp;#039;&amp;#039;Passive Port Range&amp;#039;&amp;#039;&amp;#039; (any range within 1-65535) and the &amp;#039;&amp;#039;&amp;#039;Passive IP Address&amp;#039;&amp;#039;&amp;#039; to advertise to clients. Passive mode is off by default.&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;Resilio Agent&amp;#039;&amp;#039;&amp;#039; takes an &amp;#039;&amp;#039;&amp;#039;Agent Name&amp;#039;&amp;#039;&amp;#039; and a &amp;#039;&amp;#039;&amp;#039;Sync File&amp;#039;&amp;#039;&amp;#039;, both required.&lt;br /&gt;
&lt;br /&gt;
Click &amp;#039;&amp;#039;&amp;#039;OK&amp;#039;&amp;#039;&amp;#039;. The Service Config appears in the &amp;#039;&amp;#039;&amp;#039;Services&amp;#039;&amp;#039;&amp;#039; section; it does nothing until you add it to a resource group.&lt;br /&gt;
&lt;br /&gt;
== Step 2: Create the resource group ==&lt;br /&gt;
&lt;br /&gt;
{{Navigation|Multitenancy &amp;amp;rarr; Resource Groups &amp;#039;&amp;#039;(section)&amp;#039;&amp;#039; &amp;amp;rarr; Resource Group &amp;#039;&amp;#039;(toolbar group)&amp;#039;&amp;#039; &amp;amp;rarr; Create &amp;#039;&amp;#039;(toolbar)&amp;#039;&amp;#039;}}&lt;br /&gt;
&lt;br /&gt;
The [[Create Resource Group]] page covers every tab of this dialog. For a service group:&lt;br /&gt;
&lt;br /&gt;
# On the &amp;#039;&amp;#039;&amp;#039;General&amp;#039;&amp;#039;&amp;#039; tab, enter a &amp;#039;&amp;#039;&amp;#039;Name&amp;#039;&amp;#039;&amp;#039; and, optionally, a &amp;#039;&amp;#039;&amp;#039;Description&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;Organization&amp;#039;&amp;#039;&amp;#039;. Under &amp;#039;&amp;#039;&amp;#039;Select Resource Group Use Case&amp;#039;&amp;#039;&amp;#039;, choose &amp;#039;&amp;#039;&amp;#039;Service Container Management&amp;#039;&amp;#039;&amp;#039;. This enables the &amp;#039;&amp;#039;&amp;#039;Service Configs&amp;#039;&amp;#039;&amp;#039; tab.&lt;br /&gt;
# On the &amp;#039;&amp;#039;&amp;#039;Service Configs&amp;#039;&amp;#039;&amp;#039; tab, under &amp;#039;&amp;#039;&amp;#039;Binding Network Address Setting&amp;#039;&amp;#039;&amp;#039;, choose the &amp;#039;&amp;#039;&amp;#039;Subnet w/CIDR&amp;#039;&amp;#039;&amp;#039; the service listens on. The list shows the subnets on the appliance&amp;#039;s network ports, minus any already bound to another resource group.&lt;br /&gt;
# Under &amp;#039;&amp;#039;&amp;#039;Storage Pool Scope&amp;#039;&amp;#039;&amp;#039;, choose &amp;#039;&amp;#039;&amp;#039;Local Storage Pool(s)&amp;#039;&amp;#039;&amp;#039; or &amp;#039;&amp;#039;&amp;#039;HA Storage Pool&amp;#039;&amp;#039;&amp;#039;. For an HA scope, select the pool in the &amp;#039;&amp;#039;&amp;#039;Storage Pool&amp;#039;&amp;#039;&amp;#039; list.&lt;br /&gt;
# Select the Service Config you created in Step 1 in the grid.&lt;br /&gt;
# Click &amp;#039;&amp;#039;&amp;#039;OK&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
If the appliance has no subnet that is not already bound to a resource group, the dialog reports that there are no available subnets. Give a network port an address on a new subnet, then try again.&lt;br /&gt;
&lt;br /&gt;
To add more binding subnets later, select the group and use &amp;#039;&amp;#039;&amp;#039;Add Network Association&amp;#039;&amp;#039;&amp;#039; on the toolbar.&lt;br /&gt;
&lt;br /&gt;
== Step 3: Add the network shares ==&lt;br /&gt;
&lt;br /&gt;
{{Navigation|Multitenancy &amp;amp;rarr; Resource Groups &amp;#039;&amp;#039;(section)&amp;#039;&amp;#039; &amp;amp;rarr; Resource Group &amp;#039;&amp;#039;(toolbar group)&amp;#039;&amp;#039; &amp;amp;rarr; Add/Remove Shares &amp;#039;&amp;#039;(toolbar)&amp;#039;&amp;#039;}}&lt;br /&gt;
&lt;br /&gt;
Move the shares the service should see into &amp;#039;&amp;#039;&amp;#039;Select Network Shares for Resource Group Assignment&amp;#039;&amp;#039;&amp;#039; and click &amp;#039;&amp;#039;&amp;#039;OK&amp;#039;&amp;#039;&amp;#039;. See [[Add Remove Resources Group Network Shares]].&lt;br /&gt;
&lt;br /&gt;
Each share is bind-mounted into the container. Where it lands depends on the service: SFTP users see each share as a folder in their home directory, and Nextcloud shows them as External Storage.&lt;br /&gt;
&lt;br /&gt;
== Adding or changing services on an existing group ==&lt;br /&gt;
&lt;br /&gt;
{{Navigation|Multitenancy &amp;amp;rarr; Resource Groups &amp;#039;&amp;#039;(section)&amp;#039;&amp;#039; &amp;amp;rarr; Resource Group &amp;#039;&amp;#039;(toolbar group)&amp;#039;&amp;#039; &amp;amp;rarr; Add/Remove Service Configs &amp;#039;&amp;#039;(toolbar)&amp;#039;&amp;#039;}}&lt;br /&gt;
&lt;br /&gt;
Select the resource group, then select the Service Configs it should have. The selection replaces the group&amp;#039;s list, so a config you clear is removed. A group can hold only one Service Config of each service type; selecting two of the same type is refused.&lt;br /&gt;
&lt;br /&gt;
Removing a Service Config that is in use requires &amp;#039;&amp;#039;&amp;#039;Force&amp;#039;&amp;#039;&amp;#039;, which stops the service. See [[Add/Add Remove Resources Group Service Configs]].&lt;br /&gt;
&lt;br /&gt;
To delete a Service Config, use &amp;#039;&amp;#039;&amp;#039;Delete Config&amp;#039;&amp;#039;&amp;#039; in the &amp;#039;&amp;#039;&amp;#039;Services&amp;#039;&amp;#039;&amp;#039; toolbar group; see [[Service Config Delete]].&lt;br /&gt;
&lt;br /&gt;
== CLI equivalents ==&lt;br /&gt;
&lt;br /&gt;
List the installed service definitions and their tags with &amp;lt;code&amp;gt;[[QuantaStor CLI Command Reference#service-def-list|qs service-def-list]]&amp;lt;/code&amp;gt;. Create a Service Config with &amp;lt;code&amp;gt;[[QuantaStor CLI Command Reference#service-config-create|qs service-config-create]]&amp;lt;/code&amp;gt;, passing the definition tag and the options as a comma-separated key=value list. For example, an FTP config:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font-size: smaller&amp;quot;&amp;gt;&lt;br /&gt;
qs service-config-create --name=ftp-config1 --service-definition-tag=vsftp --service-config-options-list=ftp_user=ftpuser1,ftp_pass=aAbBcCdDeEfF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create a service group with &amp;lt;code&amp;gt;[[QuantaStor CLI Command Reference#resource-group-create|qs resource-group-create]]&amp;lt;/code&amp;gt;, giving the binding subnet with {{Code|1=--network-list}} and the scope with {{Code|1=--scope-type}} ({{Code|1=local}} or {{Code|1=HA}}) and {{Code|1=--scope}} (the pool). Add shares and Service Configs with &amp;lt;code&amp;gt;[[QuantaStor CLI Command Reference#resource-group-resource-add|qs resource-group-resource-add]]&amp;lt;/code&amp;gt;, using the {{Code|1=share}} and {{Code|1=service_config}} resource types:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font-size: smaller&amp;quot;&amp;gt;&lt;br /&gt;
qs resource-group-resource-add --resource-group=rg-sftp --resource-list=share1:share,sftp-config1:service_config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;The service does not start in an HA-scoped group.&amp;#039;&amp;#039;&amp;#039; Check that the HA pool has a virtual interface with an address in the group&amp;#039;s binding subnet, on the node that currently owns the pool. Without one, QuantaStor has no address to publish the service on.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Clients cannot connect.&amp;#039;&amp;#039;&amp;#039; Connect to an appliance address inside the group&amp;#039;s binding subnet -- for an HA group, the VIF address. The service is not published on other addresses. Check the port too: the services use their own defaults (for example 2222 for SFTP), not the protocol&amp;#039;s usual port.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;A share is refused when added.&amp;#039;&amp;#039;&amp;#039; The share is on a pool outside the group&amp;#039;s scope. Move the share, or create a group scoped to the share&amp;#039;s pool.&lt;br /&gt;
&lt;br /&gt;
== Related pages ==&lt;br /&gt;
&lt;br /&gt;
* [[Create Resource Group]]&lt;br /&gt;
* [[Modify Resource Group]]&lt;br /&gt;
* [[Service Config Create]]&lt;br /&gt;
* [[Service Config Delete]]&lt;br /&gt;
* [[Add/Add Remove Resources Group Service Configs]]&lt;br /&gt;
* [[Add Remove Resources Group Network Shares]]&lt;br /&gt;
* [[High-availability VIF Management]]&lt;br /&gt;
* [[Network Shares]]&lt;br /&gt;
* [[Developing Service Containers]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;#039;&amp;#039;Verified against QuantaStor 6.9.0.&amp;#039;&amp;#039;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:admin_guide]]&lt;/div&gt;</summary>
		<author><name>Qadmin</name></author>
	</entry>
</feed>