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.
- package/README.md +2 -24
- package/dist/bare-2HYDXQEH.js +23 -0
- package/dist/{bowser-MFQA6OS4.js → bowser-O3AEA6AN.js} +5 -1
- package/dist/{chunk-KD7VO4LG.js → chunk-2ZLR7ULL.js} +255 -65
- package/dist/{chunk-YHXCHW7Q.js → chunk-3JQTL4R4.js} +236 -99
- package/dist/{chunk-E77LJWJK.js → chunk-4TJC4JZQ.js} +20 -9
- package/dist/{chunk-YL67EWYZ.js → chunk-4Z5QO7N6.js} +6 -2
- package/dist/{chunk-WJPCBU7Z.js → chunk-5FNIWBFI.js} +10 -6
- package/dist/{chunk-Y37KHU7L.js → chunk-5MZ624VX.js} +5 -0
- package/dist/{chunk-QKFRZNKN.js → chunk-6APIPIJY.js} +8 -4
- package/dist/{chunk-JZLNHGLW.js → chunk-6APULWSU.js} +153 -133
- package/dist/{chunk-F4DFVG6Q.js → chunk-6B5YCFFV.js} +8 -4
- package/dist/{chunk-XVSAUO2I.js → chunk-AVIB7CT7.js} +5 -1
- package/dist/{chunk-TEYJYSMT.js → chunk-C5OHTYEF.js} +12 -6
- package/dist/{chunk-7UOB5GGQ.js → chunk-DYPH4HCI.js} +5 -0
- package/dist/{chunk-XIFRMKYT.js → chunk-EI575GHN.js} +6 -2
- package/dist/{chunk-4CQWT2WL.js → chunk-FPRHYBY2.js} +5 -0
- package/dist/chunk-FQGJZ2HS.js +248 -0
- package/dist/{chunk-JR2OCMJA.js → chunk-FRNAR33O.js} +6 -2
- package/dist/{chunk-JUJBBF5U.js → chunk-FXTBHTWY.js} +362 -42
- package/dist/chunk-ILFETZOM.js +131 -0
- package/dist/{chunk-5ZCKQ2MI.js → chunk-IXCHURVK.js} +7 -3
- package/dist/{chunk-6ERIMTBC.js → chunk-JYGD5WSN.js} +5 -0
- package/dist/{chunk-4VNS5WPM.js → chunk-KI2EY3WB.js} +4 -0
- package/dist/{chunk-3U4SPZD5.js → chunk-L2VOGB2X.js} +7 -104
- package/dist/{chunk-NB2VEIWG.js → chunk-MZ2WEHHY.js} +7 -3
- package/dist/{chunk-BUBSSKO6.js → chunk-O6ZZF52V.js} +5 -1
- package/dist/{chunk-LBFH7THC.js → chunk-OWED2GRM.js} +5 -1
- package/dist/{chunk-4MG3BVHE.js → chunk-OXWDY22G.js} +6 -2
- package/dist/{chunk-4FABQGQP.js → chunk-Q2CIRAOK.js} +5 -0
- package/dist/{chunk-4LEL3H2Z.js → chunk-RPHRPFEH.js} +5 -0
- package/dist/{chunk-46YJFP4S.js → chunk-SQ77DZOI.js} +1728 -1484
- package/dist/{chunk-S6DSRLNE.js → chunk-TGIINPVM.js} +15 -2
- package/dist/{chunk-U2DPZSXA.js → chunk-TYVME3XD.js} +9 -1
- package/dist/{chunk-HFYDYK4D.js → chunk-V6AN6XLZ.js} +18 -6
- package/dist/{chunk-ZKJOFWBJ.js → chunk-VDMQJHPI.js} +38 -15
- package/dist/{chunk-E6W2JMMU.js → chunk-VFINNTUL.js} +22 -1
- package/dist/{chunk-OJE6YWPQ.js → chunk-VWPEKOH6.js} +6 -2
- package/dist/{chunk-5N7VUGL6.js → chunk-W73X43R7.js} +6 -2
- package/dist/cloud-7QYOGF7F.js +11 -0
- package/dist/cloud-ZSKOS4GY.js +30 -0
- package/dist/detect-SH4FHFBI.js +36 -0
- package/dist/{dist-L3MPOWCA.js → dist-IQJ6H6UZ.js} +6 -2
- package/dist/{dist-es-KE56MWYO.js → dist-es-5DY7K32L.js} +9 -5
- package/dist/dist-es-JSTDUS7Q.js +26 -0
- package/dist/{dist-es-GTAMF674.js → dist-es-OSNJBLXB.js} +8 -4
- package/dist/{dist-es-NRZIQY5B.js → dist-es-RYHIPOTN.js} +17 -13
- package/dist/{dist-es-XQCOTGC7.js → dist-es-VNKHQVIB.js} +7 -3
- package/dist/{dist-es-WZCR7DHQ.js → dist-es-WV4AMOII.js} +11 -7
- package/dist/{dist-es-ZW3HFQUM.js → dist-es-X3B5QYKB.js} +9 -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-7LGDL56D.js → event-streams-EHRAKL75.js} +7 -3
- package/dist/executor-YPT6RH6O.js +30 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +258 -245
- package/dist/{loadSso-N273C5I7.js → loadSso-46FQRIZS.js} +13 -9
- package/dist/local-executor-V7U5VOZW.js +12 -0
- package/dist/nginx-2GTRUIDE.js +24 -0
- package/dist/noop-FMMFG2EZ.js +11 -0
- package/dist/{openresty-lua-HAO4EUDY.js → openresty-lua-4WLGDSER.js} +13 -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-DR462ERO.js → signin-ITOPKKUB.js} +13 -9
- package/dist/{sso-oidc-VBZLJUK5.js → sso-oidc-NON2PD7Y.js} +13 -9
- package/dist/{sts-EJLZ4Z77.js → sts-HHFFSAY2.js} +12 -8
- package/package.json +1 -1
- package/dist/bare-ITM45QBX.js +0 -18
- package/dist/cloud-JMPHO3CW.js +0 -7
- package/dist/cloud-W5G6YXAY.js +0 -24
- package/dist/dist-es-4C322O5D.js +0 -22
- package/dist/docker-3FVJMFC3.js +0 -12
- package/dist/docker-edge-executor-ZIWAZWPL.js +0 -9
- package/dist/edge-import-Y34YL6JK.js +0 -39
- package/dist/executor-J7BHW5HF.js +0 -26
- package/dist/nginx-YZWKYKQU.js +0 -16
- package/dist/noop-RRNCIUI5.js +0 -7
- 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
|
|
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
|
-
|
|
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
|
-
|
|
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-
|
|
21
|
+
} from "./chunk-4Z5QO7N6.js";
|
|
17
22
|
import {
|
|
18
23
|
connectSshClient,
|
|
19
24
|
execSshCommand,
|
|
20
25
|
openSshExecChannel,
|
|
21
26
|
openSshUnixSocket
|
|
22
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-OXWDY22G.js";
|
|
23
28
|
import {
|
|
24
29
|
isRuntimeNotFoundError
|
|
25
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-RPHRPFEH.js";
|
|
26
31
|
import {
|
|
27
32
|
safeErrorMessage,
|
|
28
33
|
withTimeout
|
|
29
|
-
} from "./chunk-
|
|
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-
|
|
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 =
|
|
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
|
|
559
|
-
if (
|
|
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
|
|
566
|
-
if (
|
|
567
|
-
ip =
|
|
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
|
-
*
|
|
1227
|
-
*
|
|
1228
|
-
*
|
|
1229
|
-
*
|
|
1230
|
-
*
|
|
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(
|
|
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
|
-
|
|
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
|
|
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
|
|
2109
|
-
if (
|
|
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
|
|
2147
|
-
|
|
2148
|
-
|
|
2149
|
-
|
|
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();
|