Z User commited on
Commit
62ec96b
·
1 Parent(s): 330a308

security: generate .env from Space Secrets, remove .env from build

Browse files

- Dockerfile: remove COPY .env, add COPY .env.example
- start.sh: generate .env from HF Space Secrets (env vars) on first boot
- Persistent .env is preserved across rebuilds once created
- No API keys in git repo anymore

Files changed (2) hide show
  1. Dockerfile +1 -3
  2. start.sh +27 -14
Dockerfile CHANGED
@@ -75,16 +75,14 @@ RUN mkdir -p /root/.hermes/plugins/image_gen/pollinations
75
  # Copy config files (to both hermes home AND /app for persistence fallback)
76
  COPY config.yaml /root/.hermes/config.yaml
77
  COPY SOUL.md /root/.hermes/SOUL.md
78
- COPY .env /root/.hermes/.env
79
  # Keep repo copies in /app as fallback sources for persistent storage recovery
80
  COPY config.yaml /app/config.yaml
81
- COPY .env /app/.env
82
  COPY entry.py /app/entry.py
83
  COPY dashboard.html /app/dashboard.html
84
  COPY plugins/pollinations/ /root/.hermes/plugins/image_gen/pollinations/
85
  COPY scripts/ /app/scripts/
86
 
87
- RUN chmod 600 /root/.hermes/.env
88
 
89
  # Startup script
90
  COPY start.sh /app/start.sh
 
75
  # Copy config files (to both hermes home AND /app for persistence fallback)
76
  COPY config.yaml /root/.hermes/config.yaml
77
  COPY SOUL.md /root/.hermes/SOUL.md
 
78
  # Keep repo copies in /app as fallback sources for persistent storage recovery
79
  COPY config.yaml /app/config.yaml
80
+ COPY .env.example /app/.env.example
81
  COPY entry.py /app/entry.py
82
  COPY dashboard.html /app/dashboard.html
83
  COPY plugins/pollinations/ /root/.hermes/plugins/image_gen/pollinations/
84
  COPY scripts/ /app/scripts/
85
 
 
86
 
87
  # Startup script
88
  COPY start.sh /app/start.sh
start.sh CHANGED
@@ -52,24 +52,37 @@ if [ -z "$WEIXIN_ACCOUNT_ID" ]; then
52
  fi
53
  fi
54
 
55
- # ── Persist .env across container rebuilds ──
56
- # WeChat QR login + BFF credential saves write to ~/.hermes/.env
57
- # Without this, WeChat tokens and other channel credentials are lost on every rebuild
58
  ENV_FILE="$HERMES_HOME/.env"
59
  ENV_DATA="/data/hermes/.env"
60
- if [ -f "$ENV_FILE" ] && [ ! -L "$ENV_FILE" ] && [ ! -f "$ENV_DATA" ]; then
61
- # First time: migrate build-time .env to persistent storage
62
- cp "$ENV_FILE" "$ENV_DATA"
 
 
 
 
 
 
 
 
 
 
 
 
63
  chmod 600 "$ENV_DATA"
64
- echo "Migrated .env to persistent storage"
65
- elif [ -L "$ENV_FILE" ] && [ ! -f "$ENV_DATA" ]; then
66
- # Symlink exists but target is missing (data cleared) — recreate from repo copy
67
- if [ -f "/app/.env" ]; then
68
- cp "/app/.env" "$ENV_DATA"
69
- chmod 600 "$ENV_DATA"
70
- echo "Restored .env from repo fallback"
71
- fi
72
  fi
 
 
 
 
 
 
 
 
73
  if [ ! -L "$ENV_FILE" ]; then
74
  rm -f "$ENV_FILE"
75
  ln -sf "$ENV_DATA" "$ENV_FILE"
 
52
  fi
53
  fi
54
 
55
+ # -- Persist .env across container rebuilds --
56
+ # Priority: Space Secrets (env vars) > persistent storage
57
+ # SECURITY: .env is NO LONGER in git repo -- use HF Space Secrets
58
  ENV_FILE="$HERMES_HOME/.env"
59
  ENV_DATA="/data/hermes/.env"
60
+
61
+ # Generate .env from Space Secrets (environment variables injected by HF)
62
+ if [ ! -f "$ENV_DATA" ] && [ -n "$OPENROUTER_API_KEY" ]; then
63
+ echo "Generating .env from Space Secrets..."
64
+ {
65
+ echo "OPENROUTER_API_KEY=$OPENROUTER_API_KEY"
66
+ [ -n "$OPENAI_API_KEY" ] && echo "OPENAI_API_KEY=$OPENAI_API_KEY"
67
+ [ -n "$OPENAI_BASE_URL" ] && echo "OPENAI_BASE_URL=$OPENAI_BASE_URL"
68
+ [ -n "$FEISHU_APP_ID" ] && echo "FEISHU_APP_ID=$FEISHU_APP_ID"
69
+ [ -n "$FEISHU_APP_SECRET" ] && echo "FEISHU_APP_SECRET=$FEISHU_APP_SECRET"
70
+ echo "GATEWAY_ALLOW_ALL_USERS=true"
71
+ echo "HERMES_ACCEPT_HOOKS=1"
72
+ [ -n "$MEMPALACE_PALACE_PATH" ] && echo "MEMPALACE_PALACE_PATH=$MEMPALACE_PALACE_PATH"
73
+ [ -n "$FIRECRAWL_API_KEY" ] && echo "FIRECRAWL_API_KEY=$FIRECRAWL_API_KEY"
74
+ } > "$ENV_DATA"
75
  chmod 600 "$ENV_DATA"
76
+ echo "Created .env from Space Secrets"
 
 
 
 
 
 
 
77
  fi
78
+
79
+ # Fallback: if no secrets and no persistent data
80
+ if [ ! -f "$ENV_DATA" ] && [ -f "/app/.env.example" ]; then
81
+ cp "/app/.env.example" "$ENV_DATA"
82
+ echo "WARNING: No .env found. Set API keys via HF Space Secrets!"
83
+ fi
84
+
85
+ # Always symlink
86
  if [ ! -L "$ENV_FILE" ]; then
87
  rm -f "$ENV_FILE"
88
  ln -sf "$ENV_DATA" "$ENV_FILE"