Как я могу скачать файл с Heroku Bash?

Я запустил сценарий ruby ​​из Heroku bash, который генерирует файл CSV на сервере, который я хочу загрузить. Я пытался переместить его в общую папку для загрузки, но это не сработало. Я понял, что после каждого сеанса в консоли Heroku Bash файлы удаляются. Есть ли команда для загрузки непосредственно с консоли Heroku Bash?

12 ответов

Решение

Файловые системы Heroku dyno эфемерны, непостоянны и не разделяются между dynos. Итак, когда вы делаете heroku run bash вы фактически получаете новый dyno с новым развертыванием своего приложения без каких-либо изменений, внесенных в эфемерные файловые системы в других dyno.

Если вы хотите сделать что-то вроде этого, вы, вероятно, должны либо сделать все это в heroku run bash сеанс или все в запросе к веб-приложению, запущенному на Heroku, которое отвечает желаемым CSV-файлом.

Если вам удастся создать файл из heroku run bashВы можете использовать https://transfer.sh/.

Вы даже можете зашифровать файл перед его передачей.

cat <file_name> | gpg -ac -o- | curl -X PUT -T "-" https://transfer.sh/<file_name>.gpg

А затем скачать и расшифровать его на целевой машине

curl https://transfer.sh/<hash>/<file_name>.gpg | gpg -o- > <file_name>

Есть heroku ps:copy:

Скопируйте файл из dyno в локальную файловую систему

ИСПОЛЬЗОВАНИЕ $ heroku ps:copy FILE

но я закончил с этой ошибкой:

Establishing credentials... error
 ▸    Could not connect to dyno!
 ▸    Check if the dyno is running with `heroku ps'

Может быть, у вас будет больше успеха с этим.

Теперь, когда https://transfer.sh/ не работает, альтернативой является https://file.io/. Загрузитьmyfile.csv:

$ curl -F "file=@myfile.csv" https://file.io

Ответ будет содержать ссылку, по которой вы можете получить доступ к файлу:

{"success":true,"key":"2ojE41","link":"https://file.io/2ojE41","expiry":"14 days"}

Я не могу поручиться за безопасность file.io, поэтому использование шифрования, как описано в других ответах, может быть хорошей идеей.

Я сделал так:

  • Сначала я вошел в Heroku Bash с этой командой:

    геройку беги 'ш'

  • Затем сделал каталог и переместил файл в тот

  • Сделал git-репозиторий и передал файл
  • Наконец я отправил этот репозиторий в github

Перед отправкой git попросит вас указать ваше имя и адрес электронной почты. Дайте ему что-нибудь подделка!

Если у вас есть файлы размером более 100 Мг, нажмите на gitlab.

Если есть более простой способ, пожалуйста, дайте мне знать!

Извините за мой плохой английский.

Еще один способ сделать это (без участия какого-либо третьего сервера) - использовать метод Патрика, но сначала сжать файл до формата, который использует только видимые символы ASCII. Это должно заставить его работать для любого файла, независимо от каких-либо пробельных символов или необычных кодировок. Я бы порекомендовал base64 сделать это.

Вот как я это сделал:

  1. Войдите в свой экземпляр heroku, используя heroku run bash
  2. Используйте base64 для печати содержимого вашего файла: base64 <your-file>
  3. Выберите в своем терминале текст base64 и скопируйте его
  4. На вашем локальном компьютере распакуйте этот текст, используя base64 прямо в новый файл (на Mac я бы сделал pbpaste | base64 --decode -o <your-file>)

Я согласен, что, скорее всего, ваша потребность означает изменение архитектуры вашего приложения, что-то вроде рабочего динамо. Но, выполнив следующие шаги, вы можете перенести файл, так как в однократном режиме можно запустить scp:

  1. создать vm в облачном провайдере, например, digital ocean;
  2. запусти однократную геройку и создай свой файл;
  3. scp файл из герою одноразового dyno на тот vm сервер;
  4. scp файл с сервера vm на ваш локальный компьютер;
  5. удалить облачную вм и остановить геройку одноразовой динамкой.

Я вижу, что эти ответы намного старше, поэтому я предполагаю, что это новая функция. Для всех таких, как я, которые ищут более простое решение, чем отличные ответы, уже здесь, Heroku теперь имеет возможность довольно легко копировать файлы с помощью следующей команды: heroku ps:copy <filename>

Обратите внимание, что это работает с относительными путями, как и следовало ожидать. (Протестировано на стеке heroku-18, загружая файлы в "path/to/file.ext"

Для справки: Heroku Docs

Heroku Dyno поставляется с предварительно установленным sftp. Я попробовал git, но было слишком много шагов (пришлось генерировать новый ssh-сертификат и добавлять его в github каждый раз), так что теперь я использую sftp, и он прекрасно работает.

Вам понадобится другой хост (например, dreamhost, hostgator, godaddy и т. Д.), Но если вы это сделаете, вы можете:

sftp username@ftp.yourhostname.com

Примите отпечаток пальца / хэш сервера, затем введите свой пароль.

Оказавшись на сервере, перейдите в папку, в которую вы хотите загрузить файлы (используя команды cd и ls).

Затем используйте команду put filename.csv и он загрузит его на ваш веб-хостинг.

Чтобы получить ваш файл: используйте ftp-клиент, например, filezilla, или нажмите ссылку, если вы загрузили в папку по адресу www или путь к веб-сайту.

Это здорово, потому что он также работает с несколькими файлами и двоичными файлами, а также текстовыми файлами.

Для небольших / быстрых переводов, которые удобно помещаются в буфер обмена:

  1. Откройте терминал на вашем локальном устройстве
  2. Бежать heroku run bash
  3. (Внутри вашего удаленного соединения, на dyno) Запустите cat filename
  4. Выберите строки в вашем локальном терминале и скопируйте их в буфер обмена.
  5. Проверьте, чтобы обеспечить правильные переводы строк при их вставке.

TL; DR: используйте Heroku Redis в качестве механизма хранения.

Предыдущие ответы хороши, но в основном включают стороннюю службу для экспорта файла, веб-приложение для создания файла или ftp / scp / rsync для отправки файла из сеанса запуска heroku. Мои требования не позволяли мне использовать ни одно из них:

  • Данные являются частными, что исключает публичное хранилище файлов (даже в зашифрованном виде)
  • Никакие сторонние серверы не задействованы (нет ftp / scp / rsync).
  • Нет веб-стендов (только для рабочих).

Решение без сторонней внешней службы с использованием одноразовых запусков динамометрического стенда ...

... это сработало для меня:

Изначально возникли 2 проблемы:

  • Куда / как переместить данные (файл) из данных, генерирующих одноразовый динамометрический анализатор?
  • Как получить эти данные на локальный компьютер?

Оказывается, мы можем сделать и то, и другое, используя простую надстройку Heroku Redis. Это позволит нам обмениваться данными внутри приложения (между динамометрическими станциями) и с внешним миром.

Отправка файла в Redis:

Я не нашел простого способа использовать redis-cli внутри heroku run bash session, поэтому я использую библиотеку redis для языка, для которого у меня есть пакет сборки (в моем случае ruby).

Для начала нам понадобится библиотека так:


Затем нам нужно отправить файл в Redis. Несколько полосок рубина подойдут.

      require "redis"
redis = redis = Redis.new(url: ENV["REDIS_URL"])
redis.set("some-key-name", IO.binread("path/to/file.csv"), ex: 1200)

Объяснение:

  • Heroku сохранит URL-адрес redis с учетными данными в переменной среды REDIS_URL, поэтому мы получаем его с помощью ENV["REDIS_URL"]
  • 1200 - это количество времени (в секундах), в течение которого Redis будет хранить запись до ее удаления (можно опустить).

Вот и все, что касается хранения. Данные теперь доступны на динамометрических станциях внутри приложения. Heroku также делает его доступным из Интернета.

Получение из Redis локально:

Получить данные можно либо через heroku redis cli, либо снова через драйвер redis.

Пример (через heroku redis: cli) :

      echo 'GET some-key-name' | redis:cli > file.out

file.out теперь должен содержать данные.
Нам нужно очистить данные , потому что redis:cliИнформационные сообщения также попадали туда. (Я не нашел способа отключить их, но я не смотрел достаточно внимательно).

Пример (драйвер ruby): нам нужно сначала получить URL-адрес redis (для простоты сохраним его в REDIS_URL):

      REDIS_URL=$(heroku redis:credentials)

Убедитесь, что установлен redis gem:

      gem install redis

Сценарий Ruby для извлечения данных будет выглядеть примерно так:

      require "redis"

redis = Redis.new(url: ENV["REDIS_URL"])
IO.binwrite("output/file.txt", redis.get("some-key-name"))

Заявление об ограничении ответственности:

  • Вероятно, это не лучшее использование Redis, но оно помогает.
  • В Redis существует ограничение на размер данных.
  • То же самое, вероятно, можно сделать с помощью надстройки postgres (не пробовал).
  • Heroku предлагает надстройку для отправки файлов на S3. Это был бы мой первый выбор, если бы у меня было это дополнение.

Теперь я создал сценарий оболочки для загрузки некоторых файлов в репозиторий git backup (например, мой sqlite-файл app.db является gitignored, и каждое развертывание убивает его)

## upload dyno files to git via SSH session
## https://devcenter.heroku.com/changelog-items/1112
# heroku ps:exec
git config --global user.email 'dmitry.cheva@gmail.com'
git config --global user.name 'Dmitry Cheva'
rm -rf ./.gitignore
git init
## add each file separately (-f to add git ignored files)
git add app.db -f
git commit -m "backup on `date +'%Y-%m-%d %H:%M:%S'`"
git remote add origin https://bitbucket.org/cheva/appbackup.git
git push -u origin master -f

Git перезагрузится после развертывания и не сохранит среду, вам нужно выполнить первые 3 команды. Затем вам нужно добавить файлы (-f для игнорируемых) и вставить в репозиторий (-f, потому что git потребует pull)

Другие вопросы по тегам