aMule is a multi-platform client for the ED2K file sharing network and based on the windows client eMule. aMule started in August 2003, as a fork of xMule, which is a fork of lMule.
The image is based on debian:trixie-slim and compiles aMule from source code.
Docker images are available in DockerHub and GHCR.
docker pull ngosang/amule
# or
docker pull ghcr.io/ngosang/amuleStable:
latest— Latest stable release.3.0.0-1— Specific stable version.
Development:
develop— Latest development build (compiled from aMule master branch).develop-20260512-abc1234— Specific development build: date + aMule upstream commit.
Debug:
debug— Latest debug build (compiled from aMule master branch).debug-20260512-abc1234— Specific debug build: date + aMule upstream commit.
Note
The debug images are compiled in Debug mode (CMAKE_BUILD_TYPE=Debug, full symbols, no optimizations) and ship with the debugging tools gdb, strace, lsof and heaptrack preinstalled, so you can debug crashes and memory issues of the aMule development builds. As a result they are larger and slower than the stable and develop images and are not intended for production use. The stable and develop images are regular optimized builds without these tools.
The architectures supported by this image are:
- linux/386
- linux/amd64
- linux/arm/v5
- linux/arm/v7
- linux/arm64/v8
- linux/ppc64le
- linux/riscv64
- linux/s390x
The web interface is at: <your-ip>:4711
Note
If you don't set GUI_PWD / WEBUI_PWD, a random password is generated on the first start and printed to the container logs. Run docker logs amule to retrieve it.
For better download speed you have to open these ports:
- 4662 TCP
- 4665 UDP
- 4672 UDP
Here are some example snippets to help you get started creating a container.
Note
When you start aMule all shared folders are scanned. The user interface will not be available until the process is finished. You can check the logs and CPU usage to know the status.
Compatible with docker-compose v2 schemas.
---
services:
amule:
image: ngosang/amule
container_name: amule
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/London
- GUI_PWD=<fill_password>
- WEBUI_PWD=<fill_password>
- MOD_AUTO_RESTART_ENABLED=true
- MOD_AUTO_RESTART_CRON=0 6 * * *
- MOD_AUTO_SHARE_ENABLED=false
- MOD_AUTO_SHARE_DIRECTORIES=/downloads/incoming;/my_movies
ports:
- "4711:4711" # Web interface (amuleweb)
- "4712:4712" # External connections (amulegui, amulecmd, amuleweb)
- "4662:4662" # ED2K client-to-client TCP (required for High ID)
- "4665:4665/udp" # ED2K server UDP (global searches, TCP port +3)
- "4672:4672/udp" # Extended eMule protocol and Kademlia UDP
volumes:
- <fill_amule_configuration_path>:/home/amule/.aMule
- <fill_amule_downloads_path>:/downloads
restart: unless-stoppedNote
aMule stores completed downloads in /downloads/incoming and incomplete downloads in /downloads/temp inside the container. These paths can be changed with the INCOMING_DIR and TEMP_DIR environment variables. You can also mount /downloads/incoming and /downloads/temp as separate volumes, but be aware that completed files will be copied instead of moved, since they would reside on different filesystems.
docker run -d \
--name=amule \
-p 4711:4711 \
-p 4712:4712 \
-p 4662:4662 \
-p 4665:4665/udp \
-p 4672:4672/udp \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Europe/London \
-e GUI_PWD=<fill_password> `#optional` \
-e WEBUI_PWD=<fill_password> `#optional` \
-e MOD_AUTO_RESTART_ENABLED=true `#optional` \
-e 'MOD_AUTO_RESTART_CRON=0 6 * * *' `#optional` \
-e MOD_AUTO_SHARE_ENABLED=false `#optional` \
-e MOD_AUTO_SHARE_DIRECTORIES=/downloads/incoming;/my_movies `#optional` \
-v <fill_amule_configuration_path>:/home/amule/.aMule \
-v <fill_amule_downloads_path>:/downloads \
--restart unless-stopped \
ngosang/amuleContainer images are configured using parameters passed at runtime (such as those above). These parameters are separated by a colon and indicate <external>:<internal> respectively. For example, -p 8080:80 would expose port 80 from inside the container to be accessible from the host's IP on port 8080 outside the container.
| Parameter | Function |
|---|---|
-p 4711 |
Web interface port (amuleweb). |
-p 4712 |
External connections port (amulegui, amulecmd, amuleweb). |
-p 4662 |
ED2K client-to-client TCP (required for High ID). It must be open to the Internet. |
-p 4665/udp |
ED2K server UDP (global searches, TCP port +3). It must be open to the Internet. |
-p 4672/udp |
Extended eMule protocol and Kademlia UDP. It must be open to the Internet. |
-e PUID=1000 |
for UserID - see below for explanation. |
-e PGID=1000 |
for GroupID - see below for explanation. |
-e UMASK=0002 |
Set the umask for file creation. Optional, defaults to 0002 (files: 664, dirs: 775, group write access). |
-e TZ=Europe/London |
Specify a timezone to use EG Europe/London. |
-e GUI_PWD=<fill_password> |
Set Remote GUI password. It will overwrite the password in the config files. |
-e WEBUI_PWD=<fill_password> |
Set Web UI password. It will overwrite the password in the config files. |
-e TEMP_DIR=/downloads/temp |
Path inside the container for incomplete downloads. Optional, defaults to /downloads/temp. |
-e INCOMING_DIR=/downloads/incoming |
Path inside the container for completed downloads. Optional, defaults to /downloads/incoming. |
-e FIX_PERMISSIONS=true |
Change ownership of the temp and incoming directories at startup. Optional, enabled by default. |
-e MOD_AUTO_RESTART_ENABLED=true |
Enable aMule auto restart. Check modifications section. |
-e 'MOD_AUTO_RESTART_CRON=0 6 * * *' |
aMule auto restart cron mask. Check modifications section. |
-e MOD_AUTO_SHARE_ENABLED=false |
Enable aMule auto share. Check modifications section. |
-e MOD_AUTO_SHARE_DIRECTORIES=/downloads/incoming;/my_movies |
aMule auto share directories with subdirectories. Check modifications section. |
-v /home/amule/.aMule |
Path to save aMule configuration. |
-v /downloads |
Path to downloads. aMule uses /downloads/incoming for completed downloads and /downloads/temp for incomplete downloads. |
When using volumes (-v flags) permissions issues can arise between the host OS and the container, we avoid this issue by allowing you to specify the user PUID and group PGID.
Ensure any volume directories on the host are owned by the same user you specify and any permissions issues will vanish like magic.
In this instance PUID=1000 and PGID=1000, to find yours use id user as below:
$ id username
uid=1000(dockeruser) gid=1000(dockergroup) groups=1000(dockergroup)The Docker image ships with the default aMule Web UI theme. The previously bundled AmuleWebUI-Reloaded theme has been removed because it is not compatible with aMule 3.0.0.
You can still use a custom theme by mounting it as an external volume inside the web
server templates directory (/usr/share/amule/webserver/<ThemeName>) and pointing the
Template option to it in the amule.conf file:
services:
amule:
# ... rest of the service definition ...
volumes:
- /path/to/my-theme:/usr/share/amule/webserver/MyThemeThen edit the amule.conf file and set Template=MyTheme. Leave Template= empty to
use the default theme.
Note
The normal configuration uses the default bridge networking with the ports: mappings shown above, forwarding those ports on your router manually if needed. Only use UPnP if your router supports it and you specifically want automatic port forwarding, or if you are stuck with a Low ID and cannot forward ports by hand.
aMule is compiled with UPnP support, which lets aMule automatically open the required ports on a UPnP-capable router so you get a High ID without manually forwarding ports.
UPnP needs direct access to the host network to talk to the router, so it only works when the container runs with host networking. Set network_mode: host and do not add a ports: section: in host networking the container shares the host network stack directly, so the ports: mappings are ignored.
---
services:
amule:
image: ngosang/amule
container_name: amule
network_mode: host # required for UPnP (do not add a `ports:` section)
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/London
- GUI_PWD=<fill_password>
- WEBUI_PWD=<fill_password>
volumes:
- <fill_amule_configuration_path>:/home/amule/.aMule
- <fill_amule_downloads_path>:/downloads
restart: unless-stoppedYou also have to enable UPnP in aMule itself, then restart the container. In amule.conf set UPnPEnabled=1, which forwards the eD2k TCP port (4662) and the UDP ports (4665, 4672). Optionally UPnPECEnabled=1 forwards the External Connections port and UPnPWebServerEnabled=1 forwards the Web UI port.
Note
UPnPTCPPort (default 50000) is not a forwarded port — it is the local port aMule's UPnP stack uses to communicate with the router. Leave it at the default unless it conflicts with another service. If you run a local firewall, allow local TCP 50000 and UDP 1900.
The Docker image includes some unofficial features. All of them are optional.
We have implemented a cron scheduler to restart aMule from time to time. To enable this mod set these environment variables:
MOD_AUTO_RESTART_ENABLED=trueMOD_AUTO_RESTART_CRON=0 6 * * *=> Cron mask is configurable. In the example it restarts everyday at 6:00h.
By default, aMule only shares the "incoming" directory and shared folders cannot be selected in the Web UI.
We have added this option in the Docker image. The configuration is updated when the container starts. It writes the listed directories as recursive shared roots (shareddir-recursive.dat), so aMule shares each directory together with all of its sub-directories. New sub-directories created later are shared automatically too (see AutoRescanSharedDirs below). aMule regenerates shareddir.dat (the union of all shared directories) on startup.
MOD_AUTO_SHARE_ENABLED=trueMOD_AUTO_SHARE_DIRECTORIES=/downloads/incoming;/my_movies=> List of directories separated by semicolon ';'. Subdirectories will be shared too.
These options are enabled by default in the generated amule.conf and control how aMule scans the shared directories. You can change them by editing amule.conf in the config volume.
AutoRescanSharedDirs=1=> aMule watches the shared directories and detects changes (new files and sub-directories) automatically, without a manual "Reload shared files". New sub-directories under a recursive root are shared on the fly. Set to0to disable the watcher.FollowSymlinksInShares=1=> aMule follows symbolic links while scanning the shared directories. Set to0to skip symlinked files and directories entirely.
