diff --git a/chartpress.yaml b/chartpress.yaml index 388d0d44..e6779faf 100644 --- a/chartpress.yaml +++ b/chartpress.yaml @@ -48,4 +48,5 @@ charts: valuesPath: osmchaDb.image planet-files: valuesPath: planetFiles.image - + cgimap: + valuesPath: cgimap.image diff --git a/compose/cgimap.yml b/compose/cgimap.yml new file mode 100644 index 00000000..97c0cf42 --- /dev/null +++ b/compose/cgimap.yml @@ -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 diff --git a/images/cgimap/Dockerfile b/images/cgimap/Dockerfile new file mode 100644 index 00000000..0a26d642 --- /dev/null +++ b/images/cgimap/Dockerfile @@ -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"] \ No newline at end of file diff --git a/images/cgimap/README.md b/images/cgimap/README.md new file mode 100644 index 00000000..92972a25 --- /dev/null +++ b/images/cgimap/README.md @@ -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 diff --git a/images/cgimap/lighttpd.conf.template b/images/cgimap/lighttpd.conf.template new file mode 100644 index 00000000..b2724f73 --- /dev/null +++ b/images/cgimap/lighttpd.conf.template @@ -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", + )) +) + diff --git a/images/cgimap/start.sh b/images/cgimap/start.sh new file mode 100755 index 00000000..7db92bbe --- /dev/null +++ b/images/cgimap/start.sh @@ -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 diff --git a/images/tiler-imposm/Dockerfile b/images/tiler-imposm/Dockerfile index e99ccc28..19a44cfd 100644 --- a/images/tiler-imposm/Dockerfile +++ b/images/tiler-imposm/Dockerfile @@ -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 && \ diff --git a/osm-seed/templates/cgimap/cgimap-deployment.yaml b/osm-seed/templates/cgimap/cgimap-deployment.yaml new file mode 100644 index 00000000..91dd7b31 --- /dev/null +++ b/osm-seed/templates/cgimap/cgimap-deployment.yaml @@ -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 }} diff --git a/osm-seed/templates/cgimap/cgimap-ingress.yaml b/osm-seed/templates/cgimap/cgimap-ingress.yaml new file mode 100644 index 00000000..7c158b60 --- /dev/null +++ b/osm-seed/templates/cgimap/cgimap-ingress.yaml @@ -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 }} \ No newline at end of file diff --git a/osm-seed/templates/cgimap/cgimap-service.yaml b/osm-seed/templates/cgimap/cgimap-service.yaml new file mode 100644 index 00000000..a7449407 --- /dev/null +++ b/osm-seed/templates/cgimap/cgimap-service.yaml @@ -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 }} \ No newline at end of file diff --git a/osm-seed/values.yaml b/osm-seed/values.yaml index 63637377..be7c1582 100644 --- a/osm-seed/values.yaml +++ b/osm-seed/values.yaml @@ -774,6 +774,7 @@ changesetReplicationJob: cpu: "10" nodeSelector: enabled: false + # ==================================================================================================== # Variables for osmcha web builder # ==================================================================================================== @@ -865,3 +866,21 @@ planetFiles: image: name: "" tag: "" +# ==================================================================================================== +# Cgimap +# ==================================================================================================== +cgimap: + enabled: false + image: + name: '' + tag: '' + resources: + enabled: false + requests: + memory: '20Gi' + cpu: '8' + limits: + memory: '24Gi' + cpu: '10' + nodeSelector: + enabled: false \ No newline at end of file