После git push heroku - загруженные файлы на Heroku теряются
Мое довольно базовое приложение позволяет пользователям загружать аватары.
Приложение развертывается в Heroku с помощью
$ git add .
$ git commit -m "description"
$ git checkout master
$ git merge my-cool-new-feature
$ git push heroku
Проблема в том, что каждый раз, когда я нажимаю изменения в Heroku, все файлы, загруженные в Heroku, теряются. Я думал, проблема в том, что папка/файлы находились под управлением версиями, поэтому я добавил папку в .gitignore
# Ignore User generated files
/public/system/*
и удалили файлы из репозитория.
$ git rm -rf --cached public/system
Но проблема сохраняется. Можете ли вы указать мне в правильном направлении?
Ответы
Ответ 1
Причина этого заключается в том, что Heroku ограничивает способ хранения данных на своих серверах. Назад в bamboo
дней стека, сохранение любых данных было просто невозможно без использования внешней службы. Поскольку они ввели стек Cedar
, все немного изменилось, но сохранение постоянных данных по-прежнему невозможно.
Как вы обнаружили, каждый раз, когда вы нажимаете новое изменение на свое приложение Heroku (или каждый раз, когда приложение отключается и перезапускается после неактивности в течение x минут), ваше приложение воссоздается и все сохраненные данные теряются.
Лучше всего не использовать/общедоступный каталог вообще и начать использовать внешний сервис, например Amazon S3, Rackspace Cloud Files или Spideroack
Ответ 2
Ваши файлы будут потеряны при каждом развертывании. Мое предпочтительное решение - использовать "Паперклип" и ведро Amazon. Paperclip сохранит ваше изображение в ковше, чтобы его можно было ссылаться по своему усмотрению из приложения.
Ответ 3
Если ваше приложение должно получать файлы, загруженные пользователями, вам необходимо убедиться, что эти загрузки хранятся в центральном и надежном месте.
С эфемерной файловой системой Herokus любая информация, записанная в файловую систему dynos, будет потеряна при перезапуске dyno. Вместо этого, Героку рекомендует оказывать поддержку. Для хранения файлов и носителей Amazons Simple Storage Service (S3) - отличное решение.
Возможно, вы захотите прочитать эту статью на веб-сайте Heroku: Загрузка файлов на S3 в Ruby с помощью Paperclip