awx:23.9.0
1.0K
This guide mirrors the upstream tools/docker-compose flow for AWX 23.9.0, pins the custom image, and includes fixes for the common collectstatic / uWSGI crash loop (502/404).
It also adds key AWX initialization commands (clean-ui, ui-devel, createsuperuser, create_preload_data).
docker compose version)mkdir -p /opt/awx && cd /opt/awx
git clone https://github.com/ansible/awx.git
cd awx
git checkout 23.9.0
cd tools/docker-compose/_sources
pwd # /opt/awx/awx/tools/docker-compose/_sources
ls -1
You should see: docker-compose.yml, nginx.conf, nginx.locations.conf, SECRET_KEY, websocket_secret.py, database.py, etc.
If SECRET_KEY or websocket_secret.py are missing, create them (any random non-empty strings are fine for local dev).
sed -i 's|\(image:\s*\).*awx:.*|\1afsharidevops/awx:23.9.0|' docker-compose.yml
(Optional) add initial admin credentials if not present:
awk '
BEGIN{p=1}
/services:/ {print; next}
/awx:/ && p {print; getline; print " environment:"; print " AWX_ADMIN_USER: admin"; print " AWX_ADMIN_PASSWORD: changeme"; p=0}
{print}
' docker-compose.yml > docker-compose.yml.new && mv docker-compose.yml.new docker-compose.yml
docker compose pull
docker compose up -d
docker compose logs -f awx
After the container (tools_awx_1) is running, execute the following commands:
docker exec tools_awx_1 make clean-ui ui-devel
docker exec -ti tools_awx_1 awx-manage createsuperuser
docker exec tools_awx_1 awx-manage create_preload_data
Open https://<HOST_IP>:8043 (accept the self-signed cert).
Login with your created superuser credentials.
If you used environment variables earlier, defaults are: admin / changeme
Health checks:
curl -k https://localhost:8043/api/v2/ping/
docker compose exec awx bash -lc 'curl -sS -i http://127.0.0.1:8050/api/v2/ping/ || true'
pgdataredisdataawx_projects → /var/lib/awx/projectsawx_data → /var/lib/awxawx_static → /var/lib/awx/public/staticBackup example (pgdata):
docker compose stop awx
docker run --rm -v pgdata:/from -v "$(pwd)":/to alpine sh -c 'cd /from && tar czf /to/pgdata.tgz .'
docker compose start awx
docker compose ps
docker compose logs -f awx
docker compose restart awx
Upgrade later:
sed -i 's|afsharidevops/awx:23.9.0|afsharidevops/awx:<NEW_TAG>|' docker-compose.yml
docker compose pull awx && docker compose up -d
Symptoms:
supervisorctl status: tower-processes:awx-uwsgi FATAL/var/log/nginx/error.log: no live upstreams or connect() failed (111)Root cause: The supervisor target runs: python3.9 manage.py collectstatic --clear --noinput If this fails (wrong interpreter, missing Django, etc.), uWSGI dies → nginx 502/404.
Fix flow (inside container):
docker compose exec awx bash
supervisorctl status
tail -n 200 /var/log/nginx/error.log || true
python3.9 manage.py collectstatic --clear --noinput
supervisorctl restart tower-processes:awx-uwsgi
ss -ltnp | grep 8050 || echo "uWSGI not listening yet"
curl -sS -i http://127.0.0.1:8050/api/v2/ping/ || echo "ping failed"
If port 8050 stuck/in-use:
supervisorctl stop tower-processes:awx-uwsgi || true
pkill -9 -f 'uwsgi.*tower/uwsgi.ini' || true
pkill -9 -x uwsgi || true
supervisorctl start tower-processes:awx-uwsgi
Still failing?
/var/lib/awx/public/static is writable and mapped to awx_static volume.docker compose logs awx | tail -n 300
tail -n 200 /var/log/nginx/error.log
Content type
Image
Digest
sha256:5f3ea5c69…
Size
791.3 MB
Last updated
10 months ago
docker pull afsharidevops/awx:23.9.0