Я запустил ruby script из Heroku bash, который генерирует CSV файл на сервере, который я хочу загрузить. Я попытался переместить его в общую папку для загрузки, но это не сработало. Я понял, что после каждой сессии в консоли Heroku bash файлы удаляются. Есть ли команда для загрузки непосредственно из консоли Heroku bash?
Как загрузить файл из Heroku bash?
Ответ 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
Для небольших/быстрых передач, которые удобно помещаются в буфер обмена:
- Откройте терминал на вашем локальном устройстве
- Беги
heroku run bash
- (Внутри вашего удаленного соединения, на dyno) Запустите
cat filename
- Выберите линии в вашем локальном терминале и скопируйте их в буфер обмена.
- Проверьте, чтобы обеспечить правильные переводы строк при вставке их.
Ответ 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
сделать это.
Вот как я это сделал:
- Войдите в свой экземпляр
heroku run bash
используяheroku run bash
- Используйте base64 для печати содержимого вашего файла:
base64 <your-file>
- Выберите в своем терминале текст base64 и скопируйте его
- На вашем локальном компьютере распакуйте этот текст, используя
base64
прямо в новый файл (на mac я бы сделалpbpaste | base64 --decode -o <your-file>
)
Ответ 10
Я вижу, что эти ответы намного старше, поэтому я предполагаю, что это новая функция. Для всех таких, как я, которые ищут более простое решение, чем отличные ответы, уже здесь, Heroku теперь имеет возможность довольно легко копировать файлы с помощью следующей команды: heroku ps:copy <filename>
Обратите внимание, что это работает с относительными путями, как и следовало ожидать. (Протестировано на стеке heroku-18, загружая файлы в "path/to/file.ext"
Для справки: Heroku Docs