{"result":{"depiction_url":null,"edges":{"hasreference":{"objects":[{"created":"2026-10-07T11:13:45Z","object_id":{"id":1790,"is_a":["text","documentation","developerguide"],"name":"doc_developerguide_deployment_nginx","title":{"_type":"trans","tr":{"en":"Put Zotonic behind nginx"}},"uri":"https:\/\/zotonic.com\/id\/1790"},"seq":1},{"created":"2026-10-07T11:13:45Z","object_id":{"id":3066,"is_a":["text","documentation","adminguide"],"name":"admin_hostnames_https","title":{"_type":"trans","tr":{"en":"Configure hostnames and HTTPS"}},"uri":"https:\/\/zotonic.com\/id\/3066"},"seq":2}],"predicate":{"id":2774,"is_a":["meta","predicate"],"name":"hasreference","title":{"_type":"trans","tr":{"en":"Documentation reference"}},"uri":"https:\/\/zotonic.com\/id\/hasreference"}},"references":{"objects":[{"created":"2020-05-30T05:47:48Z","object_id":{"id":1990,"is_a":["text","documentation","developerguide"],"name":"doc_developerguide_deployment_varnish","title":{"_type":"trans","tr":{"en":"Cache selected public assets with Varnish"}},"uri":"https:\/\/zotonic.com\/id\/1990"},"seq":1000000},{"created":"2020-05-30T05:47:48Z","object_id":{"id":1790,"is_a":["text","documentation","developerguide"],"name":"doc_developerguide_deployment_nginx","title":{"_type":"trans","tr":{"en":"Put Zotonic behind nginx"}},"uri":"https:\/\/zotonic.com\/id\/1790"},"seq":1000000}],"predicate":{"id":332,"is_a":["meta","predicate"],"name":"references","title":{"_type":"trans","tr":{"en":"References"}},"uri":"https:\/\/zotonic.com\/id\/references"}},"relation":{"objects":[{"created":"2020-05-30T05:47:48Z","object_id":{"id":1279,"is_a":["text","documentation"],"name":"doc_glossary","title":"Glossary","uri":"https:\/\/zotonic.com\/id\/1279"},"seq":1000000}],"predicate":{"id":303,"is_a":["meta","predicate"],"name":"relation","title":{"_type":"trans","tr":{"nl":"Relatie","en":"Relation"}},"uri":"http:\/\/purl.org\/dc\/terms\/relation"}},"subject":{"objects":[{"created":"2026-10-07T11:13:45Z","object_id":{"id":2554,"is_a":["categorization","keyword","keyword_information_type"],"name":"zotonic_topic_how_to_guide","title":"How-to guide","uri":"https:\/\/zotonic.com\/id\/2554"},"seq":1},{"created":"2026-10-07T11:13:45Z","object_id":{"id":2566,"is_a":["categorization","keyword","keyword_audience"],"name":"zotonic_topic_operator","title":"Operator","uri":"https:\/\/zotonic.com\/id\/2566"},"seq":2},{"created":"2026-10-07T11:13:45Z","object_id":{"id":2603,"is_a":["categorization","keyword","keyword_domain"],"name":"zotonic_topic_configuration","title":"Configuration","uri":"https:\/\/zotonic.com\/id\/2603"},"seq":3},{"created":"2026-10-07T11:13:45Z","object_id":{"id":2676,"is_a":["categorization","keyword","keyword_technology"],"name":"zotonic_topic_http","title":"HTTP","uri":"https:\/\/zotonic.com\/id\/2676"},"seq":4},{"created":"2026-10-07T11:13:45Z","object_id":{"id":2685,"is_a":["categorization","keyword","keyword_quality"],"name":"zotonic_topic_security","title":"Security","uri":"https:\/\/zotonic.com\/id\/2685"},"seq":5}],"predicate":{"id":308,"is_a":["meta","predicate"],"name":"subject","title":{"_type":"trans","tr":{"en":"Keyword"}},"uri":"http:\/\/purl.org\/dc\/elements\/1.1\/subject"}}},"id":1789,"is_a":["text","documentation","developerguide"],"links":[{"rel":"self","target":"https:\/\/zotonic.com\/.zotonic\/websub\/topic\/1789"},{"rel":"hub","target":"https:\/\/zotonic.com\/.zotonic\/websub"}],"medium":null,"medium_url":null,"name":"doc_developerguide_deployment_privilegedports","page_url":{"en":"https:\/\/zotonic.com\/docs\/1789\/serve-https-on-a-privileged-port","x-default":"https:\/\/zotonic.com\/docs\/1789\/serve-https-on-a-privileged-port"},"preview_url":null,"resource":{"version":37,"pivot_location_lat":null,"title":{"_type":"trans","tr":{"en":"Serve HTTPS on a privileged port"}},"is_authoritative":true,"body":{"_type":"trans","tr":{"en":"<p>Run Zotonic as an unprivileged service account on its configured high ports. Let the host&#39;s reverse proxy accept public HTTP\/HTTPS and forward to a loopback or otherwise private backend. Verify that the backend is not accidentally reachable from the internet.<\/p>\n<p>Configure the public hostname and advertised ports separately from listener ports. Trust forwarded headers only from the actual proxy addresses. Test redirect destinations, secure cookies, large uploads and MQTT\/WebSocket connections.<\/p>\n<p>If your deployment deliberately gives Zotonic direct access to a low port, use the operating system&#39;s narrowly scoped service capability mechanism and test it with the installed runtime. Avoid running the whole application as root or adding capabilities to a hard-coded <code>beam.smp<\/code> path that changes on every Erlang upgrade.<\/p>\n<p>Do not copy interface-name parsing or firewall-redirection commands from old distribution recipes. IPv4, IPv6, containers and existing firewall policy all affect the result.<\/p>"}},"is_mailing_opt_out":false,"slug":"serve-https-on-a-privileged-port","is_protected":false,"visible_for":0,"tz":"UTC","language":["en"],"is_featured":false,"content_group_id":{"id":339,"is_a":["meta","content_group"],"name":"default_content_group","title":{"_type":"trans","tr":{"en":"Default Content Group"}},"uri":"https:\/\/zotonic.com\/id\/default_content_group"},"category_id":{"id":317,"is_a":["meta","category"],"name":"developerguide","title":"Developer guide","uri":"https:\/\/zotonic.com\/id\/developerguide"},"publication_start":"2022-02-15T10:01:00Z","is_website_redirect":false,"github_url":"https:\/\/github.com\/zotonic\/zotonic\/tree\/master\/doc\/developer-guide\/deployment\/privilegedports.rst","pivot_location_lng":null,"name":"doc_developerguide_deployment_privilegedports","is_unfindable":false,"is_published":true,"doc_editorial_edges":{"hasreference":[1790,3066],"subject":[2554,2566,2603,2676,2685]},"summary":{"_type":"trans","tr":{"en":"Terminate public traffic at a reverse proxy while Zotonic stays unprivileged."}},"pivot_geocode":null,"custom_slug":false,"created":"2020-05-30T05:47:36Z","uri":null,"date_is_all_day":false,"is_dependent":false,"is_page_path_multiple":false,"publication_end":"9999-08-17T12:00:00Z","modifier_id":{"id":1,"is_a":["person"],"name":"administrator","title":"Site Administrator","uri":"https:\/\/zotonic.com\/id\/1"},"privacy":0,"doc_editorial_bundle":true,"creator_id":{"id":336,"is_a":["person","robot"],"name":"gitbot","title":"Git","uri":"https:\/\/zotonic.com\/id\/336"},"seo_noindex":false,"modified":"2026-10-07T11:13:57Z","title_slug":{"_type":"trans","tr":{"en":"serve-https-on-a-privileged-port"}}},"uri":"https:\/\/zotonic.com\/id\/1789","uri_template":"https:\/\/zotonic.com\/id\/:id","websub":{"hub":"https:\/\/zotonic.com\/.zotonic\/websub","topic":"https:\/\/zotonic.com\/.zotonic\/websub\/topic\/1789"}},"status":"ok"}