How to prevent remove folders

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!