openship 0.4.4 → 0.4.6

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 (318) hide show
  1. package/README.md +2 -24
  2. package/dist/bare-2HYDXQEH.js +23 -0
  3. package/dist/{bowser-MFQA6OS4.js → bowser-O3AEA6AN.js} +5 -1
  4. package/dist/{chunk-KD7VO4LG.js → chunk-2ZLR7ULL.js} +255 -65
  5. package/dist/{chunk-YHXCHW7Q.js → chunk-3JQTL4R4.js} +236 -99
  6. package/dist/{chunk-E77LJWJK.js → chunk-4TJC4JZQ.js} +20 -9
  7. package/dist/{chunk-YL67EWYZ.js → chunk-4Z5QO7N6.js} +6 -2
  8. package/dist/{chunk-WJPCBU7Z.js → chunk-5FNIWBFI.js} +10 -6
  9. package/dist/{chunk-Y37KHU7L.js → chunk-5MZ624VX.js} +5 -0
  10. package/dist/{chunk-QKFRZNKN.js → chunk-6APIPIJY.js} +8 -4
  11. package/dist/{chunk-JZLNHGLW.js → chunk-6APULWSU.js} +153 -133
  12. package/dist/{chunk-F4DFVG6Q.js → chunk-6B5YCFFV.js} +8 -4
  13. package/dist/{chunk-XVSAUO2I.js → chunk-AVIB7CT7.js} +5 -1
  14. package/dist/{chunk-TEYJYSMT.js → chunk-C5OHTYEF.js} +12 -6
  15. package/dist/{chunk-7UOB5GGQ.js → chunk-DYPH4HCI.js} +5 -0
  16. package/dist/{chunk-XIFRMKYT.js → chunk-EI575GHN.js} +6 -2
  17. package/dist/{chunk-4CQWT2WL.js → chunk-FPRHYBY2.js} +5 -0
  18. package/dist/chunk-FQGJZ2HS.js +248 -0
  19. package/dist/{chunk-JR2OCMJA.js → chunk-FRNAR33O.js} +6 -2
  20. package/dist/{chunk-JUJBBF5U.js → chunk-FXTBHTWY.js} +362 -42
  21. package/dist/chunk-ILFETZOM.js +131 -0
  22. package/dist/{chunk-5ZCKQ2MI.js → chunk-IXCHURVK.js} +7 -3
  23. package/dist/{chunk-6ERIMTBC.js → chunk-JYGD5WSN.js} +5 -0
  24. package/dist/{chunk-4VNS5WPM.js → chunk-KI2EY3WB.js} +4 -0
  25. package/dist/{chunk-3U4SPZD5.js → chunk-L2VOGB2X.js} +7 -104
  26. package/dist/{chunk-NB2VEIWG.js → chunk-MZ2WEHHY.js} +7 -3
  27. package/dist/{chunk-BUBSSKO6.js → chunk-O6ZZF52V.js} +5 -1
  28. package/dist/{chunk-LBFH7THC.js → chunk-OWED2GRM.js} +5 -1
  29. package/dist/{chunk-4MG3BVHE.js → chunk-OXWDY22G.js} +6 -2
  30. package/dist/{chunk-4FABQGQP.js → chunk-Q2CIRAOK.js} +5 -0
  31. package/dist/{chunk-4LEL3H2Z.js → chunk-RPHRPFEH.js} +5 -0
  32. package/dist/{chunk-46YJFP4S.js → chunk-SQ77DZOI.js} +1728 -1484
  33. package/dist/{chunk-S6DSRLNE.js → chunk-TGIINPVM.js} +15 -2
  34. package/dist/{chunk-U2DPZSXA.js → chunk-TYVME3XD.js} +9 -1
  35. package/dist/{chunk-HFYDYK4D.js → chunk-V6AN6XLZ.js} +18 -6
  36. package/dist/{chunk-ZKJOFWBJ.js → chunk-VDMQJHPI.js} +38 -15
  37. package/dist/{chunk-E6W2JMMU.js → chunk-VFINNTUL.js} +22 -1
  38. package/dist/{chunk-OJE6YWPQ.js → chunk-VWPEKOH6.js} +6 -2
  39. package/dist/{chunk-5N7VUGL6.js → chunk-W73X43R7.js} +6 -2
  40. package/dist/cloud-7QYOGF7F.js +11 -0
  41. package/dist/cloud-ZSKOS4GY.js +30 -0
  42. package/dist/detect-SH4FHFBI.js +36 -0
  43. package/dist/{dist-L3MPOWCA.js → dist-IQJ6H6UZ.js} +6 -2
  44. package/dist/{dist-es-KE56MWYO.js → dist-es-5DY7K32L.js} +9 -5
  45. package/dist/dist-es-JSTDUS7Q.js +26 -0
  46. package/dist/{dist-es-GTAMF674.js → dist-es-OSNJBLXB.js} +8 -4
  47. package/dist/{dist-es-NRZIQY5B.js → dist-es-RYHIPOTN.js} +17 -13
  48. package/dist/{dist-es-XQCOTGC7.js → dist-es-VNKHQVIB.js} +7 -3
  49. package/dist/{dist-es-WZCR7DHQ.js → dist-es-WV4AMOII.js} +11 -7
  50. package/dist/{dist-es-ZW3HFQUM.js → dist-es-X3B5QYKB.js} +9 -5
  51. package/dist/docker-U7AF5PTA.js +16 -0
  52. package/dist/docker-edge-executor-VHW3JPJS.js +13 -0
  53. package/dist/edge-import-V5CBA47C.js +45 -0
  54. package/dist/ensure-container-edge-CMYROUSI.js +33 -0
  55. package/dist/{event-streams-7LGDL56D.js → event-streams-EHRAKL75.js} +7 -3
  56. package/dist/executor-YPT6RH6O.js +30 -0
  57. package/dist/index.d.ts +2 -1
  58. package/dist/index.js +258 -245
  59. package/dist/{loadSso-N273C5I7.js → loadSso-46FQRIZS.js} +13 -9
  60. package/dist/local-executor-V7U5VOZW.js +12 -0
  61. package/dist/nginx-2GTRUIDE.js +24 -0
  62. package/dist/noop-FMMFG2EZ.js +11 -0
  63. package/dist/{openresty-lua-HAO4EUDY.js → openresty-lua-4WLGDSER.js} +13 -3
  64. package/dist/server/engine/ChangeLog +2289 -0
  65. package/dist/server/engine/Documentations +5 -0
  66. package/dist/server/engine/LICENSE +674 -0
  67. package/dist/server/engine/README.md +34 -0
  68. package/dist/server/engine/conf/amavisd +150 -0
  69. package/dist/server/engine/conf/clamav +71 -0
  70. package/dist/server/engine/conf/core +632 -0
  71. package/dist/server/engine/conf/dovecot +151 -0
  72. package/dist/server/engine/conf/fail2ban +72 -0
  73. package/dist/server/engine/conf/global +698 -0
  74. package/dist/server/engine/conf/iredapd +52 -0
  75. package/dist/server/engine/conf/logwatch +28 -0
  76. package/dist/server/engine/conf/postfix +97 -0
  77. package/dist/server/engine/conf/postgresql +93 -0
  78. package/dist/server/engine/conf/spamassassin +39 -0
  79. package/dist/server/engine/dialog/config_via_dialog.sh +258 -0
  80. package/dist/server/engine/dialog/optional_components.sh +122 -0
  81. package/dist/server/engine/dialog/pgsql_config.sh +52 -0
  82. package/dist/server/engine/dialog/virtual_domain_config.sh +94 -0
  83. package/dist/server/engine/functions/amavisd.sh +267 -0
  84. package/dist/server/engine/functions/backend.sh +85 -0
  85. package/dist/server/engine/functions/clamav.sh +100 -0
  86. package/dist/server/engine/functions/cleanup.sh +393 -0
  87. package/dist/server/engine/functions/dovecot.sh +583 -0
  88. package/dist/server/engine/functions/fail2ban.sh +209 -0
  89. package/dist/server/engine/functions/iredapd.sh +356 -0
  90. package/dist/server/engine/functions/optional_components.sh +24 -0
  91. package/dist/server/engine/functions/packages.sh +522 -0
  92. package/dist/server/engine/functions/packages_freebsd.sh +179 -0
  93. package/dist/server/engine/functions/postfix.sh +457 -0
  94. package/dist/server/engine/functions/postgresql.sh +239 -0
  95. package/dist/server/engine/functions/spamassassin.sh +49 -0
  96. package/dist/server/engine/functions/system_accounts.sh +128 -0
  97. package/dist/server/engine/iRedMail.sh +144 -0
  98. package/dist/server/engine/pkgs/get_all.sh +338 -0
  99. package/dist/server/engine/pkgs/pkgs.freebsd.sha256 +3 -0
  100. package/dist/server/engine/pkgs/pkgs.openbsd.sha256 +6 -0
  101. package/dist/server/engine/pkgs/pkgs.sha256 +1 -0
  102. package/dist/server/engine/samples/amavisd/amavisd.conf +677 -0
  103. package/dist/server/engine/samples/amavisd/amavisd.mysql +278 -0
  104. package/dist/server/engine/samples/amavisd/amavisd.pgsql +253 -0
  105. package/dist/server/engine/samples/amavisd/amavisd.schema +942 -0
  106. package/dist/server/engine/samples/amavisd/default_spam_policy.sql +46 -0
  107. package/dist/server/engine/samples/dovecot/dovecot-2.4-mariadb.conf +758 -0
  108. package/dist/server/engine/samples/dovecot/dovecot-2.4-openldap.conf +767 -0
  109. package/dist/server/engine/samples/dovecot/dovecot-2.4-pgsql.conf +762 -0
  110. package/dist/server/engine/samples/dovecot/dovecot-last-login.conf +50 -0
  111. package/dist/server/engine/samples/dovecot/dovecot-ldap.conf +21 -0
  112. package/dist/server/engine/samples/dovecot/dovecot-share-folder.conf +22 -0
  113. package/dist/server/engine/samples/dovecot/dovecot-sql.conf +28 -0
  114. package/dist/server/engine/samples/dovecot/dovecot-used-quota.conf +13 -0
  115. package/dist/server/engine/samples/dovecot/dovecot.conf +484 -0
  116. package/dist/server/engine/samples/dovecot/dovecot.sieve +7 -0
  117. package/dist/server/engine/samples/dovecot/dovecot2-quota-warning.sh +38 -0
  118. package/dist/server/engine/samples/dovecot/sql/imap_share_folder.mysql +16 -0
  119. package/dist/server/engine/samples/dovecot/sql/last_login.mysql +12 -0
  120. package/dist/server/engine/samples/dovecot/sql/used_quota.mysql +26 -0
  121. package/dist/server/engine/samples/dovecot/systemd/override.conf +3 -0
  122. package/dist/server/engine/samples/fail2ban/action.d/banned_db.conf +9 -0
  123. package/dist/server/engine/samples/fail2ban/bin/fail2ban_banned_db +268 -0
  124. package/dist/server/engine/samples/fail2ban/fail2ban.local +17 -0
  125. package/dist/server/engine/samples/fail2ban/filter.d/dovecot.iredmail.conf +5 -0
  126. package/dist/server/engine/samples/fail2ban/filter.d/postfix-pregreet.iredmail.conf +16 -0
  127. package/dist/server/engine/samples/fail2ban/filter.d/postfix.iredmail.conf +18 -0
  128. package/dist/server/engine/samples/fail2ban/filter.d/roundcube.iredmail.conf +9 -0
  129. package/dist/server/engine/samples/fail2ban/jail.d/dovecot.local +8 -0
  130. package/dist/server/engine/samples/fail2ban/jail.d/nginx-http-auth.local +8 -0
  131. package/dist/server/engine/samples/fail2ban/jail.d/postfix-pregreet.local +9 -0
  132. package/dist/server/engine/samples/fail2ban/jail.d/postfix.local +8 -0
  133. package/dist/server/engine/samples/fail2ban/jail.d/roundcube.local +9 -0
  134. package/dist/server/engine/samples/fail2ban/jail.d/sogo.local +8 -0
  135. package/dist/server/engine/samples/fail2ban/jail.d/sshd.local +8 -0
  136. package/dist/server/engine/samples/fail2ban/jail.local +6 -0
  137. package/dist/server/engine/samples/fail2ban/openbsd/rc +27 -0
  138. package/dist/server/engine/samples/fail2ban/sql/fail2ban.mysql +49 -0
  139. package/dist/server/engine/samples/fail2ban/sql/fail2ban.pgsql +48 -0
  140. package/dist/server/engine/samples/firewall/firewalld/services/ssh.xml +6 -0
  141. package/dist/server/engine/samples/firewall/firewalld/zones/iredmail.xml +15 -0
  142. package/dist/server/engine/samples/firewall/iptables/ip6tables.init.debian +362 -0
  143. package/dist/server/engine/samples/firewall/iptables/ip6tables.rules +53 -0
  144. package/dist/server/engine/samples/firewall/iptables/iptables.init.debian +363 -0
  145. package/dist/server/engine/samples/firewall/iptables/iptables.rules +54 -0
  146. package/dist/server/engine/samples/firewall/nftables.conf +58 -0
  147. package/dist/server/engine/samples/freebsd/newsyslog.conf.d/dovecot.conf +3 -0
  148. package/dist/server/engine/samples/freebsd/newsyslog.conf.d/iredapd.conf +1 -0
  149. package/dist/server/engine/samples/freebsd/newsyslog.conf.d/mlmmjadmin.conf +1 -0
  150. package/dist/server/engine/samples/freebsd/newsyslog.conf.d/php-fpm.conf +2 -0
  151. package/dist/server/engine/samples/freebsd/newsyslog.conf.d/slapd.conf +1 -0
  152. package/dist/server/engine/samples/freebsd/syslog.d/dovecot.conf +2 -0
  153. package/dist/server/engine/samples/freebsd/syslog.d/fail2ban.conf +2 -0
  154. package/dist/server/engine/samples/freebsd/syslog.d/iredapd.conf +2 -0
  155. package/dist/server/engine/samples/freebsd/syslog.d/mlmmjadmin.conf +2 -0
  156. package/dist/server/engine/samples/freebsd/syslog.d/php-fpm.conf +2 -0
  157. package/dist/server/engine/samples/freebsd/syslog.d/slapd.conf +2 -0
  158. package/dist/server/engine/samples/iredmail/iredmail.mysql +491 -0
  159. package/dist/server/engine/samples/iredmail/iredmail.pgsql +465 -0
  160. package/dist/server/engine/samples/iredmail/iredmail.schema +456 -0
  161. package/dist/server/engine/samples/iredmail/used_quota_triggers_dovecot_2.3.pgsql +40 -0
  162. package/dist/server/engine/samples/iredmail/used_quota_triggers_dovecot_2.4.pgsql +18 -0
  163. package/dist/server/engine/samples/logrotate/dovecot +13 -0
  164. package/dist/server/engine/samples/logrotate/iredapd +13 -0
  165. package/dist/server/engine/samples/logrotate/mlmmjadmin +13 -0
  166. package/dist/server/engine/samples/logrotate/openldap +19 -0
  167. package/dist/server/engine/samples/logrotate/php-fpm +13 -0
  168. package/dist/server/engine/samples/openbsd/ldapd.conf +58 -0
  169. package/dist/server/engine/samples/openbsd/pf.conf +28 -0
  170. package/dist/server/engine/samples/postfix/command_filter.pcre +3 -0
  171. package/dist/server/engine/samples/postfix/freebsd/mailer.conf +9 -0
  172. package/dist/server/engine/samples/postfix/helo_access.pcre +180 -0
  173. package/dist/server/engine/samples/postfix/ldap/catchall_maps.cf +11 -0
  174. package/dist/server/engine/samples/postfix/ldap/recipient_bcc_maps_domain.cf +11 -0
  175. package/dist/server/engine/samples/postfix/ldap/recipient_bcc_maps_user.cf +11 -0
  176. package/dist/server/engine/samples/postfix/ldap/relay_domains.cf +11 -0
  177. package/dist/server/engine/samples/postfix/ldap/sender_bcc_maps_domain.cf +11 -0
  178. package/dist/server/engine/samples/postfix/ldap/sender_bcc_maps_user.cf +11 -0
  179. package/dist/server/engine/samples/postfix/ldap/sender_dependent_relayhost_maps_domain.cf +11 -0
  180. package/dist/server/engine/samples/postfix/ldap/sender_dependent_relayhost_maps_user.cf +11 -0
  181. package/dist/server/engine/samples/postfix/ldap/sender_login_maps.cf +11 -0
  182. package/dist/server/engine/samples/postfix/ldap/transport_maps_domain.cf +11 -0
  183. package/dist/server/engine/samples/postfix/ldap/transport_maps_user.cf +11 -0
  184. package/dist/server/engine/samples/postfix/ldap/virtual_alias_maps.cf +11 -0
  185. package/dist/server/engine/samples/postfix/ldap/virtual_group_maps.cf +11 -0
  186. package/dist/server/engine/samples/postfix/ldap/virtual_group_members_maps.cf +11 -0
  187. package/dist/server/engine/samples/postfix/ldap/virtual_mailbox_domains.cf +11 -0
  188. package/dist/server/engine/samples/postfix/ldap/virtual_mailbox_maps.cf +12 -0
  189. package/dist/server/engine/samples/postfix/main.cf +282 -0
  190. package/dist/server/engine/samples/postfix/main.cf.amavisd +7 -0
  191. package/dist/server/engine/samples/postfix/main.cf.dovecot +8 -0
  192. package/dist/server/engine/samples/postfix/main.cf.ldap +39 -0
  193. package/dist/server/engine/samples/postfix/main.cf.mlmmj +5 -0
  194. package/dist/server/engine/samples/postfix/main.cf.mysql +39 -0
  195. package/dist/server/engine/samples/postfix/main.cf.pgsql +39 -0
  196. package/dist/server/engine/samples/postfix/main.cf.postscreen +30 -0
  197. package/dist/server/engine/samples/postfix/master.cf +87 -0
  198. package/dist/server/engine/samples/postfix/mysql/catchall_maps.cf +5 -0
  199. package/dist/server/engine/samples/postfix/mysql/domain_alias_catchall_maps.cf +5 -0
  200. package/dist/server/engine/samples/postfix/mysql/domain_alias_maps.cf +5 -0
  201. package/dist/server/engine/samples/postfix/mysql/recipient_bcc_maps_domain.cf +5 -0
  202. package/dist/server/engine/samples/postfix/mysql/recipient_bcc_maps_user.cf +5 -0
  203. package/dist/server/engine/samples/postfix/mysql/relay_domains.cf +5 -0
  204. package/dist/server/engine/samples/postfix/mysql/sender_bcc_maps_domain.cf +5 -0
  205. package/dist/server/engine/samples/postfix/mysql/sender_bcc_maps_user.cf +5 -0
  206. package/dist/server/engine/samples/postfix/mysql/sender_dependent_relayhost_maps.cf +6 -0
  207. package/dist/server/engine/samples/postfix/mysql/sender_login_maps.cf +5 -0
  208. package/dist/server/engine/samples/postfix/mysql/transport_maps_domain.cf +5 -0
  209. package/dist/server/engine/samples/postfix/mysql/transport_maps_maillist.cf +5 -0
  210. package/dist/server/engine/samples/postfix/mysql/transport_maps_user.cf +5 -0
  211. package/dist/server/engine/samples/postfix/mysql/virtual_alias_maps.cf +5 -0
  212. package/dist/server/engine/samples/postfix/mysql/virtual_mailbox_domains.cf +5 -0
  213. package/dist/server/engine/samples/postfix/mysql/virtual_mailbox_maps.cf +5 -0
  214. package/dist/server/engine/samples/postfix/pgsql/catchall_maps.cf +5 -0
  215. package/dist/server/engine/samples/postfix/pgsql/domain_alias_catchall_maps.cf +5 -0
  216. package/dist/server/engine/samples/postfix/pgsql/domain_alias_maps.cf +5 -0
  217. package/dist/server/engine/samples/postfix/pgsql/recipient_bcc_maps_domain.cf +5 -0
  218. package/dist/server/engine/samples/postfix/pgsql/recipient_bcc_maps_user.cf +5 -0
  219. package/dist/server/engine/samples/postfix/pgsql/relay_domains.cf +5 -0
  220. package/dist/server/engine/samples/postfix/pgsql/sender_bcc_maps_domain.cf +5 -0
  221. package/dist/server/engine/samples/postfix/pgsql/sender_bcc_maps_user.cf +5 -0
  222. package/dist/server/engine/samples/postfix/pgsql/sender_dependent_relayhost_maps.cf +6 -0
  223. package/dist/server/engine/samples/postfix/pgsql/sender_login_maps.cf +5 -0
  224. package/dist/server/engine/samples/postfix/pgsql/transport_maps_domain.cf +5 -0
  225. package/dist/server/engine/samples/postfix/pgsql/transport_maps_maillist.cf +5 -0
  226. package/dist/server/engine/samples/postfix/pgsql/transport_maps_user.cf +5 -0
  227. package/dist/server/engine/samples/postfix/pgsql/virtual_alias_maps.cf +5 -0
  228. package/dist/server/engine/samples/postfix/pgsql/virtual_mailbox_domains.cf +5 -0
  229. package/dist/server/engine/samples/postfix/pgsql/virtual_mailbox_maps.cf +5 -0
  230. package/dist/server/engine/samples/postfix/postscreen_access.cidr +6 -0
  231. package/dist/server/engine/samples/postgresql/sql/add_first_domain_and_user.sql +34 -0
  232. package/dist/server/engine/samples/postgresql/sql/grant_permissions.sql +14 -0
  233. package/dist/server/engine/samples/postgresql/sql/init_vmail_db.sql +15 -0
  234. package/dist/server/engine/samples/rsyslog.d/1-iredmail-dovecot.conf +23 -0
  235. package/dist/server/engine/samples/rsyslog.d/1-iredmail-fail2ban.conf +2 -0
  236. package/dist/server/engine/samples/rsyslog.d/1-iredmail-iredapd.conf +12 -0
  237. package/dist/server/engine/samples/rsyslog.d/1-iredmail-mlmmjadmin.conf +12 -0
  238. package/dist/server/engine/samples/rsyslog.d/1-iredmail-openldap.conf +2 -0
  239. package/dist/server/engine/samples/rsyslog.d/1-iredmail-phpfpm.conf +3 -0
  240. package/dist/server/engine/samples/spamassassin/local.cf +186 -0
  241. package/dist/server/engine/samples/spamassassin/razor.conf +1 -0
  242. package/dist/server/engine/samples/systemd/clamd.service.d/override.conf +2 -0
  243. package/dist/server/engine/samples/systemd/mariadb.service.d/override.conf +3 -0
  244. package/dist/server/engine/samples/systemd/slapd.service.d/override.conf +6 -0
  245. package/dist/server/engine/samples/yum/CentOS-Linux-AppStream.repo +6 -0
  246. package/dist/server/engine/samples/yum/CentOS-Linux-PowerTools.repo +6 -0
  247. package/dist/server/engine/samples/yum/CentOS-Stream-AppStream.repo +7 -0
  248. package/dist/server/engine/samples/yum/CentOS-Stream-PowerTools.repo +7 -0
  249. package/dist/server/engine/samples/yum/symas-openldap.repo +6 -0
  250. package/dist/server/engine/tools/add_enabled_service.py +60 -0
  251. package/dist/server/engine/tools/backup_mysql.sh +238 -0
  252. package/dist/server/engine/tools/backup_openldap.sh +230 -0
  253. package/dist/server/engine/tools/backup_pgsql.sh +217 -0
  254. package/dist/server/engine/tools/backup_sogo.sh +156 -0
  255. package/dist/server/engine/tools/create_mail_user_OpenLDAP.py +335 -0
  256. package/dist/server/engine/tools/create_mail_user_OpenLDAP.sh +287 -0
  257. package/dist/server/engine/tools/create_mail_user_SQL.sh +127 -0
  258. package/dist/server/engine/tools/enable_postscreen.sh +144 -0
  259. package/dist/server/engine/tools/fail2ban_unban_ip.sh +39 -0
  260. package/dist/server/engine/tools/find_sasl_login_ip.sh +20 -0
  261. package/dist/server/engine/tools/find_top_sasl_usernames.sh +28 -0
  262. package/dist/server/engine/tools/generate_ssl_keys.sh +85 -0
  263. package/dist/server/engine/tools/kill_high_cpu_sogo_process.sh +32 -0
  264. package/dist/server/engine/tools/ldap_assign_user_to_groups.py +151 -0
  265. package/dist/server/engine/tools/ldap_move_members_to_another_group.py +129 -0
  266. package/dist/server/engine/tools/migrate_sql_alias_table.py +177 -0
  267. package/dist/server/engine/update/0.9.8/amavisd.mysql +29 -0
  268. package/dist/server/engine/update/0.9.8/amavisd.pgsql +39 -0
  269. package/dist/server/engine/update/0.9.8/iredmail.mysql +53 -0
  270. package/dist/server/engine/update/0.9.8/iredmail.pgsql +61 -0
  271. package/dist/server/engine/update/0.9.9/iredmail.mysql +2 -0
  272. package/dist/server/engine/update/0.9.9/iredmail.pgsql +2 -0
  273. package/dist/server/engine/update/1.0/iredmail.mysql +2 -0
  274. package/dist/server/engine/update/1.0/iredmail.pgsql +2 -0
  275. package/dist/server/engine/update/1.2/last_login.mysql +16 -0
  276. package/dist/server/engine/update/1.4.0/iredmail.mysql +22 -0
  277. package/dist/server/engine/update/1.4.0/iredmail.pgsql +20 -0
  278. package/dist/server/engine/update/1.4.1/iredmail.mysql +3 -0
  279. package/dist/server/engine/update/1.4.1/iredmail.pgsql +3 -0
  280. package/dist/server/engine/update/1.4.1/sogo.mysql +11 -0
  281. package/dist/server/engine/update/1.4.1/sogo.pgsql +30 -0
  282. package/dist/server/engine/update/1.4.1/update-ldap.py +66 -0
  283. package/dist/server/engine/update/1.4.2/iredmail.mysql +9 -0
  284. package/dist/server/engine/update/1.4.2/iredmail.pgsql +9 -0
  285. package/dist/server/engine/update/1.4.2/sogo.pgsql +30 -0
  286. package/dist/server/engine/update/1.6.0/sogo_view.pgsql +27 -0
  287. package/dist/server/engine/update/1.6.3/iredmail.mysql +1 -0
  288. package/dist/server/engine/update/1.7.0/fail2ban.mysql +11 -0
  289. package/dist/server/engine/update/1.7.0/fail2ban.pgsql +12 -0
  290. package/dist/server/engine/update/1.7.1/amavisd.mysql +1 -0
  291. package/dist/server/engine/update/1.7.2/vmail.mysql +30 -0
  292. package/dist/server/engine/update/1.7.3/deleted_mailboxes.mysql +43 -0
  293. package/dist/server/engine/update/1.7.3/iredadmin.mysql +26 -0
  294. package/dist/server/engine/update/1.7.3/vmail.mysql +79 -0
  295. package/dist/server/engine/update/1.7.3/vmail.pgsql +9 -0
  296. package/dist/server/engine/update/README.md +1 -0
  297. package/dist/server/engine/update/ldap/README.md +40 -0
  298. package/dist/server/engine/update/ldap/update-ldap-dovecot-2.3.py +69 -0
  299. package/dist/server/index.js +55574 -53675
  300. package/dist/server/migrations/0071_gh_device_token.sql +3 -0
  301. package/dist/server/migrations/0072_gh_device_token_method.sql +1 -0
  302. package/dist/server/migrations/meta/_journal.json +14 -0
  303. package/dist/setup-HQIZLUOJ.js +20 -0
  304. package/dist/{signin-DR462ERO.js → signin-ITOPKKUB.js} +13 -9
  305. package/dist/{sso-oidc-VBZLJUK5.js → sso-oidc-NON2PD7Y.js} +13 -9
  306. package/dist/{sts-EJLZ4Z77.js → sts-HHFFSAY2.js} +12 -8
  307. package/package.json +1 -1
  308. package/dist/bare-ITM45QBX.js +0 -18
  309. package/dist/cloud-JMPHO3CW.js +0 -7
  310. package/dist/cloud-W5G6YXAY.js +0 -24
  311. package/dist/dist-es-4C322O5D.js +0 -22
  312. package/dist/docker-3FVJMFC3.js +0 -12
  313. package/dist/docker-edge-executor-ZIWAZWPL.js +0 -9
  314. package/dist/edge-import-Y34YL6JK.js +0 -39
  315. package/dist/executor-J7BHW5HF.js +0 -26
  316. package/dist/nginx-YZWKYKQU.js +0 -16
  317. package/dist/noop-RRNCIUI5.js +0 -7
  318. package/dist/setup-5X3WEEHA.js +0 -14
package/README.md CHANGED
@@ -97,7 +97,8 @@ A self-hosted instance **always requires login** (the admin you create in setup)
97
97
  > **Preview an unreleased build (dev).** To run the CLI built straight from source — a branch, tag, or `main` ahead of the next release — install the from-source build:
98
98
  >
99
99
  > ```bash
100
- > curl -fsSL https://get.openship.io/dev | sh # or: OPENSHIP_REF=my-branch curl ... | sh
100
+ > curl -fsSL https://get.openship.io/dev | sh # main (default)
101
+ > curl -fsSL https://get.openship.io/dev | OPENSHIP_REF=dev sh # a branch/tag (var goes on sh, not curl)
101
102
  > openship-dev # same CLI, built from source
102
103
  > openship-dev update # pull latest source + rebuild (no release needed)
103
104
  > ```
@@ -219,29 +220,6 @@ Good-faith security research is **authorized** under our
219
220
  [safe-harbor policy](SECURITY.md#safe-harbor), and we're happy to credit valid
220
221
  first reports.
221
222
 
222
- ---
223
- ## ⭐ Star History
224
-
225
- <p align="center">
226
- <a href="https://star-history.com/#oblien/openship&Date">
227
- <picture>
228
- <source
229
- media="(prefers-color-scheme: dark)"
230
- srcset="https://api.star-history.com/svg?repos=oblien/openship&type=Date&theme=dark"
231
- />
232
- <source
233
- media="(prefers-color-scheme: light)"
234
- srcset="https://api.star-history.com/svg?repos=oblien/openship&type=Date"
235
- />
236
- <img
237
- alt="Star History Chart"
238
- src="https://api.star-history.com/svg?repos=oblien/openship&type=Date"
239
- />
240
- </picture>
241
- </a>
242
- </p>
243
-
244
- ---
245
223
  ## License
246
224
 
247
225
  Openship is **open-source** software, licensed under the [Apache License 2.0](LICENSE).
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env sh
2
+ ":" //# ; exec "$(command -v bun || command -v node)" "$0" "$@"
3
+ import { createRequire as __ospCreateRequire } from "node:module";
4
+ const require = __ospCreateRequire(import.meta.url);
5
+ import {
6
+ BareRuntime,
7
+ STATIC_RELEASE_BASE
8
+ } from "./chunk-VDMQJHPI.js";
9
+ import "./chunk-MZ2WEHHY.js";
10
+ import "./chunk-L2VOGB2X.js";
11
+ import "./chunk-4Z5QO7N6.js";
12
+ import "./chunk-4TJC4JZQ.js";
13
+ import "./chunk-OXWDY22G.js";
14
+ import "./chunk-RPHRPFEH.js";
15
+ import "./chunk-TYVME3XD.js";
16
+ import "./chunk-FPRHYBY2.js";
17
+ import "./chunk-ILFETZOM.js";
18
+ import "./chunk-6APULWSU.js";
19
+ import "./chunk-KI2EY3WB.js";
20
+ export {
21
+ BareRuntime,
22
+ STATIC_RELEASE_BASE
23
+ };
@@ -1,4 +1,8 @@
1
- import "./chunk-4VNS5WPM.js";
1
+ #!/usr/bin/env sh
2
+ ":" //# ; exec "$(command -v bun || command -v node)" "$0" "$@"
3
+ import { createRequire as __ospCreateRequire } from "node:module";
4
+ const require = __ospCreateRequire(import.meta.url);
5
+ import "./chunk-KI2EY3WB.js";
2
6
 
3
7
  // ../../node_modules/bowser/src/constants.js
4
8
  var BROWSER_ALIASES_MAP = {
@@ -1,10 +1,15 @@
1
+ #!/usr/bin/env sh
2
+ ":" //# ; exec "$(command -v bun || command -v node)" "$0" "$@"
3
+ import { createRequire as __ospCreateRequire } from "node:module";
4
+ const require = __ospCreateRequire(import.meta.url);
1
5
  import {
2
6
  createDockerBuildContext,
3
7
  generateDockerfile,
4
8
  prepareSourceTree,
5
9
  resolveDockerfileCandidates,
6
- resolveServiceDockerfile
7
- } from "./chunk-HFYDYK4D.js";
10
+ resolveServiceDockerfile,
11
+ staticBuilderOutputPath
12
+ } from "./chunk-V6AN6XLZ.js";
8
13
  import {
9
14
  BuildLogger,
10
15
  assembleGitClone,
@@ -13,20 +18,20 @@ import {
13
18
  shellGitSshWriter,
14
19
  sq,
15
20
  transferLocalDirectory
16
- } from "./chunk-YL67EWYZ.js";
21
+ } from "./chunk-4Z5QO7N6.js";
17
22
  import {
18
23
  connectSshClient,
19
24
  execSshCommand,
20
25
  openSshExecChannel,
21
26
  openSshUnixSocket
22
- } from "./chunk-4MG3BVHE.js";
27
+ } from "./chunk-OXWDY22G.js";
23
28
  import {
24
29
  isRuntimeNotFoundError
25
- } from "./chunk-4LEL3H2Z.js";
30
+ } from "./chunk-RPHRPFEH.js";
26
31
  import {
27
32
  safeErrorMessage,
28
33
  withTimeout
29
- } from "./chunk-JZLNHGLW.js";
34
+ } from "./chunk-6APULWSU.js";
30
35
 
31
36
  // ../../packages/adapters/src/runtime/docker.ts
32
37
  import Dockerode from "dockerode";
@@ -77,8 +82,127 @@ function scopeVolumeBinds(slug, rawVolumes, enabled) {
77
82
  });
78
83
  }
79
84
 
80
- // ../../packages/adapters/src/runtime/docker-ssh-agent.ts
85
+ // ../../packages/adapters/src/runtime/docker-exec-stream.ts
81
86
  import net from "net";
87
+ import tls from "tls";
88
+ import { Duplex } from "stream";
89
+ var HEADER_END = "\r\n\r\n";
90
+ var UPGRADE_TIMEOUT_MS = 2e4;
91
+ function connect(conn) {
92
+ if (conn.socketPath) return net.connect({ path: conn.socketPath });
93
+ const port = Number(conn.port ?? (conn.protocol === "https" ? 443 : 80));
94
+ const host = conn.host ?? "127.0.0.1";
95
+ if (conn.protocol === "https") {
96
+ return tls.connect({ host, port, ca: conn.ca, cert: conn.cert, key: conn.key });
97
+ }
98
+ return net.connect({ port, host });
99
+ }
100
+ function bridgeSocket(socket, leftover) {
101
+ const out = new Duplex({
102
+ read() {
103
+ socket.resume();
104
+ },
105
+ write(chunk, _enc, cb) {
106
+ socket.write(chunk, (err) => cb(err ?? null));
107
+ },
108
+ final(cb) {
109
+ if (!socket.destroyed) socket.end();
110
+ cb();
111
+ },
112
+ destroy(err, cb) {
113
+ socket.destroy(err ?? void 0);
114
+ cb(err);
115
+ }
116
+ });
117
+ let readEnded = false;
118
+ const endRead = () => {
119
+ if (readEnded) return;
120
+ readEnded = true;
121
+ out.push(null);
122
+ };
123
+ if (leftover.length > 0) out.push(leftover);
124
+ socket.on("data", (chunk) => {
125
+ if (!out.push(chunk)) socket.pause();
126
+ });
127
+ socket.on("end", endRead);
128
+ socket.on("error", (err) => out.destroy(err));
129
+ socket.on("close", () => {
130
+ endRead();
131
+ if (!out.writableEnded) out.end();
132
+ });
133
+ return out;
134
+ }
135
+ function startExecStream(conn, execId, opts) {
136
+ return new Promise((resolve, reject) => {
137
+ const socket = connect(conn);
138
+ let settled = false;
139
+ let head = Buffer.alloc(0);
140
+ const fail = (err) => {
141
+ if (settled) return;
142
+ settled = true;
143
+ clearTimeout(timer);
144
+ socket.destroy();
145
+ reject(err);
146
+ };
147
+ const timer = setTimeout(
148
+ () => fail(new Error(`docker exec upgrade timed out after ${UPGRADE_TIMEOUT_MS}ms`)),
149
+ UPGRADE_TIMEOUT_MS
150
+ );
151
+ const onData = (chunk) => {
152
+ if (settled) return;
153
+ head = head.length === 0 ? Buffer.from(chunk) : Buffer.concat([head, chunk]);
154
+ const text = head.toString("latin1");
155
+ const end = text.indexOf(HEADER_END);
156
+ if (end === -1) {
157
+ if (head.length > 64 * 1024) fail(new Error("docker exec upgrade: response head too large"));
158
+ return;
159
+ }
160
+ const statusLine = text.slice(0, text.indexOf("\r\n"));
161
+ if (!/ 101 /.test(statusLine)) {
162
+ const body2 = text.slice(end + HEADER_END.length).trim();
163
+ fail(new Error(`docker exec start failed: ${statusLine}${body2 ? ` \u2014 ${body2}` : ""}`));
164
+ return;
165
+ }
166
+ settled = true;
167
+ clearTimeout(timer);
168
+ socket.removeListener("data", onData);
169
+ socket.removeListener("error", fail);
170
+ socket.removeListener("close", onEarlyClose);
171
+ const headBytes = Buffer.byteLength(text.slice(0, end + HEADER_END.length), "latin1");
172
+ resolve(bridgeSocket(socket, head.subarray(headBytes)));
173
+ };
174
+ const onEarlyClose = () => fail(new Error("docker exec start: connection closed before upgrade"));
175
+ socket.on("data", onData);
176
+ socket.on("error", fail);
177
+ socket.on("close", onEarlyClose);
178
+ const body = JSON.stringify({ Detach: false, Tty: opts.tty });
179
+ socket.write(
180
+ `POST /exec/${execId}/start HTTP/1.1\r
181
+ Host: ${conn.socketPath ? "localhost" : conn.host ?? "localhost"}\r
182
+ Content-Type: application/json\r
183
+ Content-Length: ${Buffer.byteLength(body)}\r
184
+ Connection: Upgrade\r
185
+ Upgrade: tcp\r
186
+ \r
187
+ ` + body
188
+ );
189
+ });
190
+ }
191
+ function daemonConnectionFrom(docker) {
192
+ const m = docker.modem ?? {};
193
+ return {
194
+ socketPath: typeof m.socketPath === "string" ? m.socketPath : void 0,
195
+ host: typeof m.host === "string" ? m.host : void 0,
196
+ port: typeof m.port === "number" || typeof m.port === "string" ? m.port : void 0,
197
+ protocol: typeof m.protocol === "string" ? m.protocol : void 0,
198
+ ca: m.ca,
199
+ cert: m.cert,
200
+ key: m.key
201
+ };
202
+ }
203
+
204
+ // ../../packages/adapters/src/runtime/docker-ssh-agent.ts
205
+ import net2 from "net";
82
206
  var DEFAULT_REMOTE_DOCKER_SOCKET_PATH = "/var/run/docker.sock";
83
207
  var resolvedDockerSocketPathCache = /* @__PURE__ */ new WeakMap();
84
208
  var DOCKER_DIAL_STDIO_COMMAND = "docker system dial-stdio";
@@ -253,7 +377,7 @@ function createDockerSshBridge(opts) {
253
377
  const mode = await ensureMode();
254
378
  return mode === "dialstdio" ? openDialStdioUpstream() : openStreamlocalUpstream(opts);
255
379
  };
256
- const server = net.createServer((client) => {
380
+ const server = net2.createServer((client) => {
257
381
  clients.add(client);
258
382
  client.setNoDelay(true);
259
383
  client.once("close", () => clients.delete(client));
@@ -555,16 +679,16 @@ function parseTimestampedLine(line) {
555
679
  };
556
680
  }
557
681
  function firstNetworkIp(networks) {
558
- for (const net2 of Object.values(networks ?? {})) {
559
- if (net2?.IPAddress) return net2.IPAddress;
682
+ for (const net3 of Object.values(networks ?? {})) {
683
+ if (net3?.IPAddress) return net3.IPAddress;
560
684
  }
561
685
  return void 0;
562
686
  }
563
687
  function extractNetworkInfo(data) {
564
688
  let ip;
565
- for (const net2 of Object.values(data.NetworkSettings.Networks ?? {})) {
566
- if (net2.IPAddress) {
567
- ip = net2.IPAddress;
689
+ for (const net3 of Object.values(data.NetworkSettings.Networks ?? {})) {
690
+ if (net3.IPAddress) {
691
+ ip = net3.IPAddress;
568
692
  break;
569
693
  }
570
694
  }
@@ -1223,11 +1347,43 @@ var DockerRuntime = class _DockerRuntime {
1223
1347
  }
1224
1348
  }
1225
1349
  /**
1226
- * Build a STATIC app in a Docker sandbox, then extract its doc-root onto a
1227
- * host directory the edge serves via nginx `root`. Reuses `build()` so
1228
- * Docker is auto-ensured (ensureDockerFeature) and the static nginx image is
1229
- * produced (`generateStaticDockerfile` COPYs the output to the fixed
1230
- * `/usr/share/nginx/html`) then extracts those files and discards the image.
1350
+ * Move an extract-only static build's files out of its builder image onto
1351
+ * `hostOutDir`, then delete the image.
1352
+ *
1353
+ * The ONE place this happens, shared by the single-app path
1354
+ * ({@link buildStaticToHost}) and the compose batch path ({@link buildImages})
1355
+ * they used to be destined to diverge, and the source path is subtle enough
1356
+ * (see `staticBuilderOutputPath`) that two copies would drift into extracting an
1357
+ * empty directory.
1358
+ */
1359
+ async moveStaticBuildToHost(tag, config, hostOutDir, log) {
1360
+ const docRoot = staticBuilderOutputPath(config);
1361
+ const sshExecutor = this.transport.kind === "ssh" ? this.connectionOptions?.executor : null;
1362
+ log.log("Moving built files out of the build container...\n");
1363
+ try {
1364
+ if (sshExecutor) {
1365
+ await this.extractDocRootOverSsh(sshExecutor, tag, docRoot, hostOutDir);
1366
+ } else {
1367
+ await this.extractDocRootViaDaemon(tag, docRoot, hostOutDir);
1368
+ }
1369
+ log.log(`Static files ready at ${hostOutDir}
1370
+ `);
1371
+ } finally {
1372
+ await this.removeImage(tag).catch(() => {
1373
+ });
1374
+ }
1375
+ }
1376
+ /**
1377
+ * Build a STATIC app in a Docker sandbox, then move the built files onto a host
1378
+ * directory the edge serves via nginx `root`. Reuses `build()` so Docker is
1379
+ * auto-ensured (ensureDockerFeature).
1380
+ *
1381
+ * NO RUNTIME IMAGE. `staticExtractOnly` stops the recipe at the builder stage and
1382
+ * the files are copied straight out of it. This used to build a full
1383
+ * `nginx:alpine` runtime stage — pulling that image, running six more steps, and
1384
+ * writing an nginx config nothing reads — only to `docker cp` the doc-root out
1385
+ * and delete the whole thing moments later. The edge already serves these files;
1386
+ * a second web server was never going to run.
1231
1387
  * Returns the host dir as `imageRef`, matching BareRuntime.build's host-dir
1232
1388
  * contract so the existing file-backed serve path (deployStatic /
1233
1389
  * resolveStaticRoot) consumes it unchanged. Never leaves a long-lived
@@ -1235,51 +1391,17 @@ var DockerRuntime = class _DockerRuntime {
1235
1391
  */
1236
1392
  async buildStaticToHost(config, hostOutDir, logger) {
1237
1393
  const log = logger ?? new BuildLogger();
1238
- const buildResult = await this.build({ ...config, isStatic: true }, log);
1394
+ const buildResult = await this.build(
1395
+ { ...config, isStatic: true, staticExtractOnly: true },
1396
+ log
1397
+ );
1239
1398
  if (buildResult.status !== "deploying" || !buildResult.imageRef) {
1240
1399
  return buildResult;
1241
1400
  }
1242
1401
  const tag = buildResult.imageRef;
1243
1402
  const extractStart = Date.now();
1244
- const DOC_ROOT = "/usr/share/nginx/html";
1245
1403
  try {
1246
- const sshExecutor = this.transport.kind === "ssh" ? this.connectionOptions?.executor : null;
1247
- log.log("Extracting static files from the build sandbox...\n");
1248
- if (sshExecutor) {
1249
- const cid = (await sshExecutor.exec(`docker create ${sq(tag)}`)).trim();
1250
- try {
1251
- await sshExecutor.exec(`mkdir -p ${sq(hostOutDir)}`);
1252
- await sshExecutor.exec(`docker cp ${sq(`${cid}:${DOC_ROOT}/.`)} ${sq(hostOutDir)}`);
1253
- } finally {
1254
- await sshExecutor.exec(`docker rm ${sq(cid)}`).catch(() => {
1255
- });
1256
- }
1257
- } else {
1258
- const { mkdir } = await import("fs/promises");
1259
- const { spawn } = await import("child_process");
1260
- await mkdir(hostOutDir, { recursive: true });
1261
- const container = await this.docker.createContainer({ Image: tag });
1262
- try {
1263
- const tarStream = await container.getArchive({ path: DOC_ROOT });
1264
- await new Promise((resolve, reject) => {
1265
- const extract = spawn("tar", ["-x", "--strip-components=1", "-C", hostOutDir]);
1266
- let errBuf = "";
1267
- extract.stderr.on("data", (d) => errBuf += d.toString());
1268
- extract.on("error", reject);
1269
- tarStream.on("error", reject);
1270
- tarStream.pipe(extract.stdin);
1271
- extract.on(
1272
- "close",
1273
- (code) => code === 0 ? resolve() : reject(new Error(`static extract failed (tar ${code}): ${errBuf.trim().slice(-500)}`))
1274
- );
1275
- });
1276
- } finally {
1277
- await container.remove({ force: true }).catch(() => {
1278
- });
1279
- }
1280
- }
1281
- log.log(`Static files ready at ${hostOutDir}
1282
- `);
1404
+ await this.moveStaticBuildToHost(tag, config, hostOutDir, log);
1283
1405
  return {
1284
1406
  sessionId: config.sessionId,
1285
1407
  status: "deploying",
@@ -1295,8 +1417,58 @@ var DockerRuntime = class _DockerRuntime {
1295
1417
  durationMs: (buildResult.durationMs ?? 0) + (Date.now() - extractStart),
1296
1418
  errorMessage: `Static extract failed: ${msg}`
1297
1419
  };
1420
+ }
1421
+ }
1422
+ /**
1423
+ * THE CONTRACT both extractors satisfy: after either one returns, `hostOutDir`
1424
+ * holds the doc-root's CONTENTS directly — `index.html` at the top, no wrapping
1425
+ * `html/` directory. OpenResty's `root` points straight at it, so a stray extra
1426
+ * level is a silent 404 for the whole site.
1427
+ *
1428
+ * The two paths reach that same shape differently, which is why the rule is
1429
+ * stated here once instead of in each branch:
1430
+ * - `docker cp <cid>:<root>/.` — the trailing `/.` means "contents of", so
1431
+ * there is nothing to strip.
1432
+ * - `getArchive({path: <root>})` — the tar IS rooted at `html/`, so exactly
1433
+ * one leading component must be stripped.
1434
+ */
1435
+ /** Remote host: disk-to-disk via the host's own docker CLI — never stream a
1436
+ * large tar over the SSH dockerode bridge (same rationale as saveImage/pullImage). */
1437
+ async extractDocRootOverSsh(sshExecutor, tag, docRoot, hostOutDir) {
1438
+ const cid = (await sshExecutor.exec(`docker create ${sq(tag)}`)).trim();
1439
+ try {
1440
+ await sshExecutor.exec(`mkdir -p ${sq(hostOutDir)}`);
1441
+ await sshExecutor.exec(`docker cp ${sq(`${cid}:${docRoot}/.`)} ${sq(hostOutDir)}`);
1298
1442
  } finally {
1299
- await this.removeImage(tag).catch(() => {
1443
+ await sshExecutor.exec(`docker rm ${sq(cid)}`).catch(() => {
1444
+ });
1445
+ }
1446
+ }
1447
+ /** Local socket / remote TCP: pull the tar through dockerode (portable to a TCP
1448
+ * daemon where a local `docker` CLI wouldn't apply) and extract onto THIS
1449
+ * process's filesystem — in docker-edge mode that's /opt/openship/static,
1450
+ * bind-mounted into both the api and the edge at the same path. */
1451
+ async extractDocRootViaDaemon(tag, docRoot, hostOutDir) {
1452
+ const { mkdir } = await import("fs/promises");
1453
+ const { spawn } = await import("child_process");
1454
+ await mkdir(hostOutDir, { recursive: true });
1455
+ const container = await this.docker.createContainer({ Image: tag });
1456
+ try {
1457
+ const tarStream = await container.getArchive({ path: docRoot });
1458
+ await new Promise((resolve, reject) => {
1459
+ const extract = spawn("tar", ["-x", "--strip-components=1", "-C", hostOutDir]);
1460
+ let errBuf = "";
1461
+ extract.stderr.on("data", (d) => errBuf += d.toString());
1462
+ extract.on("error", reject);
1463
+ tarStream.on("error", reject);
1464
+ tarStream.pipe(extract.stdin);
1465
+ extract.on(
1466
+ "close",
1467
+ (code) => code === 0 ? resolve() : reject(new Error(`static extract failed (tar ${code}): ${errBuf.trim().slice(-500)}`))
1468
+ );
1469
+ });
1470
+ } finally {
1471
+ await container.remove({ force: true }).catch(() => {
1300
1472
  });
1301
1473
  }
1302
1474
  }
@@ -1427,6 +1599,23 @@ var DockerRuntime = class _DockerRuntime {
1427
1599
  await this.streamDockerodeBuild(stream, spec.logger);
1428
1600
  }
1429
1601
  await this.verifyImageBuilt(tag);
1602
+ if (spec.config.staticExtractOnly && spec.config.staticOutDir) {
1603
+ await this.moveStaticBuildToHost(
1604
+ tag,
1605
+ spec.config,
1606
+ spec.config.staticOutDir,
1607
+ spec.logger
1608
+ );
1609
+ const result2 = {
1610
+ sessionId: spec.config.sessionId,
1611
+ status: "deploying",
1612
+ imageRef: spec.config.staticOutDir,
1613
+ durationMs: Date.now() - startedAt
1614
+ };
1615
+ spec.onResult?.(result2);
1616
+ results.push({ serviceName: spec.serviceName, result: result2 });
1617
+ continue;
1618
+ }
1430
1619
  spec.logger.log(`Image ${tag} is ready.
1431
1620
  `);
1432
1621
  const result = {
@@ -2105,8 +2294,8 @@ var DockerRuntime = class _DockerRuntime {
2105
2294
  async getContainerIp(containerId) {
2106
2295
  const container = this.docker.getContainer(containerId);
2107
2296
  const data = await container.inspect();
2108
- for (const net2 of Object.values(data.NetworkSettings.Networks ?? {})) {
2109
- if (net2.IPAddress) return net2.IPAddress;
2297
+ for (const net3 of Object.values(data.NetworkSettings.Networks ?? {})) {
2298
+ if (net3.IPAddress) return net3.IPAddress;
2110
2299
  }
2111
2300
  return null;
2112
2301
  }
@@ -2143,11 +2332,11 @@ var DockerRuntime = class _DockerRuntime {
2143
2332
  Cmd: ["/bin/sh", "-lc", "exec $(command -v bash || echo /bin/sh)"],
2144
2333
  Env: [`TERM=${term}`]
2145
2334
  });
2146
- const duplex = await exec.start({
2147
- hijack: true,
2148
- stdin: true,
2149
- Tty: true
2150
- });
2335
+ const duplex = await startExecStream(
2336
+ daemonConnectionFrom(this.docker),
2337
+ exec.id,
2338
+ { tty: true, stdin: true }
2339
+ );
2151
2340
  try {
2152
2341
  await exec.resize({ h: rows, w: cols });
2153
2342
  } catch {
@@ -2155,6 +2344,7 @@ var DockerRuntime = class _DockerRuntime {
2155
2344
  const stdout = new PassThrough();
2156
2345
  const stderr = new PassThrough();
2157
2346
  duplex.on("data", (chunk) => stdout.write(chunk));
2347
+ duplex.resume();
2158
2348
  duplex.on("end", () => {
2159
2349
  stdout.end();
2160
2350
  stderr.end();