$ -weight: 600;">sudo -weight: 500;">apt -weight: 500;">install -weight: 500;">apt-transport-https ca-certificates -weight: 500;">curl -y
$ -weight: 600;">sudo -weight: 500;">apt -weight: 500;">install -weight: 500;">apt-transport-https ca-certificates -weight: 500;">curl -y
$ -weight: 600;">sudo -weight: 500;">apt -weight: 500;">install -weight: 500;">apt-transport-https ca-certificates -weight: 500;">curl -y
$ -weight: 600;">sudo -weight: 500;">curl -fsSL https://download.-weight: 500;">docker.com/linux/ubuntu/gpg -o /etc/-weight: 500;">apt/keyrings/-weight: 500;">docker.asc
$ -weight: 600;">sudo -weight: 500;">curl -fsSL https://download.-weight: 500;">docker.com/linux/ubuntu/gpg -o /etc/-weight: 500;">apt/keyrings/-weight: 500;">docker.asc
$ -weight: 600;">sudo -weight: 500;">curl -fsSL https://download.-weight: 500;">docker.com/linux/ubuntu/gpg -o /etc/-weight: 500;">apt/keyrings/-weight: 500;">docker.asc
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/-weight: 500;">apt/keyrings/-weight: 500;">docker.asc] https://download.-weight: 500;">docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | -weight: 600;">sudo tee /etc/-weight: 500;">apt/sources.list.d/-weight: 500;">docker.list > /dev/null
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/-weight: 500;">apt/keyrings/-weight: 500;">docker.asc] https://download.-weight: 500;">docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | -weight: 600;">sudo tee /etc/-weight: 500;">apt/sources.list.d/-weight: 500;">docker.list > /dev/null
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/-weight: 500;">apt/keyrings/-weight: 500;">docker.asc] https://download.-weight: 500;">docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | -weight: 600;">sudo tee /etc/-weight: 500;">apt/sources.list.d/-weight: 500;">docker.list > /dev/null
$ -weight: 600;">sudo -weight: 500;">apt -weight: 500;">update
$ -weight: 600;">sudo -weight: 500;">apt -weight: 500;">install -weight: 500;">docker-ce -weight: 500;">docker-ce-cli containerd.io -weight: 500;">docker-buildx-plugin -weight: 500;">docker-compose-plugin -y
$ -weight: 600;">sudo -weight: 500;">apt -weight: 500;">update
$ -weight: 600;">sudo -weight: 500;">apt -weight: 500;">install -weight: 500;">docker-ce -weight: 500;">docker-ce-cli containerd.io -weight: 500;">docker-buildx-plugin -weight: 500;">docker-compose-plugin -y
$ -weight: 600;">sudo -weight: 500;">apt -weight: 500;">update
$ -weight: 600;">sudo -weight: 500;">apt -weight: 500;">install -weight: 500;">docker-ce -weight: 500;">docker-ce-cli containerd.io -weight: 500;">docker-buildx-plugin -weight: 500;">docker-compose-plugin -y
$ -weight: 600;">sudo usermod -aG -weight: 500;">docker $USER
$ newgrp -weight: 500;">docker
$ -weight: 600;">sudo usermod -aG -weight: 500;">docker $USER
$ newgrp -weight: 500;">docker
$ -weight: 600;">sudo usermod -aG -weight: 500;">docker $USER
$ newgrp -weight: 500;">docker
$ mkdir -p ~/hermes/data
$ cd ~/hermes
$ mkdir -p ~/hermes/data
$ cd ~/hermes
$ mkdir -p ~/hermes/data
$ cd ~/hermes
$ nano .env
$ nano .env
$ nano .env
DOMAIN=hermes.example.com
[email protected]
DOMAIN=hermes.example.com
[email protected]
DOMAIN=hermes.example.com
[email protected]
$ -weight: 500;">docker run --rm httpd:2.4-alpine htpasswd -nbB admin 'your_dashboard_password' > .htpasswd
$ -weight: 500;">docker run --rm httpd:2.4-alpine htpasswd -nbB admin 'your_dashboard_password' > .htpasswd
$ -weight: 500;">docker run --rm httpd:2.4-alpine htpasswd -nbB admin 'your_dashboard_password' > .htpasswd
$ nano -weight: 500;">docker-compose.yml
$ nano -weight: 500;">docker-compose.yml
$ nano -weight: 500;">docker-compose.yml
services: traefik: image: traefik:v3 command: - --providers.-weight: 500;">docker=true - --entrypoints.web.address=:80 - --entrypoints.websecure.address=:443 - --certificatesresolvers.letsencrypt.acme.email=${LETSENCRYPT_EMAIL} - --certificatesresolvers.letsencrypt.acme.storage=/data/acme.json - --certificatesresolvers.letsencrypt.acme.tlschallenge=true ports: - "80:80" - "443:443" volumes: - /var/run/-weight: 500;">docker.sock:/var/run/-weight: 500;">docker.sock - ./data:/data hermes: image: nousresearch/hermes-agent:latest volumes: - ./data:/opt/data labels: - traefik.-weight: 500;">enable=true - traefik.http.routers.hermes.rule=Host(`${DOMAIN}`) - traefik.http.routers.hermes.entrypoints=websecure - traefik.http.routers.hermes.tls.certresolver=letsencrypt dashboard: image: nginx:alpine volumes: - ./.htpasswd:/etc/nginx/conf.d/.htpasswd labels: - traefik.-weight: 500;">enable=true - traefik.http.routers.dashboard.rule=Host(`${DOMAIN}`) && PathPrefix(`/dashboard`) - traefik.http.middlewares.dashboard-auth.basicauth.usersfile=/etc/nginx/conf.d/.htpasswd - traefik.http.routers.dashboard.middlewares=dashboard-auth
services: traefik: image: traefik:v3 command: - --providers.-weight: 500;">docker=true - --entrypoints.web.address=:80 - --entrypoints.websecure.address=:443 - --certificatesresolvers.letsencrypt.acme.email=${LETSENCRYPT_EMAIL} - --certificatesresolvers.letsencrypt.acme.storage=/data/acme.json - --certificatesresolvers.letsencrypt.acme.tlschallenge=true ports: - "80:80" - "443:443" volumes: - /var/run/-weight: 500;">docker.sock:/var/run/-weight: 500;">docker.sock - ./data:/data hermes: image: nousresearch/hermes-agent:latest volumes: - ./data:/opt/data labels: - traefik.-weight: 500;">enable=true - traefik.http.routers.hermes.rule=Host(`${DOMAIN}`) - traefik.http.routers.hermes.entrypoints=websecure - traefik.http.routers.hermes.tls.certresolver=letsencrypt dashboard: image: nginx:alpine volumes: - ./.htpasswd:/etc/nginx/conf.d/.htpasswd labels: - traefik.-weight: 500;">enable=true - traefik.http.routers.dashboard.rule=Host(`${DOMAIN}`) && PathPrefix(`/dashboard`) - traefik.http.middlewares.dashboard-auth.basicauth.usersfile=/etc/nginx/conf.d/.htpasswd - traefik.http.routers.dashboard.middlewares=dashboard-auth
services: traefik: image: traefik:v3 command: - --providers.-weight: 500;">docker=true - --entrypoints.web.address=:80 - --entrypoints.websecure.address=:443 - --certificatesresolvers.letsencrypt.acme.email=${LETSENCRYPT_EMAIL} - --certificatesresolvers.letsencrypt.acme.storage=/data/acme.json - --certificatesresolvers.letsencrypt.acme.tlschallenge=true ports: - "80:80" - "443:443" volumes: - /var/run/-weight: 500;">docker.sock:/var/run/-weight: 500;">docker.sock - ./data:/data hermes: image: nousresearch/hermes-agent:latest volumes: - ./data:/opt/data labels: - traefik.-weight: 500;">enable=true - traefik.http.routers.hermes.rule=Host(`${DOMAIN}`) - traefik.http.routers.hermes.entrypoints=websecure - traefik.http.routers.hermes.tls.certresolver=letsencrypt dashboard: image: nginx:alpine volumes: - ./.htpasswd:/etc/nginx/conf.d/.htpasswd labels: - traefik.-weight: 500;">enable=true - traefik.http.routers.dashboard.rule=Host(`${DOMAIN}`) && PathPrefix(`/dashboard`) - traefik.http.middlewares.dashboard-auth.basicauth.usersfile=/etc/nginx/conf.d/.htpasswd - traefik.http.routers.dashboard.middlewares=dashboard-auth
$ -weight: 600;">sudo ufw allow 80/tcp
$ -weight: 600;">sudo ufw allow 443/tcp
$ -weight: 600;">sudo ufw allow 80/tcp
$ -weight: 600;">sudo ufw allow 443/tcp
$ -weight: 600;">sudo ufw allow 80/tcp
$ -weight: 600;">sudo ufw allow 443/tcp
$ -weight: 500;">docker compose up -d
$ -weight: 500;">docker compose up -d
$ -weight: 500;">docker compose up -d
$ -weight: 500;">docker compose ps
$ -weight: 500;">docker compose ps
$ -weight: 500;">docker compose ps
$ -weight: 500;">docker run -it --rm \ -v ~/hermes/data:/opt/data \ nousresearch/hermes-agent:latest model
$ -weight: 500;">docker run -it --rm \ -v ~/hermes/data:/opt/data \ nousresearch/hermes-agent:latest model
$ -weight: 500;">docker run -it --rm \ -v ~/hermes/data:/opt/data \ nousresearch/hermes-agent:latest model
$ -weight: 500;">docker compose logs hermes
$ -weight: 500;">docker compose logs hermes
$ -weight: 500;">docker compose logs hermes - Connect messaging integrations for Telegram, Discord, Slack, or WhatsApp through the dashboard
- Enable persistent memory so the agent retains context across sessions
- Switch to Vultr Serverless Inference for a cost-effective, OpenAI-compatible LLM backend