With official images
Tested with i-doit 38 and Debian 13 Trixie
This guide describes how to install i-doit Pro using the official synetics container images via Docker Compose. The stack consists of two services — app (Apache + PHP + i-doit) and db (MariaDB) — and is ready to use on a Linux server within a few minutes.
For TLS termination, an optional third service running nginx is added.
System Requirements#
The general system requirements apply. Additionally required:
- Docker ≥ 24 with the Compose plugin
- Root privileges or
sudoaccess - Internet access to the registry
registry.on.ops.docupike.net(images are public, no login required)
Install Docker#
First, install the required base packages:
1 2 | |
Docker is set up via the official repository:
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
Verify the versions:
1 2 | |
Create the project structure#
Create a directory for the i-doit stack. The subdirectories nginx/, tls/ and apache/ are only needed for the TLS variant — if you start with plain HTTP, you can omit them:
1 2 | |
Create the configuration files#
compose.yaml#
1 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | |
Plain HTTP setup
If you start without TLS, replace the expose: block in the app service with ports: ["8080:8080"] and remove the entire nginx service. The rest of this guide assumes the full TLS stack.
.env#
1 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | |
Replace the passwords
The values root, idoit, admin are only intended for the initial setup. Replace them with strong, individual passwords before going into production.
Important: IDOIT_APP_URL
IDOIT_APP_URL must point to the externally reachable URL of the application — including scheme (https://) and hostname. The value is only written to the i-doit settings on the very first container start; later changes to the .env alone are not enough (see the Troubleshooting section).
Apache override for reverse proxy headers#
1 | |
1 2 3 4 | |
This file tells the Apache inside the app container that TLS is terminated externally. Without it, i-doit will generate internal links as plain HTTP.
nginx configuration#
1 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | |
TLS certificate#
For test and inhouse environments, a self-signed certificate is sufficient. Adjust CN and subjectAltName to the real address — hostname and/or IP under which i-doit will be reachable:
1 2 3 4 5 | |
Production certificate
In production, use a certificate from your internal PKI or from Let's Encrypt and store it as tls/idoit.crt (public cert plus any intermediates) and tls/idoit.key (private key) — the nginx service picks them up automatically.
Start the containers#
1 2 3 | |
On the first start, i-doit loads the database schemas, creates the default tenant, and runs the initial setup. Depending on the machine this takes 30–90 seconds. Follow the progress:
1 2 | |
As soon as app and db are healthy, the application is reachable at the URL set in IDOIT_APP_URL. Quick check:
1 | |
Expected response:
1 | |
First login#
- Open the browser:
https://idoit.example.com/ - On the login page, choose the tenant
CMDB(matchesIDOIT_DEFAULT_TENANT). - Log in with the values defined in the
.env(default:admin/admin). - Open the user menu in the top right and change the password immediately.
- Open the Admin Center with the password from
IDOIT_ADMIN_CENTER_PASSWORD(link on the login page) and change the password there as well.
Default credentials after installation
- i-doit: user
admin, passwordadmin - Admin Center: user
admin, passwordadmin
Activate Pro mode#
The default image initialises i-doit in cloud mode. For classic Pro operation (all add-ons installable from the Subscription Center, no cloud indicator in the UI) a one-time switch is required — right after the first successful setup, before production use:
1 2 3 4 5 6 7 8 9 10 11 | |
What the three commands do:
| Command | Effect |
|---|---|
--unset-cloud | Resets the cloud flag in the i-doit database. |
--noncloudable --enable all | Enables all features that are disabled by default in cloud mode (LDAP, JDisc integration, logbook archive, etc.). |
sed command | Sets $g_is_cloud in the persistent config.inc.php to 0. |
Add-on install and Pro features
Without this step, installing add-ons from the Subscription Center fails and certain modules are not visible. The switch is a one-time operation per installation.
Install the license#
i-doit Pro requires a valid license token or license file to activate. The shipped .env contains IDOIT_LICENSE_TOKEN=changeme — the initial license activation will, as expected, fail in the logs, but the stack still starts.
Variant A — web license token#
Copy the token from the synetics customer portal, write it to the .env, and restart the app container:
1 2 | |
Variant B — license file#
Place the license file (license.key) into the data volume and replace the token line with the file variant:
1 2 3 4 | |
After the restart, the license status can be verified in the Admin Center on the License tab.
Update#
Upgrade to a newer image version:
- Open
compose.yamland set the image tag (:38) to the target version in both services. - Set
IDOIT_VERSIONin the.envto the same value. - Run the update:
1 2 3 | |
docker compose up -d detects the changed tag, pulls the new image, and replaces the container in place. On startup, the entrypoint runs the database migration automatically. The application data in the app and db volumes is preserved.
Back up before updating
Back up the volumes before changing the major version. See the Backup section.
Backup#
Back up both persistent volumes: app (configurations, uploads, logs, license) and db (database files). The following script writes a daily backup to /opt/idoit-backup/:
1 2 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
1 | |
To run the script daily:
1 2 | |
Uninstall#
1 2 | |
Data loss
--volumes deletes the app and db volumes irrevocably. Back up first if the data is still needed.
Troubleshooting#
app enters a crash loop, log ends with unbound variable#
The .env is incomplete. The entrypoint runs with set -u and aborts as soon as an expected variable is unset. Common gaps in self-made .env files:
IDOIT_VERSION— must match the image tag (tag:38⇒IDOIT_VERSION=38).IDOIT_SYSTEM_SETTINGS— may be empty, but must be set.
License error Authentication failed, please check your weblicense token#
The token is wrong or still the placeholder changeme. Put the correct token from the customer portal into the .env, then sudo docker compose restart app.
Add-on from the Subscription Center fails with rmdir: Device or resource busy#
Full error:
1 2 | |
Cause: Some compose templates ship a tmpfs mount on /var/www/html/temp in the app service. Inside the container, /var/www/html is a symlink to /var/www/idoit/updates/versions/<version>/files, so the mount sits on exactly the directory the add-on installer tries to recreate via rmdir. That fails as long as a tmpfs mount is active.
Fix: Remove the tmpfs block in the app service of compose.yaml (the example compose in this guide does not contain it on purpose) and restart the stack:
1 | |
Add-ons are missing, UI shows cloud hints#
The image initialises i-doit as a cloud instance. Pro-specific features and certain add-on installations are disabled in that mode. Run the Activate Pro mode step.
After logout, the browser lands on localhost:8080 with ERR_CONNECTION_REFUSED#
IDOIT_APP_URL is still set to http://localhost:8080, but the access happens from another host.
Important
The value from the .env is written to the i-doit settings only on the very first container start. When fixed afterwards, a container restart is not enough — the value also has to be set inside the application via the console command.
1 2 3 4 5 6 7 8 9 10 11 | |
The idoit:set-env-var command is also the clean way to switch later from HTTP to HTTPS or to a different hostname.
Links such as /admin redirect to http://...:8080/...#
Apache inside the app container listens on port 8080/HTTP. On automatic directory-slash redirects (e.g. /admin without trailing slash → /admin/), Apache builds an absolute Location header with that internal port. Since Apache doesn't know about the upstream TLS proxy, the browser ends up on an unreachable http://<host>:8080/... URL.
Fix: Set the proxy_redirect directive in the nginx reverse proxy to rewrite exactly those Location headers. The example nginx/idoit.conf in this guide already contains the line:
1 | |
After that, sudo docker compose restart nginx.
Healthcheck fails although the UI is reachable#
The healthcheck runs curl --fail http://localhost:8080/health. If it fails only briefly on startup, that is the start_period of 30 s — the setup just isn't done yet. If the status stays unhealthy, look for errors in the setup step:
1 | |
Next step#
The installation is complete. Next, install a license and apply the initial settings: