diff --git a/bin/v-bunkerweb-migrate b/bin/v-bunkerweb-migrate index a409ffc..d0f4c46 100644 --- a/bin/v-bunkerweb-migrate +++ b/bin/v-bunkerweb-migrate @@ -28,6 +28,9 @@ require "HestiaBunkerWebApi" require 'json' unless defined?(JSON) require 'fileutils' +require 'time' +require 'pathname' + def copy_nginx_files(src_root, dest_root) FileUtils.mkdir_p(dest_root) @@ -90,6 +93,55 @@ check_hestia_demo_mode case v_command.to_sym when :migratenginx + log_migrate_stage('stage0') do + # Create backup of /etc/nginx with timestamp + + timestamp = Time.now.strftime('%Y%m%d_%H%M%S') + backup_root = "/etc/nginx_backup_#{timestamp}" + FileUtils.mkdir_p(backup_root) + + src_root = '/etc/nginx' + dest_root = backup_root + + # Custom copy function to handle symlinks in conf.d/domains + def copy_with_symlinks(src, dest) + Dir.foreach(src) do |entry| + next if entry == '.' || entry == '..' + src_path = File.join(src, entry) + dest_path = File.join(dest, entry) + + if File.symlink?(src_path) + # Check if symlink is inside conf.d/domains + if src_path.include?(File.join('conf.d', 'domains')) + # Resolve the target of the symlink + target_path = File.readlink(src_path) + # Resolve relative symlink paths + unless Pathname.new(target_path).absolute? + target_path = File.expand_path(target_path, File.dirname(src_path)) + end + if File.exist?(target_path) && File.file?(target_path) + content = File.read(target_path) + new_file_name = "#{entry}_content.conf" + new_file_path = File.join(dest, new_file_name) + File.write(new_file_path, content) + end + else + # Preserve the symlink as is + FileUtils.mkdir_p(File.dirname(dest_path)) + target = File.readlink(src_path) + FileUtils.ln_s(target, dest_path) + end + elsif File.directory?(src_path) + FileUtils.mkdir_p(dest_path) + copy_with_symlinks(src_path, dest_path) + else + FileUtils.cp(src_path, dest_path) + end + end + end + + copy_with_symlinks(src_root, dest_root) + end log_migrate_stage('stage1') do if $BUNKERWEB.nil? hestia_change_sys_config_value("BUNKERWEB", "yes") @@ -103,19 +155,146 @@ when :migratenginx end end log_migrate_stage('stage3') do - hestia_change_sys_config_value("PROXY_PORT", "8078") - hestia_change_sys_config_value("PROXY_SSL_PORT", "8079") - end - log_migrate_stage('stage4') do FileUtils.rm_f Dir.glob('/usr/local/hestia/nginx-system/etc/nginx/conf.d/*.conf') src_root = '/etc/nginx' dest_root = '/usr/local/hestia/nginx-system/etc/nginx' copy_nginx_files(src_root, dest_root) end - #stage5 замена /etc/nginx на /usr/local/hestia/nginx-system/etc/nginx - #stage6 замена портов на 8078 - #stage7 проверить, нужно ли что-то менять в шаблонах + log_migrate_stage('stage4') do + # Find all files under the nginx-system directory + nginx_conf_dir = '/usr/local/hestia/nginx-system/etc/nginx' + Dir.glob(File.join(nginx_conf_dir, '**', '*')).each do |path| + next if File.directory?(path) + content = File.read(path) + new_content = content.gsub(/(?:#{$PROXY_PORT} [flags]; + # Matches: listen 192.168.3.81:80; or listen 192.168.3.81:80 default_server; + new_content = content.gsub(/(?:#{$PROXY_SSL_PORT} ssl; + if new_content == content + new_content = content.gsub(/(? e + hestia_print_error_message_to_cli "Failed to parse JSON from state command: #{e.message}" + exit 1 + end + else + hestia_print_error_message_to_cli "Failed to enable update_module" + exit 1 + end + end + log_migrate_stage('stage8') do + hestia_change_sys_config_value("PROXY_PORT", "8078") + hestia_change_sys_config_value("PROXY_SSL_PORT", "8079") + end #stage8 активация из запуск nginx-system + log_migrate_stage('stage9') do + # Delete all contents inside /etc/nginx + FileUtils.rm_rf Dir.glob('/etc/nginx/*') + # Stop nginx service + system('systemctl stop nginx') + # Start nginx-system service + system('systemctl start nginx-system') + end when :migratetobunkerweb #TODO настройка bunkerweb else