Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CGIMAP container #300

Open
wants to merge 10 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion chartpress.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,5 @@ charts:
valuesPath: osmchaDb.image
planet-files:
valuesPath: planetFiles.image

cgimap:
valuesPath: cgimap.image
18 changes: 18 additions & 0 deletions compose/cgimap.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
version: '3'
services:
# #####################################################
# ## cgmap section
# #####################################################
cgimap:
image: osmseed-cgimap:v1
build:
context: ../images/cgimap
dockerfile: Dockerfile
ports:
- '80:80'
volumes:
- ../data/cgimap-data:/apps/data/
# command: >
# /bin/bash -c " ./start.sh"
env_file:
- ../envs/.env.db
47 changes: 47 additions & 0 deletions images/cgimap/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
FROM ubuntu:24.04 AS builder

ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update -qq && \
apt-get install -y gcc g++ make cmake \
libfcgi-dev libxml2-dev libmemcached-dev libbrotli-dev \
libboost-program-options-dev libcrypto++-dev libyajl-dev \
libpqxx-dev zlib1g-dev libfmt-dev git \
ca-certificates \
postgresql-16 postgresql-server-dev-all \
wget \
--no-install-recommends && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*

# Install Argon2 from source
RUN wget https://github.com/P-H-C/phc-winner-argon2/archive/refs/tags/20190702.tar.gz && \
tar -xzf 20190702.tar.gz && \
cd phc-winner-argon2-20190702 && \
make && \
make install && \
ldconfig

WORKDIR /app

# Copy the main application.
ENV CGIMAP_GITSHA=26cd7fa10affe5dbd13dbe16de34421059f53f18
RUN git clone https://github.com/zerebubuth/openstreetmap-cgimap.git /app && \
cd /app && \
git checkout $CGIMAP_GITSHA

# Compile, install and remove source
RUN mkdir build && cd build && \
CXXFLAGS="-Wall -Wextra -Wpedantic -Wno-unused-parameter" cmake .. -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTING=ON -DCMAKE_BUILD_TYPE=Release && \
make -j$(nproc) && \
ctest --output-on-failure && \
strip openstreetmap-cgimap && \
cp openstreetmap-cgimap /usr/local/bin

RUN rm -rf /app/.git

COPY start.sh /

EXPOSE 8000

CMD ["/start.sh"]
22 changes: 22 additions & 0 deletions images/cgimap/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# openstreetmap-cgimap

This container is built using the configuration from Zerebubuth's OpenStreetMap CGImap GitHub repository, with minor modifications.


# Build and up

```sh
docker compose -f compose/cgimap.yml build
docker compose -f compose/cgimap.yml up
```

Note: Ensure that you are running PostgreSQL on your local machine. For example:


```sh
kubectl port-forward staging-db-0 5432:5432
```

Check results:

http://localhost/api/0.6/map?bbox=-77.09529161453248,-12.071898885565846,-77.077374458313,-12.066474684936727
70 changes: 70 additions & 0 deletions images/cgimap/lighttpd.conf.template
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
# default document-root
server.document-root = "/openstreetmap/cgimap/"

# TCP port
server.port = 80

server.reject-expect-100-with-417 = "disable"

# selecting modules
server.modules = ( "mod_access", "mod_rewrite", "mod_fastcgi", "mod_proxy", "mod_alias" )

# handling unknown routes
server.error-handler-404 = "/dispatch.map"

# include, relative to dirname of main config file
#include "mime.types.conf"

# read configuration from output of a command
#include_shell "/usr/local/bin/confmimetype /etc/mime.types"
mimetype.assign = (
".html" => "text/html",
".txt" => "text/plain",
".jpg" => "image/jpeg",
".png" => "image/png"
)

#debug.log-request-handling = "enable"

$HTTP["request-method"] == "GET" {
url.rewrite-once = (
"^/api/0\.6/map(\.(json|xml))?(\?(.*))?$" => "/dispatch.map",
"^/api/0\.6/(node|way|relation)/[[:digit:]]+(\.(json|xml))?$" => "/dispatch.map",
"^/api/0\.6/(node|way|relation)/[[:digit:]]+/history.*$" => "/dispatch.map",
"^/api/0\.6/(node|way|relation)/[[:digit:]]+/[[:digit:]]+.*$" => "/dispatch.map",
"^/api/0\.6/(node|way|relation)/[[:digit:]]+/relations$" => "/dispatch.map",
"^/api/0\.6/node/[[:digit:]]+/ways$" => "/dispatch.map",
"^/api/0\.6/(way|relation)/[[:digit:]]+/full$" => "/dispatch.map",
"^/api/0\.6/changeset/[[:digit:]]+.*$" => "/dispatch.map",
"^/api/0\.6/(nodes|ways|relations)(\?(.*))?$" => "/dispatch.map",
"^/api/0\.6/changeset/[[:digit:]]+/download$" => "/dispatch.map",
)
}

$HTTP["request-method"] == "POST" {
url.rewrite-once = (
"^/api/0\.6/changeset/[[:digit:]]+/upload.*$" => "/dispatch.map",
)
}

$HTTP["request-method"] == "PUT" {
url.rewrite-once = (
"^/api/0\.6/changeset/[[:digit:]]+/close.*$" => "/dispatch.map",
"^/api/0\.6/changeset/[[:digit:]]+$" => "/dispatch.map",
"^/api/0\.6/changeset/create.*$" => "/dispatch.map",
)
}

$HTTP["url"] =~ "^/(?!(dispatch\.map))" {
proxy.server = ( "" => ( ( "host" => "${API_WEB_HOST}", "port" => "${API_WEB_PORT}" ) ) )
}

fastcgi.debug = 1

fastcgi.server = ( ".map" =>
(( "host" => "127.0.0.1",
"port" => 8000,
"check-local" => "disable",
))
)

30 changes: 30 additions & 0 deletions images/cgimap/start.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#!/usr/bin/env bash
export CGIMAP_HOST=$POSTGRES_HOST
export CGIMAP_DBNAME=$POSTGRES_DB
export CGIMAP_USERNAME=$POSTGRES_USER
export CGIMAP_PASSWORD=$POSTGRES_PASSWORD
export CGIMAP_OAUTH_HOST=$POSTGRES_HOST
export CGIMAP_UPDATE_HOST=$POSTGRES_HOST
export CGIMAP_LOGFILE="/var/www/log/cgimap.log"
export CGIMAP_MEMCACHE=$OPENSTREETMAP_memcache_servers
export CGIMAP_RATELIMIT="204800"
export CGIMAP_MAXDEBT="250"
export CGIMAP_MAP_AREA="0.25"
export CGIMAP_MAP_NODES="100000"
export CGIMAP_MAX_WAY_NODES="2000"
export CGIMAP_MAX_RELATION_MEMBERS="32000"
# export CGIMAP_RATELIMIT_UPLOAD="true"
# export CGIMAP_MODERATOR_RATELIMIT="1048576"
# export CGIMAP_MODERATOR_MAXDEBT="1280"
# export CGIMAP_PIDFILE="/var/www/cgimap.pid"

# Check for web site status
if [[ "$WEBSITE_STATUS" == "database_readonly" || "$WEBSITE_STATUS" == "api_readonly" ]]; then
export CGIMAP_DISABLE_API_WRITE="true"
fi
if [[ "$WEBSITE_STATUS" == "database_offline" || "$WEBSITE_STATUS" == "api_offline" ]]; then
echo "Website is $WEBSITE_STATUS. No action required for cgimap service."
else
/usr/local/bin/openstreetmap-cgimap --port=8000 --daemon --instances=10 && \
tail --pid=$(cat /tmp/cgimap.pid) -f /dev/null
fi
25 changes: 19 additions & 6 deletions images/tiler-imposm/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,26 @@ RUN apt-get install -y \
software-properties-common && \
rm -rf /var/lib/apt/lists/*

# # Install python
RUN add-apt-repository ppa:deadsnakes/ppa && \
# Install Python 3.6
RUN apt-get update && \
apt-get install -y software-properties-common && \
add-apt-repository -y ppa:ubuntu-toolchain-r/test && \
apt-get update && \
apt-get install -y build-essential python3.6 python3.6-dev python3-pip && \
rm -rf /var/lib/apt/lists/* && \
python3 -m pip install pip --upgrade && \
python3 -m pip install wheel
apt-get install -y gcc-8 g++-8 && \
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 100 && \
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 100 && \
apt-get install -y build-essential wget libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev && \
wget https://www.python.org/ftp/python/3.6.15/Python-3.6.15.tgz && \
tar xzf Python-3.6.15.tgz && \
cd Python-3.6.15 && \
./configure --enable-optimizations && \
make altinstall && \
cd .. && \
rm -rf Python-3.6.15 Python-3.6.15.tgz && \
apt-get install -y python3-pip && \
python3.6 -m pip install pip --upgrade && \
python3.6 -m pip install wheel && \
rm -rf /var/lib/apt/lists/*

# Install postgresql-client
RUN apt-get update && apt-get install -y postgresql-client && \
Expand Down
64 changes: 64 additions & 0 deletions osm-seed/templates/cgimap/cgimap-deployment.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
{{- if .Values.cgimap.enabled -}}
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ template "osm-seed.fullname" . }}-cgimap
labels:
app: {{ template "osm-seed.name" . }}
component: cgimap-deployment
environment: {{ .Values.environment }}
release: {{ .Release.Name }}
spec:
replicas: {{ .Values.cgimap.replicaCount }}
selector:
matchLabels:
app: {{ template "osm-seed.name" . }}
release: {{ .Release.Name }}
run: {{ .Release.Name }}-cgimap
template:
metadata:
labels:
app: {{ template "osm-seed.name" . }}
release: {{ .Release.Name }}
run: {{ .Release.Name }}-cgimap
spec:
containers:
- name: {{ .Chart.Name }}-cgimap
image: "{{ .Values.cgimap.image.name }}:{{ .Values.cgimap.image.tag }}"
ports:
- name: http
containerPort: 80
protocol: TCP
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 600 # 10 min, because the compile process takes time.
timeoutSeconds: 30
{{- if .Values.cgimap.resources.enabled }}
resources:
requests:
memory: {{ .Values.cgimap.resources.requests.memory }}
cpu: {{ .Values.cgimap.resources.requests.cpu }}
limits:
memory: {{ .Values.cgimap.resources.limits.memory }}
cpu: {{ .Values.cgimap.resources.limits.cpu }}
{{- end }}
env:
- name: POSTGRES_HOST
value: {{ .Release.Name }}-db
- name: POSTGRES_DB
value: {{ .Values.db.env.POSTGRES_DB }}
- name: POSTGRES_PASSWORD
value: {{ quote .Values.db.env.POSTGRES_PASSWORD }}
- name: POSTGRES_USER
value: {{ .Values.db.env.POSTGRES_USER }}
- name: API_WEB_HOST
value: {{ .Release.Name }}-web
- name: API_WEB_PORT
value: 80
{{- if .Values.cgimap.nodeSelector.enabled }}
nodeSelector:
{{ .Values.cgimap.nodeSelector.label_key }} : {{ .Values.cgimap.nodeSelector.label_value }}
{{- end }}
{{- end }}
26 changes: 26 additions & 0 deletions osm-seed/templates/cgimap/cgimap-ingress.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{{- if and .Values.cgimap.enabled (eq .Values.serviceType "ClusterIP") }}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: {{ template "osm-seed.fullname" . }}-ingress-cgimap-api
annotations:
kubernetes.io/ingress.class: nginx
cert-manager.io/cluster-issuer: letsencrypt-prod-issuer
spec:
tls:
- hosts:
- cgimap.{{ .Values.domain }}
secretName: {{ template "osm-seed.fullname" . }}-secret-cgimap

rules:
- host: cgimap.{{ .Values.domain }}
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: {{ template "osm-seed.fullname" . }}-cgimap
port:
number: 80
{{- end }}
43 changes: 43 additions & 0 deletions osm-seed/templates/cgimap/cgimap-service.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
{{- if .Values.cgimap.enabled -}}
apiVersion: v1
kind: Service
metadata:
name: {{ template "osm-seed.fullname" . }}-cgimap
labels:
app: {{ template "osm-seed.name" . }}
component: cgimap-service
environment: {{ .Values.environment }}
release: {{ .Release.Name }}
annotations:
{{- if and (eq .Values.serviceType "LoadBalancer") .Values.AWS_SSL_ARN }}
service.beta.kubernetes.io/aws-load-balancer-ssl-cert: {{ .Values.AWS_SSL_ARN }}
service.beta.kubernetes.io/aws-load-balancer-backend-protocol: http
service.beta.kubernetes.io/aws-load-balancer-ssl-ports: https
{{- end }}
{{- if eq .Values.serviceType "ClusterIP" }}
kubernetes.io/ingress.class: nginx
cert-manager.io/cluster-issuer: letsencrypt-prod-issuer
{{- else }}
fake.annotation: fake
{{- end }}
{{- with .Values.cgimap.serviceAnnotations }}
{{- toYaml . | nindent 4 }}
{{- end }}
spec:
type: {{ .Values.serviceType }}
ports:
- port: 80
targetPort: http
protocol: TCP
name: http
{{- if and (eq .Values.serviceType "LoadBalancer") .Values.AWS_SSL_ARN }}
- port: 443
targetPort: http
protocol: TCP
name: https
{{- end }}
selector:
app: {{ template "osm-seed.name" . }}
release: {{ .Release.Name }}
run: {{ .Release.Name }}-cgimap
{{- end }}
Loading
Loading