Alexandrie is an alternative crate registry suitable for use with Cargo.
This repository implements the Cargo APIs and interacts with a crate index as specified in the Cargo's Alternative Registries RFC.
This allows to have a private registry to host crates that are specific to what your doing and not suitable for publication on crates.io while maintaining the same build experience as with crates from crates.io.
- Offer customizable crate storage strategies (local on-disk, S3, Git Repo, etc...).
- Offer multiple backing database options (MySQL, PostgreSQL or SQLite).
- An optional integrated (server-side rendered) front-end.
- The core Cargo APIs are all functional.
- The optional front-end is very usable, although still in active development.
- Complete the front-end: in-progress
- Keywords: done
- Categories: done
- Crate (un)yanking: done
- User management: done
- Crate version tracking in DB (download counts per version, etc...): planned
- Ability to re-render READMEs (to migrate themes): planned
- Search by keywords or categories: planned
- More
Storeimplementors: planned - More
Indexerimplementors: planned
Alexandrie is built using Tide and offers multiple options to be used as its database.
To build, you can run cargo build [--release].
Before running it, you need to configure your instance in the alexandrie.toml file.
The database is configured through the [database] table:
[database]
# Replace the '<...>' placeholders by the real values.
# For MySQL
url = "mysql://<user>:<password>@<hostname>:<port>/<database>"
# For PostgreSQL
url = "postgresql://<user>:<password>@<hostname>:<port>/<database>"
# For SQLite
url = "<path-to-sqlite-file>"
# or:
url = ":memory:" # ephemeral in-memory database, doesn't persists between restartsOptionally, specify the maximum number of threads for the database connection pool.
max_conns = 1If not specified, the diesel-rs default value is used.
Then, you can configure the crates' tarballs storage strategy and the crate index management strategy that you want to use.
Here is how to do it (these are also the defaults, you can leave them out if you want):
[index]
type = "command-line"
path = "crate-index"
[storage]
type = "disk"
path = "crate-storage"You can also configure things like the address and port of the server:
[general]
addr = "127.0.0.1"
port = 3000To run the registry, be sure to clone your crate index at the location designated by the path key in [index].
The default for it is ./crate-index.
To clone an existing crate index, you can run:
# Replace the '<...>' placeholders by the real ones.
git clone <url-of-the-crate-index> <path-from-config>If you want to create one, you can refer to the Cargo's Alternative Registries RFC to learn about the layout of such an index.
You can also visit the crates.io index or the crates.polomack.eu index as deployed examples.
Once everything is configured, you can run with: cargo run [--release].
Then, if you want to use this index with Cargo, you can follow these steps:
- Edit or create the
~/.cargo/configfile, and add the following code:# Replace the '<...>' placeholders by the real ones. [registries.<name-of-your-registry>] index = "<url-of-the-crate-index>"
- Then, run
cargo login --registry <name-of-your-registry>and enter your author token.
To generate a token, you need to register as an author first. You can do this using the frontend by:- Registering at
/account/register. - Generating a token at
/account/manage.
- Registering at
- You can now use the registry using
cargo [search|publish] --registry <name-of-your-registry>
You can host Alexandrie in a Docker container on your computer or a host machine of your choosing. You will need both docker and docker-compose installed.
To get started, you'll need to copy the example.env file and save it as .env (filename is important). You should:
- Set
APPDATAto the path of a new directory where the container will store the crate index, crate files, & database file. - Set
CRATE_INDEXto the SSH path of an existing repo with a valid indexconfig.jsonfile. - Set
GIT_NAMEandGIT_EMAILto valid git values that will be used when Alexandrie commits & pushes those commits to the index. - Set
GIT_SSH_KEYto a new or existing passwordless SSH key. The.pubkey associated with this key should be added to github/gitlab/etc. to grant access to push to the crate index.
These items will be mounted into the Docker container, and need to be accessible by a user with UID and GID 1000. If Docker appears to complain that any of these are inaccessible, check your paths and your file/directory permissions.
By default, Alexandrie will use SQLite for its database. If you want to use either MySQL or PostgreSQL instead, you'll need to create a rootpass.txt in docker/<database>/. The entire contents of this file will be copied and used as the password for the root user of the database; don't add an ending newline unless your password actually contains one!
To run Alexandrie, call the run_docker.sh script, with arguments depending on the action and database you want. For example, to start Alexandrie in the background with the default SQLite database, do:
./run_docker.sh upTo stop Alexandrie, do:
./run_docker.sh downThe script assumes a Bash environment, and was only tested on Ubuntu 19.10. For more details and examples, see the docs.
Licensed under either of
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.