هل من الممكن أن يكون لديك Capistrano القيام بالخروج على نفق SSH عكسي؟

StackOverflow https://stackoverflow.com/questions/2729100

سؤال

أقوم بتطوير تطبيق موجود على مضيف عام ، لكن يجب أن أحتفظ بمصدره في مستودع GIT خلف جدار حماية الشركات. انا احصل جداً تعبت من بطء النشر عبر scp (نسخ المستودع بالكامل وشحنه عبر SSH على كل نشر) ويرغب في الحصول على المضيف البعيد ببساطة git pull للتحديث. المشكلة هي أن جدار الحماية يحظر اتصالات SSH الواردة.

هل سيكون من الممكن أن أقوم بإعداد نفق SSH من جهاز الكمبيوتر الخاص بي إلى كمبيوتر النشر واستخدام المستودع الخاص بي كمصدر لـ git pull؟ بعد كل شيء، git يتم توزيعه ، لذلك نسختي صالحة تمامًا مثل المستودع المركزي. إذا كان هذا ممكنًا ، فماذا سيكون أمر النفق وتكوين Capistrano؟

أعتقد أن النفق سيبدو مثل

ssh -R something:deployserver.com:something deploybot@deployserver.com
هل كانت مفيدة؟

المحلول

Net :: Ssh ينفذ إعادة التوجيه عن بُعد. لقد نظرت إلى جميع الكود المصدري في Capistrano ولم أتمكن من رؤية أي إشارات إليه في الإصدار الحالي. ومع ذلك ، فإن هذا لا يمنعك من إنشاء إعادة توجيه عن بعد قبل الانتشار مع Capistrano.

ما تريد القيام به هو تعيين :local_repository و :repository المسارات بشكل فردي. :local_repository تتم الإشارة إليها محليًا لتحديد الالتزام الذي سيتم استخدامه للنشر قبل بدء الاتصال. أن يترك :repository لكي يتم بدء الخادم البعيد بعد بدء الاتصال. هذا هو المكان الذي يمكنك فيه تحديد المسار إلى المستودع وراء جدار الحماية.

# deploy.rb
set :local_repository, "ssh://git@serverbehindfirewall/path/to/project.git"
set :repository,  "ssh://git@localhost:9000/path/to/project.git"

قبل النشر ، تأكد من إنشاء جهاز التحكم عن بُعد. ستحتاج إلى تكرار هذا لكل خادم تنشره.

$ ssh -R 9000:serverbehindfirewall:22 deploybot@deployserver.com
# CTRL + C + A (Screen) or ⌘ + T (Terminal.app) to open new tab
$ cap HOSTFILTER=deployserver.com deploy # HOSTFILTER reduces set to specified host. Only useful if you have multiple servers.

باستخدام Net :: Ssh ، يمكن تحويل هذا بسهولة إلى مهمة يتم تنفيذها قبل أي شيء آخر يوفر مرونة أكبر عند النشر في خوادم متعددة.

أخيرًا ، نظرًا لأنك تستخدم SCP ، فقد ترغب في تعيين deploy_via, :remote_cache الذي يحتفظ بنسخة من المستودع على الخادم البعيد. هذا يقلل بشكل كبير من وقت النشر الخاص بك يقلل من فرصة الفساد.

نصائح أخرى

انظر إجابتي من هذا السؤال جدا:

باستخدام Capistrano 3.x ، فإن ما يلي يعمل بالنسبة لي:

namespace :deploy do
  desc "Open SSH Tunnel to GitLab"
  task :open_tunnel do
    on roles(:app) do
      info "Opening SSH Remote Tunnel..."
      self.send(:with_ssh) do |ssh|
        # ssh -R 9000:192.168.1.123:22
        ssh.forward.remote(22, "192.168.1.123", 9000)
      end
    end
  end
  before "deploy:check", "deploy:open_tunnel"
end

يرجى ملاحظة ذلك ssh.forward.remote تتوقع المعلمات بترتيب مختلف عن ssh -R, ما سبق يعادل ssh -R 9000:192.168.1.123:22

تستدعي هذه المهمة طريقة خاصة ، إذا كان أي شخص يعرف طريقة رسمية للحصول على اتصال SSH Capistrano للوصول ، فيرجى التعليق أو التعديل.

يحرر: انظر أيضا القسم نفق وموضوعات SSH الأخرى ذات الصلة من Sshkit's readme

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top