Comment puis-je télécharger un fichier à partir de Heroku bash?
J'ai exécuté un script ruby de Heroku bash qui génère un fichier CSV sur le serveur que je veux télécharger. J'ai essayé de le déplacer dans le dossier public pour le télécharger, mais cela n'a pas fonctionné. J'ai compris qu'après chaque session dans la console Heroku bash, les fichiers sont supprimés. Y a-t-il une commande à télécharger directement depuis la console Heroku bash?
9 réponses
Heroku les systèmes de fichiers dyno sont éphémères, non persistants et non partagés entre les dynos. Donc, lorsque vous faites heroku run bash
, Vous obtenez un nouveau dyno avec un nouveau déploiement de votre application sans aucune des modifications apportées aux systèmes de fichiers éphémères dans d'autres dynos.
Si vous voulez faire quelque chose comme ça, vous devriez probablement faire tout cela dans une session heroku run bash
ou tout dans une requête à une application web fonctionnant sur Heroku qui répond avec le fichier CSV que vous voulez.
Si vous parvenez à créer le fichier à partir de heroku run bash
, vous pouvez utiliser transfer.sh.
Vous pouvez même chiffrer le fichier avant de le transférer.
cat <file_name> | gpg -ac -o- | curl -X PUT -T "-" https://transfer.sh/<file_name>.gpg
Puis téléchargez-le et déchiffrez-le sur la machine cible
curl https://transfer.sh/<hash>/<file_name>.gpg | gpg -o- > <file_name>
J'ai fait comme suit:
-
J'ai d'Abord entré heroku bash avec cette commande:
Heroku run ' sh '
-
Puis fait un répertoire et déplacé le fichier à ce
- fait un dépôt git et engage le fichier
- Enfin, j'ai poussé ce dépôt à github
Avant de vous engager, git vous demandera votre nom et votre email. Lui donner quelque chose de faux!
Si vous avez des fichiers de plus de 100 Mg, appuyez sur gitlab.
S'il y a un moyen plus facile, faites le moi savoir!
Désolé pour mon mauvais anglais.
Je suis d'accord que très probablement votre besoin signifie un changement dans votre architecture d'application, quelque chose comme un dyno de travail.
Mais en exécutant les étapes suivantes, vous pouvez transférer le fichier, car Heroku one-off dyno peut exécuter scp
:
- créer une machine virtuelle dans un fournisseur de cloud, par exemple Digital ocean;
- exécutez Heroku one-off dyno et créez votre fichier;
-
scp
fichier de Heroku one-off dyno à ce serveur vm; -
scp
fichier du serveur vm vers votre machine locale; - supprimer cloud vm et arrêter Heroku one-off dyno.
Pour les petits transferts / rapides qui s'adaptent confortablement dans le presse-papiers:
- Ouvrez un terminal sur votre appareil local
- Exécuter
heroku run bash
- (à l'intérieur de votre connexion distante, sur le dyno) exécutez
cat filename
- Sélectionnez les lignes dans votre terminal local et les copier dans votre presse-papiers.
- Vérifiez que les nouvelles lignes sont correctes lors du collage.
Maintenant, j'ai créé un script shell pour télécharger des fichiers à partir de Git backup repo (par exemple, mon application.le fichier DB sqlite est gitignored et chaque déploiement le tue)
## 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
Le git redémarre après le déploiement et ne stocke pas l'environnement, vous devez effectuer les 3 premières commandes. Ensuite, vous devez ajouter des fichiers (- f pour les ignorés) et pousser dans repo (-f, car le git nécessitera pull)
Les dyno Heroku sont livrés avecsftp préinstallé. J'ai essayé git mais il y avait trop d'étapes (il fallait générer un nouveau certificat ssh et l'ajouter à github à chaque fois), alors maintenant j'utilise sftp et cela fonctionne très bien.
Vous aurez besoin d'avoir un autre hôte (dreamhost, hostgator, godaddy, etc) mais si vous le faites, vous pouvez:
sftp username@ftp.yourhostname.com
Acceptez l'empreinte digitale/hachage du serveur, puis entrez votre mot de passe.
Une fois sur le serveur, accédez au dossier que vous souhaitez télécharger (en utilisant cd et ls commande).
Ensuite, utilisez la commande put filename.csv
et elle le téléchargera sur votre hébergeur.
Pour récupérer votre fichier: utilisez un client ftp comme filezilla ou cliquez sur l'url si vous avez téléchargé dans un dossier dans le chemin du dossier www ou du site web.
C'est génial car il fonctionne également avec plusieurs fichiers et binaires ainsi que des fichiers texte.
Une autre façon de le faire (qui n'implique aucun troisième serveur) est d'utiliser la méthode de Patrick mais d'abord compresser le fichier dans un format qui utilise uniquement des caractères ASCII visibles. Cela devrait le faire fonctionner pour n'importe quel fichier, indépendamment des caractères d'espace ou des encodages inhabituels. Je recommande base64
de le faire.
Voici comment je l'ai fait:
- connectez-vous à votre instance heroku en utilisant
heroku run bash
- Utiliser base64 pour imprimer le contenu de votre fichier:
base64 <your-file>
- sélectionner le texte base64 dans votre terminal et copiez-le
- sur votre machine locale décompressez ce texte en utilisant
base64
directement dans un nouveau fichier (sur un mac, je feraispbpaste | base64 --decode -o <your-file>
)
Il n'y a heroku ps:copy
:
Copie un fichier d'un dyno vers le système de fichiers local
Utilisation $ heroku ps: copier le fichier
Mais je me suis retrouvé avec cette erreur:
Establishing credentials... error
▸ Could not connect to dyno!
▸ Check if the dyno is running with `heroku ps'
Peut-être que vous aurez plus de succès avec cela.