mirror of
				https://github.com/caddyserver/caddy.git
				synced 2025-11-04 03:27:23 -05:00 
			
		
		
		
	* Simplify variables for commands * Add --envfile support for adapt command * Carry custom status code for commands to os.Exit() * cmd: add `-v` and `--version` to root caddy command * Add `--envfile` to `caddy environ`, extract flag parsing to func --------- Co-authored-by: Mohammed Al Sahaf <msaa1990@gmail.com>
		
			
				
	
	
		
			158 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			158 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package caddycmd
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
 | 
						|
	"github.com/spf13/cobra"
 | 
						|
 | 
						|
	"github.com/caddyserver/caddy/v2"
 | 
						|
)
 | 
						|
 | 
						|
var rootCmd = &cobra.Command{
 | 
						|
	Use: "caddy",
 | 
						|
	Long: `Caddy is an extensible server platform written in Go.
 | 
						|
 | 
						|
At its core, Caddy merely manages configuration. Modules are plugged
 | 
						|
in statically at compile-time to provide useful functionality. Caddy's
 | 
						|
standard distribution includes common modules to serve HTTP, TLS,
 | 
						|
and PKI applications, including the automation of certificates.
 | 
						|
 | 
						|
To run Caddy, use:
 | 
						|
 | 
						|
	- 'caddy run' to run Caddy in the foreground (recommended).
 | 
						|
	- 'caddy start' to start Caddy in the background; only do this
 | 
						|
	  if you will be keeping the terminal window open until you run
 | 
						|
	  'caddy stop' to close the server.
 | 
						|
 | 
						|
When Caddy is started, it opens a locally-bound administrative socket
 | 
						|
to which configuration can be POSTed via a restful HTTP API (see
 | 
						|
https://caddyserver.com/docs/api).
 | 
						|
 | 
						|
Caddy's native configuration format is JSON. However, config adapters
 | 
						|
can be used to convert other config formats to JSON when Caddy receives
 | 
						|
its configuration. The Caddyfile is a built-in config adapter that is
 | 
						|
popular for hand-written configurations due to its straightforward
 | 
						|
syntax (see https://caddyserver.com/docs/caddyfile). Many third-party
 | 
						|
adapters are available (see https://caddyserver.com/docs/config-adapters).
 | 
						|
Use 'caddy adapt' to see how a config translates to JSON.
 | 
						|
 | 
						|
For convenience, the CLI can act as an HTTP client to give Caddy its
 | 
						|
initial configuration for you. If a file named Caddyfile is in the
 | 
						|
current working directory, it will do this automatically. Otherwise,
 | 
						|
you can use the --config flag to specify the path to a config file.
 | 
						|
 | 
						|
Some special-purpose subcommands build and load a configuration file
 | 
						|
for you directly from command line input; for example:
 | 
						|
 | 
						|
	- caddy file-server
 | 
						|
	- caddy reverse-proxy
 | 
						|
	- caddy respond
 | 
						|
 | 
						|
These commands disable the administration endpoint because their
 | 
						|
configuration is specified solely on the command line.
 | 
						|
 | 
						|
In general, the most common way to run Caddy is simply:
 | 
						|
 | 
						|
	$ caddy run
 | 
						|
 | 
						|
Or, with a configuration file:
 | 
						|
 | 
						|
	$ caddy run --config caddy.json
 | 
						|
 | 
						|
If running interactively in a terminal, running Caddy in the
 | 
						|
background may be more convenient:
 | 
						|
 | 
						|
	$ caddy start
 | 
						|
	...
 | 
						|
	$ caddy stop
 | 
						|
 | 
						|
This allows you to run other commands while Caddy stays running.
 | 
						|
Be sure to stop Caddy before you close the terminal!
 | 
						|
 | 
						|
Depending on the system, Caddy may need permission to bind to low
 | 
						|
ports. One way to do this on Linux is to use setcap:
 | 
						|
 | 
						|
	$ sudo setcap cap_net_bind_service=+ep $(which caddy)
 | 
						|
 | 
						|
Remember to run that command again after replacing the binary.
 | 
						|
 | 
						|
See the Caddy website for tutorials, configuration structure,
 | 
						|
syntax, and module documentation: https://caddyserver.com/docs/
 | 
						|
 | 
						|
Custom Caddy builds are available on the Caddy download page at:
 | 
						|
https://caddyserver.com/download
 | 
						|
 | 
						|
The xcaddy command can be used to build Caddy from source with or
 | 
						|
without additional plugins: https://github.com/caddyserver/xcaddy
 | 
						|
 | 
						|
Where possible, Caddy should be installed using officially-supported
 | 
						|
package installers: https://caddyserver.com/docs/install
 | 
						|
 | 
						|
Instructions for running Caddy in production are also available:
 | 
						|
https://caddyserver.com/docs/running
 | 
						|
`,
 | 
						|
	Example: `  $ caddy run
 | 
						|
  $ caddy run --config caddy.json
 | 
						|
  $ caddy reload --config caddy.json
 | 
						|
  $ caddy stop`,
 | 
						|
 | 
						|
	// kind of annoying to have all the help text printed out if
 | 
						|
	// caddy has an error provisioning its modules, for instance...
 | 
						|
	SilenceUsage: true,
 | 
						|
	Version:      onlyVersionText(),
 | 
						|
}
 | 
						|
 | 
						|
const fullDocsFooter = `Full documentation is available at:
 | 
						|
https://caddyserver.com/docs/command-line`
 | 
						|
 | 
						|
func init() {
 | 
						|
	rootCmd.SetVersionTemplate("{{.Version}}")
 | 
						|
	rootCmd.SetHelpTemplate(rootCmd.HelpTemplate() + "\n" + fullDocsFooter + "\n")
 | 
						|
}
 | 
						|
 | 
						|
func onlyVersionText() string {
 | 
						|
	_, f := caddy.Version()
 | 
						|
	return f
 | 
						|
}
 | 
						|
 | 
						|
func caddyCmdToCobra(caddyCmd Command) *cobra.Command {
 | 
						|
	cmd := &cobra.Command{
 | 
						|
		Use:   caddyCmd.Name,
 | 
						|
		Short: caddyCmd.Short,
 | 
						|
		Long:  caddyCmd.Long,
 | 
						|
	}
 | 
						|
	if caddyCmd.CobraFunc != nil {
 | 
						|
		caddyCmd.CobraFunc(cmd)
 | 
						|
	} else {
 | 
						|
		cmd.RunE = WrapCommandFuncForCobra(caddyCmd.Func)
 | 
						|
		cmd.Flags().AddGoFlagSet(caddyCmd.Flags)
 | 
						|
	}
 | 
						|
	return cmd
 | 
						|
}
 | 
						|
 | 
						|
// WrapCommandFuncForCobra wraps a Caddy CommandFunc for use
 | 
						|
// in a cobra command's RunE field.
 | 
						|
func WrapCommandFuncForCobra(f CommandFunc) func(cmd *cobra.Command, _ []string) error {
 | 
						|
	return func(cmd *cobra.Command, _ []string) error {
 | 
						|
		status, err := f(Flags{cmd.Flags()})
 | 
						|
		if status > 1 {
 | 
						|
			cmd.SilenceErrors = true
 | 
						|
			return &exitError{ExitCode: status, Err: err}
 | 
						|
		}
 | 
						|
		return err
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// exitError carries the exit code from CommandFunc to Main()
 | 
						|
type exitError struct {
 | 
						|
	ExitCode int
 | 
						|
	Err      error
 | 
						|
}
 | 
						|
 | 
						|
func (e *exitError) Error() string {
 | 
						|
	if e.Err == nil {
 | 
						|
		return fmt.Sprintf("exiting with status %d", e.ExitCode)
 | 
						|
	}
 | 
						|
	return e.Err.Error()
 | 
						|
}
 |