Customizing Resellers

Limiting the number of users a reseller can create

As of DirectAdmin version 1.59, the number of users a reseller can create is controlled in the reseller packagesopen in new window.

How resellers could customize the default web page and suspended pages

Starting from DirectAdmin version 1.51, additional directories exist in the reseller home directory (as well in the admin home directory), like:

Which contain the default files from /usr/local/directadmin/data/templates/suspended. These could be customized after copying to /usr/local/directadmin/data/templates/custom/suspended. The same is true for the default/ directory.

It will also now include an .htaccess file to prevent any caching of the html/htm/js/css files, so that the moment a domain is unsuspended, the client's browser won't cache the suspended page.

I want a shared IP among many resellers

Before the global IP typeopen in new window, only the server IP could be shared among many Resellers, and shared IPs could only "officially" exist in one Reseller at a time. This is no longer the case with the implementation of global IPs.

Global IPs

One may allow multiple resellers to use a shared secondary IP with DirectAdmin now via the shared IP option global=yes.
This will be set by the Admin in the Admin Level -> IP Manager for a given "shared" IP. Once an IP is global, it can then be assigned to multiple Resellers, and will be treated as a shared IP. Accessing the IP directly should go to the Admin's shared area, rather than the Reseller's shared area.

This feature replaces the following guide: in new window

The Reseller Level -> IP Manager will always hide the User count for global shared IPs.

The "Remove from Reseller" button will remove any global shared IP from all Reseller/Admin ip.list files, but as before, does require the value to be 0 prior to DA allowing removal.

Setting a status=free IP to be global from the details page will automatically assign this IP to the current Admin, and convert the status to shared.

Note that, with the implementation of this feature, you can now remove the server IP from a Reseller! In Admin Level -> IP Manager, when you select the server IP checkbox, if you previously clicked "Free from Reseller", it would throw an error. This button is now allowed and DA will use the current drop-down Reseller selector to know which reseller to remove the server IP from.

CMD_* calls and JSON relating to the implementation of global IPs

To save changes, you can either use:

method: POST
global=yes|no  #ABSENCE of global=* counts as no, since it's a checkbox.


method: POST
set_global=<any text>
global=yes|no  #DIFFERENT FROM ABOVE in that absence of global implies yes.

You can pass global=no if you want to set it to no for the selected IPs. Enhanced does not do this.

When viewing the details of an IP:


if set, there will be:

"global": "yes"

The global value might not be present, which can be assumed set to "no". If "yes", then there could be multiple Resellers/Admins managing this IP.

For all loads of the details of the IP, of any status, DA will scan all Reseller/Admin ip.list files to see who has this IP listed. This array will be shown as:


This is primarily for informational purposes, but can be handy in case the IP value is more than 0 and you're not sure who's on it (alternatively, one could check the Show All Users page).

Relative Skins

The admin/ip_manager_details.html file has the following form:

|*if global="yes"|
|*if status="shared"|
|*if status="free"|
|*if SHOW_GLBOAL="yes"|
<tr><td class=list_alt>|LANG_GLOBAL|</td><td class=list_alt>
		<form class='mb0' action='CMD_IP_MANAGER_DETAILS' method='POST'>
			<input type='hidden' name='action' value='global'>
			<input type='hidden' name='ip' value='|ip|'>
			<input type='checkbox' name='global' value='yes' |GLOBAL_CHECKED|> When enabled, this IP can be used by multiple Resellers
			<input type='submit' value='|LANG_SAVE|' class='float_right'>

Creation of Users now lists global IPs. Instead of shared, they'll show as: - Shared - Global
Global - randomly selected

which will assume the Reseller has a global IP assigned in their account.

The randomly selected value will be:


The same values will be listed in the Admin Backup -> Restore area (CMD_ADMIN_BACKUP).

The call to CMD_IP_CONFIG?json=yes will also include have_global=yes if there are global IPs.

Keep in mind, a global IP address is a sub-set of a shared IP. So having a global IP address by default means you have at least one shared.

The CMD_IP_CONFIG?json=yes also includes a Select box array as:

"ip_list" { "0": { ... } }

in the standard select-box format DA provides in other areas.


The following is retained for troubleshooting purposes and for those that may require this functionality but be using an older version of DirectAdmin that doesn't support the Global IP feature.

There might be a case where you don't want to give your Resellers the server IP, and only let them all share 1 "shared IP" between them.

Assumptions: - Server IP - Shared IP

  1. Ensure the shared IP has been created in the Admin Level -> IP Manager. Assign it to the "admin" account on that page, then go to: Admin -> Reseller Level -> IP Manager and ensure the IP is set as "shared".

  2. Now we want all newly created Resellers to have the server IP swapped with this shared IP upon their creation. To do this, create the /usr/local/directadmin/scripts/custom/ script and add the code:

       if [ -s ${IPL} ]; then
               STR="perl -pi -e \'s/^${SERVER}\\$/${SHARED}/\' ${IPL}"
               eval ${STR}

               echo "Swapped server IP ${SERVER} with shared IP ${SHARED} for $username";
       exit 0;
  1. Make it executable:
chmod 755 /usr/local/directadmin/scripts/custom/
  1. Lastly, when you create your Reseller, just make sure you assign them to the server IP, and it will be swapped with the shared IP for their control.

NOTE: Their User Level domain will still be set to the server IP. More perl regex calls would be needed to accomplish that (user.conf, user.ip_list, httpd.conf, domains/, domains/, /var/named/

How to add your own headers in welcome messages and lost password messages

If you want to set a header in the welcome message, example:

Content-Type: text/plain; charset=windows-1251

you would add:

|?HEADER=Content-Type: text/plain; charset=windows-1251|

to your welcome message.

Note: you can already add:


to the very top of your welcome message, to get DA to add:

MIME-Version: 1.0
Content-Type: text/html

Also, no "creative" headers are allowed. DA does strict character checking to make sure you headers are sane.

For international messages that need UTF-8 encoding, add this line:

|?HEADER=Content-Type: text/plain; charset=utf-8|

Extra headers can now be used. Their token names will be:


in addition to the already existing token value HEADER .


|?HEADER=MIME-Version: 1.0|
|?HEADER2=Content-Type: text/plain; charset=utf8|

This does not apply to the HEADER value used in tickets, only welcome emails.

Related keywords/files:

Last Updated: