這是我想出的。 (更長的說明,請參閱SSH tunneling from Heroku。)
- 設置了一堆的環境變量,包括公共和私有密鑰,使用
heroku config:set NAME1=value1 NAME2=value2 etc...
- 創建
.profile.d/web-setup.sh
包含以下內容。請注意,根據https://devcenter.heroku.com/articles/profiled,當dyno第一次設置時,.profile.d
目錄中的任何文件都將運行。
注意:這樣,私密SSH密鑰只有在heroku環境中顯示爲配置變量。由於其他敏感信息保留在那裏,我認爲這是一種相對安全的方法。
的.profile.d/web-setup.sh
文件包含:
# file=.profile.d/web-setup.sh
# create keypair files on this dyno
echo $0: creating public and private key files
mkdir -p ${HOME}/.ssh
echo "${PUBLIC_KEY}" > ${HOME}/.ssh/heroku_id_rsa.pub
chmod 644 ${HOME}/.ssh/heroku_id_rsa.pub
# note the use of double quotes to preserve newlines!
echo "${PRIVATE_KEY}" > ${HOME}/.ssh/heroku_id_rsa
chmod 600 ${HOME}/.ssh/heroku_id_rsa
# You may need to preload known-hosts here. See
# https://stackoverflow.com/questions/21575582/ssh-tunneling-from-heroku/27361295#27361295
# on how to do that.
# open a tunnel if not already running
SSH_CMD="ssh -f -i ${HOME}/.ssh/heroku_id_rsa -N -L ${LOCAL_PORT}:${REMOTE_MYSQL_HOST}:${MYSQL_PORT} ${REMOTE_USER}@${REMOTE_SITE}"
PID=`pgrep -f "${SSH_CMD}"`
if [ $PID ] ; then
echo $0: tunnel already running on ${PID}
else
echo $0 launching tunnel
$SSH_CMD
fi