Start package servers

The ffx repository server commands can start and manage Fuchsia package servers on the host machine.

Concepts

Virtually all software running on Fuchsia is collected into Fuchsia packages. A Fuchsia package is a hierarchical collection of files that provides one or more programs, components, or services to a Fuchsia system. A Fuchsia package is a term representing a unit of distribution, though unlike many other package systems, that unit is composed of parts and is not a single binary BLOB.

Beyond the base packages that comprise the foundation of the Fuchsia platform, additional packages can be downloaded from a Fuchsia package server. The Fuchsia package server is an HTTP(S) server managing the Fuchsia packages using TUF (the update framework). This framework uses cryptographically signed BLOBs to securely distribute updated packages to a device running Fuchsia.

For developers working with Fuchsia, a package server is provided that facilitates working with packages that are used as the product foundation and also overlaying packages compiled locally during the development cycle.

Start the package server

The package repository server is controlled by running the subcommands of ffx repository server. This server handles requests for metadata about the available packages and delivers the file blobs that make up the package contents.

Basic command

ffx repository server start

Server Options

--address

The address that the package server listens on to for requests. The format of the address is can be either an IPv4 or IPv6 address. For example, [::]:8083 or 127.0.0.1:8083. Historically, the preferred port for the package server is 8083. However there is an effort to improve flexibility by making the default port 0 indicating to use a dynamic port. The address of running repository servers is seen by running ffx repository server list.

There are no configuration properties influencing the address option. This option cannot be configured since the port numbers for multiple servers must be unique.

The motivation for moving to use a dynamic port is to avoid port in use errors. When running the package server locally with a locally connected device or emulator, ffx can manage the address of the package server internally.

However, there are cases when a specific network address should be used to serve packages based on the target device's network connection. For example, when non-ffx commands are needed for tunneling or firewall configuration, specifying a port is needed to match configuration in these other tools.

--background, --daemon, --foreground

The execution mode of the package server. These options are mutually exclusive; only 1 of the execution modes can be used at a time.

  • --background Indicates the package server will be started in the background. This is mutually exclusive with --foreground and --daemon.

  • --daemon Indicates the package server will be started as part of the ffx daemon. This mode should be considered deprecated and only be used when using --background or --foreground is not acceptable. Until the deprecation and removal is complete, --daemon is the default mode to ensure backwards compatibility. Note: If you must use --daemon, please file an issue explaining the missing functionality so the package server can be improved.

  • --foreground Indicates the package server will be started in the foreground. This is mutually exclusive with --background and --daemon.

There are no configuration properties that affect the execution mode. The execution mode of the package server is the source of many, sometimes subtle, problems with developer workflows.

Developers have preferences, depending on individual circumstances on the UI for the package server being in the foreground or background. The server behavior is identical regardless of the processing mode.

These are specific switches vs. an option with enumerated values so insight can be gathered via command line analytics. Switches appear in the analytics, the value of an option does not.

Since the default behavior via the SDK is to run a daemon based package server, that is the default for the time being. The package server is migrating to the foreground being the default so it is obvious that the package server is running, and is the most simplistic execution model.

Background is a desirable mode for remote workflows so there can be one remote terminal window, and with IDEs such as VS Code where the user experience of switching between multiple terminal windows is not easy.

--repo-name

Uniquely identifies the package server by name. If another package server is running with the same name, the new package server will fail with an error.

The default value is devhost. Primarily for historic reasons.

There is no configuration properties affecting repo-name; Server names must be unique.

In --daemon mode, this option is not allowed, since repositories are managed using other commands such as ffx repository add-from-pm.

--repo-path

The path to the root directory of the repository.

This directory can be a repository initialized with ffx repository create, or the root directory of a product bundle.

The default value is undefined, but can be configured.

The configuration property package.repository.path can be set. This is the root directory of the repository. It is expected that this value is set per-project vs. at the user level since each project probably has a different repository.

It is also beneficial to set this configuration property so other package repository tools such as ffx repository publish use the same repository path as the package server.

This value is also referred to by the publishing tools, and represents a core characteristic of a development project environment.

In --daemon mode, this option is not allowed,since repositories are managed using other commands such as ffx repository add-from-pm.

--trusted-root

Path to the root metadata that was used to sign the repository TUF metadata.

This establishes the root of trust for this repository. If the TUF metadata was not signed by this root metadata, running this command will result in an error. The default is to use 1.root.json from the repository.

There are no configuration properties that affect --trusted-root.

This option is rarely used by developers.

Registration options

These are options influencing the server registration on the target devices. As a developer productivity aide, the package server can register itself on development devices. The following options affect this registration behavior.

--no-device

Disables automatic registration of the server on the target device.

Available only with --foreground and --background.

This flag is most commonly used when working with multiple devices and multiple projects and the default behavior is doing the wrong thing. It is also useful when troubleshooting package resolution.

Eventually to simplify the package serving process, this option will be the default, or registration removed completely. At this point the automatic registration workflow would be integrated into other commands.

--alias

Identifies a package domain alias for this repository.

This is used when registering the package server on a target device in order to set up a rewrite rule mapping each alias domain to this server. Aliases are listed for running repositories by running ffx repository server list.

This only should be used when there is ambiguity about which package server should be used to resolve a package.

The default is to not have any alias.

There are no configuration properties affecting --alias.

This is commonly used when working on a source code project which produces a package that must be in the "fuchsia.com" or "chromium.org" domain, but is not part of the fuchsia source project.

--alias-conflict-mode

Defines the resolution mechanism when alias registrations conflict. Must be either error-out or replace.

The default behavior is replace.

There are no configuration properties affecting --alias-conflict-mode.

--storage-type

Defines the storage type for packages resolved using this registration. persistent defines that the packages are persisted across reboots. Alternatively, ephemeral defines that the packages are lost when rebooting.

The default is ephemeral.

There are no configuration properties affecting --storage-type.

There are times when a target device needs to reboot and keep the updated package rather than reverting to the one contained in the last flash or OTA. This is especially useful when working with packages that are used during the startup process.

Examples

Start the repository in-tree

See fx serve reference for options. As part of the implementation, ffx repository server start is run.

fx serve

Start the repository when using VSCode (single terminal window)

ffx repository server start --background

or in-tree

fx serve --background