Set Up AnythingLLM on Ubuntu 24.04 with Docker

AnythingLLM is a self-hosted AI workspace that combines document ingestion, chat, connectors for different model backends, and a browser-based interface in one application. It is a strong fit when you want a full private AI workspace on your own server instead of only exposing a model endpoint.

In this guide, we restore a fresh Ubuntu 24.04.1 LTS server on Shape.Host, verify the current AnythingLLM stable release from the official project, install Docker Engine and Docker Compose from Docker’s official Ubuntu repository, deploy AnythingLLM v1.11.2 in a localhost-only container, and validate the web interface safely over an SSH tunnel.

Application AnythingLLM
Application version v1.11.2
Operating system Ubuntu 24.04.1 LTS
Container runtime Docker Engine 29.3.1 with Docker Compose 5.1.1
Supporting tools Git 2.43.0 and OpenSSL 3.0.13
Access pattern AnythingLLM bound to 127.0.0.1:3001 with browser access through an SSH tunnel
Validated on Live Shape.Host Ubuntu 24.04.1 server

Why Use AnythingLLM on Ubuntu 24.04?

  • AnythingLLM gives you a polished self-hosted AI workspace with document chat, model connectors, and a browser UI.
  • Ubuntu 24.04.1 LTS is a stable and current base for containerized applications.
  • Docker keeps the deployment easy to reproduce and update.
  • A localhost-only bind keeps the panel off the public interface until you intentionally add a reverse proxy later.

Before You Begin

Make sure you have the following before you start:

  • A fresh Ubuntu 24.04 server
  • Root or sudo access
  • An SSH key that can log in to the server
  • A local workstation where you can open an SSH tunnel to the server

1. Verify the Ubuntu 24.04 Release

Start by confirming that the rebuilt server is actually running Ubuntu 24.04.1 LTS.

cat /etc/os-release
Ubuntu 24.04.1 LTS os-release output on the AnythingLLM server
Fresh Ubuntu 24.04.1 LTS deployment used for the AnythingLLM installation.

2. Install Docker Engine, Docker Compose, and Base Tools

The official AnythingLLM self-hosted path uses Docker, so the clean Ubuntu route is Docker’s official APT repository instead of an older distro-packaged container stack.

apt-get update
apt-get install -y ca-certificates curl git openssl
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc

cat > /etc/apt/sources.list.d/docker.list <<EOF
deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable
EOF

apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

systemctl enable --now docker

docker --version
docker compose version
git --version
ufw status || true

On the validated Ubuntu 24.04.1 server, this installed Docker Engine 29.3.1, Docker Compose 5.1.1, Git 2.43.0, and kept the firewall state visible through the final ufw status check.

Docker Engine and Docker Compose installed on Ubuntu 24.04 for AnythingLLM
Docker and the supporting CLI tools installed on Ubuntu 24.04.

3. Create the AnythingLLM Configuration

AnythingLLM needs a persistent storage directory and an environment file. The storage path must be writable by the container user, so set the ownership before the first container start.

mkdir -p /opt/anythingllm/storage
chown -R 1000:1000 /opt/anythingllm/storage
chmod 775 /opt/anythingllm/storage
cd /opt/anythingllm

SIG_KEY="$(openssl rand -hex 32)"
SIG_SALT="$(openssl rand -hex 32)"

cat > .env <<EOF
SERVER_PORT=3001
STORAGE_DIR="/app/server/storage"
SIG_KEY="${SIG_KEY}"
SIG_SALT="${SIG_SALT}"
DISABLE_TELEMETRY="true"
EOF

cat > compose.yaml <<'EOF'
services:
  anythingllm:
    image: mintplexlabs/anythingllm:1.11.2
    container_name: anythingllm
    restart: unless-stopped
    cap_add:
      - SYS_ADMIN
    ports:
      - 127.0.0.1:3001:3001
    env_file:
      - .env
    volumes:
      - ./storage:/app/server/storage
      - ./.env:/app/server/.env
    extra_hosts:
      - "host.docker.internal:host-gateway"
EOF

grep '^SERVER_PORT=' .env
grep '^DISABLE_TELEMETRY=' .env
grep 'image:' compose.yaml
grep '127.0.0.1:3001:3001' compose.yaml
docker compose config --services

This configuration pins the current AnythingLLM release, keeps the web app on 127.0.0.1:3001, disables telemetry, and includes SYS_ADMIN so the instance can support the upstream web-scraping capability when needed.

AnythingLLM compose file and environment file prepared on Ubuntu 24.04
Pinned AnythingLLM configuration prepared with writable persistent storage.

4. Start AnythingLLM

With the configuration in place, pull the image and start the application container.

4.1 Launch the Container

cd /opt/anythingllm
docker compose pull
docker compose up -d
sleep 30
docker compose ps

On the validated Ubuntu server, Docker pulled mintplexlabs/anythingllm:1.11.2, created the container, and brought the service up successfully.

Starting AnythingLLM with Docker Compose on Ubuntu 24.04
First startup of the AnythingLLM container on Ubuntu 24.04.

4.2 Validate the Local HTTP Response

docker compose ps
docker compose images
curl -I http://127.0.0.1:3001

The live deployment reached a healthy container state and the local endpoint returned HTTP/1.1 200 OK, which is the expected result before opening a browser session through a tunnel.

AnythingLLM container status and local HTTP validation on Ubuntu 24.04
Container status and localhost HTTP validation for the running AnythingLLM deployment.

5. Open the AnythingLLM Web Interface Through an SSH Tunnel

This installation keeps AnythingLLM on localhost instead of exposing it directly to the public network. Create an SSH tunnel from your local machine, then open the forwarded port in your browser.

ssh -L 13001:127.0.0.1:3001 root@YOUR_SERVER_IP

After the tunnel is open, browse to:

http://127.0.0.1:13001

On the live server, the AnythingLLM welcome page loaded correctly through the tunnel and was ready for the initial setup flow.

AnythingLLM welcome screen accessed through an SSH tunnel on Ubuntu 24.04
AnythingLLM web interface reached safely through an SSH tunnel.

6. Run Final Server-Side Checks

Before you stop, confirm that the container is still healthy, the port is bound only to localhost, and the local HTTP response remains available.

cd /opt/anythingllm
docker compose ps
docker compose images
ss -lntp | grep ':3001'
curl -I http://127.0.0.1:3001

On the validated deployment, the final check showed the container in the healthy state, port 3001 listening only on 127.0.0.1, and the local AnythingLLM page still returning 200 OK.

Final AnythingLLM validation on Ubuntu 24.04
Final container, port-binding, and localhost response checks for AnythingLLM.

Conclusion

You now have AnythingLLM on Ubuntu 24.04 running in Docker with persistent storage, a pinned stable image, and a safer localhost-only access pattern. From here, you can complete the in-app onboarding flow, connect your preferred LLM provider, and only add a public reverse proxy later if you decide you need browser access without SSH tunneling.