openship 0.4.5 → 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.
- package/README.md +2 -24
- package/dist/bare-2HYDXQEH.js +23 -0
- package/dist/{bowser-L6PVH37V.js → bowser-O3AEA6AN.js} +3 -1
- package/dist/{chunk-R74UB4X4.js → chunk-2ZLR7ULL.js} +253 -65
- package/dist/{chunk-E3ZPCNPU.js → chunk-3JQTL4R4.js} +234 -99
- package/dist/{chunk-YFLQGDN2.js → chunk-4TJC4JZQ.js} +18 -9
- package/dist/{chunk-JXQCFTDV.js → chunk-4Z5QO7N6.js} +4 -2
- package/dist/{chunk-7EYFCKZX.js → chunk-5FNIWBFI.js} +8 -6
- package/dist/{chunk-JJVSOE4I.js → chunk-5MZ624VX.js} +2 -0
- package/dist/{chunk-TDFK6ISF.js → chunk-6APIPIJY.js} +6 -4
- package/dist/{chunk-3LCRNQ2C.js → chunk-6APULWSU.js} +151 -133
- package/dist/{chunk-FTBXJ2VA.js → chunk-6B5YCFFV.js} +6 -4
- package/dist/{chunk-MDFYN2QH.js → chunk-AVIB7CT7.js} +3 -1
- package/dist/{chunk-VJTXRCTT.js → chunk-C5OHTYEF.js} +10 -6
- package/dist/{chunk-W7KGHYLV.js → chunk-DYPH4HCI.js} +2 -0
- package/dist/{chunk-5WI7ZXOC.js → chunk-EI575GHN.js} +4 -2
- package/dist/{chunk-Z6EKX6CX.js → chunk-FPRHYBY2.js} +2 -0
- package/dist/chunk-FQGJZ2HS.js +248 -0
- package/dist/{chunk-FZJX6XP7.js → chunk-FRNAR33O.js} +4 -2
- package/dist/{chunk-XRWV5ZNR.js → chunk-FXTBHTWY.js} +360 -42
- package/dist/chunk-ILFETZOM.js +131 -0
- package/dist/{chunk-PARRPUXN.js → chunk-IXCHURVK.js} +5 -3
- package/dist/{chunk-YJAS5RQX.js → chunk-JYGD5WSN.js} +2 -0
- package/dist/{chunk-JWBXYO24.js → chunk-KI2EY3WB.js} +2 -0
- package/dist/{chunk-YVXF6GGR.js → chunk-L2VOGB2X.js} +5 -104
- package/dist/{chunk-K5OH5U7N.js → chunk-MZ2WEHHY.js} +5 -3
- package/dist/{chunk-SJBR527P.js → chunk-O6ZZF52V.js} +3 -1
- package/dist/{chunk-VLPJLXXB.js → chunk-OWED2GRM.js} +3 -1
- package/dist/{chunk-C4FOQJ63.js → chunk-OXWDY22G.js} +4 -2
- package/dist/{chunk-NPVJYR7M.js → chunk-Q2CIRAOK.js} +2 -0
- package/dist/{chunk-JYAGTMSJ.js → chunk-RPHRPFEH.js} +2 -0
- package/dist/{chunk-UMYQALBH.js → chunk-SQ77DZOI.js} +1726 -1484
- package/dist/{chunk-HYL4QYZM.js → chunk-TGIINPVM.js} +13 -2
- package/dist/{chunk-SYCZE6FQ.js → chunk-TYVME3XD.js} +7 -1
- package/dist/{chunk-HDV4NSA3.js → chunk-V6AN6XLZ.js} +16 -6
- package/dist/{chunk-3YCMJRDZ.js → chunk-VDMQJHPI.js} +36 -15
- package/dist/{chunk-RZPDJC2J.js → chunk-VFINNTUL.js} +20 -1
- package/dist/{chunk-65KKUJBR.js → chunk-VWPEKOH6.js} +4 -2
- package/dist/{chunk-GHXGCANU.js → chunk-W73X43R7.js} +4 -2
- package/dist/{cloud-7IGG45CF.js → cloud-7QYOGF7F.js} +4 -2
- package/dist/cloud-ZSKOS4GY.js +30 -0
- package/dist/detect-SH4FHFBI.js +36 -0
- package/dist/{dist-NQB6QGX3.js → dist-IQJ6H6UZ.js} +4 -2
- package/dist/{dist-es-DCR6UJMP.js → dist-es-5DY7K32L.js} +7 -5
- package/dist/{dist-es-TYYZ5KEF.js → dist-es-JSTDUS7Q.js} +7 -5
- package/dist/{dist-es-7EZIM4JU.js → dist-es-OSNJBLXB.js} +6 -4
- package/dist/{dist-es-6RSPR56Q.js → dist-es-RYHIPOTN.js} +15 -13
- package/dist/{dist-es-33Z3Y6VE.js → dist-es-VNKHQVIB.js} +5 -3
- package/dist/{dist-es-D6QQVWRZ.js → dist-es-WV4AMOII.js} +9 -7
- package/dist/{dist-es-GMEQINIE.js → dist-es-X3B5QYKB.js} +7 -5
- package/dist/docker-U7AF5PTA.js +16 -0
- package/dist/docker-edge-executor-VHW3JPJS.js +13 -0
- package/dist/edge-import-V5CBA47C.js +45 -0
- package/dist/ensure-container-edge-CMYROUSI.js +33 -0
- package/dist/{event-streams-G7F6Q7QY.js → event-streams-EHRAKL75.js} +5 -3
- package/dist/{executor-O5NR7LMP.js → executor-YPT6RH6O.js} +9 -7
- package/dist/index.d.ts +2 -1
- package/dist/index.js +256 -245
- package/dist/{loadSso-LH753OSJ.js → loadSso-46FQRIZS.js} +11 -9
- package/dist/local-executor-V7U5VOZW.js +12 -0
- package/dist/nginx-2GTRUIDE.js +24 -0
- package/dist/{noop-6KC6HRDB.js → noop-FMMFG2EZ.js} +4 -2
- package/dist/{openresty-lua-KFCOJAG4.js → openresty-lua-4WLGDSER.js} +11 -3
- package/dist/server/engine/ChangeLog +2289 -0
- package/dist/server/engine/Documentations +5 -0
- package/dist/server/engine/LICENSE +674 -0
- package/dist/server/engine/README.md +34 -0
- package/dist/server/engine/conf/amavisd +150 -0
- package/dist/server/engine/conf/clamav +71 -0
- package/dist/server/engine/conf/core +632 -0
- package/dist/server/engine/conf/dovecot +151 -0
- package/dist/server/engine/conf/fail2ban +72 -0
- package/dist/server/engine/conf/global +698 -0
- package/dist/server/engine/conf/iredapd +52 -0
- package/dist/server/engine/conf/logwatch +28 -0
- package/dist/server/engine/conf/postfix +97 -0
- package/dist/server/engine/conf/postgresql +93 -0
- package/dist/server/engine/conf/spamassassin +39 -0
- package/dist/server/engine/dialog/config_via_dialog.sh +258 -0
- package/dist/server/engine/dialog/optional_components.sh +122 -0
- package/dist/server/engine/dialog/pgsql_config.sh +52 -0
- package/dist/server/engine/dialog/virtual_domain_config.sh +94 -0
- package/dist/server/engine/functions/amavisd.sh +267 -0
- package/dist/server/engine/functions/backend.sh +85 -0
- package/dist/server/engine/functions/clamav.sh +100 -0
- package/dist/server/engine/functions/cleanup.sh +393 -0
- package/dist/server/engine/functions/dovecot.sh +583 -0
- package/dist/server/engine/functions/fail2ban.sh +209 -0
- package/dist/server/engine/functions/iredapd.sh +356 -0
- package/dist/server/engine/functions/optional_components.sh +24 -0
- package/dist/server/engine/functions/packages.sh +522 -0
- package/dist/server/engine/functions/packages_freebsd.sh +179 -0
- package/dist/server/engine/functions/postfix.sh +457 -0
- package/dist/server/engine/functions/postgresql.sh +239 -0
- package/dist/server/engine/functions/spamassassin.sh +49 -0
- package/dist/server/engine/functions/system_accounts.sh +128 -0
- package/dist/server/engine/iRedMail.sh +144 -0
- package/dist/server/engine/pkgs/get_all.sh +338 -0
- package/dist/server/engine/pkgs/pkgs.freebsd.sha256 +3 -0
- package/dist/server/engine/pkgs/pkgs.openbsd.sha256 +6 -0
- package/dist/server/engine/pkgs/pkgs.sha256 +1 -0
- package/dist/server/engine/samples/amavisd/amavisd.conf +677 -0
- package/dist/server/engine/samples/amavisd/amavisd.mysql +278 -0
- package/dist/server/engine/samples/amavisd/amavisd.pgsql +253 -0
- package/dist/server/engine/samples/amavisd/amavisd.schema +942 -0
- package/dist/server/engine/samples/amavisd/default_spam_policy.sql +46 -0
- package/dist/server/engine/samples/dovecot/dovecot-2.4-mariadb.conf +758 -0
- package/dist/server/engine/samples/dovecot/dovecot-2.4-openldap.conf +767 -0
- package/dist/server/engine/samples/dovecot/dovecot-2.4-pgsql.conf +762 -0
- package/dist/server/engine/samples/dovecot/dovecot-last-login.conf +50 -0
- package/dist/server/engine/samples/dovecot/dovecot-ldap.conf +21 -0
- package/dist/server/engine/samples/dovecot/dovecot-share-folder.conf +22 -0
- package/dist/server/engine/samples/dovecot/dovecot-sql.conf +28 -0
- package/dist/server/engine/samples/dovecot/dovecot-used-quota.conf +13 -0
- package/dist/server/engine/samples/dovecot/dovecot.conf +484 -0
- package/dist/server/engine/samples/dovecot/dovecot.sieve +7 -0
- package/dist/server/engine/samples/dovecot/dovecot2-quota-warning.sh +38 -0
- package/dist/server/engine/samples/dovecot/sql/imap_share_folder.mysql +16 -0
- package/dist/server/engine/samples/dovecot/sql/last_login.mysql +12 -0
- package/dist/server/engine/samples/dovecot/sql/used_quota.mysql +26 -0
- package/dist/server/engine/samples/dovecot/systemd/override.conf +3 -0
- package/dist/server/engine/samples/fail2ban/action.d/banned_db.conf +9 -0
- package/dist/server/engine/samples/fail2ban/bin/fail2ban_banned_db +268 -0
- package/dist/server/engine/samples/fail2ban/fail2ban.local +17 -0
- package/dist/server/engine/samples/fail2ban/filter.d/dovecot.iredmail.conf +5 -0
- package/dist/server/engine/samples/fail2ban/filter.d/postfix-pregreet.iredmail.conf +16 -0
- package/dist/server/engine/samples/fail2ban/filter.d/postfix.iredmail.conf +18 -0
- package/dist/server/engine/samples/fail2ban/filter.d/roundcube.iredmail.conf +9 -0
- package/dist/server/engine/samples/fail2ban/jail.d/dovecot.local +8 -0
- package/dist/server/engine/samples/fail2ban/jail.d/nginx-http-auth.local +8 -0
- package/dist/server/engine/samples/fail2ban/jail.d/postfix-pregreet.local +9 -0
- package/dist/server/engine/samples/fail2ban/jail.d/postfix.local +8 -0
- package/dist/server/engine/samples/fail2ban/jail.d/roundcube.local +9 -0
- package/dist/server/engine/samples/fail2ban/jail.d/sogo.local +8 -0
- package/dist/server/engine/samples/fail2ban/jail.d/sshd.local +8 -0
- package/dist/server/engine/samples/fail2ban/jail.local +6 -0
- package/dist/server/engine/samples/fail2ban/openbsd/rc +27 -0
- package/dist/server/engine/samples/fail2ban/sql/fail2ban.mysql +49 -0
- package/dist/server/engine/samples/fail2ban/sql/fail2ban.pgsql +48 -0
- package/dist/server/engine/samples/firewall/firewalld/services/ssh.xml +6 -0
- package/dist/server/engine/samples/firewall/firewalld/zones/iredmail.xml +15 -0
- package/dist/server/engine/samples/firewall/iptables/ip6tables.init.debian +362 -0
- package/dist/server/engine/samples/firewall/iptables/ip6tables.rules +53 -0
- package/dist/server/engine/samples/firewall/iptables/iptables.init.debian +363 -0
- package/dist/server/engine/samples/firewall/iptables/iptables.rules +54 -0
- package/dist/server/engine/samples/firewall/nftables.conf +58 -0
- package/dist/server/engine/samples/freebsd/newsyslog.conf.d/dovecot.conf +3 -0
- package/dist/server/engine/samples/freebsd/newsyslog.conf.d/iredapd.conf +1 -0
- package/dist/server/engine/samples/freebsd/newsyslog.conf.d/mlmmjadmin.conf +1 -0
- package/dist/server/engine/samples/freebsd/newsyslog.conf.d/php-fpm.conf +2 -0
- package/dist/server/engine/samples/freebsd/newsyslog.conf.d/slapd.conf +1 -0
- package/dist/server/engine/samples/freebsd/syslog.d/dovecot.conf +2 -0
- package/dist/server/engine/samples/freebsd/syslog.d/fail2ban.conf +2 -0
- package/dist/server/engine/samples/freebsd/syslog.d/iredapd.conf +2 -0
- package/dist/server/engine/samples/freebsd/syslog.d/mlmmjadmin.conf +2 -0
- package/dist/server/engine/samples/freebsd/syslog.d/php-fpm.conf +2 -0
- package/dist/server/engine/samples/freebsd/syslog.d/slapd.conf +2 -0
- package/dist/server/engine/samples/iredmail/iredmail.mysql +491 -0
- package/dist/server/engine/samples/iredmail/iredmail.pgsql +465 -0
- package/dist/server/engine/samples/iredmail/iredmail.schema +456 -0
- package/dist/server/engine/samples/iredmail/used_quota_triggers_dovecot_2.3.pgsql +40 -0
- package/dist/server/engine/samples/iredmail/used_quota_triggers_dovecot_2.4.pgsql +18 -0
- package/dist/server/engine/samples/logrotate/dovecot +13 -0
- package/dist/server/engine/samples/logrotate/iredapd +13 -0
- package/dist/server/engine/samples/logrotate/mlmmjadmin +13 -0
- package/dist/server/engine/samples/logrotate/openldap +19 -0
- package/dist/server/engine/samples/logrotate/php-fpm +13 -0
- package/dist/server/engine/samples/openbsd/ldapd.conf +58 -0
- package/dist/server/engine/samples/openbsd/pf.conf +28 -0
- package/dist/server/engine/samples/postfix/command_filter.pcre +3 -0
- package/dist/server/engine/samples/postfix/freebsd/mailer.conf +9 -0
- package/dist/server/engine/samples/postfix/helo_access.pcre +180 -0
- package/dist/server/engine/samples/postfix/ldap/catchall_maps.cf +11 -0
- package/dist/server/engine/samples/postfix/ldap/recipient_bcc_maps_domain.cf +11 -0
- package/dist/server/engine/samples/postfix/ldap/recipient_bcc_maps_user.cf +11 -0
- package/dist/server/engine/samples/postfix/ldap/relay_domains.cf +11 -0
- package/dist/server/engine/samples/postfix/ldap/sender_bcc_maps_domain.cf +11 -0
- package/dist/server/engine/samples/postfix/ldap/sender_bcc_maps_user.cf +11 -0
- package/dist/server/engine/samples/postfix/ldap/sender_dependent_relayhost_maps_domain.cf +11 -0
- package/dist/server/engine/samples/postfix/ldap/sender_dependent_relayhost_maps_user.cf +11 -0
- package/dist/server/engine/samples/postfix/ldap/sender_login_maps.cf +11 -0
- package/dist/server/engine/samples/postfix/ldap/transport_maps_domain.cf +11 -0
- package/dist/server/engine/samples/postfix/ldap/transport_maps_user.cf +11 -0
- package/dist/server/engine/samples/postfix/ldap/virtual_alias_maps.cf +11 -0
- package/dist/server/engine/samples/postfix/ldap/virtual_group_maps.cf +11 -0
- package/dist/server/engine/samples/postfix/ldap/virtual_group_members_maps.cf +11 -0
- package/dist/server/engine/samples/postfix/ldap/virtual_mailbox_domains.cf +11 -0
- package/dist/server/engine/samples/postfix/ldap/virtual_mailbox_maps.cf +12 -0
- package/dist/server/engine/samples/postfix/main.cf +282 -0
- package/dist/server/engine/samples/postfix/main.cf.amavisd +7 -0
- package/dist/server/engine/samples/postfix/main.cf.dovecot +8 -0
- package/dist/server/engine/samples/postfix/main.cf.ldap +39 -0
- package/dist/server/engine/samples/postfix/main.cf.mlmmj +5 -0
- package/dist/server/engine/samples/postfix/main.cf.mysql +39 -0
- package/dist/server/engine/samples/postfix/main.cf.pgsql +39 -0
- package/dist/server/engine/samples/postfix/main.cf.postscreen +30 -0
- package/dist/server/engine/samples/postfix/master.cf +87 -0
- package/dist/server/engine/samples/postfix/mysql/catchall_maps.cf +5 -0
- package/dist/server/engine/samples/postfix/mysql/domain_alias_catchall_maps.cf +5 -0
- package/dist/server/engine/samples/postfix/mysql/domain_alias_maps.cf +5 -0
- package/dist/server/engine/samples/postfix/mysql/recipient_bcc_maps_domain.cf +5 -0
- package/dist/server/engine/samples/postfix/mysql/recipient_bcc_maps_user.cf +5 -0
- package/dist/server/engine/samples/postfix/mysql/relay_domains.cf +5 -0
- package/dist/server/engine/samples/postfix/mysql/sender_bcc_maps_domain.cf +5 -0
- package/dist/server/engine/samples/postfix/mysql/sender_bcc_maps_user.cf +5 -0
- package/dist/server/engine/samples/postfix/mysql/sender_dependent_relayhost_maps.cf +6 -0
- package/dist/server/engine/samples/postfix/mysql/sender_login_maps.cf +5 -0
- package/dist/server/engine/samples/postfix/mysql/transport_maps_domain.cf +5 -0
- package/dist/server/engine/samples/postfix/mysql/transport_maps_maillist.cf +5 -0
- package/dist/server/engine/samples/postfix/mysql/transport_maps_user.cf +5 -0
- package/dist/server/engine/samples/postfix/mysql/virtual_alias_maps.cf +5 -0
- package/dist/server/engine/samples/postfix/mysql/virtual_mailbox_domains.cf +5 -0
- package/dist/server/engine/samples/postfix/mysql/virtual_mailbox_maps.cf +5 -0
- package/dist/server/engine/samples/postfix/pgsql/catchall_maps.cf +5 -0
- package/dist/server/engine/samples/postfix/pgsql/domain_alias_catchall_maps.cf +5 -0
- package/dist/server/engine/samples/postfix/pgsql/domain_alias_maps.cf +5 -0
- package/dist/server/engine/samples/postfix/pgsql/recipient_bcc_maps_domain.cf +5 -0
- package/dist/server/engine/samples/postfix/pgsql/recipient_bcc_maps_user.cf +5 -0
- package/dist/server/engine/samples/postfix/pgsql/relay_domains.cf +5 -0
- package/dist/server/engine/samples/postfix/pgsql/sender_bcc_maps_domain.cf +5 -0
- package/dist/server/engine/samples/postfix/pgsql/sender_bcc_maps_user.cf +5 -0
- package/dist/server/engine/samples/postfix/pgsql/sender_dependent_relayhost_maps.cf +6 -0
- package/dist/server/engine/samples/postfix/pgsql/sender_login_maps.cf +5 -0
- package/dist/server/engine/samples/postfix/pgsql/transport_maps_domain.cf +5 -0
- package/dist/server/engine/samples/postfix/pgsql/transport_maps_maillist.cf +5 -0
- package/dist/server/engine/samples/postfix/pgsql/transport_maps_user.cf +5 -0
- package/dist/server/engine/samples/postfix/pgsql/virtual_alias_maps.cf +5 -0
- package/dist/server/engine/samples/postfix/pgsql/virtual_mailbox_domains.cf +5 -0
- package/dist/server/engine/samples/postfix/pgsql/virtual_mailbox_maps.cf +5 -0
- package/dist/server/engine/samples/postfix/postscreen_access.cidr +6 -0
- package/dist/server/engine/samples/postgresql/sql/add_first_domain_and_user.sql +34 -0
- package/dist/server/engine/samples/postgresql/sql/grant_permissions.sql +14 -0
- package/dist/server/engine/samples/postgresql/sql/init_vmail_db.sql +15 -0
- package/dist/server/engine/samples/rsyslog.d/1-iredmail-dovecot.conf +23 -0
- package/dist/server/engine/samples/rsyslog.d/1-iredmail-fail2ban.conf +2 -0
- package/dist/server/engine/samples/rsyslog.d/1-iredmail-iredapd.conf +12 -0
- package/dist/server/engine/samples/rsyslog.d/1-iredmail-mlmmjadmin.conf +12 -0
- package/dist/server/engine/samples/rsyslog.d/1-iredmail-openldap.conf +2 -0
- package/dist/server/engine/samples/rsyslog.d/1-iredmail-phpfpm.conf +3 -0
- package/dist/server/engine/samples/spamassassin/local.cf +186 -0
- package/dist/server/engine/samples/spamassassin/razor.conf +1 -0
- package/dist/server/engine/samples/systemd/clamd.service.d/override.conf +2 -0
- package/dist/server/engine/samples/systemd/mariadb.service.d/override.conf +3 -0
- package/dist/server/engine/samples/systemd/slapd.service.d/override.conf +6 -0
- package/dist/server/engine/samples/yum/CentOS-Linux-AppStream.repo +6 -0
- package/dist/server/engine/samples/yum/CentOS-Linux-PowerTools.repo +6 -0
- package/dist/server/engine/samples/yum/CentOS-Stream-AppStream.repo +7 -0
- package/dist/server/engine/samples/yum/CentOS-Stream-PowerTools.repo +7 -0
- package/dist/server/engine/samples/yum/symas-openldap.repo +6 -0
- package/dist/server/engine/tools/add_enabled_service.py +60 -0
- package/dist/server/engine/tools/backup_mysql.sh +238 -0
- package/dist/server/engine/tools/backup_openldap.sh +230 -0
- package/dist/server/engine/tools/backup_pgsql.sh +217 -0
- package/dist/server/engine/tools/backup_sogo.sh +156 -0
- package/dist/server/engine/tools/create_mail_user_OpenLDAP.py +335 -0
- package/dist/server/engine/tools/create_mail_user_OpenLDAP.sh +287 -0
- package/dist/server/engine/tools/create_mail_user_SQL.sh +127 -0
- package/dist/server/engine/tools/enable_postscreen.sh +144 -0
- package/dist/server/engine/tools/fail2ban_unban_ip.sh +39 -0
- package/dist/server/engine/tools/find_sasl_login_ip.sh +20 -0
- package/dist/server/engine/tools/find_top_sasl_usernames.sh +28 -0
- package/dist/server/engine/tools/generate_ssl_keys.sh +85 -0
- package/dist/server/engine/tools/kill_high_cpu_sogo_process.sh +32 -0
- package/dist/server/engine/tools/ldap_assign_user_to_groups.py +151 -0
- package/dist/server/engine/tools/ldap_move_members_to_another_group.py +129 -0
- package/dist/server/engine/tools/migrate_sql_alias_table.py +177 -0
- package/dist/server/engine/update/0.9.8/amavisd.mysql +29 -0
- package/dist/server/engine/update/0.9.8/amavisd.pgsql +39 -0
- package/dist/server/engine/update/0.9.8/iredmail.mysql +53 -0
- package/dist/server/engine/update/0.9.8/iredmail.pgsql +61 -0
- package/dist/server/engine/update/0.9.9/iredmail.mysql +2 -0
- package/dist/server/engine/update/0.9.9/iredmail.pgsql +2 -0
- package/dist/server/engine/update/1.0/iredmail.mysql +2 -0
- package/dist/server/engine/update/1.0/iredmail.pgsql +2 -0
- package/dist/server/engine/update/1.2/last_login.mysql +16 -0
- package/dist/server/engine/update/1.4.0/iredmail.mysql +22 -0
- package/dist/server/engine/update/1.4.0/iredmail.pgsql +20 -0
- package/dist/server/engine/update/1.4.1/iredmail.mysql +3 -0
- package/dist/server/engine/update/1.4.1/iredmail.pgsql +3 -0
- package/dist/server/engine/update/1.4.1/sogo.mysql +11 -0
- package/dist/server/engine/update/1.4.1/sogo.pgsql +30 -0
- package/dist/server/engine/update/1.4.1/update-ldap.py +66 -0
- package/dist/server/engine/update/1.4.2/iredmail.mysql +9 -0
- package/dist/server/engine/update/1.4.2/iredmail.pgsql +9 -0
- package/dist/server/engine/update/1.4.2/sogo.pgsql +30 -0
- package/dist/server/engine/update/1.6.0/sogo_view.pgsql +27 -0
- package/dist/server/engine/update/1.6.3/iredmail.mysql +1 -0
- package/dist/server/engine/update/1.7.0/fail2ban.mysql +11 -0
- package/dist/server/engine/update/1.7.0/fail2ban.pgsql +12 -0
- package/dist/server/engine/update/1.7.1/amavisd.mysql +1 -0
- package/dist/server/engine/update/1.7.2/vmail.mysql +30 -0
- package/dist/server/engine/update/1.7.3/deleted_mailboxes.mysql +43 -0
- package/dist/server/engine/update/1.7.3/iredadmin.mysql +26 -0
- package/dist/server/engine/update/1.7.3/vmail.mysql +79 -0
- package/dist/server/engine/update/1.7.3/vmail.pgsql +9 -0
- package/dist/server/engine/update/README.md +1 -0
- package/dist/server/engine/update/ldap/README.md +40 -0
- package/dist/server/engine/update/ldap/update-ldap-dovecot-2.3.py +69 -0
- package/dist/server/index.js +55574 -53675
- package/dist/server/migrations/0071_gh_device_token.sql +3 -0
- package/dist/server/migrations/0072_gh_device_token_method.sql +1 -0
- package/dist/server/migrations/meta/_journal.json +14 -0
- package/dist/setup-HQIZLUOJ.js +20 -0
- package/dist/{signin-PVC7MBZJ.js → signin-ITOPKKUB.js} +11 -9
- package/dist/{sso-oidc-ZXY77BSL.js → sso-oidc-NON2PD7Y.js} +11 -9
- package/dist/{sts-LX5L4UU3.js → sts-HHFFSAY2.js} +10 -8
- package/package.json +1 -1
- package/dist/bare-CNSFDNSZ.js +0 -20
- package/dist/cloud-655YYCEW.js +0 -26
- package/dist/docker-UWQPDEGW.js +0 -14
- package/dist/docker-edge-executor-ZLAYE5FE.js +0 -11
- package/dist/edge-import-AFID2EN3.js +0 -41
- package/dist/nginx-M36GDYL7.js +0 -18
- package/dist/setup-ZXXB5S22.js +0 -16
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
|
|
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,6 +1,8 @@
|
|
|
1
|
+
#!/usr/bin/env sh
|
|
2
|
+
":" //# ; exec "$(command -v bun || command -v node)" "$0" "$@"
|
|
1
3
|
import { createRequire as __ospCreateRequire } from "node:module";
|
|
2
4
|
const require = __ospCreateRequire(import.meta.url);
|
|
3
|
-
import "./chunk-
|
|
5
|
+
import "./chunk-KI2EY3WB.js";
|
|
4
6
|
|
|
5
7
|
// ../../node_modules/bowser/src/constants.js
|
|
6
8
|
var BROWSER_ALIASES_MAP = {
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
#!/usr/bin/env sh
|
|
2
|
+
":" //# ; exec "$(command -v bun || command -v node)" "$0" "$@"
|
|
1
3
|
import { createRequire as __ospCreateRequire } from "node:module";
|
|
2
4
|
const require = __ospCreateRequire(import.meta.url);
|
|
3
5
|
import {
|
|
@@ -5,8 +7,9 @@ import {
|
|
|
5
7
|
generateDockerfile,
|
|
6
8
|
prepareSourceTree,
|
|
7
9
|
resolveDockerfileCandidates,
|
|
8
|
-
resolveServiceDockerfile
|
|
9
|
-
|
|
10
|
+
resolveServiceDockerfile,
|
|
11
|
+
staticBuilderOutputPath
|
|
12
|
+
} from "./chunk-V6AN6XLZ.js";
|
|
10
13
|
import {
|
|
11
14
|
BuildLogger,
|
|
12
15
|
assembleGitClone,
|
|
@@ -15,20 +18,20 @@ import {
|
|
|
15
18
|
shellGitSshWriter,
|
|
16
19
|
sq,
|
|
17
20
|
transferLocalDirectory
|
|
18
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-4Z5QO7N6.js";
|
|
19
22
|
import {
|
|
20
23
|
connectSshClient,
|
|
21
24
|
execSshCommand,
|
|
22
25
|
openSshExecChannel,
|
|
23
26
|
openSshUnixSocket
|
|
24
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-OXWDY22G.js";
|
|
25
28
|
import {
|
|
26
29
|
isRuntimeNotFoundError
|
|
27
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-RPHRPFEH.js";
|
|
28
31
|
import {
|
|
29
32
|
safeErrorMessage,
|
|
30
33
|
withTimeout
|
|
31
|
-
} from "./chunk-
|
|
34
|
+
} from "./chunk-6APULWSU.js";
|
|
32
35
|
|
|
33
36
|
// ../../packages/adapters/src/runtime/docker.ts
|
|
34
37
|
import Dockerode from "dockerode";
|
|
@@ -79,8 +82,127 @@ function scopeVolumeBinds(slug, rawVolumes, enabled) {
|
|
|
79
82
|
});
|
|
80
83
|
}
|
|
81
84
|
|
|
82
|
-
// ../../packages/adapters/src/runtime/docker-
|
|
85
|
+
// ../../packages/adapters/src/runtime/docker-exec-stream.ts
|
|
83
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";
|
|
84
206
|
var DEFAULT_REMOTE_DOCKER_SOCKET_PATH = "/var/run/docker.sock";
|
|
85
207
|
var resolvedDockerSocketPathCache = /* @__PURE__ */ new WeakMap();
|
|
86
208
|
var DOCKER_DIAL_STDIO_COMMAND = "docker system dial-stdio";
|
|
@@ -255,7 +377,7 @@ function createDockerSshBridge(opts) {
|
|
|
255
377
|
const mode = await ensureMode();
|
|
256
378
|
return mode === "dialstdio" ? openDialStdioUpstream() : openStreamlocalUpstream(opts);
|
|
257
379
|
};
|
|
258
|
-
const server =
|
|
380
|
+
const server = net2.createServer((client) => {
|
|
259
381
|
clients.add(client);
|
|
260
382
|
client.setNoDelay(true);
|
|
261
383
|
client.once("close", () => clients.delete(client));
|
|
@@ -557,16 +679,16 @@ function parseTimestampedLine(line) {
|
|
|
557
679
|
};
|
|
558
680
|
}
|
|
559
681
|
function firstNetworkIp(networks) {
|
|
560
|
-
for (const
|
|
561
|
-
if (
|
|
682
|
+
for (const net3 of Object.values(networks ?? {})) {
|
|
683
|
+
if (net3?.IPAddress) return net3.IPAddress;
|
|
562
684
|
}
|
|
563
685
|
return void 0;
|
|
564
686
|
}
|
|
565
687
|
function extractNetworkInfo(data) {
|
|
566
688
|
let ip;
|
|
567
|
-
for (const
|
|
568
|
-
if (
|
|
569
|
-
ip =
|
|
689
|
+
for (const net3 of Object.values(data.NetworkSettings.Networks ?? {})) {
|
|
690
|
+
if (net3.IPAddress) {
|
|
691
|
+
ip = net3.IPAddress;
|
|
570
692
|
break;
|
|
571
693
|
}
|
|
572
694
|
}
|
|
@@ -1225,11 +1347,43 @@ var DockerRuntime = class _DockerRuntime {
|
|
|
1225
1347
|
}
|
|
1226
1348
|
}
|
|
1227
1349
|
/**
|
|
1228
|
-
*
|
|
1229
|
-
*
|
|
1230
|
-
*
|
|
1231
|
-
*
|
|
1232
|
-
*
|
|
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.
|
|
1233
1387
|
* Returns the host dir as `imageRef`, matching BareRuntime.build's host-dir
|
|
1234
1388
|
* contract so the existing file-backed serve path (deployStatic /
|
|
1235
1389
|
* resolveStaticRoot) consumes it unchanged. Never leaves a long-lived
|
|
@@ -1237,51 +1391,17 @@ var DockerRuntime = class _DockerRuntime {
|
|
|
1237
1391
|
*/
|
|
1238
1392
|
async buildStaticToHost(config, hostOutDir, logger) {
|
|
1239
1393
|
const log = logger ?? new BuildLogger();
|
|
1240
|
-
const buildResult = await this.build(
|
|
1394
|
+
const buildResult = await this.build(
|
|
1395
|
+
{ ...config, isStatic: true, staticExtractOnly: true },
|
|
1396
|
+
log
|
|
1397
|
+
);
|
|
1241
1398
|
if (buildResult.status !== "deploying" || !buildResult.imageRef) {
|
|
1242
1399
|
return buildResult;
|
|
1243
1400
|
}
|
|
1244
1401
|
const tag = buildResult.imageRef;
|
|
1245
1402
|
const extractStart = Date.now();
|
|
1246
|
-
const DOC_ROOT = "/usr/share/nginx/html";
|
|
1247
1403
|
try {
|
|
1248
|
-
|
|
1249
|
-
log.log("Extracting static files from the build sandbox...\n");
|
|
1250
|
-
if (sshExecutor) {
|
|
1251
|
-
const cid = (await sshExecutor.exec(`docker create ${sq(tag)}`)).trim();
|
|
1252
|
-
try {
|
|
1253
|
-
await sshExecutor.exec(`mkdir -p ${sq(hostOutDir)}`);
|
|
1254
|
-
await sshExecutor.exec(`docker cp ${sq(`${cid}:${DOC_ROOT}/.`)} ${sq(hostOutDir)}`);
|
|
1255
|
-
} finally {
|
|
1256
|
-
await sshExecutor.exec(`docker rm ${sq(cid)}`).catch(() => {
|
|
1257
|
-
});
|
|
1258
|
-
}
|
|
1259
|
-
} else {
|
|
1260
|
-
const { mkdir } = await import("fs/promises");
|
|
1261
|
-
const { spawn } = await import("child_process");
|
|
1262
|
-
await mkdir(hostOutDir, { recursive: true });
|
|
1263
|
-
const container = await this.docker.createContainer({ Image: tag });
|
|
1264
|
-
try {
|
|
1265
|
-
const tarStream = await container.getArchive({ path: DOC_ROOT });
|
|
1266
|
-
await new Promise((resolve, reject) => {
|
|
1267
|
-
const extract = spawn("tar", ["-x", "--strip-components=1", "-C", hostOutDir]);
|
|
1268
|
-
let errBuf = "";
|
|
1269
|
-
extract.stderr.on("data", (d) => errBuf += d.toString());
|
|
1270
|
-
extract.on("error", reject);
|
|
1271
|
-
tarStream.on("error", reject);
|
|
1272
|
-
tarStream.pipe(extract.stdin);
|
|
1273
|
-
extract.on(
|
|
1274
|
-
"close",
|
|
1275
|
-
(code) => code === 0 ? resolve() : reject(new Error(`static extract failed (tar ${code}): ${errBuf.trim().slice(-500)}`))
|
|
1276
|
-
);
|
|
1277
|
-
});
|
|
1278
|
-
} finally {
|
|
1279
|
-
await container.remove({ force: true }).catch(() => {
|
|
1280
|
-
});
|
|
1281
|
-
}
|
|
1282
|
-
}
|
|
1283
|
-
log.log(`Static files ready at ${hostOutDir}
|
|
1284
|
-
`);
|
|
1404
|
+
await this.moveStaticBuildToHost(tag, config, hostOutDir, log);
|
|
1285
1405
|
return {
|
|
1286
1406
|
sessionId: config.sessionId,
|
|
1287
1407
|
status: "deploying",
|
|
@@ -1297,8 +1417,58 @@ var DockerRuntime = class _DockerRuntime {
|
|
|
1297
1417
|
durationMs: (buildResult.durationMs ?? 0) + (Date.now() - extractStart),
|
|
1298
1418
|
errorMessage: `Static extract failed: ${msg}`
|
|
1299
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)}`);
|
|
1300
1442
|
} finally {
|
|
1301
|
-
await
|
|
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(() => {
|
|
1302
1472
|
});
|
|
1303
1473
|
}
|
|
1304
1474
|
}
|
|
@@ -1429,6 +1599,23 @@ var DockerRuntime = class _DockerRuntime {
|
|
|
1429
1599
|
await this.streamDockerodeBuild(stream, spec.logger);
|
|
1430
1600
|
}
|
|
1431
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
|
+
}
|
|
1432
1619
|
spec.logger.log(`Image ${tag} is ready.
|
|
1433
1620
|
`);
|
|
1434
1621
|
const result = {
|
|
@@ -2107,8 +2294,8 @@ var DockerRuntime = class _DockerRuntime {
|
|
|
2107
2294
|
async getContainerIp(containerId) {
|
|
2108
2295
|
const container = this.docker.getContainer(containerId);
|
|
2109
2296
|
const data = await container.inspect();
|
|
2110
|
-
for (const
|
|
2111
|
-
if (
|
|
2297
|
+
for (const net3 of Object.values(data.NetworkSettings.Networks ?? {})) {
|
|
2298
|
+
if (net3.IPAddress) return net3.IPAddress;
|
|
2112
2299
|
}
|
|
2113
2300
|
return null;
|
|
2114
2301
|
}
|
|
@@ -2145,11 +2332,11 @@ var DockerRuntime = class _DockerRuntime {
|
|
|
2145
2332
|
Cmd: ["/bin/sh", "-lc", "exec $(command -v bash || echo /bin/sh)"],
|
|
2146
2333
|
Env: [`TERM=${term}`]
|
|
2147
2334
|
});
|
|
2148
|
-
const duplex = await
|
|
2149
|
-
|
|
2150
|
-
|
|
2151
|
-
|
|
2152
|
-
|
|
2335
|
+
const duplex = await startExecStream(
|
|
2336
|
+
daemonConnectionFrom(this.docker),
|
|
2337
|
+
exec.id,
|
|
2338
|
+
{ tty: true, stdin: true }
|
|
2339
|
+
);
|
|
2153
2340
|
try {
|
|
2154
2341
|
await exec.resize({ h: rows, w: cols });
|
|
2155
2342
|
} catch {
|
|
@@ -2157,6 +2344,7 @@ var DockerRuntime = class _DockerRuntime {
|
|
|
2157
2344
|
const stdout = new PassThrough();
|
|
2158
2345
|
const stderr = new PassThrough();
|
|
2159
2346
|
duplex.on("data", (chunk) => stdout.write(chunk));
|
|
2347
|
+
duplex.resume();
|
|
2160
2348
|
duplex.on("end", () => {
|
|
2161
2349
|
stdout.end();
|
|
2162
2350
|
stderr.end();
|