|
| 1 | +#!/bin/bash |
| 2 | +set -euo pipefail |
| 3 | + |
| 4 | +HERMES_HOME="${HERMES_HOME:-/opt/data}" |
| 5 | +INSTALL_DIR="/opt/hermes" |
| 6 | + |
| 7 | +bootstrap_files() { |
| 8 | + mkdir -p "$HERMES_HOME"/{cron,sessions,logs,hooks,memories,skills,skins,plans,workspace,home} |
| 9 | + |
| 10 | + if [ ! -f "$HERMES_HOME/.env" ]; then |
| 11 | + cp "$INSTALL_DIR/.env.example" "$HERMES_HOME/.env" |
| 12 | + fi |
| 13 | + |
| 14 | + if [ ! -f "$HERMES_HOME/config.yaml" ]; then |
| 15 | + cp "$INSTALL_DIR/cli-config.yaml.example" "$HERMES_HOME/config.yaml" |
| 16 | + fi |
| 17 | + |
| 18 | + if [ ! -f "$HERMES_HOME/SOUL.md" ]; then |
| 19 | + cp "$INSTALL_DIR/docker/SOUL.md" "$HERMES_HOME/SOUL.md" |
| 20 | + fi |
| 21 | + |
| 22 | + if [ -d "$INSTALL_DIR/skills" ]; then |
| 23 | + python3 "$INSTALL_DIR/tools/skills_sync.py" |
| 24 | + fi |
| 25 | +} |
| 26 | + |
| 27 | +run_dashboard() { |
| 28 | + local host port |
| 29 | + |
| 30 | + host="${HERMES_DASHBOARD_HOST:-0.0.0.0}" |
| 31 | + port="${HERMES_DASHBOARD_PORT:-9119}" |
| 32 | + |
| 33 | + if [ "${HERMES_DASHBOARD_NO_OPEN:-1}" = "1" ]; then |
| 34 | + hermes dashboard --host "$host" --port "$port" --no-open |
| 35 | + else |
| 36 | + hermes dashboard --host "$host" --port "$port" |
| 37 | + fi |
| 38 | +} |
| 39 | + |
| 40 | +run_both() { |
| 41 | + local gateway_pid dashboard_pid exit_code |
| 42 | + |
| 43 | + hermes gateway run & |
| 44 | + gateway_pid=$! |
| 45 | + |
| 46 | + run_dashboard & |
| 47 | + dashboard_pid=$! |
| 48 | + |
| 49 | + trap 'kill "$gateway_pid" "$dashboard_pid" 2>/dev/null || true; wait "$gateway_pid" "$dashboard_pid" 2>/dev/null || true' INT TERM |
| 50 | + |
| 51 | + wait -n "$gateway_pid" "$dashboard_pid" |
| 52 | + exit_code=$? |
| 53 | + kill "$gateway_pid" "$dashboard_pid" 2>/dev/null || true |
| 54 | + wait "$gateway_pid" "$dashboard_pid" 2>/dev/null || true |
| 55 | + return "$exit_code" |
| 56 | +} |
| 57 | + |
| 58 | +if [ "$(id -u)" = "0" ]; then |
| 59 | + if [ -n "${HERMES_UID:-}" ] && [ "${HERMES_UID}" != "$(id -u hermes)" ]; then |
| 60 | + echo "Changing hermes UID to ${HERMES_UID}" |
| 61 | + usermod -u "${HERMES_UID}" hermes |
| 62 | + fi |
| 63 | + |
| 64 | + if [ -n "${HERMES_GID:-}" ] && [ "${HERMES_GID}" != "$(id -g hermes)" ]; then |
| 65 | + echo "Changing hermes GID to ${HERMES_GID}" |
| 66 | + groupmod -g "${HERMES_GID}" hermes |
| 67 | + fi |
| 68 | + |
| 69 | + actual_hermes_uid="$(id -u hermes)" |
| 70 | + if [ "$(stat -c %u "$HERMES_HOME" 2>/dev/null || echo missing)" != "$actual_hermes_uid" ]; then |
| 71 | + echo "$HERMES_HOME is not owned by $actual_hermes_uid, fixing" |
| 72 | + chown -R hermes:hermes "$HERMES_HOME" |
| 73 | + fi |
| 74 | + |
| 75 | + exec gosu hermes "$0" "$@" |
| 76 | +fi |
| 77 | + |
| 78 | +printf '\033[1;32m%s\033[0m\n' 'This image is maintained by 1Panel.' |
| 79 | +printf '\033[1;33m%s\033[0m\n' 'For support or issue discussion, please visit:' |
| 80 | +printf '\033[1;36m%s\033[0m\n' 'https://github.com/1Panel-dev/1Panel/discussions' |
| 81 | + |
| 82 | +source "$INSTALL_DIR/.venv/bin/activate" |
| 83 | +bootstrap_files |
| 84 | +cd "$HERMES_HOME/workspace" |
| 85 | + |
| 86 | +if [ "$#" -gt 0 ]; then |
| 87 | + exec hermes "$@" |
| 88 | +fi |
| 89 | + |
| 90 | +case "${HERMES_RUN_MODE:-gateway}" in |
| 91 | + gateway) |
| 92 | + exec hermes gateway run |
| 93 | + ;; |
| 94 | + dashboard) |
| 95 | + run_dashboard |
| 96 | + ;; |
| 97 | + both) |
| 98 | + run_both |
| 99 | + ;; |
| 100 | + *) |
| 101 | + echo "Unsupported HERMES_RUN_MODE: ${HERMES_RUN_MODE:-gateway}" >&2 |
| 102 | + echo "Supported values: gateway, dashboard, both" >&2 |
| 103 | + exit 1 |
| 104 | + ;; |
| 105 | +esac |
0 commit comments