dokku (herokuish buildpack) で GEO/GISのライブラリを入れる

Djangoには django.contrib.gis というパッケージが標準で搭載されています。

docs.djangoproject.com

この django.contrib.gis を使ったWebアプリケーションを作ろうと思ったのですがその環境を作るのにとてつもなくハマってしまいました…

環境

VPSUbuntu 22.04 LTS)にdokkuをインストールしています。今回 dokku apps:create したものにDjangoアプリを載せようとしていました。

ハマったこと

GeoDjangoのドキュメントにあった地理空間ライブラリのインストールに従って、必要なパッケージをインストールしようと思いました。

具体的には https://github.com/heroku/heroku-buildpack-apt.git を buildpackに追加し、 Aptfile を作成。 Aptfile 内に必要なパッケージを記述しました

# Aptfile
binutils 
libproj-dev 
libatlas-base-dev
gdal-bin

github.com

起こったこと

デプロイ中に実行する django manage.py collectstatic --no-input が失敗しデプロイできなくなりました

       File "/app/.heroku/python/lib/python3.13/site-packages/django/contrib/gis/db/backends/postgis/adapter.py", line 6, in <module>
       from django.contrib.gis.geos import GEOSGeometry
       File "/app/.heroku/python/lib/python3.13/site-packages/django/contrib/gis/geos/__init__.py", line 6, in <module>
       from .collections import (  # NOQA
       ...<4 lines>...
       )
       File "/app/.heroku/python/lib/python3.13/site-packages/django/contrib/gis/geos/collections.py", line 7, in <module>
       from django.contrib.gis.geos.geometry import GEOSGeometry, LinearGeometryMixin
       File "/app/.heroku/python/lib/python3.13/site-packages/django/contrib/gis/geos/geometry.py", line 9, in <module>
       from django.contrib.gis import gdal
       File "/app/.heroku/python/lib/python3.13/site-packages/django/contrib/gis/gdal/__init__.py", line 29, in <module>
       from django.contrib.gis.gdal.datasource import DataSource
       File "/app/.heroku/python/lib/python3.13/site-packages/django/contrib/gis/gdal/datasource.py", line 40, in <module>
       from django.contrib.gis.gdal.driver import Driver
       File "/app/.heroku/python/lib/python3.13/site-packages/django/contrib/gis/gdal/driver.py", line 5, in <module>
       from django.contrib.gis.gdal.prototypes import ds as capi
       File "/app/.heroku/python/lib/python3.13/site-packages/django/contrib/gis/gdal/prototypes/ds.py", line 10, in <module>
       from django.contrib.gis.gdal.libgdal import lgdal
       File "/app/.heroku/python/lib/python3.13/site-packages/django/contrib/gis/gdal/libgdal.py", line 71, in <module>
       lgdal = CDLL(lib_path)
       File "/app/.heroku/python/lib/python3.13/ctypes/__init__.py", line 390, in __init__
       self._handle = _dlopen(self._name, mode)
       ~~~~~~~^^^^^^^^^^^^^^^^^^
       OSError: libblas.so.3: cannot open shared object file: No such file or directory

OSError: libblas.so.3: cannot open shared object file: No such file or directory が出てしまっています

解決法

https://github.com/heroku/heroku-buildpack-apt.git のbuildpackでなく、

Herokuが公式に提供している heroku-geo-buildpack を導入することで解決します

github.com

起きた理由

エラーでググると同じ症状が

github.com

どうも、 heroku-buildpack-apt においてインストールしたパッケージがサブディレクトリに配置されていると検出してくれないようです。

対応のプルリクエストも出ているのですが放置されています。

解決策に提示した https://github.com/heroku/heroku-geo-buildpack ではGEO/GISで必要なライブラリのインストールだけでなくきちんとパスの処理も実行されている ことから問題なく動作します。