[Nominatim] Can't start after db init (tokenizer error)
enlight3d opened this issue · 9 comments
Hello,
I was using an older chart before and decided to update to your latest chart version (v3.9.1) for a new deployment. I successfully deployed nominatim and initialized it.
After upgrading the release (which is named geocoder) with nominatimInitialize.enabled: false
, the container nominatim of my pod geocoder-nominatim-xxx returns the following error:
2023-04-24 15:35:24: Using project directory: /nominatim
--
Mon, Apr 24 2023 5:35:24 pm | 2023-04-24 15:35:24: Setting up website directory at /nominatim/website
Mon, Apr 24 2023 5:35:24 pm | 2023-04-24 15:35:24: Tokenizer was not set up properly. Database property missing.
Mon, Apr 24 2023 5:35:24 pm | 2023-04-24 15:35:24: FATAL: Cannot initialize tokenizer.
I don't know what I should do now... the container nominatim-ui-download
completed without errors (I tried with 3.2.1 and 3.2.4 but same results).
Help would be appreciated 😃
Hello @enlight3d
Could you please provide your values.yaml file?
Of course, here you go
# Default values for nominatim.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
replicaCount: 1
## @param updateStrategy.type nominatim deployment strategy type
## @param updateStrategy.rollingUpdate nominatim deployment rolling update configuration parameters
## ref: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#strategy
## NOTE: Set it to `Recreate` if you use a PV that cannot be mounted on multiple pods
## e.g:
## updateStrategy:
## type: RollingUpdate
## rollingUpdate:
## maxSurge: 25%
## maxUnavailable: 25%
##
updateStrategy:
type: Recreate
image:
repository: mediagis/nominatim
pullPolicy: IfNotPresent
# Overrides the image tag whose default is the chart appVersion.
tag: ""
imagePullSecrets: []
## @param nameOverride String to partially override common.names.fullname template (will maintain the release name)
##
nameOverride: ""
## @param fullnameOverride String to fully override common.names.fullname template
##
fullnameOverride: ""
## @param namespaceOverride String to fully override common.names.namespace
##
namespaceOverride: ""
## @param commonAnnotations Common annotations to add to all Nominatim resources (sub-charts are not considered). Evaluated as a template
##
commonAnnotations: {}
## @param commonLabels Common labels to add to all Nominatim resources (sub-charts are not considered). Evaluated as a template
##
commonLabels: {}
nominatimInitialize:
enabled: ${NOMINATIM_INIT_DATABASE}
pbfUrl: https://download.geofabrik.de/europe/france-latest.osm.pbf
importWikipedia: false
importGB_Postcode: false
importUS_Postcode: false
importStyle: full
# customStyleUrl: https://raw.githubusercontent.com/david-mart/Nominatim/master/settings/import-street.style
threads: 16
freeze: false
wikipediaUrl: https://nominatim.org/data/wikimedia-importance.sql.gz
resources: {}
# We usually recommend not to specify default resources and to leave this as a conscious
# choice for the user. This also increases chances charts run on environments with little
# resources, such as Minikube. If you do want to specify resources, uncomment the following
# lines, adjust them as necessary, and remove the curly braces after 'resources:'.
# requests:
# cpu: 4000m
# memory: 4Gi
# limits:
# cpu: 4000m
# memory: 4Gi
nominatimReplications:
enabled: true
replicationUrl: http://download.geofabrik.de/europe/france-updates/
nominatim:
extraEnv: []
nominatimUi:
enabled: true
version: 3.2.4
# apacheConfiguration configures the apache webserver that serves the UI.
apacheConfiguration: |-
<VirtualHost *:80>
DocumentRoot /nominatim/website
CustomLog "|$/usr/bin/rotatelogs -n 7 /var/log/apache2/access.log 86400" combined
ErrorLog "|$/usr/bin/rotatelogs -n 7 /var/log/apache2/error.log 86400"
LogLevel info
<Directory "/nominatim/nominatim-ui/dist">
DirectoryIndex search.html
Require all granted
</Directory>
Alias /ui /nominatim/nominatim-ui/dist
<Directory /nominatim/website>
Options FollowSymLinks MultiViews
DirectoryIndex search.php
Require all granted
RewriteEngine On
# This must correspond to the URL where nominatim can be found.
RewriteBase "/"
# If no endpoint is given, then use search.
RewriteRule ^(/|$) "search.php"
# If format-html is explicity requested, forward to the UI.
RewriteCond %{QUERY_STRING} "format=html"
RewriteRule ^([^/]+).php ui/$1.html [R,END]
# Same but .php suffix is missing.
RewriteCond %{QUERY_STRING} "format=html"
RewriteRule ^([^/]+) ui/$1.html [R,END]
# If no format parameter is there then forward anything
# but /reverse and /lookup to the UI.
RewriteCond %{QUERY_STRING} "!format="
RewriteCond %{REQUEST_URI} "!/lookup"
RewriteCond %{REQUEST_URI} "!/reverse"
RewriteRule ^([^/]+).php ui/$1.html [R,END]
# Same but .php suffix is missing.
RewriteCond %{QUERY_STRING} "!format="
RewriteCond %{REQUEST_URI} "!/lookup"
RewriteCond %{REQUEST_URI} "!/reverse"
RewriteRule ^([^/]+) ui/$1.html [R,END]
</Directory>
AddType text/html .php
</VirtualHost>
configuration: |-
Nominatim_Config.Nominatim_API_Endpoint = '/';
serviceAccount:
# Specifies whether a service account should be created
create: true
# Annotations to add to the service account
annotations: {}
# The name of the service account to use.
# If not set and create is true, a name is generated using the fullname template
name: ""
podAnnotations: {}
podSecurityContext:
fsGroup: 101
securityContext:
{}
# capabilities:
# drop:
# - ALL
# readOnlyRootFilesystem: true
# runAsNonRoot: true
# runAsUser: 1000
service:
## @param service.type Nominatim K8s service type
##
type: ClusterIP
## @param service.port Nominatim K8s service port
##
port: 80
## @param service.nodePort Nominatim K8s service node port
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport
##
nodePort:
## @param service.clusterIP Nominatim K8s service clusterIP IP
## e.g:
## clusterIP: None
##
clusterIP:
""
## @param service.loadBalancerIP Nominatim loadBalancerIP if service type is `LoadBalancer`
## Set the LoadBalancer service type to internal only
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer
##
loadBalancerIP: ""
## @param service.externalTrafficPolicy Enable client source IP preservation
## ref https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip
##
externalTrafficPolicy: Cluster
## @param service.loadBalancerSourceRanges Addresses that are allowed when Nominatim service is LoadBalancer
## https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service
## E.g.
## loadBalancerSourceRanges:
## - 10.10.10.0/24
##
loadBalancerSourceRanges: []
## @param service.extraPorts Extra ports to expose (normally used with the `sidecar` value)
##
extraPorts: []
## @param service.annotations Additional custom annotations for Nominatim service
##
annotations: {}
## @param service.sessionAffinity Session Affinity for Kubernetes service, can be "None" or "ClientIP"
## If "ClientIP", consecutive client requests will be directed to the same Pod
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies
##
sessionAffinity: None
## @param service.sessionAffinityConfig Additional settings for the sessionAffinity
## sessionAffinityConfig:
## clientIP:
## timeoutSeconds: 300
##
sessionAffinityConfig: {}
ingress:
## @param ingress.enabled Enable ingress record generation for nominatim
##
enabled: true
## @param ingress.certManager Add the corresponding annotations for cert-manager integration
##
certManager: true
## @param ingress.annotations Additional custom annotations for the ingress record
## NOTE: If `ingress.certManager=true`, annotation `kubernetes.io/tls-acme: "true"` will automatically be added
##
annotations:
cert-manager.io/cluster-issuer: letsencrypt-staging # using prod cluster issuer
## @param ingress.hostname Default host for the ingress record
##
hostname: ${NOMINATIM_URL}
## @param ingress.tls Enable TLS configuration for the host defined at `ingress.hostname` parameter
## TLS certificates will be retrieved from a TLS secret with name: `{{- printf "%s-tls" .Values.ingress.hostname }}`
## You can:
## - Use the `ingress.secrets` parameter to create this TLS secret
## - Relay on cert-manager to create it by setting `ingress.certManager=true`
## - Relay on Helm to create self-signed certificates by setting `ingress.tls=true` and `ingress.certManager=false`
##
tls: true
## @param ingress.secrets Custom TLS certificates as secrets
## NOTE: 'key' and 'certificate' are expected in PEM format
## NOTE: 'name' should line up with a 'secretName' set further up
## If it is not set and you're using cert-manager, this is unneeded, as it will create a secret for you with valid certificates
## If it is not set and you're NOT using cert-manager either, self-signed certificates will be created valid for 365 days
## It is also possible to create and manage the certificates outside of this helm chart
## Please see README.md for more information
## e.g:
## secrets:
## - name: nominatim.local-tls
## key: |-
## -----BEGIN RSA PRIVATE KEY-----
## ...
## -----END RSA PRIVATE KEY-----
## certificate: |-
## -----BEGIN CERTIFICATE-----
## ...
## -----END CERTIFICATE-----
##
secrets: []
resources:
{}
# We usually recommend not to specify default resources and to leave this as a conscious
# choice for the user. This also increases chances charts run on environments with little
# resources, such as Minikube. If you do want to specify resources, uncomment the following
# lines, adjust them as necessary, and remove the curly braces after 'resources:'.
# limits:
# cpu: 100m
# memory: 128Mi
# requests:
# cpu: 100m
# memory: 128Mi
autoscaling:
enabled: false
minReplicas: 1
maxReplicas: 100
targetCPUUtilizationPercentage: 80
# targetMemoryUtilizationPercentage: 80
nodeSelector: {}
tolerations: []
affinity: {}
flatnode:
## @param flatnode.enabled Enable flatnode using Persistent Volume Claims
##
enabled: true
## @param flatnode.storageClass Persistent Volume storage class
## If defined, storageClassName: <storageClass>
## If set to "-", storageClassName: "", which disables dynamic provisioning
## If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner
##
storageClass: ${STORAGE_CLASS}
## @param flatnode.accessModes [array] Persistent Volume access modes
##
accessModes:
- ReadWriteMany
## @param flatnode.size Persistent Volume size
##
size: 100Gi
## @param persistence.existingClaim The name of an existing PVC to use for persistence
##
existingClaim:
postgresql:
enabled: true
auth:
postgresPassword: nominatim
primary:
persistence:
size: 500Gi
# extendedConfiguration: |
# shared_buffers = 2GB
# maintenance_work_mem = 10GB
# autovacuum_work_mem = 2GB
# work_mem = 50MB
# effective_cache_size = 24GB
# synchronous_commit = off
# max_wal_size = 1GB
# checkpoint_timeout = 10min
# checkpoint_completion_target = 0.9
externalDatabase:
## @param externalDatabase.existingSecretDsn Use an existing secret for the DSN (Data Source Name) to connect to the external PostgreSQL database
###
existingSecretDsn:
## @param externalDatabase.existingSecretDsnKey Key in the existing secret to use for the DSN
##
existingSecretDsnKey:
## @param externalDatabase.host External Database server host
##
host: localhost
## @param externalDatabase.port External Database server port
##
port: 5432
## @param externalDatabase.user External Database username
##
user: nominatim
## @param externalDatabase.password External Database user password
##
password: ""
datapvc:
## @param datapvc.enabled Enable using Persistent Volume Claims for the data volume used in initJob
##
enabled: true
## @param datapvc.storageClass Persistent Volume storage class
## If defined, storageClassName: <storageClass>
## If set to "-", storageClassName: "", which disables dynamic provisioning
## If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner
##
storageClass: ${STORAGE_CLASS}
## @param datapvc.accessModes [array] Persistent Volume access modes
##
accessModes:
- ReadWriteOnce
## @param datapvc.size Persistent Volume size
##
size: 100Gi
## @param datapvc.existingClaim The name of an existing PVC to use for persistence
##
existingClaim:
Could you please try with a smaller extract and with flatnode.enabled: false
?
Maybe in a different namespace to avoid data lost
I'll try that tomorrow, but thanks for the anwser !
well, my bad, but it seems I didn't wait long enough for the init process. France is quite big 😅 I'll close this issue if it's good.
yup, on the second nominatim that I deployed, it starts correctly. But when I go to its deployed URL I get a 404. Any idea ?
Is your ingress definition correct?
Could you now try the same import with flatnode enabled?
well, as you saw in the file, I used your helm chart to deploy the ingress. I only added my cluster-issuer.
Okay, should I delete the DB first ?
Let me take a closer look on it