web-dev-qa-db-ja.com

Heroku bashからファイルをダウンロードするにはどうすればよいですか?

ダウンロードするサーバーにCSVファイルを生成するHeroku bashのRubyスクリプトを実行しました。ダウンロードするためにパブリックフォルダーに移動しようとしましたが、うまくいきませんでした。 Heroku bashコンソールでのすべてのセッションの後にファイルが削除されることがわかりました。Herokubashコンソールから直接ダウンロードするコマンドはありますか?

38
user1276567

Heroku dynoファイルシステムは短命です 、非永続的で、dyno間で共有されません。だからあなたがするときheroku run bash、実際には、他のdynoの一時ファイルシステムに変更を加えることなく、アプリを新たにデプロイして新しいdynoを取得します。

このようなことをしたい場合は、おそらくheroku run bashセッションまたはすべてを、必要なCSVファイルで応答するHerokuで実行されているWebアプリへのリクエストに含めます。

8
friism

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>
58
niklasae

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 

警告

これは、heroku runを介したrunのdynoで実行されないようです。

#$ 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 -P PORT tmp/some.log user@Host:/path/some.heroku.log dynoコマンドラインからSCP run.6039を使用することにしました。

14
Szymon Jeż

私は次のようにしました:

  • 最初に私はこのコマンドでheroku bashに入りました:

    heroku実行 'sh'

  • 次にディレクトリを作成し、ファイルをそこに移動しました

  • Gitリポジトリを作成し、ファイルをコミットしました
  • 最後に、このリポジトリをgithubにプッシュしました

コミットする前に、gitはあなたの名前とメールアドレスを尋ねてきます。それを偽物にしてください!

100 mgを超えるファイルがある場合は、gitlabにプッシュします。

もっと簡単な方法があれば教えてください!

英語が下手でごめんなさい。

8

おそらくあなたの必要性は、アプリケーションアーキテクチャの変更、つまりワーカーdynoのようなものを意味することに同意します。ただし、次の手順を実行すると、heroku one-off dynoがscpを実行できるため、ファイルを転送できます。

  1. クラウドプロバイダーでvmを作成します。デジタルオーシャン;
  2. heroku one-off dynoを実行してファイルを作成します。
  3. heroku one-off dynoからそのvmサーバーへのscpファイル。
  4. VMサーバーからローカルマシンへのscpファイル。
  5. cloud vmを削除し、heroku one-off dynoを停止します。
6
Christos K

これを行う別の方法(3番目のサーバーを必要としない)は、Patrickの方法を使用することですが、最初に、ファイルをvisible ASCII charatersのみを使用する形式に圧縮します。これにより、空白文字や異常なエンコーディングに関係なく、すべてのファイル。これを行うには、base64をお勧めします。

ここに私がそれをした方法があります:

  1. heroku run bashを使用してherokuインスタンスにログオンします
  2. Base64を使用してファイルの内容を印刷します:base64 <your-file>
  3. 端末でbase64テキストを選択してコピーします
  4. ローカルマシンで、base64を使用してこのテキストを直接新しいファイルに解凍します(Macではpbpaste | base64 --decode -o <your-file>を実行します)
2
iainbeeston

クリップボードにすっぽり収まる小さい/迅速な転送の場合:

  1. ローカルデバイスでターミナルを開く
  2. heroku run bashを実行します
  3. (リモート接続内、dyno上)cat filenameを実行します
  4. ローカルターミナルで行を選択し、クリップボードにコピーします。
  5. それらを貼り付けるときに、適切な改行を確認してください。
1
Patrick

これらの回答の方がはるかに古いので、これは新機能だと思います。すでにここにある優れた答えよりも簡単な解決策を探している私のようなすべての人にとって、Herokuには次のコマンドでファイルを非常に簡単にコピーする機能があります:heroku ps:copy <filename>

予想通り、これは相対パスで機能することに注意してください。 (heroku-18スタックでテストされ、「path/to/file.ext」でファイルをダウンロードします

参考: Heroku docs

1
joepin

Heroku dynoにはsftpがプリインストールされています。私はgitを試しましたが、手順が多すぎたため(新しいssh証明書を生成して毎回githubに追加する必要がありました)、今ではsftpを使用していて、うまく動作します。

別のホスト(dreamhost、hostgator、godaddyなど)が必要ですが、そうした場合、次のことができます。

sftp [email protected]

サーバーのフィンガープリント/ハッシュを受け入れ、パスワードを入力します。

サーバー上で、アップロード先のフォルダーに移動します(cdおよびlsコマンドを使用)。

次に、コマンドput filename.csvを使用すると、Webホストにアップロードされます。

ファイルを取得するには:filezillaなどのftpクライアントを使用するか、wwwまたはwebサイトのフォルダーパスにあるフォルダーにアップロードした場合はURLにアクセスします。

テキストファイルだけでなく、複数のファイルやバイナリでも機能するため、これは素晴らしいことです。

0
Ira Herman

今私はいくつかのファイルをgitバックアップリポジトリにアップロードするためのシェルスクリプトを作成しました(たとえば、私のapp.db sqliteファイルは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ではプルが必要になるため)