|
| 1 | +{ |
| 2 | + "name": "Hanko", |
| 3 | + "slug": "hanko", |
| 4 | + "categories": [ |
| 5 | + 6 |
| 6 | + ], |
| 7 | + "date_created": "2026-10-05", |
| 8 | + "type": "ct", |
| 9 | + "updateable": true, |
| 10 | + "privileged": false, |
| 11 | + "architectures": [ |
| 12 | + "amd64", |
| 13 | + "arm64" |
| 14 | + ], |
| 15 | + "interface_port": 8000, |
| 16 | + "documentation": "https://docs.hanko.io/", |
| 17 | + "website": "https://www.hanko.io/", |
| 18 | + "repository": "https://github.com/teamhanko/hanko", |
| 19 | + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/hanko.webp", |
| 20 | + "description": "Hanko is an open-source authentication and user management backend, an alternative to Auth0 or Clerk. It provides passkeys, passwords, email passcodes, TOTP and security-key MFA, OAuth/OIDC and SAML single sign-on, sessions and JWTs, and web apps add the login through the Hanko Elements web components or SDKs. This script runs the Hanko backend (public and admin API) with PostgreSQL.", |
| 21 | + "install_methods": [ |
| 22 | + { |
| 23 | + "type": "default", |
| 24 | + "script": "ct/hanko.sh", |
| 25 | + "config_path": "/opt/hanko_data/config.yaml", |
| 26 | + "resources": { |
| 27 | + "cpu": 1, |
| 28 | + "ram": 512, |
| 29 | + "hdd": 4, |
| 30 | + "os": "Debian", |
| 31 | + "version": "13" |
| 32 | + } |
| 33 | + } |
| 34 | + ], |
| 35 | + "default_credentials": { |
| 36 | + "username": null, |
| 37 | + "password": null |
| 38 | + }, |
| 39 | + "notes": [ |
| 40 | + { |
| 41 | + "text": "Hanko is a headless authentication API, not a web app. Port 8000 is the public API that your own application's login talks to through Hanko Elements or the SDKs; opened in a browser it only shows an API status page. The self-hosted backend has no admin UI, the Hanko Console is part of the closed-source Hanko Cloud.", |
| 42 | + "type": "info" |
| 43 | + }, |
| 44 | + { |
| 45 | + "text": "Before an app can use Hanko, replace the example.com placeholders in /opt/hanko_data/config.yaml: webauthn.relying_party.id is your domain, webauthn.relying_party.origins and cors.allow_origins the https:// URL of the app that embeds the login. Then run systemctl restart hanko. Hanko 3 reads the top-level cors key and ignores the server.public.cors of older upstream examples.", |
| 46 | + "type": "warning" |
| 47 | + }, |
| 48 | + { |
| 49 | + "text": "Passkeys only work over HTTPS on a domain name: browsers refuse WebAuthn on an IP address, and the session cookie is marked Secure. Publish port 8000 through a TLS reverse proxy (e.g. https://auth.example.com) instead of using http://<IP>:8000 directly.", |
| 50 | + "type": "warning" |
| 51 | + }, |
| 52 | + { |
| 53 | + "text": "Sign-up, email verification and passcode login send emails. Set email_delivery (from_address and the smtp host, port, user and password) in /opt/hanko_data/config.yaml to your mail server; until then these flows fail. Users created through the admin API with a password can still sign in.", |
| 54 | + "type": "warning" |
| 55 | + }, |
| 56 | + { |
| 57 | + "text": "The admin API (users, sessions, webhooks) has no authentication of its own, so it only listens on 127.0.0.1:8001, e.g. curl http://127.0.0.1:8001/users inside the container. Change server.admin.address only behind a firewall or an authenticating proxy: anyone who reaches it can create sessions for any user.", |
| 58 | + "type": "warning" |
| 59 | + }, |
| 60 | + { |
| 61 | + "text": "Back up secret_keys from /opt/hanko_data/config.yaml together with the database. It encrypts the JWT signing key stored in PostgreSQL, and without it Hanko can no longer issue session tokens.", |
| 62 | + "type": "warning" |
| 63 | + } |
| 64 | + ] |
| 65 | +} |
0 commit comments