OpenStreetMap Tile 서버 구축

이동기·2024년 5월 22일
1

Tile 서버를 구축하는 이유

보통 지도 타일이라고 하면 인터넷이 가능한 환경에서 구글 또는 네이버 등의 기업에서 제공해주는 API를 이용하여 지도 타일 이미지를 가져온 후 사용자 단말에서 로딩하여 띄우는 방식입니다. 그러나 구글이나 네이버의 경우 지도 타일을 다운로드 하여 자체적으로 사용하는 것이 불가능하고 보통의 기업환경에서는 보안을 위해서 자체적인 네트워크(온프레미스)를 구축하여 사용하기 때문에 인터넷이 불가능한 경우가 많은데 이러한 환경에서 지도에 타일을 띄우기 위한 목적 입니다.

인터넷이 안되는데 왜 해당 포스팅에서 인터넷을 사용했냐고 의문이 들 수 있는데 저의 의도는 자체 서버에서 구축 후 docker image 및 필요 데이터 파일들을 export하여 들고 가서 설치한다고 가정하였습니다. 물론 docker도 rpm을 통해서 오프라인 설치가 가능합니다.


사용 기술

AWS, Docker, Javascript, Openlayers


서버스펙

AWS / Ubuntu / t2.medium

하드웨어는 일반적으로 도시 규모 지역의 경우 10~20GB 스토리지, 4GB 메모리 및 최신 듀얼 코어 프로세서부터 지구 전체를 위한 1TB의 빠른 스토리지, 24GB 메모리 및 쿼드 코어 프로세서까지 다양합니다. 해당 포스팅에서는 남한 전체 타일을 대상으로 하였습니다.


Tile 서버 구축 방법

[STEP-0] Docker 설치
https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository

위 링크에서 Install using the apt repository 항목을 참고 하여 설치를 진행하시면 됩니다.

-- 아래 명령어는 sudo 명령어 없이 docker 명령어 사용하는 방법입니다.
# sudo groupadd docker
# sudo usermod -aG docker ubuntu
# sudo chown root:docker /var/run/docker.sock
# sudo chmod 666 /var/run/docker.sock
# sudo service docker restart
# docker ps -a

[STEP-1] 타일 정보 다운로드를 위한 디렉터리 생성

# cd /home/ubuntu
# mkdir osm


[STEP-2] 대한민국 지도(타일)정보 다운로드

# cd /home/ubuntu/osm
# wget https://download.geofabrik.de/asia/south-korea-latest.osm.pbf


[STEP-3] 타일 컨테이너에서 사용할 볼륨 생성

# docker volume create tile

호스트 서버 /var/lib/docker/volumes에 생성됩니다. volume을 지우려면 volume을 참조하는 컨테이너를 제거하고 docker volume rm tile 명령어로 지우면 됩니다.



[STEP-4] 타일 정보 import 컨테이너 실행

# docker run  -v /home/ubuntu/osm/south-korea-latest.osm.pbf:/data/region.osm.pbf  -v tile:/data/database/  overv/openstreetmap-tile-server  import

-v /home/ubuntu/osm/south-korea-latest.osm.pbf:/data/region.osm.pbf는 호스트 서버 /home/ubuntu/osm/south-korea-latest.osm.pbf 파일을 컨테이너 내부 /data/region.osm.pbf 파일과 동기화 하겠다는 의미입니다.

-v tile:/data/database/는 이전에 만들었던 tile 볼륨과 컨테이너 내부 /data/database/와 연동하겠다는 의미입니다.

overv/openstreetmap-tile-server는 해당 docker image를 이용해서 컨테이너를 실행하겠다는 의미입니다.

import는 컨테이너 실행 후 컨테이너 내부에서 수행할 명령어 입니다.

위 명령어 수행 후 마지막 로그에서 INFO:root: Import complete 이게 나오면 성공입니다. 완료 후 컨테이너는 자동으로 종료됩니다.(docker ps로 종료 되었는지 확인)

완료 후 호스트 서버 /var/lib/docker/volumes/tile 경로에 지도 데이터가 저장되어있음을 확인 할 수 있습니다.



[STEP-5] 타일 컨테이너 실행

# docker run -p 8080:80 -v tile:/data/database -d overv/openstreetmap-tile-server run

STEP-3에서 import하였던 지도 데이터(/var/lib/docker/volumes/tile)를 이용함을 알 수 있습니다.

-p 8080:80는 호스트 8080포트를 컨테이너 80포트로 포트포워딩 하는 옵션입니다.

-v tile:/data/database는 이전에 만들었던 tile 볼륨 디렉터리와 컨테이너 내부 /data/database 디렉터리를 연동하겠다는 의미입니다.

-d는 백그라운드 실행을 의미합니다. 명령어 실행 후 커맨드 라인으로 복귀가 가능합니다.

overv/openstreetmap-tile-server는 해당 docker image를 이용해서 컨테이너를 실행하겠다는 의미입니다.

run은 컨테이너 실행 후 컨테이너 내부에서 수행할 명령어 입니다.



[STEP-6] AWS ec2인스턴스 8080포트 인바운드 오픈



[STEP-7] 정상작동 확인
웹 브라우저에서 http://your.server.ip.address:8080/tile/0/0/0.png를 입력하여 지도타일 이미지가 나오는지 확인



[STEP-8] openlayers 타일 적용

new ol.layer.Tile({
    source: new ol.source.OSM({
        url: "http://your.server.ip.address:8080/tile/{z}/{x}/{y}.png",
        crossOrigin: null
    }),
});


참고

OSM 타일서버 구조 참고 : https://switch2osm.org/serving-tiles/
OSM 도커 설치 : https://switch2osm.org/serving-tiles/using-a-docker-container/
Openlayers 타일 적용 : https://switch2osm.org/using-tiles/getting-started-with-openlayers/
OSM 도커 Volume이슈 : https://stackoverflow.com/questions/61468219/issue-creating-osm-tile-server-using-docker
Ubuntu Docker 설치 : https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository
Google Map 약관 : https://www.google.com/intl/ko/help/terms_maps/
Naver Tile 사용관련 문의 : https://developers.naver.com/forum/posts/26810

공식문서의 docker 구축 예제에서는 osm-data라는 이름으로 volume을 지정하라고 나오는데 그대로 지정하면 ERROR: role "renderer" does not exist 라는 에러가 발생합니다. 그래서 해당 포스팅에서는 tile이라는 이름으로 docker volume을 지정하였습니다.

profile
개발자가 되고 싶은 '개'발자입니다. https://github.com/lee-dong-gi

0개의 댓글