Подтвердить что ты не робот

Как загрузить файл из Heroku bash?

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

4b9b3361

Ответ 1

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

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

Ответ 2

Если вам удалось создать файл с heroku run bash, вы можете использовать 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>

Ответ 3

Я сделал следующее:

  • Сначала я ввел heroku bash с помощью этой команды:

    heroku run 'sh'

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

  • Создал репозиторий git и запустил файл
  • Наконец, я нажал этот репозиторий на github

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

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

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

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

Ответ 4

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

  • создать vm в облачном провайдере, например. цифровой океан;
  • запустить one-off dyno и запустить файл.
  • scp файл от одноразового dyno героя к этому серверу vm;
  • scp файл с сервера vm на ваш локальный компьютер;
  • удалить облако vm и отключить одноразовый dynku one-off.

Ответ 5

Существует heroku ps:copy:

#$ heroku help ps:copy 
Copy a file from a dyno to the local filesystem

USAGE
  $ heroku ps:copy FILE

OPTIONS
  -a, --app=app        (required) app to run command against
  -d, --dyno=dyno      specify the dyno to connect to
  -o, --output=output  the name of the output file
  -r, --remote=remote  git remote of app to use

DESCRIPTION
  Example:

       $ heroku ps:copy FILENAME --app murmuring-headland-14719

Пример выполнения:

#$ heroku ps:copy app.json --app=app-example-prod --output=app.json.from-heroku
Copying app.json to app.json.from-heroku
Establishing credentials... done
Connecting to web.1 on ⬢ app-example-prod... 
Downloading... ████████████████████████▏  100% 00:00 

Caveat

Похоже, что это не работает с динамо, которые run через heroku run.

Пример

#$ heroku ps:copy tmp/some.log --app app-example-prod --dyno run.6039 --output=tmp/some.heroku.log
Copying tmp/some.log to tmp/some.heroku.log
Establishing credentials... error
 ▸    Could not connect to dyno!
 ▸    Check if the dyno is running with 'heroku ps'

Это так! Доказать:

#$ heroku ps --app app-example-prod
=== run: one-off processes (1)
run.6039 (Standard-1X): up 2019/08/29 12:09:13 +0200 (~ 16m ago): bash

=== web (Standard-2X): elixir --sname dyno -S mix phx.server --no-compile (2)
web.1: up 2019/08/29 10:41:35 +0200 (~ 1h ago)
web.2: up 2019/08/29 10:41:39 +0200 (~ 1h ago)

Я мог бы подключиться к web.1, хотя:

#$ heroku ps:copy tmp/some.log --app app-example-prod --dyno web.1 --output=tmp/some.heroku.log
Copying tmp/some.log to tmp/some.heroku.log
Establishing credentials... done
Connecting to web.1 on ⬢ app-example-prod... 
 ▸    ERROR: Could not transfer the file!
 ▸    Make sure the filename is correct.

Поэтому я вернулся к использованию SCP scp -P PORT tmp/some.log [email protected]:/path/some.heroku.log из командной строки run.6039 dyno.

Ответ 6

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

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

Ответ 7

Теперь я создал сценарий оболочки для загрузки некоторых файлов в репозиторий 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 '[email protected]'
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)

Ответ 8

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

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

sftp [email protected]

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

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

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

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

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

Ответ 9

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

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

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

Ответ 10

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

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

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