[GH-ISSUE #5334] Zitadel Migration Tool #11257

Closed
opened 2026-08-05 01:29:05 -04:00 by saavagebueno · 14 comments
Owner

Originally created by @07ke on GitHub (Feb 15, 2026).
Original GitHub issue: https://github.com/netbirdio/netbird/issues/5334

Originally assigned to: @jnfrati on GitHub.

Hi,

I noticed that you are working on a migration tool to automate the process of switching from standalone IdPs to external providers.

We are very interested in this feature and would like to learn more about it. Could you please let us know:

How we can access or try this migration tool?

Whether it is currently available (beta/preview/GA)?

If there are any prerequisites or documentation available?

Looking forward to your reply. Thank you!

https://docs.netbird.io/selfhosted/identity-providers#migration-guide-and-backwards-compatibility

Originally created by @07ke on GitHub (Feb 15, 2026). Original GitHub issue: https://github.com/netbirdio/netbird/issues/5334 Originally assigned to: @jnfrati on GitHub. Hi, I noticed that you are working on a migration tool to automate the process of switching from standalone IdPs to external providers. We are very interested in this feature and would like to learn more about it. Could you please let us know: How we can access or try this migration tool? Whether it is currently available (beta/preview/GA)? If there are any prerequisites or documentation available? Looking forward to your reply. Thank you! https://docs.netbird.io/selfhosted/identity-providers#migration-guide-and-backwards-compatibility
Author
Owner

@quietPL83 commented on GitHub (Feb 16, 2026):

I am also interested.

<!-- gh-comment-id:3906903875 --> @quietPL83 commented on GitHub (Feb 16, 2026): I am also interested.
Author
Owner

@SuperKali commented on GitHub (Feb 20, 2026):

+1 So interested, hope this can be addressed soon

<!-- gh-comment-id:3932135355 --> @SuperKali commented on GitHub (Feb 20, 2026): +1 So interested, hope this can be addressed soon
Author
Owner

@07ke commented on GitHub (Feb 20, 2026):

migrate.sh X

==========================================
  NetBird Migration Tool v1.0.0
  Pre-v0.65.0 → Combined Container Setup
==========================================

[INFO] Checking dependencies...
[OK] All dependencies found (docker compose: 'docker-compose')
[INFO] Validating old setup...
[OK] Found management.json at: /root/netbirdio/management.json
[INFO] Detecting reverse proxy type...
[INFO] Detected: Caddy reverse proxy (in Docker Compose)
[INFO] Detecting identity provider type...
[ERROR] External IdP detected: zitadel

This migration script only supports embedded IdP setups.
External IdP providers (Auth0, Keycloak, Zitadel, etc.) require
a fresh installation using getting-started.sh.

Please refer to the NetBird documentation for upgrade instructions:
  https://docs.netbird.io/selfhosted/getting-started
<!-- gh-comment-id:3935695447 --> @07ke commented on GitHub (Feb 20, 2026): migrate.sh X ``` ========================================== NetBird Migration Tool v1.0.0 Pre-v0.65.0 → Combined Container Setup ========================================== [INFO] Checking dependencies... [OK] All dependencies found (docker compose: 'docker-compose') [INFO] Validating old setup... [OK] Found management.json at: /root/netbirdio/management.json [INFO] Detecting reverse proxy type... [INFO] Detected: Caddy reverse proxy (in Docker Compose) [INFO] Detecting identity provider type... [ERROR] External IdP detected: zitadel This migration script only supports embedded IdP setups. External IdP providers (Auth0, Keycloak, Zitadel, etc.) require a fresh installation using getting-started.sh. Please refer to the NetBird documentation for upgrade instructions: https://docs.netbird.io/selfhosted/getting-started ```
Author
Owner

@WithdewHua commented on GitHub (Feb 23, 2026):

+1 looking forward to migrating from standalone IdPs to embedded IdPs

<!-- gh-comment-id:3944234652 --> @WithdewHua commented on GitHub (Feb 23, 2026): +1 looking forward to migrating from standalone IdPs to embedded IdPs
Author
Owner

@kovsrdjan commented on GitHub (Feb 23, 2026):

+1 - migrate.sh looks promising, but external IdPs (Zitadel) support in the migration process would be awesome.

<!-- gh-comment-id:3944695453 --> @kovsrdjan commented on GitHub (Feb 23, 2026): +1 - migrate.sh looks promising, but external IdPs (Zitadel) support in the migration process would be awesome.
Author
Owner

@pernetz commented on GitHub (Apr 13, 2026):

Here is the migration guide for changing over from Zitadel to embedded IdP: https://docs.netbird.io/selfhosted/migration/external-to-embedded-idp

First you must switch to embedded IdP, then you can run the migration to combined server via migrate.sh supported by this guide: https://docs.netbird.io/selfhosted/migration/combined-container

<!-- gh-comment-id:4238867476 --> @pernetz commented on GitHub (Apr 13, 2026): Here is the migration guide for changing over from Zitadel to embedded IdP: [https://docs.netbird.io/selfhosted/migration/external-to-embedded-idp](url) First you must switch to embedded IdP, then you can run the migration to combined server via `migrate.sh` supported by this guide: [https://docs.netbird.io/selfhosted/migration/combined-container](url)
Author
Owner

@07ke commented on GitHub (Apr 13, 2026):

[root@hk-2 netbirdio]# ./migrate --domain xxx.com
2026-04-14T09:26:53.003+08:00 INFO management/server/store/store.go:370: using SQLite store engine
2026-04-14T09:26:53.004+08:00 INFO management/server/store/sql_store.go:105: Setting transaction timeout to 5m0s
2026-04-14T09:26:53.004+08:00 INFO management/server/store/sql_store.go:119: Set max open db connections to 1, max idle to 1, max lifetime to 1h0m0s, max idle time to 3m0s
2026-04-14T09:26:53.004+08:00 INFO management/server/store/sql_store.go:123: skipping migration
2026-04-14T09:26:53.004+08:00 INFO management/server/activity/store/sql_store.go:270: using sqlite as activity event store engine
2026-04-14T09:26:53.004+08:00 INFO management/server/activity/store/sql_store.go:299: Set max open db connections to 1, max idle to 1, max lifetime to 1h0m0s, max idle time to 3m0s
2026-04-14T09:26:53.005+08:00 INFO management/server/migration/migration.go:344: No rows with empty name found in table deleted_users, no migration needed
2026-04-14T09:26:53.005+08:00 INFO management/server/migration/migration.go:358: Migration of empty name to default value in table deleted_users completed
2026-04-14T09:26:53.005+08:00 INFO management/server/migration/migration.go:344: No rows with empty enc_algo found in table deleted_users, no migration needed
2026-04-14T09:26:53.005+08:00 INFO management/server/migration/migration.go:358: Migration of empty enc_algo to default value in table deleted_users completed
2026-04-14T09:26:53.008+08:00 INFO tools/idp-migrate/main.go:128: database schema check passed
2026-04-14T09:26:53.008+08:00 INFO tools/idp-migrate/main.go:162: created IDP manager (type: zitadel)
2026-04-14T09:26:53.008+08:00 INFO management/server/store/store.go:370: using SQLite store engine
2026-04-14T09:26:53.008+08:00 INFO management/server/store/sql_store.go:105: Setting transaction timeout to 5m0s
2026-04-14T09:26:53.009+08:00 INFO management/server/store/sql_store.go:119: Set max open db connections to 1, max idle to 1, max lifetime to 1h0m0s, max idle time to 3m0s
2026-04-14T09:26:53.009+08:00 INFO management/server/store/sql_store.go:123: skipping migration
2026-04-14T09:26:53.009+08:00 INFO management/server/activity/store/sql_store.go:270: using sqlite as activity event store engine
2026-04-14T09:26:53.009+08:00 INFO management/server/activity/store/sql_store.go:299: Set max open db connections to 1, max idle to 1, max lifetime to 1h0m0s, max idle time to 3m0s
2026-04-14T09:26:53.009+08:00 INFO management/server/migration/migration.go:344: No rows with empty name found in table deleted_users, no migration needed
2026-04-14T09:26:53.009+08:00 INFO management/server/migration/migration.go:358: Migration of empty name to default value in table deleted_users completed
2026-04-14T09:26:53.009+08:00 INFO management/server/migration/migration.go:344: No rows with empty enc_algo found in table deleted_users, no migration needed
2026-04-14T09:26:53.009+08:00 INFO management/server/migration/migration.go:358: Migration of empty enc_algo to default value in table deleted_users completed
2026-04-14T09:26:53.563+08:00 INFO management/server/idp/migration/migration.go:171: fetched 4 users from IDP
2026-04-14T09:26:53.572+08:00 INFO management/server/idp/migration/migration.go:224: updated user 299779303514570756: email="admin@xxx.com", name="Zitadel Admin"
2026-04-14T09:26:53.572+08:00 INFO management/server/idp/migration/migration.go:231: user info population complete: 1 updated, 0 skipped, 0 not found in IDP
2026-04-14T09:26:53.572+08:00 INFO tools/idp-migrate/main.go:86: resolved connector: type=oidc, id=299779288918392836, name=NETBIRD
2026-04-14T09:26:53.572+08:00 INFO management/server/store/store.go:370: using SQLite store engine
2026-04-14T09:26:53.573+08:00 INFO management/server/store/sql_store.go:105: Setting transaction timeout to 5m0s
2026-04-14T09:26:53.574+08:00 INFO management/server/store/sql_store.go:119: Set max open db connections to 1, max idle to 1, max lifetime to 1h0m0s, max idle time to 3m0s
2026-04-14T09:26:53.574+08:00 INFO management/server/store/sql_store.go:123: skipping migration
2026-04-14T09:26:53.574+08:00 INFO management/server/activity/store/sql_store.go:270: using sqlite as activity event store engine
2026-04-14T09:26:53.574+08:00 INFO management/server/activity/store/sql_store.go:299: Set max open db connections to 1, max idle to 1, max lifetime to 1h0m0s, max idle time to 3m0s
2026-04-14T09:26:53.574+08:00 INFO management/server/migration/migration.go:344: No rows with empty name found in table deleted_users, no migration needed
2026-04-14T09:26:53.574+08:00 INFO management/server/migration/migration.go:358: Migration of empty name to default value in table deleted_users completed
2026-04-14T09:26:53.575+08:00 INFO management/server/migration/migration.go:344: No rows with empty enc_algo found in table deleted_users, no migration needed
2026-04-14T09:26:53.575+08:00 INFO management/server/migration/migration.go:358: Migration of empty enc_algo to default value in table deleted_users completed
2026-04-14T09:26:53.578+08:00 INFO tools/idp-migrate/main.go:274: found 1 total users: 1 pending migration, 0 already migrated
2026-04-14T09:26:53.578+08:00 INFO tools/idp-migrate/main.go:280: About to migrate 1 users. This cannot be easily undone. Continue? [y/N]
y
2026-04-14T09:27:02.003+08:00 INFO management/server/store/sql_store_idp_migration.go:140: Updating user ID in the store
2026-04-14T09:27:02.035+08:00 INFO management/server/store/sql_store_idp_migration.go:163: Restoring FK constraints
2026-04-14T09:27:02.075+08:00 INFO management/server/idp/migration/migration.go:109: migration complete: 1 users migrated, 0 already migrated
2026-04-14T09:27:02.075+08:00 INFO tools/idp-migrate/main.go:252: DB migration completed successfully
2026-04-14T09:27:02.076+08:00 INFO tools/idp-migrate/main.go:399: backed up original config to /root/netbirdio/management.json.bak
2026-04-14T09:27:02.077+08:00 INFO tools/idp-migrate/main.go:405: wrote new config to /root/netbirdio/management.json
2026-04-14T09:27:02.077+08:00 INFO tools/idp-migrate/main.go:430: Congratulations! You have successfully migrated your NetBird management server to the embedded Dex IdP.
2026-04-14T09:27:02.077+08:00 INFO tools/idp-migrate/main.go:431: Next steps:
2026-04-14T09:27:02.077+08:00 INFO tools/idp-migrate/main.go:432: 1. Make sure the following environment variables are set for your dashboard server:
2026-04-14T09:27:02.077+08:00 INFO tools/idp-migrate/main.go:433:
AUTH_AUDIENCE=netbird-dashboard
AUTH_CLIENT_ID=netbird-dashboard
AUTH_AUTHORITY=https://xxx.com/oauth2
AUTH_SUPPORTED_SCOPES=openid profile email groups
AUTH_REDIRECT_URI=/nb-auth
AUTH_SILENT_REDIRECT_URI=/nb-silent-auth

2026-04-14T09:27:02.077+08:00 INFO tools/idp-migrate/main.go:443: 2. Make sure you restart the dashboard & management servers to pick up the new config and environment variables.
2026-04-14T09:27:02.077+08:00 INFO tools/idp-migrate/main.go:444: eg. docker compose up -d --force-recreate management dashboard
2026-04-14T09:27:02.077+08:00 INFO tools/idp-migrate/main.go:445: 3. Optional: If you have a reverse proxy configured, make sure the path `/oauth2/*` points to the management api server.

The previously built-in Zitadel is completely unusable after migration. Email login shows ‘incorrect username or password.’ Using OIDC shows that the application does not exist.

<!-- gh-comment-id:4240961540 --> @07ke commented on GitHub (Apr 13, 2026): ``` [root@hk-2 netbirdio]# ./migrate --domain xxx.com 2026-04-14T09:26:53.003+08:00 INFO management/server/store/store.go:370: using SQLite store engine 2026-04-14T09:26:53.004+08:00 INFO management/server/store/sql_store.go:105: Setting transaction timeout to 5m0s 2026-04-14T09:26:53.004+08:00 INFO management/server/store/sql_store.go:119: Set max open db connections to 1, max idle to 1, max lifetime to 1h0m0s, max idle time to 3m0s 2026-04-14T09:26:53.004+08:00 INFO management/server/store/sql_store.go:123: skipping migration 2026-04-14T09:26:53.004+08:00 INFO management/server/activity/store/sql_store.go:270: using sqlite as activity event store engine 2026-04-14T09:26:53.004+08:00 INFO management/server/activity/store/sql_store.go:299: Set max open db connections to 1, max idle to 1, max lifetime to 1h0m0s, max idle time to 3m0s 2026-04-14T09:26:53.005+08:00 INFO management/server/migration/migration.go:344: No rows with empty name found in table deleted_users, no migration needed 2026-04-14T09:26:53.005+08:00 INFO management/server/migration/migration.go:358: Migration of empty name to default value in table deleted_users completed 2026-04-14T09:26:53.005+08:00 INFO management/server/migration/migration.go:344: No rows with empty enc_algo found in table deleted_users, no migration needed 2026-04-14T09:26:53.005+08:00 INFO management/server/migration/migration.go:358: Migration of empty enc_algo to default value in table deleted_users completed 2026-04-14T09:26:53.008+08:00 INFO tools/idp-migrate/main.go:128: database schema check passed 2026-04-14T09:26:53.008+08:00 INFO tools/idp-migrate/main.go:162: created IDP manager (type: zitadel) 2026-04-14T09:26:53.008+08:00 INFO management/server/store/store.go:370: using SQLite store engine 2026-04-14T09:26:53.008+08:00 INFO management/server/store/sql_store.go:105: Setting transaction timeout to 5m0s 2026-04-14T09:26:53.009+08:00 INFO management/server/store/sql_store.go:119: Set max open db connections to 1, max idle to 1, max lifetime to 1h0m0s, max idle time to 3m0s 2026-04-14T09:26:53.009+08:00 INFO management/server/store/sql_store.go:123: skipping migration 2026-04-14T09:26:53.009+08:00 INFO management/server/activity/store/sql_store.go:270: using sqlite as activity event store engine 2026-04-14T09:26:53.009+08:00 INFO management/server/activity/store/sql_store.go:299: Set max open db connections to 1, max idle to 1, max lifetime to 1h0m0s, max idle time to 3m0s 2026-04-14T09:26:53.009+08:00 INFO management/server/migration/migration.go:344: No rows with empty name found in table deleted_users, no migration needed 2026-04-14T09:26:53.009+08:00 INFO management/server/migration/migration.go:358: Migration of empty name to default value in table deleted_users completed 2026-04-14T09:26:53.009+08:00 INFO management/server/migration/migration.go:344: No rows with empty enc_algo found in table deleted_users, no migration needed 2026-04-14T09:26:53.009+08:00 INFO management/server/migration/migration.go:358: Migration of empty enc_algo to default value in table deleted_users completed 2026-04-14T09:26:53.563+08:00 INFO management/server/idp/migration/migration.go:171: fetched 4 users from IDP 2026-04-14T09:26:53.572+08:00 INFO management/server/idp/migration/migration.go:224: updated user 299779303514570756: email="admin@xxx.com", name="Zitadel Admin" 2026-04-14T09:26:53.572+08:00 INFO management/server/idp/migration/migration.go:231: user info population complete: 1 updated, 0 skipped, 0 not found in IDP 2026-04-14T09:26:53.572+08:00 INFO tools/idp-migrate/main.go:86: resolved connector: type=oidc, id=299779288918392836, name=NETBIRD 2026-04-14T09:26:53.572+08:00 INFO management/server/store/store.go:370: using SQLite store engine 2026-04-14T09:26:53.573+08:00 INFO management/server/store/sql_store.go:105: Setting transaction timeout to 5m0s 2026-04-14T09:26:53.574+08:00 INFO management/server/store/sql_store.go:119: Set max open db connections to 1, max idle to 1, max lifetime to 1h0m0s, max idle time to 3m0s 2026-04-14T09:26:53.574+08:00 INFO management/server/store/sql_store.go:123: skipping migration 2026-04-14T09:26:53.574+08:00 INFO management/server/activity/store/sql_store.go:270: using sqlite as activity event store engine 2026-04-14T09:26:53.574+08:00 INFO management/server/activity/store/sql_store.go:299: Set max open db connections to 1, max idle to 1, max lifetime to 1h0m0s, max idle time to 3m0s 2026-04-14T09:26:53.574+08:00 INFO management/server/migration/migration.go:344: No rows with empty name found in table deleted_users, no migration needed 2026-04-14T09:26:53.574+08:00 INFO management/server/migration/migration.go:358: Migration of empty name to default value in table deleted_users completed 2026-04-14T09:26:53.575+08:00 INFO management/server/migration/migration.go:344: No rows with empty enc_algo found in table deleted_users, no migration needed 2026-04-14T09:26:53.575+08:00 INFO management/server/migration/migration.go:358: Migration of empty enc_algo to default value in table deleted_users completed 2026-04-14T09:26:53.578+08:00 INFO tools/idp-migrate/main.go:274: found 1 total users: 1 pending migration, 0 already migrated 2026-04-14T09:26:53.578+08:00 INFO tools/idp-migrate/main.go:280: About to migrate 1 users. This cannot be easily undone. Continue? [y/N] y 2026-04-14T09:27:02.003+08:00 INFO management/server/store/sql_store_idp_migration.go:140: Updating user ID in the store 2026-04-14T09:27:02.035+08:00 INFO management/server/store/sql_store_idp_migration.go:163: Restoring FK constraints 2026-04-14T09:27:02.075+08:00 INFO management/server/idp/migration/migration.go:109: migration complete: 1 users migrated, 0 already migrated 2026-04-14T09:27:02.075+08:00 INFO tools/idp-migrate/main.go:252: DB migration completed successfully 2026-04-14T09:27:02.076+08:00 INFO tools/idp-migrate/main.go:399: backed up original config to /root/netbirdio/management.json.bak 2026-04-14T09:27:02.077+08:00 INFO tools/idp-migrate/main.go:405: wrote new config to /root/netbirdio/management.json 2026-04-14T09:27:02.077+08:00 INFO tools/idp-migrate/main.go:430: Congratulations! You have successfully migrated your NetBird management server to the embedded Dex IdP. 2026-04-14T09:27:02.077+08:00 INFO tools/idp-migrate/main.go:431: Next steps: 2026-04-14T09:27:02.077+08:00 INFO tools/idp-migrate/main.go:432: 1. Make sure the following environment variables are set for your dashboard server: 2026-04-14T09:27:02.077+08:00 INFO tools/idp-migrate/main.go:433: AUTH_AUDIENCE=netbird-dashboard AUTH_CLIENT_ID=netbird-dashboard AUTH_AUTHORITY=https://xxx.com/oauth2 AUTH_SUPPORTED_SCOPES=openid profile email groups AUTH_REDIRECT_URI=/nb-auth AUTH_SILENT_REDIRECT_URI=/nb-silent-auth 2026-04-14T09:27:02.077+08:00 INFO tools/idp-migrate/main.go:443: 2. Make sure you restart the dashboard & management servers to pick up the new config and environment variables. 2026-04-14T09:27:02.077+08:00 INFO tools/idp-migrate/main.go:444: eg. docker compose up -d --force-recreate management dashboard 2026-04-14T09:27:02.077+08:00 INFO tools/idp-migrate/main.go:445: 3. Optional: If you have a reverse proxy configured, make sure the path `/oauth2/*` points to the management api server. ``` The previously built-in Zitadel is completely unusable after migration. Email login shows ‘incorrect username or password.’ Using OIDC shows that the application does not exist.
Author
Owner

@jnfrati commented on GitHub (Apr 14, 2026):

Hey @07ke, could you check that:

  • management.json contains the proper StaticConnector with the new Zitadel OIDC app you created?
  • the dashboard.env variables are extremely important for the embedded IdP to work properly, could you check if they are applied by doing a docker compose up -d --force-recreate?

When you're trying to log-in to the netbird dashboard are you automatically redirected to Zitadel? Or are you shown the options "Continue with Email" and "Continue with Zitadel"?

<!-- gh-comment-id:4242937900 --> @jnfrati commented on GitHub (Apr 14, 2026): Hey @07ke, could you check that: - management.json contains the proper StaticConnector with the new Zitadel OIDC app you created? - the dashboard.env variables are extremely important for the embedded IdP to work properly, could you check if they are applied by doing a `docker compose up -d --force-recreate`? When you're trying to log-in to the netbird dashboard are you automatically redirected to Zitadel? Or are you shown the options "Continue with Email" and "Continue with Zitadel"?
Author
Owner

@07ke commented on GitHub (Apr 14, 2026):

Hey @07ke, could you check that:

  • management.json contains the proper StaticConnector with the new Zitadel OIDC app you created?
  • the dashboard.env variables are extremely important for the embedded IdP to work properly, could you check if they are applied by doing a docker compose up -d --force-recreate?

When you're trying to log-in to the netbird dashboard are you automatically redirected to Zitadel? Or are you shown the options "Continue with Email" and "Continue with Zitadel"?

I didn’t create a new Zitadel because I’m using the one that was built into my previous installation. I copied the clientID and clientSecret from the old management.json.

In dashboard.env, only these three values were different from my old configuration, and I’ve updated them to:

AUTH_AUDIENCE=netbird-dashboard
AUTH_CLIENT_ID=netbird-dashboard
AUTH_AUTHORITY=https://xxx.com/oauth2
AUTH_SUPPORTED_SCOPES=openid profile email groups

Everything works fine except that I can’t log into NetBird. I’ve already done a force-recreate.

<!-- gh-comment-id:4242991041 --> @07ke commented on GitHub (Apr 14, 2026): > Hey [@07ke](https://github.com/07ke), could you check that: > > * management.json contains the proper StaticConnector with the new Zitadel OIDC app you created? > * the dashboard.env variables are extremely important for the embedded IdP to work properly, could you check if they are applied by doing a `docker compose up -d --force-recreate`? > > When you're trying to log-in to the netbird dashboard are you automatically redirected to Zitadel? Or are you shown the options "Continue with Email" and "Continue with Zitadel"? I didn’t create a new Zitadel because I’m using the one that was built into my previous installation. I copied the clientID and clientSecret from the old `management.json`. In `dashboard.env`, only these three values were different from my old configuration, and I’ve updated them to: ``` AUTH_AUDIENCE=netbird-dashboard AUTH_CLIENT_ID=netbird-dashboard AUTH_AUTHORITY=https://xxx.com/oauth2 AUTH_SUPPORTED_SCOPES=openid profile email groups ``` Everything works fine except that I can’t log into NetBird. I’ve already done a force-recreate.
Author
Owner

@jnfrati commented on GitHub (Apr 14, 2026):

Right, the instructions on "Prepare your provider" were added because the old application that was created for Zitadel does not work with the new embedded IdP, and it was simpler to instruct people on create a new one.

If you want to keep your existing Zitadel app (same client id and client secret), you will need the application to match the options we share here https://docs.netbird.io/selfhosted/identity-providers/zitadel

  • Type: Web
  • Authentication Method: Code
  • Make sure your callback is now under https://xxx.com/oauth2/callback
  • And token settings should match for proper behavior but shouldn't block you from logging in

Hope that solves the issue! If it's still failing after that please let me know 🙌

<!-- gh-comment-id:4243066051 --> @jnfrati commented on GitHub (Apr 14, 2026): Right, the instructions on "[Prepare your provider](https://docs.netbird.io/selfhosted/migration/external-to-embedded-idp#step-3-prepare-your-provider)" were added because the old application that was created for Zitadel does not work with the new embedded IdP, and it was simpler to instruct people on create a new one. If you want to keep your existing Zitadel app (same client id and client secret), you will need the application to match the options we share here https://docs.netbird.io/selfhosted/identity-providers/zitadel - Type: Web - Authentication Method: Code - Make sure your callback is now under https://xxx.com/oauth2/callback - And token settings should match for proper behavior but shouldn't block you from logging in Hope that solves the issue! If it's still failing after that please let me know 🙌
Author
Owner

@07ke commented on GitHub (Apr 14, 2026):

Can’t you add a new administrator to the Embedded IdP? Or can you export the current system configuration rules? I plan to reinstall NetBird and then import the data back.

<!-- gh-comment-id:4243098082 --> @07ke commented on GitHub (Apr 14, 2026): Can’t you add a new administrator to the Embedded IdP? Or can you export the current system configuration rules? I plan to reinstall NetBird and then import the data back.
Author
Owner

@jnfrati commented on GitHub (Apr 14, 2026):

Were you able to try out the solution I sent? I'm pretty sure it's a configuration issue that can be solved without a fresh install. Happy to assist on slack as well if you want to send a message there.

Either way, if you need to add an owner you should be able to set the server.auth.owner parameter to get a local user https://docs.netbird.io/selfhosted/configuration-files#authentication-settings

Make sure to add the email and password so that the owner is created on the spot

<!-- gh-comment-id:4243202799 --> @jnfrati commented on GitHub (Apr 14, 2026): Were you able to try out the solution I sent? I'm pretty sure it's a configuration issue that can be solved without a fresh install. Happy to assist on slack as well if you want to send a message there. Either way, if you need to add an owner you should be able to set the `server.auth.owner` parameter to get a local user https://docs.netbird.io/selfhosted/configuration-files#authentication-settings Make sure to add the email and password so that the owner is created on the spot
Author
Owner

@07ke commented on GitHub (Apr 14, 2026):

Okay, I'll try it tomorrow and let you know the result.

<!-- gh-comment-id:4243211301 --> @07ke commented on GitHub (Apr 14, 2026): Okay, I'll try it tomorrow and let you know the result.
Author
Owner

@07ke commented on GitHub (Apr 15, 2026):

Built-in ZITADEL Guide for Legacy Installer

Step 3: Prepare Your Provider

1. Open the Console

Go to:
https://example.com/ui/console/


2. Open the NETBIRD Project

Image

3. Create a Web Application

Image

4. Enter a Name

Provide a name for your application.

Image

5. Select Authorization Code Flow

Make sure the Code option is selected.

Image

6. Enter Your Domain

Fill in your domain information as required.

Image

7. Modify the connector.json File

Image
{
  "issuer": "https://example.com",
  "clientID": "my-client-id",
  "clientSecret": "my-client-secret"
}

8. Edit AuthToken

Image

(。・_・。)ノ~ Everything else is consistent with the tutorial.

<!-- gh-comment-id:4256689463 --> @07ke commented on GitHub (Apr 15, 2026): # Built-in ZITADEL Guide for Legacy Installer ## Step 3: Prepare Your Provider ### 1. Open the Console Go to: [https://example.com/ui/console/](https://example.com/ui/console/) --- ### 2. Open the **NETBIRD** Project <img width="1784" height="1011" alt="Image" src="https://github.com/user-attachments/assets/ffb45067-bb21-405b-a4c3-f239b22f15b9" /> --- ### 3. Create a Web Application <img width="1512" height="444" alt="Image" src="https://github.com/user-attachments/assets/5e0d2be9-5b02-42fe-8417-b776811f3681" /> --- ### 4. Enter a Name Provide a name for your application. <img width="2131" height="1275" alt="Image" src="https://github.com/user-attachments/assets/fa599709-38cb-4e83-8991-cd6e534228ae" /> --- ### 5. Select **Authorization Code Flow** Make sure the **Code** option is selected. <img width="2237" height="1119" alt="Image" src="https://github.com/user-attachments/assets/745ebfae-1694-4b69-a92f-4c1b1ac65746" /> --- ### 6. Enter Your Domain Fill in your domain information as required. <img width="2220" height="1200" alt="Image" src="https://github.com/user-attachments/assets/ea96a224-5451-4bad-b1f1-c24024b709d6" /> --- ### 7. Modify the `connector.json` File <img width="1875" height="786" alt="Image" src="https://github.com/user-attachments/assets/35b49012-373f-4e72-ac0b-a72717d15080" /> ```json { "issuer": "https://example.com", "clientID": "my-client-id", "clientSecret": "my-client-secret" } ``` ### 8. Edit AuthToken <img width="1609" height="1429" alt="Image" src="https://github.com/user-attachments/assets/f15c9013-e0d5-4969-a74b-19e721db02c3" /> > (。・_・。)ノ~ Everything else is consistent with the tutorial.
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: DYNR/netbird#11257