Compare commits
20 Commits
fix/himala
...
feat/ai-ba
| Author | SHA1 | Date | |
|---|---|---|---|
| 9a9f095820 | |||
| be4b1ab8c4 | |||
| d3f2e3b7b9 | |||
| 6a44120b1a | |||
| 38a1451689 | |||
| f9fb28d560 | |||
| bcc4b6d157 | |||
| 8d1ae7e632 | |||
| 29ae32a1c5 | |||
| 8dff094768 | |||
| ec08f5eb5d | |||
| 611e96b306 | |||
| f184ed957c | |||
| 2bf31c7ccc | |||
| f44f93e35a | |||
| 4cdd157e3f | |||
| 3ba0345887 | |||
| 5e242eb946 | |||
| e607982b21 | |||
| 4627199217 |
23
ai/Dockerfile
Normal file
23
ai/Dockerfile
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
FROM debian:13.4
|
||||||
|
|
||||||
|
# Install uv (Python package manager), curl, poppler-utils, and imagemagick
|
||||||
|
RUN apt-get update && \
|
||||||
|
apt-get install -y --no-install-recommends \
|
||||||
|
curl \
|
||||||
|
poppler-utils \
|
||||||
|
imagemagick && \
|
||||||
|
rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# Install uv if not already present (debian:13.4 doesn't ship it)
|
||||||
|
COPY --from=ghcr.io/astral-sh/uv:latest /usr/local/bin/uv /usr/local/bin/uv
|
||||||
|
RUN uv --version
|
||||||
|
|
||||||
|
# Verify all expected tools are available
|
||||||
|
RUN curl --version && \
|
||||||
|
pdftotext -v 2>&1 | head -1 && \
|
||||||
|
pdfinfo -v 2>&1 | head -1 && \
|
||||||
|
pdftoppm -v 2>&1 | head -1 && \
|
||||||
|
convert --version | head -1 && \
|
||||||
|
identify --version | head -1
|
||||||
|
|
||||||
|
CMD ["/bin/bash"]
|
||||||
@@ -31,6 +31,9 @@ services:
|
|||||||
ssh:
|
ssh:
|
||||||
- default
|
- default
|
||||||
container_name: hermes
|
container_name: hermes
|
||||||
|
entrypoint: ["/bin/bash", "-c",
|
||||||
|
"bash /opt/data/hermes-tools/install.sh && exec /usr/bin/tini -g -- /opt/hermes/docker/entrypoint.sh \"$@\"",
|
||||||
|
"hermes-entrypoint"]
|
||||||
restart: always
|
restart: always
|
||||||
# Gateway run enables the internal API server on port 8642
|
# Gateway run enables the internal API server on port 8642
|
||||||
command: gateway run
|
command: gateway run
|
||||||
@@ -51,6 +54,10 @@ services:
|
|||||||
- TZ=America/Montreal
|
- TZ=America/Montreal
|
||||||
volumes:
|
volumes:
|
||||||
- /mnt/HoardingCow_docker_data/Hermes/data:/opt/data
|
- /mnt/HoardingCow_docker_data/Hermes/data:/opt/data
|
||||||
|
# Syncthing-shared org files — read-only view of user's agenda
|
||||||
|
- /mnt/HoardingCow_docker_data/Syncthing/telos-ro:/opt/data/telos-ro:ro
|
||||||
|
# Syncthing-shared inbox — write tasks here, they sync to user's laptop
|
||||||
|
- /mnt/HoardingCow_docker_data/Syncthing/telos-rw:/opt/data/telos-rw:rw
|
||||||
devices:
|
devices:
|
||||||
- /dev/kfd:/dev/kfd
|
- /dev/kfd:/dev/kfd
|
||||||
- /dev/dri:/dev/dri
|
- /dev/dri:/dev/dri
|
||||||
@@ -60,6 +67,35 @@ services:
|
|||||||
networks:
|
networks:
|
||||||
- ai_backend
|
- ai_backend
|
||||||
|
|
||||||
|
syncthing:
|
||||||
|
image: syncthing/syncthing:latest
|
||||||
|
container_name: syncthing
|
||||||
|
hostname: syncthing
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- "8384:8384"
|
||||||
|
- "22000:22000"
|
||||||
|
- "21027:21027/udp"
|
||||||
|
environment:
|
||||||
|
- TZ=America/Montreal
|
||||||
|
volumes:
|
||||||
|
- /mnt/HoardingCow_docker_data/Syncthing/config:/var/syncthing/config
|
||||||
|
- /mnt/HoardingCow_docker_data/Syncthing/telos-ro:/telos-ro
|
||||||
|
- /mnt/HoardingCow_docker_data/Syncthing/telos-rw:/telos-rw
|
||||||
|
networks:
|
||||||
|
- ai_backend
|
||||||
|
- ai_net
|
||||||
|
labels:
|
||||||
|
- "traefik.enable=true"
|
||||||
|
- "traefik.http.routers.syncthing-http.rule=Host(`syncthing.lazyworkhorse.net`)"
|
||||||
|
- "traefik.http.routers.syncthing-http.entrypoints=web"
|
||||||
|
- "traefik.http.routers.syncthing-http.middlewares=redirect-to-https"
|
||||||
|
- "traefik.http.routers.syncthing-https.rule=Host(`syncthing.lazyworkhorse.net`)"
|
||||||
|
- "traefik.http.routers.syncthing-https.entrypoints=websecure"
|
||||||
|
- "traefik.http.routers.syncthing-https.tls=true"
|
||||||
|
- "traefik.http.routers.syncthing-https.tls.certresolver=njalla"
|
||||||
|
- "traefik.http.services.syncthing.loadbalancer.server.port=8384"
|
||||||
|
|
||||||
ollama:
|
ollama:
|
||||||
build:
|
build:
|
||||||
context: ./ollama
|
context: ./ollama
|
||||||
@@ -93,6 +129,22 @@ services:
|
|||||||
- "303"
|
- "303"
|
||||||
- "26"
|
- "26"
|
||||||
|
|
||||||
|
paperclip-db:
|
||||||
|
image: postgres:17
|
||||||
|
container_name: paperclip-db
|
||||||
|
restart: always
|
||||||
|
environment:
|
||||||
|
- POSTGRES_PASSWORD=${PAPERCLIP_DB_PASSWORD}
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD-SHELL", "pg_isready -U postgres"]
|
||||||
|
interval: 5s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 10
|
||||||
|
volumes:
|
||||||
|
- /mnt/HoardingCow_docker_data/Paperclip/db:/var/lib/postgresql/data
|
||||||
|
networks:
|
||||||
|
- ai_backend
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
ai_net:
|
ai_net:
|
||||||
external: true
|
external: true
|
||||||
|
|||||||
@@ -86,7 +86,8 @@ ENV PATH="/opt/data/.local/bin:${PATH}"
|
|||||||
# Point browser tool to Playwright's Chromium (already in base image)
|
# Point browser tool to Playwright's Chromium (already in base image)
|
||||||
ENV CHROME_EXECUTABLE=/opt/hermes/.playwright/chromium/chrome-linux/chrome
|
ENV CHROME_EXECUTABLE=/opt/hermes/.playwright/chromium/chrome-linux/chrome
|
||||||
|
|
||||||
VOLUME [ "/opt/data" ]
|
# Ensure tools directory and toolsets.py are writable by the hermes runtime user
|
||||||
|
# so custom tools can be injected from the persistent volume at startup.
|
||||||
|
RUN chown -R hermes:hermes /opt/hermes/tools /opt/hermes/toolsets.py
|
||||||
|
|
||||||
COPY --chmod=0755 fix-permissions.sh /opt/hermes/fix-permissions.sh
|
VOLUME [ "/opt/data" ]
|
||||||
ENTRYPOINT [ "/usr/bin/tini", "-g", "--", "/opt/hermes/fix-permissions.sh" ]
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# Startup permission fix + TTS patch.
|
|
||||||
# Runs as root before the entrypoint drops to the hermes user.
|
|
||||||
set -e
|
|
||||||
|
|
||||||
HERMES_HOME="${HERMES_HOME:-/opt/data}"
|
|
||||||
|
|
||||||
# Fix ownership on critical writable directories
|
|
||||||
chown -R hermes:hermes \
|
|
||||||
"$HERMES_HOME/sessions" \
|
|
||||||
"$HERMES_HOME/checkpoints" \
|
|
||||||
"$HERMES_HOME/skills" \
|
|
||||||
"$HERMES_HOME/memories" \
|
|
||||||
"$HERMES_HOME/workspace" \
|
|
||||||
"$HERMES_HOME/pastes" \
|
|
||||||
"$HERMES_HOME/logs" \
|
|
||||||
"$HERMES_HOME/cron" \
|
|
||||||
"$HERMES_HOME/plans" \
|
|
||||||
"$HERMES_HOME/hooks" \
|
|
||||||
"$HERMES_HOME/cache" \
|
|
||||||
2>/dev/null || true
|
|
||||||
|
|
||||||
# Fix data volume root ownership
|
|
||||||
if [ "$(stat -c %u "$HERMES_HOME" 2>/dev/null)" != "$(id -u hermes)" ]; then
|
|
||||||
chown hermes:hermes "$HERMES_HOME" 2>/dev/null || true
|
|
||||||
fi
|
|
||||||
|
|
||||||
# ---------- Patch tts_tool.py: replace Edge TTS with Piper ----------
|
|
||||||
# Fallback runtime patch in case the volume's site-packages differ from the image.
|
|
||||||
# Idempotent: if already patched, the script does nothing.
|
|
||||||
PATCH_SCRIPT="/opt/hermes/patch_tts_tool.py"
|
|
||||||
if [ -f "$PATCH_SCRIPT" ]; then
|
|
||||||
echo "Applying TTS patch (Piper only, no Edge fallback)..."
|
|
||||||
/opt/hermes/.venv/bin/python3 "$PATCH_SCRIPT" 2>&1 || true
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Chain to the official Hermes entrypoint
|
|
||||||
exec /opt/hermes/docker/entrypoint.sh "$@"
|
|
||||||
@@ -8,13 +8,10 @@ services:
|
|||||||
- USER_GID=1000
|
- USER_GID=1000
|
||||||
- GITEA__server__ROOT_URL=https://code.lazyworkhorse.net
|
- GITEA__server__ROOT_URL=https://code.lazyworkhorse.net
|
||||||
- GITEA__actions__ENABLED=true
|
- GITEA__actions__ENABLED=true
|
||||||
- GITEA__actions__DEFAULT_ACTIONS_URL=off
|
|
||||||
- SSH_PORT=2222
|
- SSH_PORT=2222
|
||||||
- SSH_LISTEN_PORT=2222
|
- SSH_LISTEN_PORT=2222
|
||||||
# Enable Gitea Actions (act_runner required on host)
|
# Enable Gitea Actions (act_runner required on host)
|
||||||
- GITEA__actions__ENABLED=true
|
- GITEA__actions__ENABLED=true
|
||||||
# Don't fetch actions from GitHub (offline mode + local only)
|
|
||||||
- GITEA__actions__DEFAULT_ACTIONS_URL=off
|
|
||||||
volumes:
|
volumes:
|
||||||
- /mnt/HoardingCow_docker_data/Gitea:/data
|
- /mnt/HoardingCow_docker_data/Gitea:/data
|
||||||
networks:
|
networks:
|
||||||
|
|||||||
9
vpn/Dockerfile
Normal file
9
vpn/Dockerfile
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# Custom wg-easy with iptables-nft (nftables-backed iptables)
|
||||||
|
# Fixes crash-loop when host kernel lacks legacy iptable_nat module.
|
||||||
|
FROM ghcr.io/wg-easy/wg-easy:latest
|
||||||
|
|
||||||
|
# The upstream image registers only iptables-legacy with update-alternatives.
|
||||||
|
# iptables-nft binary exists but isn't registered as an alternative key.
|
||||||
|
# Override the alternatives-managed symlinks directly.
|
||||||
|
RUN ln -sf /usr/sbin/iptables-nft /usr/sbin/iptables && \
|
||||||
|
ln -sf /usr/sbin/ip6tables-nft /usr/sbin/ip6tables
|
||||||
@@ -2,7 +2,10 @@ version: "3.8"
|
|||||||
|
|
||||||
services:
|
services:
|
||||||
wireguard:
|
wireguard:
|
||||||
image: weejewel/wg-easy:latest
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
image: wg-easy-iptables-nft:latest
|
||||||
container_name: wireguard
|
container_name: wireguard
|
||||||
cap_add:
|
cap_add:
|
||||||
- NET_ADMIN
|
- NET_ADMIN
|
||||||
|
|||||||
Reference in New Issue
Block a user