mirror of
https://github.com/zitadel/zitadel.git
synced 2025-07-17 20:18:36 +00:00

This PR summarizes multiple changes specifically only available with ZITADEL v3: - feat: Web Keys management (https://github.com/zitadel/zitadel/pull/9526) - fix(cmd): ensure proper working of mirror (https://github.com/zitadel/zitadel/pull/9509) - feat(Authz): system user support for permission check v2 (https://github.com/zitadel/zitadel/pull/9640) - chore(license): change from Apache to AGPL (https://github.com/zitadel/zitadel/pull/9597) - feat(console): list v2 sessions (https://github.com/zitadel/zitadel/pull/9539) - fix(console): add loginV2 feature flag (https://github.com/zitadel/zitadel/pull/9682) - fix(feature flags): allow reading "own" flags (https://github.com/zitadel/zitadel/pull/9649) - feat(console): add Actions V2 UI (https://github.com/zitadel/zitadel/pull/9591) BREAKING CHANGE - feat(webkey): migrate to v2beta API (https://github.com/zitadel/zitadel/pull/9445) - chore!: remove CockroachDB Support (https://github.com/zitadel/zitadel/pull/9444) - feat(actions): migrate to v2beta API (https://github.com/zitadel/zitadel/pull/9489) --------- Co-authored-by: Livio Spring <livio.a@gmail.com> Co-authored-by: Stefan Benz <46600784+stebenz@users.noreply.github.com> Co-authored-by: Silvan <27845747+adlerhurst@users.noreply.github.com> Co-authored-by: Ramon <mail@conblem.me> Co-authored-by: Elio Bischof <elio@zitadel.com> Co-authored-by: Kenta Yamaguchi <56732734+KEY60228@users.noreply.github.com> Co-authored-by: Harsha Reddy <harsha.reddy@klaviyo.com> Co-authored-by: Livio Spring <livio@zitadel.com> Co-authored-by: Max Peintner <max@caos.ch> Co-authored-by: Iraq <66622793+kkrime@users.noreply.github.com> Co-authored-by: Florian Forster <florian@zitadel.com> Co-authored-by: Tim Möhlmann <tim+github@zitadel.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Max Peintner <peintnerm@gmail.com>
100 lines
3.2 KiB
Go
100 lines
3.2 KiB
Go
package mirror
|
|
|
|
import (
|
|
"bytes"
|
|
_ "embed"
|
|
"strings"
|
|
|
|
"github.com/spf13/cobra"
|
|
"github.com/spf13/viper"
|
|
"github.com/zitadel/logging"
|
|
|
|
"github.com/zitadel/zitadel/cmd/key"
|
|
)
|
|
|
|
var (
|
|
instanceIDs []string
|
|
isSystem bool
|
|
shouldReplace bool
|
|
)
|
|
|
|
func New(configFiles *[]string) *cobra.Command {
|
|
cmd := &cobra.Command{
|
|
Use: "mirror",
|
|
Short: "mirrors all data of ZITADEL from one database to another",
|
|
Long: `mirrors all data of ZITADEL from one database to another
|
|
ZITADEL needs to be initialized and set up with --for-mirror
|
|
|
|
The command does mirror all data needed and recomputes the projections.
|
|
For more details call the help functions of the sub commands.
|
|
|
|
Order of execution:
|
|
1. mirror system tables
|
|
2. mirror auth tables
|
|
3. mirror event store tables
|
|
4. recompute projections
|
|
5. verify`,
|
|
PersistentPreRun: func(cmd *cobra.Command, args []string) {
|
|
err := viper.MergeConfig(bytes.NewBuffer(defaultConfig))
|
|
logging.OnError(err).Fatal("unable to read default config")
|
|
|
|
for _, file := range *configFiles {
|
|
viper.SetConfigFile(file)
|
|
err := viper.MergeInConfig()
|
|
logging.WithFields("file", file).OnError(err).Warn("unable to read config file")
|
|
}
|
|
},
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
config := mustNewMigrationConfig(viper.GetViper())
|
|
projectionConfig := mustNewProjectionsConfig(viper.GetViper())
|
|
|
|
masterKey, err := key.MasterKey(cmd)
|
|
logging.OnError(err).Fatal("unable to read master key")
|
|
|
|
copySystem(cmd.Context(), config)
|
|
copyAuth(cmd.Context(), config)
|
|
copyEventstore(cmd.Context(), config)
|
|
|
|
projections(cmd.Context(), projectionConfig, masterKey)
|
|
},
|
|
}
|
|
|
|
mirrorFlags(cmd)
|
|
cmd.Flags().BoolVar(&shouldIgnorePrevious, "ignore-previous", false, "ignores previous migrations of the events table")
|
|
cmd.Flags().BoolVar(&shouldReplace, "replace", false, `replaces all data of the following tables for the provided instances or all if the "--system"-flag is set:
|
|
* system.assets
|
|
* auth.auth_requests
|
|
* eventstore.unique_constraints
|
|
The flag should be provided if you want to execute the mirror command multiple times so that the static data are also mirrored to prevent inconsistent states.`)
|
|
migrateProjectionsFlags(cmd)
|
|
|
|
cmd.AddCommand(
|
|
eventstoreCmd(),
|
|
systemCmd(),
|
|
projectionsCmd(),
|
|
authCmd(),
|
|
verifyCmd(),
|
|
)
|
|
|
|
return cmd
|
|
}
|
|
|
|
func mirrorFlags(cmd *cobra.Command) {
|
|
cmd.PersistentFlags().StringSliceVar(&instanceIDs, "instance", nil, "id or comma separated ids of the instance(s) to migrate. Either this or the `--system`-flag must be set. Make sure to always use the same flag if you execute the command multiple times.")
|
|
cmd.PersistentFlags().BoolVar(&isSystem, "system", false, "migrates the whole system. Either this or the `--instance`-flag must be set. Make sure to always use the same flag if you execute the command multiple times.")
|
|
cmd.MarkFlagsOneRequired("system", "instance")
|
|
cmd.MarkFlagsMutuallyExclusive("system", "instance")
|
|
}
|
|
|
|
func instanceClause() string {
|
|
if isSystem {
|
|
return "WHERE instance_id <> ''"
|
|
}
|
|
for i := range instanceIDs {
|
|
instanceIDs[i] = "'" + instanceIDs[i] + "'"
|
|
}
|
|
|
|
// COPY does not allow parameters so we need to set them directly
|
|
return "WHERE instance_id IN (" + strings.Join(instanceIDs, ", ") + ")"
|
|
}
|