【发布时间】:2020-07-13 15:28:51
【问题描述】:
我已经在 Digital Ocean 的服务器上运行 Spree,但每次部署新版本时,我都找不到用户在以前版本上上传的图像
根据我发现的相关帖子,我设置符号链接目录的方式似乎是一个问题
我尝试将storage dir 添加到我的deploy.rb 中的linked_dirs 并发布了一个运行cap production deploy 的新版本,但我仍然遇到同样的错误
set :linked_dirs, %w{log tmp/pids tmp/cache tmp/sockets vendor/bundle .bundle public/system public/uploads storage}
我真的不知道这是否可以从当前版本开始工作,但问题是以前的图像仍然丢失,我需要在部署新版本后保留它们
这是我的Capfile
# Load DSL and Setup Up Stages
require 'capistrano/setup'
require 'capistrano/deploy'
require 'sshkit/sudo'
require 'capistrano/rails/migrations'
require 'capistrano/bundler'
require 'capistrano/rvm'
require 'capistrano/puma'
require 'capistrano/nginx'
install_plugin Capistrano::Puma
# Loads custom tasks from `lib/capistrano/tasks' if you have any defined.
Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }
这是我的config/deploy.rb
# config valid for current version and patch releases of Capistrano
lock "~> 3.14.0"
# Change these
server 'XXX.XX.XX.XXX', port: 22, roles: [:web, :app, :db], primary: true
set :repo_url, 'git@gitlab.com:my-user/my-app-name.git'
set :application, 'my-app-name'
set :user, 'deploy'
set :puma_threads, [4, 16]
set :puma_workers, 0
# Don't change these unless you know what you're doing
set :pty, true
set :use_sudo, false
set :deploy_via, :remote_cache
set :puma_bind, "unix://#{shared_path}/tmp/sockets/#{fetch(:application)}-puma.sock"
set :puma_state, "#{shared_path}/tmp/pids/puma.state"
set :puma_pid, "#{shared_path}/tmp/pids/puma.pid"
set :puma_access_log, "#{release_path}/log/puma.error.log"
set :puma_error_log, "#{release_path}/log/puma.access.log"
set :ssh_options, { forward_agent: true, user: fetch(:user), keys: %w(~/.ssh/id_rsa) }
set :puma_preload_app, true
set :puma_worker_timeout, nil
set :puma_init_active_record, true # Change to false when not using ActiveRecord
## Linked Files & Directories (Default None):
set :linked_files, %w{config/secrets.yml config/database.yml}
set :linked_dirs, %w{log tmp/pids tmp/cache tmp/sockets vendor/bundle .bundle public/system public/uploads storage}
namespace :puma do
desc 'Create Directories for Puma Pids and Socket'
task :make_dirs do
on roles(:app) do
execute "mkdir #{shared_path}/tmp/sockets -p"
execute "mkdir #{shared_path}/tmp/pids -p"
end
end
before :start, :make_dirs
end
namespace :deploy do
desc "Make sure local git is in sync with remote."
task :check_revision do
on roles(:app) do
unless `git rev-parse HEAD` == `git rev-parse origin/master`
puts "WARNING: HEAD is not the same as origin/master"
puts "Run `git push` to sync changes."
end
end
end
desc 'Initial Deploy'
task :initial do
on roles(:app) do
before 'deploy:restart', 'puma:start'
invoke 'deploy'
end
end
# Reload Nginx after deploy
after 'deploy:published', 'nginx:reload'
before :starting, :check_revision
# after :finishing, :precompile_assets
after :finishing, :cleanup
# after :finishing, :restart
end
这是我的config/environments/production.rb
Rails.application.configure do
config.cache_classes = true
config.eager_load = true
# Full error reports are disabled and caching is turned on.
config.consider_all_requests_local = false
config.action_controller.perform_caching = true
# Disable serving static files from the `/public` folder by default since
# Apache or NGINX already handles this.
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
# Do not fallback to assets pipeline if a precompiled asset is missed.
config.assets.compile = true
# Store uploaded files on the local file system (see config/storage.yml for options).
config.active_storage.service = :local
# Use the lowest log level to ensure availability of diagnostic information
# when problems arise.
config.log_level = :debug
# Prepend all log lines with the following tags.
config.log_tags = [ :request_id ]
config.action_mailer.perform_caching = false
# Enable locale fallbacks for I18n (makes lookups for any locale fall back to
# the I18n.default_locale when a translation cannot be found).
config.i18n.fallbacks = true
# Send deprecation notices to registered listeners.
config.active_support.deprecation = :notify
# Use default logging formatter so that PID and timestamp are not suppressed.
config.log_formatter = ::Logger::Formatter.new
if ENV["RAILS_LOG_TO_STDOUT"].present?
logger = ActiveSupport::Logger.new(STDOUT)
logger.formatter = config.log_formatter
config.logger = ActiveSupport::TaggedLogging.new(logger)
end
# Do not dump schema after migrations.
config.active_record.dump_schema_after_migration = false
Rails.application.routes.default_url_options[:protocol] = 'https'
end
这是我的config/storage.yml
test:
service: Disk
root: <%= Rails.root.join("tmp/storage") %>
local:
service: Disk
root: <%= Rails.root.join("storage") %>
相关:
【问题讨论】:
-
好的,我终于做到了。问题是图像保存在服务器上的每个发布文件夹中,所以每次我部署新版本(发布上的新文件夹)时,图像都保留在上一个版本的文件夹中。
-
解决方案是在我的
config/storage.yml中将我存储图像的路径更改为所有版本之间共享的路径,在这种情况下,我使用了此路径root: <%= Rails.root.join("../shared/storage") %>在此之后,我移动了所有图像在服务器上使用mv ./storage/* ./../shared/storage/*到这个新文件夹现在每个图像都上传到这个新路径,我在部署新版本时没有任何问题:)
标签: ruby-on-rails capistrano symlink spree rails-activestorage