6.3 KiB
Setup full-text search with Find
This configuration will enable the fulltext search feature for Docs :
- Each save on core.Document or core.DocumentAccess will trigger the indexer
- The
api/v1.0/documents/search/will work as a proxy with the Find API for fulltext search.
Create an index service for Docs
In Find application Django admin configure a Service with these settings
-
Name:
docs
request.auth.name of the Docs application. -
Client id:
impress
Name of the token audience or client_id of the Docs application.
Configure settings
Add those Django settings to enable the feature.
SEARCH_INDEXER_CLASS="core.services.search_indexers.FindDocumentIndexer"
SEARCH_INDEXER_COUNTDOWN=10 # Debounce delay in seconds for the index calls.
# Indexation endpoint.
SEARCH_INDEXER_SECRET=my-token-from-the-find-impress-service
# The token from service "docs" of Find application.
SEARCH_INDEXER_URL="http://app-find:8000/api/v1.0/documents/index/"
# Search endpoint. Uses the OIDC token for authentication
SEARCH_INDEXER_QUERY_URL="http://app-find:8000/api/v1.0/documents/search/"
We also need to enable the OIDC Token refresh or the authentication will fail quickly.
# Store OIDC tokens in the session
OIDC_STORE_ACCESS_TOKEN = True # Store the access token in the session
OIDC_STORE_REFRESH_TOKEN = True # Store the encrypted refresh token in the session
OIDC_STORE_REFRESH_TOKEN_KEY = "your-32-byte-encryption-key==" # Must be a valid Fernet key (32 url-safe base64-encoded bytes)
Installation with docker compose
First see compose installation documentation.
1. Postgresql
Find uses PostgreSQL as its database.
If you are using the example provided, you need to generate a secure key for DB_PASSWORD and set it in env.d/find_postgresql.
# Postgresql db container configuration
POSTGRES_DB=find
POSTGRES_USER=dinum
POSTGRES_PASSWORD=pass
# App database configuration
DB_HOST=postgresql-find
DB_NAME=find
DB_USER=dinum
DB_PASSWORD=<password>
DB_PORT=5432
And the service can be configured in compose.yml.
postgresql-find:
image: postgres:15
env_file:
- env.d/development/find_postgresql
- env.d/development/find_postgresql.local
ports:
- "15433:5432"
2. Opensearch
Find uses Opensearch as its indexation database.
If you are using the example provided, you need to generate a secure key for OPENSEARCH_INITIAL_ADMIN_PASSWORD and OPENSEARCH_PASSWORD
to set them in env.d/opensearch.
OPENSEARCH_INITIAL_ADMIN_PASSWORD=find
OPENSEARCH_PASSWORD=find
OPENSEARCH_USE_SSL=true # false in Development mode
# Dashboard
OPENSEARCH_HOSTS=["http://opensearch:9200"]
DISABLE_SECURITY_DASHBOARDS_PLUGIN=false # true in Development mode
And the service & dashboard can be configured in compose.yml.
opensearch:
user: ${DOCKER_USER:-1000}
image: opensearchproject/opensearch:latest
env_file:
- env.d/development/opensearch
- env.d/development/opensearch.local
environment:
- discovery.type=single-node
- plugins.security.disabled=true
- plugins.security.ssl.http.enabled=false
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- ./data/opensearch:/usr/share/opensearch/data
ports:
- "9200:9200"
- "9600:9600"
opensearch-dashboards:
image: opensearchproject/opensearch-dashboards:latest
ports:
- "5601:5601"
env_file:
- env.d/development/opensearch
- env.d/development/opensearch.local
depends_on:
- opensearch
3. Find (dev mode)
If you are using the example provided, you need to generate a secure key for OIDC_RS_CLIENT_SECRET and set it in env.d/find.
# Django
DJANGO_ALLOWED_HOSTS=*
DJANGO_SECRET_KEY=ThisIsAnExampleKeyForDevPurposeOnly
DJANGO_SETTINGS_MODULE=find.settings
DJANGO_SUPERUSER_PASSWORD=admin
# Python
PYTHONPATH=/app
# find settings
# Backend url
FIND_BASE_URL="http://localhost:9072"
# OIDC
OIDC_OP_URL=http://localhost:8083/realms/impress
OIDC_OP_INTROSPECTION_ENDPOINT=http://nginx:8083/realms/impress/protocol/openid-connect/token/introspect
OIDC_OP_JWKS_ENDPOINT=http://nginx:8083/realms/impress/protocol/openid-connect/certs
OIDC_OP_AUTHORIZATION_ENDPOINT=http://localhost:8083/realms/impress/protocol/openid-connect/auth
OIDC_OP_TOKEN_ENDPOINT=http://nginx:8083/realms/impress/protocol/openid-connect/token
OIDC_OP_USER_ENDPOINT=http://nginx:8083/realms/impress/protocol/openid-connect/userinfo
OIDC_RP_CLIENT_ID=impress
OIDC_RP_CLIENT_SECRET=ThisIsAnExampleKeyForDevPurposeOnly
OIDC_RP_SIGN_ALGO=RS256
OIDC_RP_SCOPES="openid email"
OIDC_REDIRECT_ALLOWED_HOSTS=["http://localhost:8083", "http://localhost:3000"]
OIDC_AUTH_REQUEST_EXTRA_PARAMS={"acr_values": "eidas1"}
# OIDC Resource server
OIDC_RS_SCOPES="openid"
OIDC_RS_CLIENT_ID=impress
OIDC_RS_CLIENT_SECRET=ThisIsAnExampleKeyForDevPurposeOnly
OIDC_RS_SIGN_ALGO=RS256
OIDC_RS_BACKEND_CLASS="core.authentication.FinderResourceServerBackend"
And Find can be configured in compose.yml.
find-dev:
user: ${DOCKER_USER:-1000}
image: find:backend-development
environment:
- PYLINTHOME=/app/.pylint.d
- DJANGO_CONFIGURATION=Development
env_file:
- env.d/development/find
- env.d/development/find.local
- env.d/development/find_postgresql
- env.d/development/find_postgresql.local
- env.d/development/opensearch
- env.d/development/opensearch.local
ports:
- "9071:8000"
volumes:
- ../find/src/backend:/app
- ../find/data/static:/data/static
depends_on:
- find_postgresql
- opensearch
- redis
Ports (dev defaults)
| Port | Service |
|---|---|
| 3000 | Next.js |
| 8071 | Django (main) |
| 9071 | Django (Find) |
| 4444 | Y-Provider |
| 8080 | Keycloak |
| 8083 | Nginx proxy |
| 9000/9001 | MinIO |
| 15432 | PostgreSQL (main) |
| 15433 | PostgreSQL (Find) |
| 5433 | PostgreSQL (Keycloak) |
| 1081 | MailCatcher |
| 9200 | Opensearch |
| 9600 | Opensearch admin |
| 5601 | Opensearch dashboard |