Repository: caddyserver/caddy
File: cmd/commands.go (Go)

Code before:
			cmd.RunE = WrapCommandFuncForCobra(cmdAdaptConfig)
		},
	})

	RegisterCommand(Command{
		Name:  "validate",
		Usage: "--config <path> [--adapter <name>] [--envfile <path>]",
		Short: "Tests whether a configuration file is valid",
		Long: `
Loads and provisions the provided config, but does not start running it.
This reveals any errors with the configuration through the loading and
provisioning stages.

If --envfile is specified, an environment file with environment variables in
the KEY=VALUE format will be loaded into the Caddy process.
`,
		CobraFunc: func(cmd *cobra.Command) {
			cmd.Flags().StringP("config", "c", "", "Input configuration file")
			cmd.Flags().StringP("adapter", "a", "", "Name of config adapter")
			cmd.Flags().StringP("envfile", "", "", "Environment file to load")
			cmd.RunE = WrapCommandFuncForCobra(cmdValidateConfig)
		},
	})

  RegisterCommand(Command{
		Name:  "storage-export",
		Usage: "--config <path> [--output <path>] [--user <name>]",
		Short: "Exports storage assets as a tarball",
		Long: `
The contents of the configured storage module (TLS certificates, autosave.json, etc) 
are exported via a tarball.

An output file can be set with --output, otherwise the archive is written to stdout.

If Caddy is running under its own user (e.g. as a systemd service), pass their 
name with --user. This is only needed when using the default file_system storage,
and has no effect otherwise. 
`,
		CobraFunc: func(cmd *cobra.Command) {
			cmd.Flags().StringP("config", "c", "", "Input configuration file (required)")
			cmd.Flags().StringP("output", "o", "", "Output path")
			cmd.Flags().StringP("user", "u", "", "User to run the command as") 
			cmd.RunE = WrapCommandFuncForCobra(cmdExportStorage)
		},
	})

  RegisterCommand(Command{
		Name:  "storage-import",
		Usage: "--config <path> [--user <name>] <path>",
		Short: "Imports storage assets from a tarball.",
		Long: `

Review comment (suggestion):
Named it this instead of `export storage` so I didn't have to look up subcommand handling. :walking: 
Happy to change it though.

Code after:
			cmd.RunE = WrapCommandFuncForCobra(cmdAdaptConfig)
		},
	})

	RegisterCommand(Command{
		Name:  "validate",
		Usage: "--config <path> [--adapter <name>] [--envfile <path>]",
		Short: "Tests whether a configuration file is valid",
		Long: `
Loads and provisions the provided config, but does not start running it.
This reveals any errors with the configuration through the loading and
provisioning stages.

If --envfile is specified, an environment file with environment variables in
the KEY=VALUE format will be loaded into the Caddy process.
`,
		CobraFunc: func(cmd *cobra.Command) {
			cmd.Flags().StringP("config", "c", "", "Input configuration file")
			cmd.Flags().StringP("adapter", "a", "", "Name of config adapter")
			cmd.Flags().StringP("envfile", "", "", "Environment file to load")
			cmd.RunE = WrapCommandFuncForCobra(cmdValidateConfig)
		},
	})

	RegisterCommand(Command{
		Name:  "storage",
		Short: "Commands for working with Caddy's storage (EXPERIMENTAL)",
		Long: `
Allows exporting and importing Caddy's storage contents. The two commands can be
combined in a pipeline to transfer directly from one storage to another:

$ caddy storage export --config Caddyfile.old --output - |
> caddy storage import --config Caddyfile.new --input -

The - argument refers to stdout and stdin, respectively.

NOTE: When importing to or exporting from file_system storage (the default), the command
should be run as the user that owns the associated root path.

EXPERIMENTAL: May be changed or removed.
`,
		CobraFunc: func(cmd *cobra.Command) {
			exportCmd := &cobra.Command{
				Use:   "export --config <path> --output <path>",
				Short: "Exports storage assets as a tarball",
				Long: `
The contents of the configured storage module (TLS certificates, etc)
are exported via a tarball.

--output is required, - can be given for stdout.
`,