Django db с помощью ssh-туннеля

Есть ли нативный для python способ подключить django к базе данных через ssh туннель? Я видел людей, использующих проброс портов ssh на хост-машине, но я бы предпочел решение, которое можно легко контейнеризировать.

Это довольно бесшовно.

Требования: Пакет sshtunnel https://github.com/pahaz/sshtunnel

  1. В 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()
  1. Затем добавьте блок информации о БД в settings.py. Здесь я добавляю локальную БД по умолчанию и удаленную БД, к которой мы подключаемся через ssh-туннель
  2. .
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
Вернуться на верх