Hello,
I am deploying a Ruby on Rails app. I want to store users photo on my server.
My problem is Puma remove all folders. I have three folders to store users photos.
I use Ruby 3.2.2, Rails 8.0.1, Puma 6.0, Capistrano 3.19.2 The server user Debian 12 and Nginx.
This is my deploy.rb
# config valid for current version and patch releases of Capistrano
lock "~> 3.19.2"
set :application, "project"
set :repo_url, "ssh://root@project.com:/var/www/project/git"
set :branch, "main"
# Default branch is :master
# ask :branch, \
git rev-parse --abbrev-ref HEAD.chomp
# Default deploy_to directory is /var/www/my_app_name
set :deploy_to, "/var/www/project"
# Default value for :format is :airbrussh.
# set :format, :airbrussh
# You can configure the Airbrussh format using :format_options.
# These are the defaults.
# set :format_options, command_output: true, log_file: "log/capistrano.log", color: :auto, truncate: :auto
# Default value for :pty is false
# set :pty, true
# Default value for :linked_files is []
# append :linked_files, "config/database.yml", "config/master.key"
set :linked_files, fetch(:linked_files, []).push("config/database.yml", "config/master.key")
# Default value for linked_dirs is []
# append :linked_dirs, "log", "tmp/pids", "tmp/cache", "tmp/sockets", "public/system", "vendor/javascript",
# "storage", "app/models/users/keys",
# "images_cache/logos", "images_cache/real_estates", "images_cache/users", "agencies/logos", "photos/real_estates", "photos/users"
set :linked_dirs, fetch(:linked_dirs, []).push(
"log", "tmp/pids", "tmp/cache", "tmp/sockets", "public/system", "vendor/javascript", "storage", "app/models/users/keys",
"images_cache/logos", "images_cache/real_estates", "images_cache/users", "agencies/logos", "photos/real_estates", "photos/users"
)
set :nginx_config_name, "project-config"
set :nginx_server_name, "project"
set :puma_workers, 4
set :puma_bind, "unix:///var/www/project/shared/sockets/puma.sock"
set :puma_pid, "/var/www/project/shared/pids/puma.pid"
set :puma_state, "/var/www/project/shared/pids/puma.state"
# Default value for default_env is {}
# set :default_env, { path: "/opt/ruby/bin:$PATH" }
# Default value for local_user is ENV['USER']
# set :local_user, -> { \
git config user.name.chomp }
# Default value for keep_releases is 5
# set :keep_releases, 5
# Uncomment the following to require manually verifying the host key before first deploy.
# set :ssh_options, verify_host_key: :secure
set :ssh_options, {forward_agent: true, auth_methods: %w[publickey], keys: %w[/Users/owner/.ssh/id_rsa]}
namespace :deploy do
namespace :check do
before :linked_files, :set_master_key do
on roles(:app) do
unless test("[ -f #{shared_path}/config/master.key ]")
upload! "config/master.key", "#{shared_path}/config/master.key"
end
end
end
end
task :create_assets_dir do
on roles(:app) do
folders = %w[buttons challenge generic_photos icons icons-menu]
folders.each do |folder|
path = releases_path.join("app/assets/images/", folder)
execute :mkdir, "-p", path
execute :chmod, "765", path
puts "Folder #{folder} created !"
end
end
end
task :create_shared_dir do
on roles(:app) do
folders = %w[images_cache agencies photos]
folders.each do |folder|
path = shared_path.join("images", folder)
unless test("[ -d #{shared_path}/#{folder} ]")
execute :mkdir, "-p", path
execute :chmod, "766", path
puts "Folder #{folder} created !"
end
end
end
end
task :create_agencies_dir do
on roles(:app) do
folders = %w[logos]
folders.each do |folder|
path = shared_path.join("agencies", folder)
unless test("[ -d #{shared_path}/agencies/#{folder} ]")
execute :mkdir, "-p", path
execute :chmod, "766", path
puts "Folder #{folder} created !"
end
end
end
end
task :create_images_cache_dir do
on roles(:app) do
folders = %w[logos real_estates users]
folders.each do |folder|
path = shared_path.join("images_cache", folder)
unless test("[ -d #{shared_path}/images_cache/#{folder} ]")
execute :mkdir, "-p", path
execute :chmod, "766", path
puts "Folder #{folder} created !"
end
end
end
end
task :create_photos_dir do
on roles(:app) do
folders = %w[real_estates users]
folders.each do |folder|
path = shared_path.join("photos", folder)
unless test("[ -d #{shared_path}/photos/#{folder} ]")
execute :mkdir, "-p", path
execute :chmod, "766", path
puts "Folder #{folder} created !"
end
end
end
end
task :create_users_generic_photos_dir do
on roles(:app) do
generic_photos_dir = releases_path.join("app/assets/images/generic_photos/")
execute :mkdir, "-p", generic_photos_dir + "users"
execute :chmod, "765", generic_photos_dir + "users"
end
end
task :update_assets_buttons do
on roles(:app) do
local_dir = "/path/psa/app/assets/images/buttons/"
local_files = Dir.entries(local_dir).reject { |f| f[0] == "." || File.directory?(local_dir + f) }
remote_dir = releases_path.join("app/assets/images/buttons/")
local_files.each do |file|
remote_path = remote_dir.join(file)
unless File.exist?(remote_path)
upload!(local_dir + file, remote_path)
puts "File uploaded : #{file}"
end
end
end
end
task :update_assets_challenge do
on roles(:app) do
local_dir = "/path/psa/app/assets/images/challenge/"
local_files = Dir.entries(local_dir).reject { |f| f[0] == "." || File.directory?(local_dir + f) }
remote_dir = releases_path.join("app/assets/images/challenge/")
local_files.each do |file|
remote_path = remote_dir.join(file)
unless File.exist?(remote_path)
upload!(local_dir + file, remote_path)
puts "File uploaded : #{file}"
end
end
end
end
task :update_assets_generic_photos do
on roles(:app) do
local_dir = "/path/psa/app/assets/images/generic_photos/"
local_files = Dir.entries(local_dir).reject { |f| f[0] == "." || File.directory?(local_dir + f) }
remote_dir = releases_path.join("app/assets/images/generic_photos/")
local_files.each do |file|
remote_path = remote_dir.join(file)
unless File.exist?(remote_path)
upload!(local_dir + file, remote_path)
puts "File uploaded : #{file}"
end
end
end
end
task :update_assets_icons do
on roles(:app) do
local_dir = "/path/psa/app/assets/images/icons/"
local_files = Dir.entries(local_dir).reject { |f| f[0] == "." || File.directory?(local_dir + f) }
remote_dir = releases_path.join("app/assets/images/icons/")
local_files.each do |file|
remote_path = remote_dir.join(file)
unless File.exist?(remote_path)
upload!(local_dir + file, remote_path)
puts "File uploaded : #{file}"
end
end
end
end
task :update_assets_icons_menu do
on roles(:app) do
local_dir = "/path/psa/app/assets/images/icons-menu/"
local_files = Dir.entries(local_dir).reject { |f| f[0] == "." || File.directory?(local_dir + f) }
remote_dir = releases_path.join("app/assets/images/icons-menu/")
local_files.each do |file|
remote_path = remote_dir.join(file)
unless File.exist?(remote_path)
upload!(local_dir + file, remote_path)
puts "File uploaded : #{file}"
end
end
end
end
task :update_assets_logo do
on roles(:app) do
local_dir = "/path/psa/app/assets/images/"
local_logo = %w[logo.svg logo_footer.svg logo-mobile.svg favicon.ico]
remote_dir = releases_path.join("app/assets/images/")
local_logo.each do |file|
remote_path = remote_dir.join(file)
unless File.exist?(remote_path)
upload!(local_dir + file, remote_path)
puts "File uploaded : #{file}"
end
end
end
end
task :symlink_uploads do
on roles(:app) do
execute :ln, "-nfs", "#{shared_path}/images", "#{release_path}/app/assets/images"
end
end
after :updated, :create_assets_dir
after :updated, :create_shared_dir
after :updated, :create_agencies_dir
after :updated, :create_images_cache_dir
after :updated, :create_photos_dir
after :updated, :create_users_generic_photos_dir
after :updated, :update_assets_buttons
after :updated, :update_assets_challenge
after :updated, :update_assets_generic_photos
after :updated, :update_assets_icons
after :updated, :update_assets_icons_menu
after :updated, :update_assets_logo
after :finishing, :compile_assets
after :finishing, :cleanup
after :finishing, :restart
end
Thank you very much for your help!