Django db с помощью ssh-туннеля
Есть ли нативный для python способ подключить django к базе данных через ssh туннель? Я видел людей, использующих проброс портов ssh на хост-машине, но я бы предпочел решение, которое можно легко контейнеризировать.
Это довольно бесшовно.
Требования:
Пакет sshtunnel
https://github.com/pahaz/sshtunnel
- В django
settings.py
создайте ssh-туннель перед блоком настроек django DB:
# Connect to a server using the ssh keys. See the sshtunnel documentation for using password authentication
ssh_tunnel = SSHTunnelForwarder(
SERVER_IP,
ssh_private_key=PATH_TO_SSH_PRIVATE_KEY,
ssh_private_key_password=SSH_PRIVATE_KEY_PASSWORD,
ssh_username=SSH_USERNAME,
remote_bind_address=('localhost', LOCAL_DB_PORT_ON_THE_SERVER),
)
ssh_tunnel.start()
- Затем добавьте блок информации о БД в
settings.py
. Здесь я добавляю локальную БД по умолчанию и удаленную БД, к которой мы подключаемся через ssh-туннель .
DATABASES = {
'default': {
'ENGINE': 'django.contrib.gis.db.backends.postgis',
'HOST': NORMAL_DB_HOST,
'PORT': NORMAL_DB_PORT,
'NAME': NORMAL_DB_NAME,
'USER': NORMAL_DB_USER,
'PASSWORD': NORMAL_DB_PASSWORD,
},
'shhtunnel_db': {
'ENGINE': 'django.contrib.gis.db.backends.postgis',
'HOST': 'localhost',
'PORT': ssh_tunnel.local_bind_port,
'NAME': REMOTE_DB_DB_NAME,
'USER': REMOTE_DB_USERNAME,
'PASSWORD': REMOTE_DB_PASSWORD,
},
}
Вот и все. Теперь можно выполнять миграции в удаленную базу данных с помощью команд типа $ python manage.py migrate --database=shhtunnel_db
или делать вызовы к базе данных из кода python с помощью строк типа Models.objects.all().using('shhtunnel_db')
Extra:. В моем случае удаленная база данных была создана кем-то другим, и я хотел только прочитать ее. Чтобы избежать записи моделей и деактивации менеджера моделей, я использовал следующую команду django для получения моделей из базы данных [src]:
python manage.py inspectdb