+++ title = "Compiling Garage from source" weight = 10 +++ Garage is a standard Rust project. First, you need `rust` and `cargo`. For instance on Debian: ```bash sudo apt-get update sudo apt-get install -y rustc cargo ``` You can also use [Rustup](https://rustup.rs/) to setup a Rust toolchain easily. In addition, you will need a full C toolchain. On Debian-based distributions, it can be installed as follows: ```bash sudo apt-get update sudo apt-get install build-essential ``` ## Building from source from the Forgejo repository The primary location for Garage's source code is the [Forgejo repository](https://git.deuxfleurs.fr/Deuxfleurs/garage), which contains all of the released versions as well as the code for the development of the next version. Clone the repository and enter it as follows: ```bash git clone https://git.deuxfleurs.fr/Deuxfleurs/garage.git cd garage ``` If you wish to build a specific version of Garage, check out the corresponding tag. For instance: ```bash git tag # List available tags git checkout v0.8.0 # Change v0.8.0 with the version you wish to build ``` Otherwise you will be building a development build from the `main` branch that includes all of the changes to be released in the next version. Be careful that such a build might be unstable or contain bugs, and could be incompatible with nodes that run stable versions of Garage. Finally, build Garage with the following command: ```bash cargo build --release ``` The binary built this way can now be found in `target/release/garage`. You may simply copy this binary to somewhere in your `$PATH` in order to have the `garage` command available in your shell, for instance: ```bash sudo cp target/release/garage /usr/local/bin/garage ``` If you are planning to develop Garage, you might be interested in producing debug builds, which compile faster but run slower: this can be done by removing the `--release` flag, and the resulting build can then be found in `target/debug/garage`. ## Building with the web admin UI By default, Garage builds will not include the web admin UI, as this requires some extra build steps. Building the web admin UI requires the latest LTS version of Node.js. For instance on Debian testing: ```bash sudo apt update sudo apt install npm nodejs ``` To include the web admin UI, you must first build it separately: ```bash git clone https://git.deuxfleurs.fr/Deuxfleurs/garage-webadmin cd garage-webadmin npm install npm run build:integrated ``` Next, export the `$GARAGE_WEBADMIN_DIST` environment variable to point to the `/dist/` folder of the `garage-webadmin` build: ```bash export GARAGE_WEBADMIN_DIST=$(pwd)/dist ``` Then, return to your Garage source folder and build with the `webadmin` feature flag enabled: ```bash cargo build --release --features webadmin ``` ## List of available Cargo feature flags Garage supports a number of compilation options in the form of Cargo feature flags, which can be used to provide builds adapted to your system and your use case. To produce a build with a given set of features, invoke the `cargo build` command as follows: ```bash # This will build the default feature set plus feature1, feature2 and feature3 cargo build --release --features feature1,feature2,feature3 # This will build ONLY feature1, feature2 and feature3 cargo build --release --no-default-features \ --features feature1,feature2,feature3 ``` The following feature flags are available in v0.8.0: | Feature flag | Enabled | Description | | ------------ | ------- | ----------- | | `bundled-libs` | *by default* | Use bundled version of sqlite3, zstd, lmdb and libsodium | | `consul-discovery` | optional | Enable automatic registration and discovery
of cluster nodes through the Consul API | | `fjall` | experimental | Enable using Fjall to store Garage's metadata | | `journald` | optional | Enable logging to systemd-journald with
`GARAGE_LOG_TO_JOURNALD=true` environment variable set | | `k2v` | optional | Enable the experimental K2V API (if used, all nodes on your
Garage cluster must have it enabled as well) | | `kubernetes-discovery` | optional | Enable automatic registration and discovery
of cluster nodes through the Kubernetes API | | `lmdb` | *by default* | Enable using LMDB to store Garage's metadata | | `metrics` | *by default* | Enable collection of metrics in Prometheus format on the admin API | | `sqlite` | *by default* | Enable using Sqlite3 to store Garage's metadata | | `syslog` | optional | Enable logging to Syslog with
`GARAGE_LOG_TO_SYSLOG=true` environment variable set | | `system-libs` | optional | Use system version of sqlite3, zstd, lmdb and libsodium
if available (exclusive with `bundled-libs`, build using
`cargo build --no-default-features --features system-libs`) | | `telemetry-otlp` | optional | Enable collection of execution traces using OpenTelemetry | | `webadmin` | optional | Embed static files for the web admin UI (see dedicated section above) |