كيفية نشر تطبيق Rails 2.3.2 مع Capistrano من الأعلى (لـ FastCGI)؟
-
22-08-2019 - |
سؤال
تنصل:أنا مبتدئ في Rails وCapistrano (لكنني مطور متوسط لـ .NET C#) وأحاول معرفة المزيد.
لقد واجهت أصعب الأوقات في إعداد عملية تطوير Capistrano.إليك ما لدي حتى الآن بخصوص موقعploy.rb الخاص بي:
set :application, "MyAppName"
set :domain, "domainname"
set :user, "userid"
set :repository, "svn+ssh://#{user}@#{domain}/home/#{user}/svn/#{application}/trunk"
set :rails_env, :production
set :chmod755, %w(app config db lib public vendor script tmp public/dispatch.cgi public/dispatch.fcgi public/dispatch.rb)
set :deploy_to, "/home/#{user}/apps/#{application}"
set :use_sudo, false
set :deploy_via, :checkout
set :group_writable, false
default_run_options[:pty] = true
role :app, domain
role :web, domain
role :db, domain, :primary => true
هذا هو ملف Capfile الخاص بي:
load 'deploy' if respond_to?(:namespace) # cap2 differentiator
Dir['vendor/plugins/*/recipes/*.rb'].each { |plugin| load(plugin) }
load 'config/deploy'
namespace :deploy do
task :restart, :roles => :app do
run "#{current_path}/script/process/reaper --dispatcher=dispatch.fcgi"
end
desc "Set the proper permissions for directories and files on HostingRails accounts"
task :after_deploy do
run(chmod755.collect do |item|
"chmod 755 #{current_path}/#{item}"
end.join(" && "))
end
end
- لا يحتوي Rails 2.3.2 على دليل البرنامج النصي/العملية، لذا لا تعمل مهمة إعادة التشغيل على الإطلاق.كيف يمكنني حل هذه المشكلة؟
- هل هناك طريقة لتعيين متغير RAILS_ENV في بيئة.rb على "الإنتاج" عند نشر التطبيق ("set :rails_env, :production" لا يفعل ذلك)؟
- أيضًا، هل أفتقد أي شيء آخر من هذين الملفين؟
المحلول
هذا هو موقعploy.rb الخاص بي، والذي لم يتم تحديثه حقًا منذ فترة طويلة.أقوم بتشغيل أمرين sed لتعيين البيئة داخل مهمتي: after_update_code.أنا متأكد من أن هناك طريقة أسهل للقيام بذلك، ولكن هذه هي طريقتي الحالية.
require 'erb'
before "deploy:setup", :db
after "deploy:update_code", "db:symlink"
after "deploy", "deploy:cleanup"
def prompt_with_default(var, default)
set(var) do
Capistrano::CLI.ui.ask "Enter #{var} [#{default}] : "
end
set var, default if eval("#{var.to_s}.empty?")
end
default_run_options[:pty] = true
set :rake, "/usr/local/bin/rake"
set :user, "your username"
set :application, "application name"
set :repository, "svn repository path"
set :host, "domain name"
set :db_host, "DB host name"
set :db_user, "DB user name"
set :db_prefix, "any DB name prefix your host might require"
set :rails_env, "production"
set :deploy_to, "/home/username/rails/#{host}" # your deployment directory
role :app, host
role :web, host
role :db, host, :primary => true
set :use_sudo, false
set :checkout, "export"
#
# TASKS
#
desc "Tasks to execute after code update"
task :after_update_code, :roles => [:app, :db, :web] do
# Make sure we're running in production
run "sed -i -e '/ENV.*RAILS_ENV/s/# //' #{release_path}/config/environment.rb"
run "sed -i -e '/ENV.*RAILS_ENV/s/production/#{rails_env}/' #{release_path}/config/environment.rb"
# Add banned IPs
deny_lines = []
File.readlines("#{release_path}/config/banned_ips").each {|ip|
deny_lines << "deny from #{ip}"
}
ip_ban_block = <<EOBAN
# Bannination
order allow,deny
#{deny_lines.join}
allow from all
EOBAN
run "sed -i -e 's/# BANNED IPS/#{ip_ban_block}/' #{release_path}/public/.htaccess"
run "chmod +x #{release_path}/script/runner"
run "chmod +x #{release_path}/script/process/reaper"
run "chmod +x #{release_path}/script/process/spawner"
run "chmod 755 #{release_path}/public/dispatch.*"
end
desc "Restarting after deployment"
task :after_deploy, :roles => [:app, :db, :web] do
run "cd #{current_path} && rake RAILS_ENV=production db:sessions:clear tmp:clear"
# fix permissions
run "dos2unix #{release_path}/public/dispatch.*"
run "dos2unix #{release_path}/public/.htaccess"
run "chmod -R 755 #{release_path}"
run "chmod -R 775 #{release_path}/log #{release_path}/tmp #{release_path}/script"
run "find #{release_path}/ | xargs touch"
run "touch #{deploy_to}/current/public/dispatch.fcgi"
end
desc "Restarting after rollback"
task :after_rollback, :roles => [:app, :db, :web] do
run "touch #{deploy_to}/current/public/dispatch.fcgi"
end
namespace :db do
desc "Create database yaml in shared path"
task :default do
prompt_with_default(:db_password, "")
db_config = ERB.new <<-EOF
base: &base
adapter: mysql
port: 3306
host: #{db_host}
username: #{db_user}
password: #{db_password}
development:
database: #{db_prefix}#{application}development
<<: *base
test:
database: #{db_prefix}#{application}test
<<: *base
production:
database: #{db_prefix}#{application}production
<<: *base
EOF
run "mkdir -p #{shared_path}/config"
put db_config.result, "#{shared_path}/config/database.yml"
end
desc "Make symlink for database yaml"
task :symlink do
run "ln -nfs #{shared_path}/config/database.yml #{release_path}/config/database.yml"
end
end
بمجرد إعداد المتغيرات الخاصة بي، لدي برنامج نصي bash يعمل:
svn export $svn_path . --force
cap deploy
سوف يطلب مني كلمة المرور الخاصة بي مرتين.مرة واحدة للتصدير من SVN، ومرة واحدة كمطالبة لإنشاء قاعدة البيانات الخاصة بي تلقائيًا.yml في المسار المشترك.
نصائح أخرى
تحديث إجابتي، انظر رقم 3 ...
لا أستخدم FastCGI للنشر، ولكن هناك بعض الأشياء التي تتبادر إلى ذهني:
- تم نقل البرامج النصية للعملية من قلب Rails إلى البرنامج المساعد, ، والتي يمكنك الحصول عليها من GitHub.
بالنظر إلى ملف Publish.rb الخاص بي، ستحتاج على الأرجح إلى تمرير متغير البيئة RAILS_ENV إلى البرنامج النصي من خلال سطر الأوامر، على غرار:
run #{current_path}/script/process/reaper RAILS_ENV=#{rails_env} --dispatcher=dispatch.fcgi
- يحرر:في الواقع، من الغريب بعض الشيء أن تكون مهامك في ملف Capfile بدلاً من Deploy.rb - على الرغم من النظر إلى هذا الموضوع على مجموعة جوجل Capistrano, ، إنه ليس مستهجنًا تمامًا.الأمر متروك لك/لفريقك، على ما أعتقد.
نأمل أن تكون هذه النقاط التي في الاتجاه الصحيح.