После 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