>Public pages and search indexing

Configure public pages and search indexing

Stackweaver's frontend serves public product pages and documentation alongside the signed-in application. Installations request noindex by default. Opt in only when you intend to publish those public pages at your own HTTPS address.

The indexing setting does not protect private data. Keep authentication and network access controls in place. Crawlers must be able to fetch a page to read its noindex rule; the robots file therefore allows crawling even when indexing is disabled. See Google's indexing controls.

Before you start

  • A working Compose or Helm installation.
  • An HTTPS hostname routed to the frontend and API, with a valid certificate.
  • The same hostname configured for browser sign-in, callbacks and trusted origins. Follow Configure a Zitadel domain before changing an installation's address.
  • Your existing image pins, chart version and deployment values. Keep them when applying these settings so a publishing change does not upgrade the installation.

The public URL controls canonical links and sitemap addresses. It does not create DNS records, provision TLS or update identity-provider registrations.

Helm

Add this section to your installation's values, using its actual HTTPS app hostname:

frontend:
  publicSite:
    url: https://app.example.com
    indexing: true

Save the YAML above as public-site-values.yaml. Apply it to the existing release, replacing the release, namespace and version with your installation's values:

CHART_VERSION="<your-installed-chart-version>"
helm upgrade stackweaver oci://ghcr.io/vhco-pro/charts/stackweaver \
  --namespace stackweaver --version "$CHART_VERSION" \
  --reuse-values --values public-site-values.yaml

The chart supplies the frontend's runtime and nginx settings; the image does not need rebuilding. Set indexing: false to retain the URL while requesting exclusion from search and disabling the sitemap response.

An optional clean path prefix, such as https://app.example.com/stack, also sets the frontend's base path. Use it only with matching reverse-proxy and browser callback settings. The indexing setting does not configure those routes or registrations for you. A dedicated app hostname is the simpler starting point.

Docker Compose

The downloadable Compose bundle includes an optional public-site override. Run these commands in the extracted bundle's directory, alongside its existing configuration:

cp public-site-settings.conf.example public-site-settings.conf

Edit public-site-settings.conf. Set your installation's HTTPS address consistently in the site URL and sitemap line. This example publishes at the hostname root:

set $sw_site_url "https://app.example.com";
set $sw_base_path "";
set $sw_noindex "";
set $sw_sitemap_line "Sitemap: https://app.example.com/sitemap.xml";

An empty sw_noindex opts public pages in to indexing. To request exclusion instead, use set $sw_noindex "noindex, nofollow"; and set $sw_sitemap_line "";.

Validate the combined configuration and recreate only the frontend so nginx loads the file:

docker compose -f docker-compose.yml -f docker-compose.public-site.yml config --quiet
docker compose -f docker-compose.yml -f docker-compose.public-site.yml \
  up -d --no-deps --force-recreate frontend

The override mounts public-site-settings.conf at /etc/nginx/public-site-settings.conf. It preserves the bundle's generated env.js and existing identity configuration. Use the same combined Compose files for subsequent frontend configuration changes. This supplied example uses the hostname root; a custom prefix also needs matching runtime base-path and proxy configuration.

Verify the responses

Set the actual public URL, including a configured prefix if applicable:

SITE_URL="https://app.example.com"
curl -sSI "$SITE_URL/blog"
curl -fsS "$SITE_URL/robots.txt"
curl -sSI "$SITE_URL/sitemap.xml"
curl -sSI "$SITE_URL/a-missing-public-page"
CheckIndexing enabledIndexing disabled
Public HTML, such as /blogHTTP 200 without a noindex response header.HTTP 200 with X-Robots-Tag: noindex, nofollow.
/robots.txtText response allowing crawling, with your sitemap address.Text response allowing crawlers to read the indexing policy.
/sitemap.xmlHTTP 200 with an XML content type and your configured public URLs.HTTP 404.
Unknown public pageHTTP 404.HTTP 404.

When indexing is enabled, inspect the sitemap body and a page's initial HTML as well:

curl -fsS "$SITE_URL/sitemap.xml"
curl -fsS "$SITE_URL/blog"

Check that sitemap entries and the page's canonical link use your configured address. Private application and sign-in routes should retain their noindex policy. Public content must be readable in the initial HTML; an empty root element is not a successful check. Only published article sources appear in public discovery and the sitemap.

If you use Search Console, verify ownership and submit the sitemap for this address after these checks pass. Sitemap submission is a hint, not a guarantee of indexing or search rankings.