@simplehomelab/deployrr 6.0.0-rc3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (472) hide show
  1. package/announcement +1 -0
  2. package/apps/community/CONTRIBUTING.md +660 -0
  3. package/apps/community/apps.json +6 -0
  4. package/apps/core/apps.json +16 -0
  5. package/apps/core/authelia/authelia-redis.yml +24 -0
  6. package/apps/core/authelia/compose.yml +45 -0
  7. package/apps/core/authelia/files/chain-authelia.yml +8 -0
  8. package/apps/core/authelia/files/configuration.yml +100 -0
  9. package/apps/core/authelia/files/middlewares-authelia.yml +9 -0
  10. package/apps/core/authelia/files/users.yml +15 -0
  11. package/apps/core/authelia/manifest.json +156 -0
  12. package/apps/core/authentik/authentik-postgresql.yml +26 -0
  13. package/apps/core/authentik/authentik-worker.yml +37 -0
  14. package/apps/core/authentik/compose.yml +51 -0
  15. package/apps/core/authentik/files/chain-authentik.yml +8 -0
  16. package/apps/core/authentik/files/middlewares-authentik.yml +19 -0
  17. package/apps/core/authentik/manifest.json +117 -0
  18. package/apps/core/crowdsec/compose.yml +23 -0
  19. package/apps/core/crowdsec/files/acquis-traefik.yaml +4 -0
  20. package/apps/core/crowdsec/files/acquis.yaml +8 -0
  21. package/apps/core/crowdsec/files/crowdsec-firewall-bouncer.yaml +46 -0
  22. package/apps/core/crowdsec/files/custom-whitelists.yaml +13 -0
  23. package/apps/core/crowdsec/manifest.json +87 -0
  24. package/apps/core/crowdsec-firewall-bouncer/manifest.json +85 -0
  25. package/apps/core/deployrr/jokes_and_tips.txt +58 -0
  26. package/apps/core/deployrr-dashboard/compose.yml +23 -0
  27. package/apps/core/deployrr-dashboard/files/bookmarks.yaml +51 -0
  28. package/apps/core/deployrr-dashboard/files/deployrr_icon.ico +0 -0
  29. package/apps/core/deployrr-dashboard/files/deployrr_icon.png +0 -0
  30. package/apps/core/deployrr-dashboard/files/docker.yaml +10 -0
  31. package/apps/core/deployrr-dashboard/files/service-template-other.yaml +10 -0
  32. package/apps/core/deployrr-dashboard/files/service-template-web-local.yaml +10 -0
  33. package/apps/core/deployrr-dashboard/files/service-template-web-remote.yaml +10 -0
  34. package/apps/core/deployrr-dashboard/files/services.yaml +18 -0
  35. package/apps/core/deployrr-dashboard/files/settings.yaml +13 -0
  36. package/apps/core/deployrr-dashboard/files/widgets.yaml +20 -0
  37. package/apps/core/deployrr-dashboard/manifest.json +133 -0
  38. package/apps/core/npm/compose.yml +40 -0
  39. package/apps/core/npm/manifest.json +60 -0
  40. package/apps/core/oauth/compose.yml +38 -0
  41. package/apps/core/oauth/files/chain-oauth.yml +8 -0
  42. package/apps/core/oauth/files/middlewares-oauth.yml +8 -0
  43. package/apps/core/oauth/files/oauth-secrets-template +3 -0
  44. package/apps/core/oauth/manifest.json +58 -0
  45. package/apps/core/socket-proxy/compose.yml +54 -0
  46. package/apps/core/socket-proxy/manifest.json +62 -0
  47. package/apps/core/system/bash-aliases/udms_bash_aliases +229 -0
  48. package/apps/core/system/bash-aliases/udms_bashrc +5 -0
  49. package/apps/core/system/docker/custom.yml +4 -0
  50. package/apps/core/system/docker/starter.yml +25 -0
  51. package/apps/core/system/rclone/compose.yml +28 -0
  52. package/apps/core/system/rclone/rclone-mount-template.service +43 -0
  53. package/apps/core/system/rclone/rclone-template.conf +6 -0
  54. package/apps/core/system/rclone/start-media-after-boot.service +9 -0
  55. package/apps/core/system/rclone/start-media-after-boot.sh +57 -0
  56. package/apps/core/tinyauth/compose.yml +47 -0
  57. package/apps/core/tinyauth/files/chain-tinyauth.yml +8 -0
  58. package/apps/core/tinyauth/files/middlewares-tinyauth.yml +10 -0
  59. package/apps/core/tinyauth/manifest.json +70 -0
  60. package/apps/core/traefik/compose.yml +106 -0
  61. package/apps/core/traefik/files/app-http-bypass-template.yml +31 -0
  62. package/apps/core/traefik/files/app-http-template.yml +18 -0
  63. package/apps/core/traefik/files/app-https-ssc-bypass-template.yml +36 -0
  64. package/apps/core/traefik/files/app-https-ssc-template.yml +23 -0
  65. package/apps/core/traefik/files/chain-basic-auth.yml +9 -0
  66. package/apps/core/traefik/files/chain-nextcloud.yml +8 -0
  67. package/apps/core/traefik/files/chain-no-auth.yml +8 -0
  68. package/apps/core/traefik/files/domain-passthrough-template.yml +15 -0
  69. package/apps/core/traefik/files/labels-auth-bypass-template.yml +6 -0
  70. package/apps/core/traefik/files/labels-template.yml +10 -0
  71. package/apps/core/traefik/files/middlewares-basic-auth.yml +9 -0
  72. package/apps/core/traefik/files/middlewares-buffering.yml +9 -0
  73. package/apps/core/traefik/files/middlewares-compress.yml +4 -0
  74. package/apps/core/traefik/files/middlewares-crowdsec-bouncer.yml +13 -0
  75. package/apps/core/traefik/files/middlewares-nextcloud.yml +35 -0
  76. package/apps/core/traefik/files/middlewares-rate-limit.yml +6 -0
  77. package/apps/core/traefik/files/middlewares-secure-headers.yml +26 -0
  78. package/apps/core/traefik/files/t2_proxy_network.yml +8 -0
  79. package/apps/core/traefik/files/tls-opts.yml +19 -0
  80. package/apps/core/traefik/files/traefik-static-config-example.yml +97 -0
  81. package/apps/core/traefik/files/traefik.yml +123 -0
  82. package/apps/core/traefik/files/traefik_global_secrets_template.yml +4 -0
  83. package/apps/core/traefik/files/traefik_proxy_network.yml +8 -0
  84. package/apps/core/traefik/manifest.json +70 -0
  85. package/apps/manifest-schema.json +760 -0
  86. package/apps/official/adminer/compose.yml +14 -0
  87. package/apps/official/adminer/manifest.json +65 -0
  88. package/apps/official/airsonic-advanced/compose.yml +26 -0
  89. package/apps/official/airsonic-advanced/manifest.json +78 -0
  90. package/apps/official/apps.json +146 -0
  91. package/apps/official/audiobookshelf/compose.yml +20 -0
  92. package/apps/official/audiobookshelf/manifest.json +65 -0
  93. package/apps/official/autobrr/autobrr-postgresql.yml +24 -0
  94. package/apps/official/autobrr/compose.yml +27 -0
  95. package/apps/official/autobrr/manifest.json +101 -0
  96. package/apps/official/baikal/compose.yml +17 -0
  97. package/apps/official/baikal/manifest.json +65 -0
  98. package/apps/official/bazarr/compose.yml +23 -0
  99. package/apps/official/bazarr/manifest.json +65 -0
  100. package/apps/official/beets/compose.yml +24 -0
  101. package/apps/official/beets/manifest.json +65 -0
  102. package/apps/official/bookstack/bookstack-mariadb.yml +26 -0
  103. package/apps/official/bookstack/compose.yml +31 -0
  104. package/apps/official/bookstack/manifest.json +113 -0
  105. package/apps/official/boxarr/compose.yml +18 -0
  106. package/apps/official/boxarr/manifest.json +65 -0
  107. package/apps/official/cadvisor/compose.yml +23 -0
  108. package/apps/official/cadvisor/files/pre-install.sh +10 -0
  109. package/apps/official/cadvisor/manifest.json +69 -0
  110. package/apps/official/calibre/compose.yml +27 -0
  111. package/apps/official/calibre/manifest.json +87 -0
  112. package/apps/official/calibre-web/compose.yml +23 -0
  113. package/apps/official/calibre-web/manifest.json +74 -0
  114. package/apps/official/change-detection/compose.yml +22 -0
  115. package/apps/official/change-detection/manifest.json +65 -0
  116. package/apps/official/chromium/compose.yml +25 -0
  117. package/apps/official/chromium/manifest.json +82 -0
  118. package/apps/official/cleanuparr/compose.yml +30 -0
  119. package/apps/official/cleanuparr/manifest.json +65 -0
  120. package/apps/official/cloud-commander/compose.yml +24 -0
  121. package/apps/official/cloud-commander/manifest.json +65 -0
  122. package/apps/official/cloudflare-tunnel/compose.yml +26 -0
  123. package/apps/official/cloudflare-tunnel/files/pre-install.sh +7 -0
  124. package/apps/official/cloudflare-tunnel/manifest.json +70 -0
  125. package/apps/official/cyberchef/compose.yml +14 -0
  126. package/apps/official/cyberchef/manifest.json +65 -0
  127. package/apps/official/dashy/compose.yml +27 -0
  128. package/apps/official/dashy/files/starter-conf.yml +45 -0
  129. package/apps/official/dashy/manifest.json +72 -0
  130. package/apps/official/ddns-updater/compose.yml +28 -0
  131. package/apps/official/ddns-updater/files/config.json +14 -0
  132. package/apps/official/ddns-updater/files/pre-install.sh +18 -0
  133. package/apps/official/ddns-updater/manifest.json +71 -0
  134. package/apps/official/deunhealth/compose.yml +17 -0
  135. package/apps/official/deunhealth/manifest.json +46 -0
  136. package/apps/official/digikam/compose.yml +23 -0
  137. package/apps/official/digikam/manifest.json +85 -0
  138. package/apps/official/dispatcharr/compose.yml +39 -0
  139. package/apps/official/dispatcharr/manifest.json +86 -0
  140. package/apps/official/docker-gc/compose.yml +25 -0
  141. package/apps/official/docker-gc/files/docker-gc-exclude +9 -0
  142. package/apps/official/docker-gc/files/pre-install.sh +22 -0
  143. package/apps/official/docker-gc/manifest.json +54 -0
  144. package/apps/official/dockhand/compose.yml +24 -0
  145. package/apps/official/dockhand/dockhand-postgresql.yml +24 -0
  146. package/apps/official/dockhand/manifest.json +105 -0
  147. package/apps/official/dockpeek/compose.yml +20 -0
  148. package/apps/official/dockpeek/manifest.json +95 -0
  149. package/apps/official/dockwatch/compose.yml +31 -0
  150. package/apps/official/dockwatch/manifest.json +65 -0
  151. package/apps/official/dokuwiki/compose.yml +21 -0
  152. package/apps/official/dokuwiki/manifest.json +81 -0
  153. package/apps/official/double-commander/compose.yml +26 -0
  154. package/apps/official/double-commander/manifest.json +83 -0
  155. package/apps/official/dozzle/compose.yml +23 -0
  156. package/apps/official/dozzle/manifest.json +65 -0
  157. package/apps/official/dozzle-agent/compose.yml +26 -0
  158. package/apps/official/dozzle-agent/manifest.json +71 -0
  159. package/apps/official/dweebui/compose.yml +21 -0
  160. package/apps/official/dweebui/manifest.json +81 -0
  161. package/apps/official/emby/compose.yml +29 -0
  162. package/apps/official/emby/manifest.json +98 -0
  163. package/apps/official/esphome/compose.yml +20 -0
  164. package/apps/official/esphome/manifest.json +65 -0
  165. package/apps/official/filezilla/compose.yml +23 -0
  166. package/apps/official/filezilla/manifest.json +82 -0
  167. package/apps/official/flame/compose.yml +21 -0
  168. package/apps/official/flame/manifest.json +73 -0
  169. package/apps/official/flaresolverr/compose.yml +19 -0
  170. package/apps/official/flaresolverr/manifest.json +75 -0
  171. package/apps/official/flowise/compose.yml +46 -0
  172. package/apps/official/flowise/flowise-postgresql.yml +24 -0
  173. package/apps/official/flowise/flowise-redis.yml +23 -0
  174. package/apps/official/flowise/manifest.json +125 -0
  175. package/apps/official/freshrss/compose.yml +20 -0
  176. package/apps/official/freshrss/manifest.json +65 -0
  177. package/apps/official/funkwhale/compose.yml +24 -0
  178. package/apps/official/funkwhale/files/post-install.sh +8 -0
  179. package/apps/official/funkwhale/manifest.json +69 -0
  180. package/apps/official/gamevault/compose.yml +26 -0
  181. package/apps/official/gamevault/gamevault-postgresql.yml +24 -0
  182. package/apps/official/gamevault/manifest.json +101 -0
  183. package/apps/official/glances/compose.yml +26 -0
  184. package/apps/official/glances/files/glances.conf +771 -0
  185. package/apps/official/glances/manifest.json +72 -0
  186. package/apps/official/gluetun/compose.yml +33 -0
  187. package/apps/official/gluetun/files/post-install.sh +78 -0
  188. package/apps/official/gluetun/manifest.json +88 -0
  189. package/apps/official/gonic/compose.yml +26 -0
  190. package/apps/official/gonic/manifest.json +78 -0
  191. package/apps/official/gptwol/compose.yml +23 -0
  192. package/apps/official/gptwol/manifest.json +81 -0
  193. package/apps/official/grafana/compose.yml +19 -0
  194. package/apps/official/grafana/manifest.json +81 -0
  195. package/apps/official/grocy/compose.yml +20 -0
  196. package/apps/official/grocy/manifest.json +74 -0
  197. package/apps/official/guacamole/compose.yml +26 -0
  198. package/apps/official/guacamole/guacamole-mariadb.yml +26 -0
  199. package/apps/official/guacamole/guacd.yml +12 -0
  200. package/apps/official/guacamole/hooks/post-install.sh +60 -0
  201. package/apps/official/guacamole/manifest.json +131 -0
  202. package/apps/official/heimdall/compose.yml +20 -0
  203. package/apps/official/heimdall/manifest.json +65 -0
  204. package/apps/official/homarr/compose.yml +22 -0
  205. package/apps/official/homarr/manifest.json +73 -0
  206. package/apps/official/homebridge/compose.yml +13 -0
  207. package/apps/official/homebridge/manifest.json +66 -0
  208. package/apps/official/homepage/compose.yml +22 -0
  209. package/apps/official/homepage/manifest.json +65 -0
  210. package/apps/official/homer/compose.yml +20 -0
  211. package/apps/official/homer/manifest.json +65 -0
  212. package/apps/official/immich/compose.yml +35 -0
  213. package/apps/official/immich/immich-machine-learning.yml +21 -0
  214. package/apps/official/immich/immich-postgresql.yml +30 -0
  215. package/apps/official/immich/immich-redis.yml +23 -0
  216. package/apps/official/immich/manifest.json +135 -0
  217. package/apps/official/influxdb/compose.yml +17 -0
  218. package/apps/official/influxdb/manifest.json +65 -0
  219. package/apps/official/it-tools/compose.yml +14 -0
  220. package/apps/official/it-tools/manifest.json +65 -0
  221. package/apps/official/jackett/compose.yml +21 -0
  222. package/apps/official/jackett/manifest.json +65 -0
  223. package/apps/official/jellyfin/compose.yml +27 -0
  224. package/apps/official/jellyfin/manifest.json +89 -0
  225. package/apps/official/jellyseerr/compose.yml +19 -0
  226. package/apps/official/jellyseerr/manifest.json +65 -0
  227. package/apps/official/kasm/compose.yml +27 -0
  228. package/apps/official/kasm/manifest.json +115 -0
  229. package/apps/official/kavita/compose.yml +21 -0
  230. package/apps/official/kavita/manifest.json +65 -0
  231. package/apps/official/kometa/compose.yml +23 -0
  232. package/apps/official/kometa/manifest.json +56 -0
  233. package/apps/official/komga/compose.yml +22 -0
  234. package/apps/official/komga/manifest.json +65 -0
  235. package/apps/official/langfuse/compose.yml +64 -0
  236. package/apps/official/langfuse/files/pre-install.sh +178 -0
  237. package/apps/official/langfuse/langfuse-clickhouse.yml +25 -0
  238. package/apps/official/langfuse/langfuse-minio.yml +25 -0
  239. package/apps/official/langfuse/langfuse-postgresql.yml +26 -0
  240. package/apps/official/langfuse/langfuse-redis.yml +22 -0
  241. package/apps/official/langfuse/langfuse-worker.yml +50 -0
  242. package/apps/official/langfuse/manifest.json +201 -0
  243. package/apps/official/lidarr/compose.yml +25 -0
  244. package/apps/official/lidarr/manifest.json +65 -0
  245. package/apps/official/lollypop/compose.yml +26 -0
  246. package/apps/official/lollypop/manifest.json +83 -0
  247. package/apps/official/maintainerr/compose.yml +20 -0
  248. package/apps/official/maintainerr/manifest.json +72 -0
  249. package/apps/official/mariadb/compose.yml +27 -0
  250. package/apps/official/mariadb/manifest.json +74 -0
  251. package/apps/official/mosquitto/compose.yml +24 -0
  252. package/apps/official/mosquitto/files/mosquitto.conf +15 -0
  253. package/apps/official/mosquitto/files/passwd +0 -0
  254. package/apps/official/mosquitto/files/post-install.sh +23 -0
  255. package/apps/official/mosquitto/manifest.json +123 -0
  256. package/apps/official/mqttx-web/compose.yml +14 -0
  257. package/apps/official/mqttx-web/manifest.json +74 -0
  258. package/apps/official/mylar3/compose.yml +22 -0
  259. package/apps/official/mylar3/manifest.json +65 -0
  260. package/apps/official/n8n/compose.yml +29 -0
  261. package/apps/official/n8n/files/pre-install.sh +26 -0
  262. package/apps/official/n8n/manifest.json +103 -0
  263. package/apps/official/n8n/n8n-postgresql.yml +26 -0
  264. package/apps/official/navidrome/compose.yml +26 -0
  265. package/apps/official/navidrome/manifest.json +65 -0
  266. package/apps/official/netdata/compose.yml +28 -0
  267. package/apps/official/netdata/manifest.json +66 -0
  268. package/apps/official/nextcloud/compose.yml +38 -0
  269. package/apps/official/nextcloud/manifest.json +159 -0
  270. package/apps/official/nextcloud/nextcloud-mariadb.yml +29 -0
  271. package/apps/official/nextcloud/nextcloud-redis.yml +20 -0
  272. package/apps/official/node-exporter/compose.yml +23 -0
  273. package/apps/official/node-exporter/manifest.json +65 -0
  274. package/apps/official/node-red/compose.yml +16 -0
  275. package/apps/official/node-red/manifest.json +72 -0
  276. package/apps/official/notifiarr/compose.yml +23 -0
  277. package/apps/official/notifiarr/manifest.json +75 -0
  278. package/apps/official/nzbget/compose.yml +23 -0
  279. package/apps/official/nzbget/manifest.json +74 -0
  280. package/apps/official/ollama/compose.yml +17 -0
  281. package/apps/official/ollama/manifest.json +85 -0
  282. package/apps/official/ombi/compose.yml +21 -0
  283. package/apps/official/ombi/manifest.json +65 -0
  284. package/apps/official/open-webui/compose.yml +21 -0
  285. package/apps/official/open-webui/manifest.json +75 -0
  286. package/apps/official/openhands/compose.yml +23 -0
  287. package/apps/official/openhands/manifest.json +65 -0
  288. package/apps/official/organizr/compose.yml +19 -0
  289. package/apps/official/organizr/manifest.json +78 -0
  290. package/apps/official/overseerr/compose.yml +20 -0
  291. package/apps/official/overseerr/manifest.json +65 -0
  292. package/apps/official/paperless-ai/compose.yml +16 -0
  293. package/apps/official/paperless-ai/manifest.json +74 -0
  294. package/apps/official/paperless-ngx/compose.yml +51 -0
  295. package/apps/official/paperless-ngx/gotenberg.yml +18 -0
  296. package/apps/official/paperless-ngx/manifest.json +179 -0
  297. package/apps/official/paperless-ngx/paperless-ngx-mariadb.yml +26 -0
  298. package/apps/official/paperless-ngx/paperless-ngx-redis.yml +23 -0
  299. package/apps/official/paperless-ngx/tika.yml +12 -0
  300. package/apps/official/pdfding/compose.yml +32 -0
  301. package/apps/official/pdfding/files/post-install.sh +55 -0
  302. package/apps/official/pdfding/manifest.json +120 -0
  303. package/apps/official/pdfding/pdfding-postgresql.yml +24 -0
  304. package/apps/official/pgadmin/compose.yml +17 -0
  305. package/apps/official/pgadmin/manifest.json +80 -0
  306. package/apps/official/phpmyadmin/compose.yml +22 -0
  307. package/apps/official/phpmyadmin/manifest.json +65 -0
  308. package/apps/official/pihole/compose.yml +41 -0
  309. package/apps/official/pihole/manifest.json +89 -0
  310. package/apps/official/piwigo/compose.yml +22 -0
  311. package/apps/official/piwigo/manifest.json +65 -0
  312. package/apps/official/plex/compose.yml +39 -0
  313. package/apps/official/plex/files/pre-install.sh +24 -0
  314. package/apps/official/plex/manifest.json +109 -0
  315. package/apps/official/portainer/compose.yml +22 -0
  316. package/apps/official/portainer/manifest.json +91 -0
  317. package/apps/official/postgresql/compose.yml +28 -0
  318. package/apps/official/postgresql/manifest.json +89 -0
  319. package/apps/official/privatebin/compose.yml +20 -0
  320. package/apps/official/privatebin/files/conf.php +90 -0
  321. package/apps/official/privatebin/manifest.json +82 -0
  322. package/apps/official/projectsend/compose.yml +21 -0
  323. package/apps/official/projectsend/manifest.json +72 -0
  324. package/apps/official/prometheus/compose.yml +25 -0
  325. package/apps/official/prometheus/files/prometheus.yml +3 -0
  326. package/apps/official/prometheus/manifest.json +79 -0
  327. package/apps/official/prowlarr/compose.yml +22 -0
  328. package/apps/official/prowlarr/manifest.json +65 -0
  329. package/apps/official/pulse/compose.yml +28 -0
  330. package/apps/official/pulse/files/post-install.sh +29 -0
  331. package/apps/official/pulse/manifest.json +78 -0
  332. package/apps/official/qbittorrent/compose.yml +22 -0
  333. package/apps/official/qbittorrent/files/pre-install.sh +5 -0
  334. package/apps/official/qbittorrent/files/qBittorrent.conf +39 -0
  335. package/apps/official/qbittorrent/manifest.json +96 -0
  336. package/apps/official/qbittorrent-vpn/compose.yml +26 -0
  337. package/apps/official/qbittorrent-vpn/files/post-install.sh +52 -0
  338. package/apps/official/qbittorrent-vpn/files/pre-install.sh +10 -0
  339. package/apps/official/qbittorrent-vpn/files/qBittorrent.conf +39 -0
  340. package/apps/official/qbittorrent-vpn/manifest.json +108 -0
  341. package/apps/official/qdrant/compose.yml +15 -0
  342. package/apps/official/qdrant/manifest.json +82 -0
  343. package/apps/official/radarr/compose.yml +25 -0
  344. package/apps/official/radarr/manifest.json +65 -0
  345. package/apps/official/redis/compose.yml +26 -0
  346. package/apps/official/redis/manifest.json +73 -0
  347. package/apps/official/redis-commander/compose.yml +20 -0
  348. package/apps/official/redis-commander/manifest.json +65 -0
  349. package/apps/official/remmina/compose.yml +23 -0
  350. package/apps/official/remmina/manifest.json +84 -0
  351. package/apps/official/resilio-sync/compose.yml +23 -0
  352. package/apps/official/resilio-sync/manifest.json +74 -0
  353. package/apps/official/sabnzbd/compose.yml +23 -0
  354. package/apps/official/sabnzbd/files/post-install.sh +35 -0
  355. package/apps/official/sabnzbd/manifest.json +75 -0
  356. package/apps/official/scrutiny/compose.yml +25 -0
  357. package/apps/official/scrutiny/manifest.json +113 -0
  358. package/apps/official/scrutiny/scrutiny-influxdb.yml +28 -0
  359. package/apps/official/searxng/compose.yml +28 -0
  360. package/apps/official/searxng/files/limiter.toml +6 -0
  361. package/apps/official/searxng/files/pre-install.sh +25 -0
  362. package/apps/official/searxng/files/settings.yml +8 -0
  363. package/apps/official/searxng/manifest.json +88 -0
  364. package/apps/official/searxng/searxng-valkey.yml +26 -0
  365. package/apps/official/shellinabox/manifest.json +68 -0
  366. package/apps/official/smokeping/compose.yml +21 -0
  367. package/apps/official/smokeping/manifest.json +65 -0
  368. package/apps/official/sonarr/compose.yml +25 -0
  369. package/apps/official/sonarr/manifest.json +65 -0
  370. package/apps/official/speedtest-tracker/compose.yml +30 -0
  371. package/apps/official/speedtest-tracker/manifest.json +119 -0
  372. package/apps/official/speedtest-tracker/speedtest-tracker-mariadb.yml +24 -0
  373. package/apps/official/sshwifty/compose.yml +17 -0
  374. package/apps/official/sshwifty/files/pre-install.sh +34 -0
  375. package/apps/official/sshwifty/files/sshwifty.conf.json +36 -0
  376. package/apps/official/sshwifty/manifest.json +101 -0
  377. package/apps/official/stirling-pdf/compose.yml +23 -0
  378. package/apps/official/stirling-pdf/manifest.json +65 -0
  379. package/apps/official/supabase/compose.yml +39 -0
  380. package/apps/official/supabase/files/pre-install.sh +201 -0
  381. package/apps/official/supabase/files/volumes/api/kong.yml +221 -0
  382. package/apps/official/supabase/files/volumes/db/_supabase.sql +3 -0
  383. package/apps/official/supabase/files/volumes/db/jwt.sql +5 -0
  384. package/apps/official/supabase/files/volumes/db/logs.sql +6 -0
  385. package/apps/official/supabase/files/volumes/db/pooler.sql +6 -0
  386. package/apps/official/supabase/files/volumes/db/realtime.sql +4 -0
  387. package/apps/official/supabase/files/volumes/db/roles.sql +8 -0
  388. package/apps/official/supabase/files/volumes/db/webhooks.sql +208 -0
  389. package/apps/official/supabase/files/volumes/functions/hello/index.ts +6 -0
  390. package/apps/official/supabase/files/volumes/functions/main/index.ts +93 -0
  391. package/apps/official/supabase/files/volumes/logs/vector.yml +266 -0
  392. package/apps/official/supabase/files/volumes/pooler/pooler.exs +30 -0
  393. package/apps/official/supabase/manifest.json +327 -0
  394. package/apps/official/supabase/supabase-analytics.yml +32 -0
  395. package/apps/official/supabase/supabase-auth.yml +34 -0
  396. package/apps/official/supabase/supabase-db.yml +42 -0
  397. package/apps/official/supabase/supabase-functions.yml +24 -0
  398. package/apps/official/supabase/supabase-imgproxy.yml +25 -0
  399. package/apps/official/supabase/supabase-kong.yml +30 -0
  400. package/apps/official/supabase/supabase-meta.yml +20 -0
  401. package/apps/official/supabase/supabase-pooler.yml +45 -0
  402. package/apps/official/supabase/supabase-realtime.yml +42 -0
  403. package/apps/official/supabase/supabase-rest.yml +21 -0
  404. package/apps/official/supabase/supabase-storage.yml +36 -0
  405. package/apps/official/supabase/supabase-vector.yml +23 -0
  406. package/apps/official/tailscale/compose.yml +23 -0
  407. package/apps/official/tailscale/manifest.json +65 -0
  408. package/apps/official/tautulli/compose.yml +21 -0
  409. package/apps/official/tautulli/files/pre-install.sh +9 -0
  410. package/apps/official/tautulli/manifest.json +69 -0
  411. package/apps/official/termix/compose.yml +18 -0
  412. package/apps/official/termix/manifest.json +65 -0
  413. package/apps/official/teslamate/teslamate-grafana.yml +22 -0
  414. package/apps/official/teslamate/teslamate-mosquitto.yml +27 -0
  415. package/apps/official/teslamate/teslamate-pgsql.yml +24 -0
  416. package/apps/official/teslamate/teslamate.yml +27 -0
  417. package/apps/official/thelounge/compose.yml +20 -0
  418. package/apps/official/thelounge/manifest.json +65 -0
  419. package/apps/official/theme-park/compose.yml +21 -0
  420. package/apps/official/theme-park/manifest.json +74 -0
  421. package/apps/official/traefik-access-log/compose.yml +14 -0
  422. package/apps/official/traefik-access-log/manifest.json +59 -0
  423. package/apps/official/traefik-certs-dumper/compose.yml +18 -0
  424. package/apps/official/traefik-certs-dumper/manifest.json +56 -0
  425. package/apps/official/traefik-error-log/compose.yml +14 -0
  426. package/apps/official/traefik-error-log/manifest.json +59 -0
  427. package/apps/official/transmission/compose.yml +33 -0
  428. package/apps/official/transmission/manifest.json +90 -0
  429. package/apps/official/trilium/compose.yml +19 -0
  430. package/apps/official/trilium/manifest.json +65 -0
  431. package/apps/official/uptime-kuma/compose.yml +17 -0
  432. package/apps/official/uptime-kuma/manifest.json +65 -0
  433. package/apps/official/vaultwarden/compose.yml +20 -0
  434. package/apps/official/vaultwarden/files/pre-install.sh +27 -0
  435. package/apps/official/vaultwarden/manifest.json +86 -0
  436. package/apps/official/vikunja/compose.yml +30 -0
  437. package/apps/official/vikunja/manifest.json +123 -0
  438. package/apps/official/vikunja/vikunja-mariadb.yml +26 -0
  439. package/apps/official/viniplay/compose.yml +18 -0
  440. package/apps/official/viniplay/files/pre-install.sh +9 -0
  441. package/apps/official/viniplay/manifest.json +63 -0
  442. package/apps/official/vscode/compose.yml +28 -0
  443. package/apps/official/vscode/manifest.json +65 -0
  444. package/apps/official/wallos/compose.yml +19 -0
  445. package/apps/official/wallos/manifest.json +65 -0
  446. package/apps/official/weaviate/compose.yml +28 -0
  447. package/apps/official/weaviate/manifest.json +82 -0
  448. package/apps/official/wg-easy/compose.yml +31 -0
  449. package/apps/official/wg-easy/files/post-install.sh +32 -0
  450. package/apps/official/wg-easy/manifest.json +118 -0
  451. package/apps/official/wikidocs/compose.yml +19 -0
  452. package/apps/official/wikidocs/manifest.json +65 -0
  453. package/apps/official/wud/compose.yml +22 -0
  454. package/apps/official/wud/manifest.json +74 -0
  455. package/apps/official/xpipe-webtop/compose.yml +21 -0
  456. package/apps/official/xpipe-webtop/manifest.json +83 -0
  457. package/apps/official/zerotier/compose.yml +17 -0
  458. package/apps/official/zerotier/files/post-install.sh +23 -0
  459. package/apps/official/zerotier/manifest.json +78 -0
  460. package/apps/unofficial/9router/compose.yml +30 -0
  461. package/apps/unofficial/9router/files/oauth-fix.patch +32 -0
  462. package/apps/unofficial/9router/files/pre-install.sh +87 -0
  463. package/apps/unofficial/9router/manifest.json +144 -0
  464. package/apps/unofficial/openclaw/Dockerfile.full +79 -0
  465. package/apps/unofficial/openclaw/compose.yml +60 -0
  466. package/apps/unofficial/openclaw/files/post-install.sh +316 -0
  467. package/apps/unofficial/openclaw/files/pre-install.sh +174 -0
  468. package/apps/unofficial/openclaw/manifest.json +178 -0
  469. package/apps/version_pins +67 -0
  470. package/bin/deployrr-init.sh +49 -0
  471. package/latest-version +1 -0
  472. package/package.json +21 -0
@@ -0,0 +1,144 @@
1
+ {
2
+ "$schema": "../../../apps/manifest-schema.json",
3
+ "version": "1.2",
4
+ "app": {
5
+ "sname": "9router",
6
+ "pname": "9Router",
7
+ "description": "9Router is a universal AI proxy that smart-routes requests across Claude, GPT, Gemini, and other LLMs. It maximizes subscription usage with auto-fallback, quota tracking, multi-account support, and format translation — all through a single OpenAI-compatible endpoint.",
8
+ "descriptionShort": "Universal AI proxy & smart router",
9
+ "icon": "https://raw.githubusercontent.com/decolua/9router/master/public/favicon.svg",
10
+ "category": "unofficial",
11
+ "menuNumber": "05",
12
+ "tags": [
13
+ "ai",
14
+ "proxy",
15
+ "llm",
16
+ "router",
17
+ "pro"
18
+ ]
19
+ },
20
+ "deployment": {
21
+ "type": "single",
22
+ "compose": "compose.yml",
23
+ "profiles": [
24
+ "apps",
25
+ "all"
26
+ ],
27
+ "networks": [
28
+ "default"
29
+ ],
30
+ "build": {
31
+ "imageName": "deployrr/9router:latest",
32
+ "localBuild": true,
33
+ "repoUrl": "https://github.com/decolua/9router.git"
34
+ },
35
+ "webui": true,
36
+ "port": 20128,
37
+ "protocol": "http"
38
+ },
39
+ "requirements": {
40
+ "prerequisites": [
41
+ "prerequisites",
42
+ "pro"
43
+ ]
44
+ },
45
+ "env": {
46
+ "variables": [
47
+ {
48
+ "name": "NINEROUTER_PORT",
49
+ "description": "9Router dashboard and API port",
50
+ "type": "port",
51
+ "default": 20128,
52
+ "prompt": true,
53
+ "required": true,
54
+ "validation": {
55
+ "type": "port",
56
+ "min": 1,
57
+ "max": 65535
58
+ }
59
+ }
60
+ ],
61
+ "secrets": [
62
+ {
63
+ "name": "ninerouter_jwt_secret",
64
+ "description": "JWT secret for 9Router session authentication. Used to sign dashboard login tokens.",
65
+ "type": "random",
66
+ "length": 32,
67
+ "addToCompose": false
68
+ },
69
+ {
70
+ "name": "ninerouter_password",
71
+ "description": "Initial dashboard login password for 9Router.",
72
+ "type": "random",
73
+ "length": 16,
74
+ "addToCompose": false
75
+ }
76
+ ],
77
+ "constants": [
78
+ {
79
+ "name": "NINEROUTER_DATA_DIR",
80
+ "value": "$DOCKERDIR/appdata/9router/data",
81
+ "description": "9Router persistent data directory"
82
+ }
83
+ ]
84
+ },
85
+ "hooks": {
86
+ "preInstall": {
87
+ "dialog": {
88
+ "type": "warning",
89
+ "title": "9Router - Build from Source",
90
+ "message": "\\Z1IMPORTANT:\\Zn 9Router is an \\Z4unofficial\\Zn app that must be built from source.\\n\\nThe first install will:\\n• Clone the 9Router repository from GitHub\\n• Build the Docker image locally (may take 3-5 minutes)\\n• Require an active internet connection\\n\\nSubsequent starts will use the cached image.\\n\\nDo you want to proceed?"
91
+ },
92
+ "script": "files/pre-install.sh"
93
+ },
94
+ "postInstall": {
95
+ "messages": [
96
+ {
97
+ "style": "warning",
98
+ "text": "COPY THIS PASSWORD TO LOG IN: $INITIAL_PASSWORD"
99
+ },
100
+ {
101
+ "style": "info",
102
+ "text": "9Router dashboard is running at http://$SERVER_LAN_IP:$NINEROUTER_PORT/dashboard"
103
+ },
104
+ {
105
+ "style": "note",
106
+ "text": "Password also saved to $DOCKER_FOLDER/secrets/ninerouter_password"
107
+ },
108
+ {
109
+ "style": "note",
110
+ "text": "OpenAI-compatible API endpoint: http://$SERVER_LAN_IP:$NINEROUTER_PORT/v1"
111
+ },
112
+ {
113
+ "style": "info",
114
+ "text": "To connect OpenClaw: use http://9router:20128/v1 as the provider endpoint"
115
+ },
116
+ {
117
+ "style": "info",
118
+ "text": "For more info: https://github.com/decolua/9router"
119
+ }
120
+ ],
121
+ "copyValue": "$INITIAL_PASSWORD",
122
+ "copyLabel": "Copy Password"
123
+ }
124
+ },
125
+ "folders": {
126
+ "appdata": [
127
+ "data"
128
+ ]
129
+ },
130
+ "traefik": {
131
+ "supported": true
132
+ },
133
+ "dashboard": {
134
+ "enabled": true,
135
+ "location": "local",
136
+ "showStats": true,
137
+ "portVariable": "NINEROUTER_PORT"
138
+ },
139
+ "status": {
140
+ "file": "05_9router_status",
141
+ "successMessage": "9Router Setup Completed",
142
+ "telemetryAction": "9router"
143
+ }
144
+ }
@@ -0,0 +1,79 @@
1
+ # OpenClaw - Power-user Dockerfile
2
+ # Faithful copy of upstream Dockerfile with power-user defaults enabled.
3
+ # See: https://docs.openclaw.ai/install/docker#power-user-%2F-full-featured-container-opt-in
4
+ #
5
+ # Differences from upstream Dockerfile:
6
+ # OPENCLAW_DOCKER_APT_PACKAGES defaults to full toolset (upstream: empty)
7
+ # OPENCLAW_INSTALL_BROWSER defaults to "1" (upstream: empty)
8
+ #
9
+ # This file is copied into the OpenClaw repo's build context by pre-install.sh
10
+ # and used instead of the standard Dockerfile.
11
+
12
+ FROM node:22-bookworm
13
+
14
+ # Install Bun (required for build scripts)
15
+ RUN curl -fsSL https://bun.sh/install | bash
16
+ ENV PATH="/root/.bun/bin:${PATH}"
17
+
18
+ RUN corepack enable
19
+
20
+ WORKDIR /app
21
+
22
+ # ── Extra packages for power-user features ─────────────────────────
23
+ # Upstream default: "" (empty). Full variant bakes in common dev tools.
24
+ ARG OPENCLAW_DOCKER_APT_PACKAGES="git curl jq build-essential procps ca-certificates"
25
+ RUN if [ -n "$OPENCLAW_DOCKER_APT_PACKAGES" ]; then \
26
+ apt-get update && \
27
+ DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends $OPENCLAW_DOCKER_APT_PACKAGES && \
28
+ apt-get clean && \
29
+ rm -rf /var/lib/apt/lists/* /var/cache/apt/archives/*; \
30
+ fi
31
+
32
+ # ── pnpm monorepo dependency install ───────────────────────────────
33
+ COPY package.json pnpm-lock.yaml pnpm-workspace.yaml .npmrc ./
34
+ COPY ui/package.json ./ui/package.json
35
+ COPY patches ./patches
36
+ COPY scripts ./scripts
37
+
38
+ RUN pnpm install --frozen-lockfile
39
+
40
+ # ── Pre-install Chromium + Playwright deps ─────────────────────────
41
+ # Optionally install Chromium and Xvfb for browser automation.
42
+ # Build with: docker build --build-arg OPENCLAW_INSTALL_BROWSER=1 ...
43
+ # Adds ~300MB but eliminates the 60-90s Playwright install on every container start.
44
+ # Must run after pnpm install so playwright-core is available in node_modules.
45
+ # Upstream default: "" (empty). Full variant bakes in Chromium.
46
+ ARG OPENCLAW_INSTALL_BROWSER="1"
47
+ RUN if [ -n "$OPENCLAW_INSTALL_BROWSER" ]; then \
48
+ apt-get update && \
49
+ DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends xvfb && \
50
+ node /app/node_modules/playwright-core/cli.js install --with-deps chromium && \
51
+ apt-get clean && \
52
+ rm -rf /var/lib/apt/lists/* /var/cache/apt/archives/*; \
53
+ fi
54
+
55
+ # ── Build ──────────────────────────────────────────────────────────
56
+ COPY . .
57
+
58
+ RUN pnpm build
59
+ # Force pnpm for UI build (Bun may fail on ARM/Synology architectures)
60
+ ENV OPENCLAW_PREFER_PNPM=1
61
+ RUN pnpm ui:install && pnpm ui:build
62
+
63
+ ENV NODE_ENV=production
64
+
65
+ # Allow non-root user to write temp files during runtime/tests.
66
+ RUN chown -R node:node /app
67
+
68
+ # Security hardening: Run as non-root user
69
+ # The node:22-bookworm image includes a 'node' user (uid 1000)
70
+ # This reduces the attack surface by preventing container escape via root privileges
71
+ USER node
72
+
73
+ # Start gateway server with default config.
74
+ # Binds to loopback (127.0.0.1) by default for security.
75
+ #
76
+ # For container platforms requiring external health checks:
77
+ # 1. Set OPENCLAW_GATEWAY_TOKEN or OPENCLAW_GATEWAY_PASSWORD env var
78
+ # 2. Override CMD: ["node","openclaw.mjs","gateway","--allow-unconfigured","--bind","lan"]
79
+ CMD ["node", "openclaw.mjs", "gateway", "--allow-unconfigured"]
@@ -0,0 +1,60 @@
1
+ services:
2
+ # OpenClaw - Power-user AI Coding Assistant with Agent Sandbox
3
+ # WARNING: Mounts Docker socket - grants container access to host Docker daemon
4
+ openclaw:
5
+ image: deployrr/openclaw:latest
6
+ container_name: openclaw
7
+ security_opt:
8
+ - no-new-privileges:true
9
+ restart: unless-stopped
10
+ profiles: [ "apps", "all" ]
11
+ networks:
12
+ - default
13
+ ports:
14
+ - "$OPENCLAW_PORT:18789"
15
+ volumes:
16
+ - $DOCKERDIR/appdata/openclaw/home:/home/node
17
+ - $DOCKERDIR/appdata/shared/openclaw-cli:/home/node/.openclaw
18
+ - $DOCKERDIR/appdata/openclaw/workspace:/home/node/.openclaw/workspace
19
+ - /var/run/docker.sock:/var/run/docker.sock
20
+ environment:
21
+ - TZ=$TZ
22
+ - PUID=$PUID
23
+ - PGID=$PGID
24
+ - HOME=/home/node
25
+ - TERM=xterm-256color
26
+ - NODE_ENV=production
27
+ - PLAYWRIGHT_BROWSERS_PATH=/home/node/.cache/ms-playwright
28
+ # env_file injects OPENCLAW_GATEWAY_TOKEN as an env var.
29
+ # Docker daemon reads this file as root — host file stays root:root 0600.
30
+ # The container process never needs to read any secret file directly.
31
+ # NOTE: Docker Compose standalone secrets (file: type) do NOT override host file
32
+ # permissions inside the container — mode: 0444 is ignored for bind-mounted secrets.
33
+ env_file:
34
+ - $DOCKERDIR/secrets/openclaw.env
35
+ command: [ "node", "openclaw.mjs", "gateway", "--allow-unconfigured", "--bind", "lan", "--port", "18789" ]
36
+ # DOCKER-LABELS-PLACEHOLDER
37
+
38
+ # OpenClaw CLI — admin commands (onboard, devices approve, etc.)
39
+ # Never auto-started (profiles: cli). Usage:
40
+ # sudo docker compose -f <compose-file> run --rm openclaw-cli devices list
41
+ # sudo docker compose -f <compose-file> run --rm openclaw-cli devices approve --latest
42
+ openclaw-cli:
43
+ image: deployrr/openclaw:latest
44
+ container_name: openclaw-cli
45
+ profiles: [ "cli" ]
46
+ networks:
47
+ - default
48
+ environment:
49
+ - HOME=/home/node
50
+ - TERM=xterm-256color
51
+ - OPENCLAW_GATEWAY_URL=http://openclaw:18789
52
+ volumes:
53
+ - $DOCKERDIR/appdata/shared/openclaw-cli:/home/node/.openclaw
54
+ - $DOCKERDIR/appdata/openclaw/workspace:/home/node/.openclaw/workspace
55
+ env_file:
56
+ - $DOCKERDIR/secrets/openclaw.env
57
+ stdin_open: true
58
+ tty: true
59
+ init: true
60
+ entrypoint: [ "node", "openclaw.mjs" ]
@@ -0,0 +1,316 @@
1
+ #!/bin/bash
2
+ # OpenClaw: Post-install hook
3
+ # This script is sourced by f_execute_app_hook after container starts.
4
+ # All Deployrr variables (DOCKER_FOLDER, SERVER_LAN_IP, etc.) are available.
5
+
6
+ local _oc_container="openclaw"
7
+ local _oc_secret_file="$DOCKER_FOLDER/secrets/openclaw_gateway_token"
8
+ local _oc_config_dir="$DOCKER_FOLDER/appdata/shared/openclaw-cli"
9
+ local _oc_port="${OPENCLAW_PORT:-18789}"
10
+ local _oc_gateway_ready=false
11
+
12
+ # Step 1: Wait for gateway to become healthy (up to 30s)
13
+ # The container does first-run initialization on startup (writes openclaw.json,
14
+ # sets up workspace, etc.). We must wait for this to complete before overwriting
15
+ # openclaw.json — otherwise the container will overwrite our config.
16
+ f_print_substep "Waiting for OpenClaw gateway to initialize..."
17
+ for _oc_i in $(seq 1 15); do
18
+ if sudo docker exec "$_oc_container" \
19
+ node openclaw.mjs gateway health 2>/dev/null | grep -qi "healthy"; then
20
+ _oc_gateway_ready=true
21
+ f_print_substep "Gateway initialized"
22
+ break
23
+ fi
24
+ sleep 2
25
+ done
26
+
27
+ if [[ "$_oc_gateway_ready" != true ]]; then
28
+ f_print_warning "Gateway health check timed out — continuing anyway"
29
+ fi
30
+
31
+ # Step 2: Write openclaw.json AFTER container first-run initialization
32
+ # The container overwrites openclaw.json on first startup (normalizes it).
33
+ # We write our config here — after initialization — then restart the container
34
+ # so it picks up our settings correctly.
35
+ #
36
+ # gateway.auth.mode: "trusted-proxy" — trusts the user identity header set by
37
+ # the active Traefik auth middleware (basicAuth, Authelia, Authentik, etc.).
38
+ # The correct header is auto-detected from the Traefik file provider.
39
+ # dangerouslyDisableDeviceAuth: true — completely disables device identity checks
40
+ # for the Control UI. Required for homelab LAN installs.
41
+ # trustedProxies — required when running behind Traefik reverse proxy.
42
+ # Without this, OpenClaw treats all connections as untrusted/remote.
43
+ f_print_substep "Writing OpenClaw gateway configuration..."
44
+ local _oc_docker_subnet="172.16.0.0/12"
45
+
46
+ # Detect active auth chain → set correct userHeader
47
+ # Each auth middleware sets a different header for the authenticated username:
48
+ # basicAuth/OAuth → X-Forwarded-User
49
+ # Authelia/TinyAuth → Remote-User
50
+ # Authentik → X-authentik-username
51
+ local _oc_user_header="x-forwarded-user" # safe default
52
+ # $CHAIN_NAME is a global set during the install flow's auth selection
53
+ local _oc_detected_chain="${CHAIN_NAME:-}"
54
+ # Fallback: read from Traefik file provider if CHAIN_NAME not set (e.g. reinstall)
55
+ if [[ -z "$_oc_detected_chain" ]]; then
56
+ local _oc_file_provider="$DOCKER_FOLDER/appdata/traefik3/rules/$HOSTNAME/app-openclaw.yml"
57
+ if [[ -f "$_oc_file_provider" ]]; then
58
+ _oc_detected_chain=$(grep -o 'chain-[a-z-]*' "$_oc_file_provider" 2>/dev/null | head -1)
59
+ fi
60
+ fi
61
+ case "$_oc_detected_chain" in
62
+ chain-authelia|chain-tinyauth)
63
+ _oc_user_header="remote-user"
64
+ ;;
65
+ chain-authentik)
66
+ _oc_user_header="x-authentik-username"
67
+ ;;
68
+ esac
69
+ f_print_substep "Auth: ${_oc_detected_chain:-no chain} → userHeader: $_oc_user_header"
70
+
71
+ if sudo docker ps --format '{{.Names}}' 2>/dev/null | grep -q '^9router$'; then
72
+ f_print_substep "9Router detected — auto-configuring provider endpoint..."
73
+
74
+ # Query 9Router for its actual available models (from the shim)
75
+ local _oc_9r_models_json
76
+ _oc_9r_models_json=$(sudo docker exec "$_oc_container" \
77
+ wget -qO- http://9router:20128/v1/models 2>/dev/null)
78
+
79
+ # Build OpenClaw-format models array from 9Router's /v1/models response
80
+ local _oc_9r_models_array="[]"
81
+ local _oc_9r_primary=""
82
+ if [[ -n "$_oc_9r_models_json" ]]; then
83
+ _oc_9r_models_array=$(echo "$_oc_9r_models_json" | jq '[.data[] | {id: .id, name: (.root // .id)}]' 2>/dev/null)
84
+ _oc_9r_primary=$(echo "$_oc_9r_models_json" | jq -r '.data[0].id // empty' 2>/dev/null)
85
+ fi
86
+
87
+ # Fallback if query failed or returned no models
88
+ if [[ -z "$_oc_9r_primary" ]]; then
89
+ f_print_warning "Could not query 9Router models — using placeholder"
90
+ _oc_9r_models_array='[{"id": "placeholder", "name": "Configure models in 9Router dashboard"}]'
91
+ _oc_9r_primary="placeholder"
92
+ else
93
+ f_print_substep "Found $(echo "$_oc_9r_models_array" | jq 'length') model(s) from 9Router"
94
+ fi
95
+
96
+ # Write config to temp file first (NEVER use sudo tee — it injects password)
97
+ local _oc_tmp_cfg="/tmp/openclaw_cfg_$$.json"
98
+ cat > "$_oc_tmp_cfg" <<OCCONFIG
99
+ {
100
+ "gateway": {
101
+ "bind": "lan",
102
+ "auth": {
103
+ "mode": "trusted-proxy",
104
+ "trustedProxy": {
105
+ "userHeader": "$_oc_user_header"
106
+ }
107
+ },
108
+ "trustedProxies": ["$_oc_docker_subnet"],
109
+ "controlUi": {
110
+ "allowInsecureAuth": true,
111
+ "dangerouslyDisableDeviceAuth": true
112
+ }
113
+ },
114
+ "agents": {
115
+ "defaults": {
116
+ "model": {
117
+ "primary": "9router/$_oc_9r_primary"
118
+ }
119
+ }
120
+ },
121
+ "models": {
122
+ "providers": {
123
+ "9router": {
124
+ "baseUrl": "http://9router:20128/v1",
125
+ "apiKey": "sk_9router",
126
+ "api": "openai-completions",
127
+ "models": $_oc_9r_models_array
128
+ }
129
+ }
130
+ }
131
+ }
132
+ OCCONFIG
133
+ sudo cp "$_oc_tmp_cfg" "$_oc_config_dir/openclaw.json"
134
+ rm -f "$_oc_tmp_cfg"
135
+ f_print_success "Configured to use 9Router (model: 9router/$_oc_9r_primary)"
136
+ else
137
+ # No 9Router — write gateway-only config
138
+ local _oc_tmp_cfg="/tmp/openclaw_cfg_$$.json"
139
+ cat > "$_oc_tmp_cfg" <<OCCONFIG
140
+ {
141
+ "gateway": {
142
+ "bind": "lan",
143
+ "auth": {
144
+ "mode": "trusted-proxy",
145
+ "trustedProxy": {
146
+ "userHeader": "$_oc_user_header"
147
+ }
148
+ },
149
+ "trustedProxies": ["$_oc_docker_subnet"],
150
+ "controlUi": {
151
+ "allowInsecureAuth": true,
152
+ "dangerouslyDisableDeviceAuth": true
153
+ }
154
+ }
155
+ }
156
+ OCCONFIG
157
+ sudo cp "$_oc_tmp_cfg" "$_oc_config_dir/openclaw.json"
158
+ rm -f "$_oc_tmp_cfg"
159
+ f_print_substep "9Router not found — configure API providers manually after install"
160
+ fi
161
+ sudo chown 1000:1000 "$_oc_config_dir/openclaw.json"
162
+ f_print_substep "Gateway config written (dangerouslyDisableDeviceAuth + trustedProxies)"
163
+
164
+ # Step 2b: Ollama Heartbeat Configuration (optional)
165
+ # If user chose to route heartbeats to Ollama, pull the model and merge config.
166
+ # This runs BEFORE the container restart so all config changes are picked up at once.
167
+ if [[ "${OPENCLAW_OLLAMA_HEARTBEAT:-no}" == "yes" ]]; then
168
+ f_print_substep "Configuring Ollama heartbeat..."
169
+
170
+ # Verify Ollama container is running
171
+ if sudo docker ps --format '{{.Names}}' 2>/dev/null | grep -q '^ollama$'; then
172
+ # Pull the heartbeat model into Ollama
173
+ f_print_substep "Pulling llama3.2:3b model into Ollama (this may take a minute)..."
174
+ if sudo docker exec ollama ollama pull llama3.2:3b 2>&1; then
175
+ f_print_success "Model llama3.2:3b pulled successfully"
176
+ else
177
+ f_print_warning "Failed to pull model — heartbeat will still try at runtime"
178
+ fi
179
+
180
+ # Merge heartbeat config + Ollama provider into openclaw.json using jq
181
+ # IMPORTANT: heartbeat must go under agents.defaults.heartbeat (NOT top-level)
182
+ # OpenClaw rejects top-level "heartbeat" key and crash-loops with "Config invalid"
183
+ f_print_substep "Adding heartbeat and Ollama provider to openclaw.json..."
184
+ local _oc_tmp_config="/tmp/openclaw_config_merge_$$.json"
185
+ if sudo jq '. * {
186
+ "agents": (.agents // {}) * {
187
+ "defaults": ((.agents // {}).defaults // {}) * {
188
+ "heartbeat": {
189
+ "every": "1h",
190
+ "model": "ollama/llama3.2:3b",
191
+ "session": "main",
192
+ "target": "slack",
193
+ "prompt": "Check: Any blockers, opportunities, or progress updates needed?"
194
+ }
195
+ }
196
+ },
197
+ "models": (.models // {}) * {
198
+ "providers": ((.models // {}).providers // {}) * {
199
+ "ollama": ((.models // {}).providers // {}).ollama // {} | . * {
200
+ "baseUrl": "http://ollama:11434",
201
+ "api": "openai-completions",
202
+ "models": [
203
+ {
204
+ "id": "llama3.2:3b",
205
+ "name": "Llama 3.2 3B (heartbeat)"
206
+ }
207
+ ]
208
+ }
209
+ }
210
+ }
211
+ }' "$_oc_config_dir/openclaw.json" > "$_oc_tmp_config" 2>/dev/null; then
212
+ sudo mv "$_oc_tmp_config" "$_oc_config_dir/openclaw.json"
213
+ sudo chown 1000:1000 "$_oc_config_dir/openclaw.json"
214
+ f_print_success "Heartbeat configured to use Ollama (free local LLM)"
215
+ f_print_substep "Heartbeats will use ollama/llama3.2:3b instead of paid API"
216
+ else
217
+ f_print_warning "Failed to merge heartbeat config — configure manually in openclaw.json"
218
+ sudo rm -f "$_oc_tmp_config"
219
+ fi
220
+ else
221
+ f_print_warning "Ollama container not found — skipping heartbeat configuration"
222
+ f_print_substep "Install Ollama first, then reconfigure heartbeat manually"
223
+ fi
224
+ fi
225
+
226
+ # Step 2c: Configure allowedOrigins for gateway Control UI
227
+ # Without correct allowedOrigins, the browser cannot connect to the gateway WebSocket.
228
+ # We construct the origins list from Deployrr environment variables that are available
229
+ # at this point (DOMAINNAME_1, SERVER_LAN_IP, port).
230
+ f_print_substep "Configuring gateway allowedOrigins..."
231
+
232
+ # Try to read existing subdomain from Traefik file provider (reinstall case)
233
+ local _oc_subdomain
234
+ _oc_subdomain=$(f_get_app_subdomain "openclaw" 2>/dev/null)
235
+ # Default: sname with hyphens removed (matches Deployrr's default subdomain pattern)
236
+ [[ -z "$_oc_subdomain" ]] && _oc_subdomain="openclaw"
237
+
238
+ # Build origins array — always include localhost entries
239
+ local _oc_origins
240
+ _oc_origins='["http://localhost:'"$_oc_port"'","http://127.0.0.1:'"$_oc_port"'"]'
241
+
242
+ # Add LAN IP entry if available
243
+ if [[ -n "$SERVER_LAN_IP" ]]; then
244
+ _oc_origins=$(echo "$_oc_origins" | jq '. + ["http://'"${SERVER_LAN_IP}:${_oc_port}"'"]')
245
+ fi
246
+
247
+ # Add Traefik/HTTPS entry if a domain is configured
248
+ if [[ -n "$DOMAINNAME_1" ]]; then
249
+ _oc_origins=$(echo "$_oc_origins" | jq '. + ["https://'"${_oc_subdomain}.${DOMAINNAME_1}"'"]')
250
+ f_print_substep "Added Traefik origin: https://${_oc_subdomain}.${DOMAINNAME_1}"
251
+ fi
252
+
253
+ # Merge allowedOrigins into openclaw.json
254
+ local _oc_tmp_origins="/tmp/openclaw_origins_$$.json"
255
+ if sudo jq --argjson origins "$_oc_origins" \
256
+ '.gateway.controlUi.allowedOrigins = $origins' \
257
+ "$_oc_config_dir/openclaw.json" > "$_oc_tmp_origins" 2>/dev/null; then
258
+ sudo mv "$_oc_tmp_origins" "$_oc_config_dir/openclaw.json"
259
+ sudo chown 1000:1000 "$_oc_config_dir/openclaw.json"
260
+ f_print_success "Gateway allowedOrigins configured"
261
+ else
262
+ f_print_warning "Failed to set allowedOrigins — you may need to configure manually"
263
+ sudo rm -f "$_oc_tmp_origins"
264
+ fi
265
+
266
+
267
+
268
+ # Step 3: Restart container to apply the new openclaw.json
269
+ # The container must restart to pick up the config changes we just wrote.
270
+ f_print_substep "Restarting container to apply configuration..."
271
+ sudo docker restart "$_oc_container" > /dev/null 2>&1
272
+ sleep 3
273
+
274
+ # Step 4: Wait for gateway to become healthy again after restart
275
+ f_print_substep "Waiting for gateway to come back up..."
276
+ _oc_gateway_ready=false
277
+ for _oc_i in $(seq 1 15); do
278
+ if sudo docker exec "$_oc_container" \
279
+ node openclaw.mjs gateway health 2>/dev/null | grep -qi "healthy"; then
280
+ _oc_gateway_ready=true
281
+ f_print_substep "Gateway is ready"
282
+ break
283
+ fi
284
+ sleep 2
285
+ done
286
+
287
+ if [[ "$_oc_gateway_ready" != true ]]; then
288
+ f_print_warning "Gateway health check timed out after restart — continuing anyway"
289
+ fi
290
+
291
+ # Step 5: Show the gateway URL
292
+ # Trusted-proxy auth mode — Traefik's basicAuth sets X-Forwarded-User header
293
+ # (requires headerField in middlewares-basic-auth.yml). No tokens needed.
294
+ if [[ -n "$DOMAINNAME_1" ]]; then
295
+ whiptail --title "OpenClaw — Setup Complete" --msgbox \
296
+ "The OpenClaw gateway is running!
297
+
298
+ Open the Control UI:
299
+
300
+ https://${_oc_subdomain:-openclaw}.${DOMAINNAME_1}
301
+
302
+ No token or device pairing needed — just open the URL.
303
+ Traefik handles authentication automatically." 14 72
304
+ else
305
+ local _oc_display_token
306
+ _oc_display_token=$(sudo cat "$_oc_secret_file" 2>/dev/null)
307
+ whiptail --title "OpenClaw — Setup Complete" --msgbox \
308
+ "The OpenClaw gateway is running!
309
+
310
+ Open the Control UI:
311
+
312
+ http://${SERVER_LAN_IP}:${_oc_port}
313
+
314
+ You will need your gateway token for LAN access:
315
+ ${_oc_display_token:-TOKEN}" 14 72
316
+ fi