An open-source test management system with XML-RPC API.
163
TestLink 1.9.20 is an open-source test management system, and its XML-RPC API lets other tools create and run test projects. AI assistants now do that work through MCP servers, which call the same API. Upstream's 1.9.20 code has a typo in the XML-RPC class that breaks every API call with HTTP 500, and the API creates test cases, test suites and builds that only the web UI can delete.
This image runs a fork of TestLink 1.9.20 with the API fixed and ten methods added, ready for the TestLink MCP server.
Save this as docker-compose.yml:
services:
db:
image: postgres:9.6
restart: unless-stopped
environment:
- POSTGRES_USER=teste
- POSTGRES_PASSWORD=teste
- POSTGRES_DB=testlink
volumes:
- postgres:/var/lib/postgresql/data
app:
image: dogkeeper886/testlink-code:latest
restart: unless-stopped
depends_on:
- db
ports:
- "8090:80"
volumes:
- logs:/var/testlink/logs
- upload_area:/var/testlink/upload_area
volumes:
postgres:
logs:
upload_area:
Then start it:
docker compose up -d
Postgres reads the teste / teste account only when it first creates the postgres volume, so change it before the first start.
The mcp-1.0.0 image stops at the install wizard's folder check, because it predates the fix that makes the log and upload folders writable. Use a later tag, or build from source until Docker Hub has one.
Open http://localhost:8090, choose New installation, and enter these values on the database page:
| Field | Value |
|---|---|
| Database type | Postgres (9.1 and later) |
| Database host | db |
| Database name | testlink |
| Database admin login | teste |
| Database admin password | teste |
| TestLink DB login | testlink |
| TestLink DB password | testlink |
The TestLink login and password are new, and you can choose your own.
Run the database function the wizard asks for:
docker compose exec -T app cat install/sql/postgres/testlink_create_udf0.sql \
| docker compose exec -T db psql -U teste -d testlink
Log in as admin with password admin, and change the password.
The wizard writes its database config inside the app container, and a recreated container loses it. The wizard drops TestLink's tables when it runs again on the same database, so save the config before you recreate or upgrade the container:
docker compose cp app:/var/www/html/config_db.inc.php .
Then mount it under app in docker-compose.yml and restart:
volumes:
- logs:/var/testlink/logs
- upload_area:/var/testlink/upload_area
- ./config_db.inc.php:/var/www/html/config_db.inc.php:ro
docker compose up -d
In TestLink, open My Settings (the icon at the top right) and click Generate a new key under API interface. Then add the MCP server to Claude Code with that key:
claude mcp add testlink -- docker run --rm -i --network host \
-e TESTLINK_URL=http://localhost:8090 \
-e TESTLINK_API_KEY=<your key> \
dogkeeper886/testlink-mcp:latest
--network host lets the MCP container reach localhost:8090 on Linux. Drop it on macOS or Windows and use http://host.docker.internal:8090. The testlink-mcp page covers other MCP clients and the server's tools.
TestLink sends mail for password resets and notifications. A maildev container catches that mail and keeps it away from real inboxes. Save this as custom_config.inc.php:
<?php
$g_tl_admin_email = '[email protected]';
$g_from_email = '[email protected]';
$g_return_path_email = '[email protected]';
$g_smtp_host = 'maildev';
$g_smtp_port = 1025;
Add the maildev service under services:
maildev:
image: maildev/maildev:latest
restart: unless-stopped
ports:
- "1080:1080"
Mount the file in the app service's volumes list:
- ./custom_config.inc.php:/var/www/html/custom_config.inc.php:ro
Run docker compose up -d, and sent mail appears at http://localhost:1080.
TestLink writes logs to /var/testlink/logs and attachments to /var/testlink/upload_area, both on named volumes. Read them through the container:
docker compose exec app ls /var/testlink/logs
docker compose exec app tail -f /var/testlink/logs/userlog0.log
The repository's own compose file builds the image and adds maildev:
git clone https://github.com/dogkeeper886/testlink-code.git
cd testlink-code
docker compose up -d --build
The build copies the repo folder into the image, so config files there survive every rebuild, and git ignores both config files.
Copy the database config out after the first install:
docker compose cp app:/var/www/html/config_db.inc.php .
Turn on email, then rebuild:
sed 's/testlink-maildev/maildev/' docker/custom_config.inc.php > custom_config.inc.php
docker compose up -d --build
The repository's restore service loads a MySQL sample dump, so it stops at its first MySQL command on this PostgreSQL stack.
docker compose down -v
rm -f config_db.inc.php
docker compose up -d
down -v deletes the database, logs and uploads. Then run the first install again.
The base image, php:7.4-apache, runs on Debian 11, whose support ended in August 2026. Debian's security repository has removed its packages, so the image installs from the main repository only, and keeps only the fixes that repository carries. PHP 7.4's security support ended in 2022. Run this stack only on a local machine or a trusted network.
Content type
Image
Digest
sha256:39cf96e3b…
Size
225.1 MB
Last updated
12 days ago
docker pull dogkeeper886/testlink-code