diff --git a/README.md b/README.md index 002c3b2..ec5666e 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,82 @@ # AURCache -A cache build server for Archlinux AUR packages and serving them +AURCache is a build server and repository for Archlinux packages sourced from the AUR (Arch User Repository). It features a Flutter frontend and Rust backend, enabling users to add packages for building and subsequently serves them as a pacman repository. Notably, AURCache automatically detects when a package is out of date and displays it within the frontend. + +## Deployment with Docker and Docker-compose + +To deploy AURCache using Docker and Docker-compose, you can use the following example docker-compose.yml file: + +```yaml +version: '3' +services: + aurcache: + image: luki42/aurcache:latest + ports: + - "8080:8080" + - "8081:8081" + volumes: + - ./aurcache/db:/app/db + - ./aurcache/repo:/app/repo +``` + +Make sure to define the db path and repo path as volumes. + +The default Port 8081 serves the Frontend and Port 8080 serves the Repository. + +To start AURCache with Docker-compose, run: + +```bash +docker-compose up -d +``` + +Access AURCache through your web browser at http://localhost:8081. + +You can now start adding packages for building and utilizing the AURCache repository. + +Add the following to your `pacman.conf` on your target machine to use the repo: + +```bash +# nano /etc/pacman.conf +[repo] +SigLevel = Optional TrustAll +Server = http://localhost:8080/ +``` + +## Build Info + +The AURCache project comprises two main components: a Flutter frontend and a Rust backend. +### Frontend (Flutter) + +To build the Flutter frontend, ensure you have Flutter SDK installed. Then, execute the following commands: + +```bash +cd frontend +flutter pub get +flutter build web +``` + +### Backend (Rust) + +To build the Rust backend, make sure you have Rust installed. Then, navigate to the backend directory and run: + +```bash +cd backend +cargo build --release +``` ## Things still missing -* proper error return to api -* package updates -* multiple package versions -* error checks if requested package does not exist +* proper error return from api * proper logging * auto update packages -* built package version differs from aur pkg version eg. mesa-git * implement repo-add in rust -* cicd -* build table where all version builds are with stdout -* endpoint to get build log \ No newline at end of file +* keep older pkg versions in repo (repo-add limitation) + + +## Contributors + + Lukas-Heiligenbrunner + +## License + +This project is licensed under the MIT License. Feel free to contribute and modify as per the guidelines outlined in the license agreement. diff --git a/backend/src/main.rs b/backend/src/main.rs index ecbf2c6..1e68bba 100644 --- a/backend/src/main.rs +++ b/backend/src/main.rs @@ -14,6 +14,8 @@ use crate::api::embed::CustomHandler; use crate::builder::types::Action; use crate::db::migration::Migrator; use crate::scheduler::aur_version_update::start_aur_version_checking; +use flate2::read::GzEncoder; +use flate2::Compression; use rocket::config::Config; use rocket::fs::FileServer; use rocket::futures::future::join_all; @@ -21,6 +23,9 @@ use rocket_okapi::swagger_ui::{make_swagger_ui, SwaggerUIConfig}; use sea_orm::{Database, DatabaseConnection}; use sea_orm_migration::MigratorTrait; use std::fs; +use std::fs::File; +use tar::Archive; +use tokio::fs::symlink; use tokio::sync::broadcast; fn main() { @@ -43,6 +48,22 @@ fn main() { // create repo folder if !fs::metadata("./repo").is_ok() { fs::create_dir("./repo").unwrap(); + + let tar_gz = File::create("./repo/repo.db.tar.gz").unwrap(); + let enc = GzEncoder::new(tar_gz, Compression::default()); + let mut tar = tar::Builder::new(enc); + tar.finish().expect("failed to create repo archive"); + symlink("./repo/repo.db.tar.gz", "./repo/repo.db") + .await + .expect("failed to create repo symlink"); + + let tar_gz = File::create("./repo/repo.files.tar.gz").unwrap(); + let enc = GzEncoder::new(tar_gz, Compression::default()); + let mut tar = tar::Builder::new(enc); + tar.finish().expect("failed to create repo archive"); + symlink("./repo/repo.files.tar.gz", "./repo/repo.files") + .await + .expect("failed to create repo symlink"); } let db2 = db.clone();