From 576125d377b7972e522fd758125812ce17831bdc Mon Sep 17 00:00:00 2001 From: pat-s Date: Thu, 2 Jan 2025 23:40:10 +0100 Subject: [PATCH] feat: add docs website --- .gitignore | 96 +++++++++++++++++++++++++++++- .terraform.lock.hcl | 42 +++++++++++++ .woodpecker/docs.yaml | 59 ++++++++++++++++++ Justfile | 8 ++- backend.tf | 16 +++++ cdn.tf | 48 +++++++++++++++ docs/.gitignore | 1 + docs/_brand.yaml | 49 +++++++++++++++ docs/_quarto.yml | 68 +++++++++++++++++++++ docs/cicd/index.qmd | 82 +++++++++++++++++++++++++ docs/configuration/index.qmd | 66 ++++++++++++++++++++ docs/containers/index.qmd | 24 ++++++++ docs/continuous-updates/index.qmd | 1 + docs/contributing/index.qmd | 15 +++++ docs/fair-usage/index.qmd | 0 docs/favicon.ico | Bin 0 -> 10990 bytes docs/index.qmd | 24 ++++++++ docs/infrastructure/index.qmd | 1 + docs/logo-icon.png | Bin 0 -> 49921 bytes docs/logo.png | Bin 0 -> 24656 bytes docs/private-mirror/index.qmd | 0 docs/r-dev-environments/index.qmd | 32 ++++++++++ docs/styles.css | 31 ++++++++++ provider.tf | 14 +++++ vars.tf | 9 +++ 25 files changed, 683 insertions(+), 3 deletions(-) create mode 100644 .terraform.lock.hcl create mode 100644 .woodpecker/docs.yaml create mode 100644 backend.tf create mode 100644 cdn.tf create mode 100644 docs/.gitignore create mode 100644 docs/_brand.yaml create mode 100644 docs/_quarto.yml create mode 100644 docs/cicd/index.qmd create mode 100644 docs/configuration/index.qmd create mode 100644 docs/containers/index.qmd create mode 100644 docs/continuous-updates/index.qmd create mode 100644 docs/contributing/index.qmd create mode 100644 docs/fair-usage/index.qmd create mode 100644 docs/favicon.ico create mode 100644 docs/index.qmd create mode 100644 docs/infrastructure/index.qmd create mode 100644 docs/logo-icon.png create mode 100644 docs/logo.png create mode 100644 docs/private-mirror/index.qmd create mode 100644 docs/r-dev-environments/index.qmd create mode 100644 docs/styles.css create mode 100644 provider.tf create mode 100644 vars.tf diff --git a/.gitignore b/.gitignore index a226d24..442134b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,101 @@ -.Rproj.user +# Created by https://www.toptal.com/developers/gitignore/api/terraform,R +# Edit at https://www.toptal.com/developers/gitignore?templates=terraform,R + +### R ### +# History files .Rhistory +.Rapp.history + +# Session Data files .RData +.RDataTmp + +# User-specific files .Ruserdata + +# Example code in package build process +*-Ex.R + +# Output files from R CMD build +/*.tar.gz + +# Output files from R CMD check +/*.Rcheck/ + +# RStudio files +.Rproj.user/ + +# produced vignettes +vignettes/*.html +vignettes/*.pdf + +# OAuth2 token, see https://github.com/hadley/httr/releases/tag/v0.3 +.httr-oauth + +# knitr and R markdown default cache directories +*_cache/ +/cache/ + +# Temporary files created by R markdown +*.utf8.md +*.knit.md + +# R Environment Variables +.Renviron + +# pkgdown site +docs/ + +# translation temp files +po/*~ + +# RStudio Connect folder +rsconnect/ + +### R.Bookdown Stack ### +# R package: bookdown caching files +/*_files/ + +### Terraform ### +# Local .terraform directories +**/.terraform/* + +# .tfstate files +*.tfstate +*.tfstate.* + +# Crash log files +crash.log +crash.*.log + +# Exclude all .tfvars files, which are likely to contain sensitive data, such as +# password, private keys, and other secrets. These should not be part of version +# control as they are data points which are potentially sensitive and subject +# to change depending on the environment. +*.tfvars +*.tfvars.json + +# Ignore override files as they are usually used to override resources locally and so +# are not checked in +override.tf +override.tf.json +*_override.tf +*_override.tf.json + +# Include override files you do wish to add to version control using negated pattern +# !example_override.tf + +# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan +# example: *tfplan* + +# Ignore CLI configuration files +.terraformrc +terraform.rc + +# End of https://www.toptal.com/developers/gitignore/api/terraform,R + .Renviron .envrc exec.sh exec.R -docs/ \ No newline at end of file +docs/_site \ No newline at end of file diff --git a/.terraform.lock.hcl b/.terraform.lock.hcl new file mode 100644 index 0000000..b394d8f --- /dev/null +++ b/.terraform.lock.hcl @@ -0,0 +1,42 @@ +# This file is maintained automatically by "tofu init". +# Manual edits may be lost in future updates. + +provider "registry.opentofu.org/hashicorp/http" { + version = "3.4.5" + hashes = [ + "h1:P3NFKZbtHuQ6mmoDVpg4WYlDJ+yK4cchzkjTPzBWG3Y=", + "zh:055a4431d33bb89b9848193152433eaead7cc2e6746d3436a5922419de2112bf", + "zh:0bfabafea9f5e36802fcfc5a800831ec1767d896af889abc610014d02b09bdc2", + "zh:300b4983fe1b43bd0a7dac1f94b30b3814f11c824224dd83fb45a521c02cea60", + "zh:68f6958314ca5dc0868be70e37ec123b99b8828aa49f27fd2fdd13df05d31ab1", + "zh:c29f098a597250adc2a7d9f99acbce3c9e07d37f1c5cfded5df4309738cf613c", + "zh:c33607397f9c9302c0cd797c8b7484c9c6cfa09c3489d4b55af17df20b204368", + "zh:d519ca364a224110428b390ee06e963a3ec4dfdd1ac816c9f32e647567957cf5", + "zh:e4a9c7c0ac31a0192362ef43449390cdf00d2cf6f13061ef730b177eaf00ac45", + "zh:f25223c062f274d8f89bb96017e73586030a205bc91cdad266a9954d0def2a23", + "zh:fd4dc824ebae2f3a66318df364bec83b88e9a52e7f66b00dafa29a796d9a94ab", + ] +} + +provider "registry.terraform.io/bunnyway/bunnynet" { + version = "0.5.0" + constraints = "~> 0.5" + hashes = [ + "h1:eiQOt1rXiFmd9dAfvVe1kPcoPCwcOnXTqBdFT5VGASY=", + "zh:2b7cc4065a40fa01a49067c616d69de60f27a8388575fece16657d07884fc061", + "zh:334d6e20ea046787e05f88df1fb24caddb96e7142a4bb6883b00a7528d2dc4e0", + "zh:3bd890b915486e4a8bae060fcf4cb6f9d09c3e22f64b871572e1f0c05a515f11", + "zh:5c0edb810fd9dbc7a59e99f2b29be3822a0f38001236018d38803149543776a2", + "zh:5d72b0ff62a959e7b21bdf51edcc5e8acc49e0991b54fe688a3de04be3b2b095", + "zh:70e34ff2d3bd108570849fb11cc333c3254d5548c8a2c5a24000f99da01b8551", + "zh:890df766e9b839623b1f0437355032a3c006226a6c200cd911e15ee1a9014e9f", + "zh:8ccc55724e70201d1db82d41632a5036688712cd215dab0f78f6890dd44ca1de", + "zh:99204d2da7788d9a24205142162fe29214146ec7dbf4f369f7c2ca57682ecc8c", + "zh:a1277fd220699cd0c9b5cdfb9afbb29f17846ec9476e4f93533879868db0d5ef", + "zh:abfddebfad3cbdfbfaa8269124bc9abab6e0cbad68356ede0095bb5381da40ab", + "zh:c74fd62921e2755e1a87dbf2acb4527966a611967a72076f4c315fb86f4deb38", + "zh:ca277ac7e5fa76ee59da8d262a120f62e43e0e8e14de006d08638a2d2a312d51", + "zh:cc8da1bf7539929a48ae2ea08b1dd83751faf31cc6c1607a0e10bbcaa63490e0", + "zh:fb0003a6af70e1b2a7ca3f19e8bfd2bcc5238ab5a0759b5e752b0fefb0ec8c50", + ] +} diff --git a/.woodpecker/docs.yaml b/.woodpecker/docs.yaml new file mode 100644 index 0000000..8fe5bdb --- /dev/null +++ b/.woodpecker/docs.yaml @@ -0,0 +1,59 @@ +when: + - event: manual + evaluate: 'task == "docs"' + - event: cron + cron: 'build == "alpine-320-arm64"' + - event: manual + evaluate: 'build == "all-arm64"' + +steps: + quarto-build: + image: ghcr.io/quarto-dev/quarto:1.6.39 + directory: docs + commands: + - quarto render + backend_options: + kubernetes: + resources: + requests: + memory: 1Gi + cpu: 1000m + limits: + memory: 2Gi + cpu: 1000m + nodeSelector: + kubernetes.io/arch: amd64 + tolerations: + - key: 'CI' + operator: 'Equal' + value: 'true' + effect: 'NoSchedule' + + s3-sync: + image: plugins/s3:1.3.1 + directory: docs + settings: + bucket: devxy-r-package-binaries-docs + region: fsn1 + endpoint: https://fsn1.your-objectstorage.com + access_key: + from_secret: HETZNER_S3_ACCESS_KEY_K3S + secret_key: + from_secret: HETZNER_S3_SECRET_KEY_K3S + source: _site/**/* + strip_prefix: _site/ + target: / + backend_options: + kubernetes: + resources: + requests: + memory: 300Mi + cpu: 200m + limits: + memory: 1Gi + cpu: 1000m + tolerations: + - key: 'CI' + operator: 'Equal' + value: 'true' + effect: 'NoSchedule' \ No newline at end of file diff --git a/Justfile b/Justfile index 59d95b7..8864dff 100644 --- a/Justfile +++ b/Justfile @@ -3,4 +3,10 @@ image OS ARCH: docker buildx build --progress plain --build-arg ARCH={{ARCH}} --build-arg GITHUB_PAT="$GITHUB_PAT" --build-arg RED_HAT_DEV_PW="$RED_HAT_DEV_PW" --platform linux/{{ARCH}} -f docker/Containerfile-{{OS}} -t devxygmbh/{{ARCH}}-binaries-r-{{OS}}:latest --push .; \ else \ docker buildx build --progress plain --build-arg GITHUB_PAT="$GITHUB_PAT" --build-arg ARCH={{ARCH}} -f docker/Containerfile-{{OS}} --platform linux/{{ARCH}} -t devxygmbh/{{ARCH}}-binaries-r-{{OS}}:latest --push .; \ - fi \ No newline at end of file + fi + +preview-docs: + cd docs && quarto preview + +publish-docs: + cd docs && quarto render && rclone sync ./_site hetzner-s3://devxy-r-package-binaries-docs \ No newline at end of file diff --git a/backend.tf b/backend.tf new file mode 100644 index 0000000..b3b286f --- /dev/null +++ b/backend.tf @@ -0,0 +1,16 @@ +terraform { + backend "s3" { + bucket = "devxy-tf-state-build-binaries" + key = "terraform.tfstate" + region = "fsn1" + access_key = var.HETZNER_S3_ACCESS_KEY_K3S + secret_key = var.HETZNER_S3_SECRET_KEY_K3S + endpoint = "https://fsn1.your-objectstorage.com" + skip_credentials_validation = true + skip_metadata_api_check = true + skip_region_validation = true + skip_s3_checksum = true + encrypt = true + sse_customer_key = "q6DUYGPpNSFFynGK1k6q6ZMeHRVLYTuPN1H3blilfB4=" + } +} diff --git a/cdn.tf b/cdn.tf new file mode 100644 index 0000000..7a08015 --- /dev/null +++ b/cdn.tf @@ -0,0 +1,48 @@ +resource "bunnynet_pullzone" "r-package-binaries-docs" { + + name = "r-package-binaries-docs" + + origin { + type = "OriginUrl" + url = "https://devxy-r-package-binaries-docs.fsn1.your-objectstorage.com" + } + + routing { + tier = "Standard" + } + + s3_auth_enabled = true + s3_auth_key = var.HETZNER_S3_ACCESS_KEY_K3S + s3_auth_secret = var.HETZNER_S3_SECRET_KEY_K3S + s3_auth_region = "fsn1" + + cache_enabled = true + cache_errors = true + # 3 months (override origin cache policy which is 30d) + cache_expiration_time = 7776000 + # not so great in case data from users is being sent (at some point) + request_coalescing_enabled = false + block_post_requests = true + + originshield_enabled = true + originshield_concurrency_limit = true + originshield_zone = "FR" + + safehop_enabled = true + + # otherwise this will expose the S3 origin URL as a secondary canonical URL + add_canonical_header = false + + block_root_path = false + + # FIXME: https://github.com/BunnyWay/terraform-provider-bunnynet/issues/19 + log_forward_server = "127.0.0.1" +} + +resource "bunnynet_pullzone_hostname" "r-package-binaries-docs" { + + pullzone = bunnynet_pullzone.r-package-binaries-docs.id + name = "docs.r-package-binaries.devxy.io" + force_ssl = true + tls_enabled = true +} diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 0000000..075b254 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1 @@ +/.quarto/ diff --git a/docs/_brand.yaml b/docs/_brand.yaml new file mode 100644 index 0000000..247a00c --- /dev/null +++ b/docs/_brand.yaml @@ -0,0 +1,49 @@ +color: + palette: + dark: "#1d262f" + orange: "#FF9B00" + links: "#15428c" + # background: blue + # foreground: dark-grey + primary: '#1d262f' # hyperlinks, active states, primary action buttons, etc. + tertiary: "#FF9B00" # hover states, accents, and wells. + +logo: + medium: + light: logo.png + dark: logo.png + +defaults: + bootstrap: + defaults: + navbar-fg: "#1d262f" + navbar-bg: "#ffffff" + +typography: + fonts: + - family: Jura + source: google + - family: Inter Variable + source: google + - family: Montserrat Alternates + source: google + base: + family: Inter Variable + headings: Montserrat + link: + decoration: underline + color: links + monospace: + color: primary + background-color: "#f0f1f3" + size: 0.8rem + # decoration: + +meta: + link: + home: https://www.devxy.io + gitlab: https://gitlab.com/devxy + bluesky: https://bsky.app/profile/devxy.bsky.social + linkedin: https://www.linkedin.com/company/105100347 + description: Where Data Science and DevOps meet 🤝️ + founded: 2024 \ No newline at end of file diff --git a/docs/_quarto.yml b/docs/_quarto.yml new file mode 100644 index 0000000..2c5fe3c --- /dev/null +++ b/docs/_quarto.yml @@ -0,0 +1,68 @@ +project: + type: website + +website: + title: "CRAN R Package Binaries" + reader-mode: false + favicon: favicon.ico + back-to-top-navigation: true + navbar: + right: + - icon: gitlab + href: https://gitlab.com/devxy + - icon: browser-safari + href: https://www.devxy.io + - icon: bluesky + href: https://www.devxy.io + sidebar: + logo: "" + style: "docked" + collapse-level: 4 + search: true + border: true + pinned: true + contents: + - text: 'Introduction' + file: index.qmd + - text: "---" + - text: 'Configuration' + file: configuration/index.qmd + - section: "**Use Cases**" + contents: + - text: "CI/CD" + file: cicd/index.qmd + - text: "R Development Environments" + file: r-dev-environments/index.qmd + - text: "Containers" + file: containers/index.qmd + # - section: "**Technical Background**" + # contents: + # - text: "Infrastructure" + # file: 031-infrastructure.qmd + # - text: "Continuous Updates" + # file: 032-continuous-updates.qmd + # - section: "**Miscellaneous**" + # contents: + # - text: "Private Mirror" + # file: 040-private-mirror.qmd + # - text: "Fair Usage" + # file: 041-fair-usage.qmd + - text: "---" + - text: 'Contributing & Help' + file: "contributing/index.qmd" + + search: + location: sidebar + type: "textbox" + limit: 5 + copy-button: true + collapse-after: 2 +format: + html: + theme: cosmo + css: styles.css + fontsize: 1rem + toc: true + grid: + sidebar-width: 300px + diff --git a/docs/cicd/index.qmd b/docs/cicd/index.qmd new file mode 100644 index 0000000..115b097 --- /dev/null +++ b/docs/cicd/index.qmd @@ -0,0 +1,82 @@ +--- +title: CI/CD +--- + +Continuous Integration / continous delivery (CI/CD) is a basic tool in todays Data Science toolstack to automate processes and execute repetite tasks on schedule. + +Running tasks in CI/CD should be fast and reliable, no matter the language, architecture or computing environment at hand. +As CI/CD requires installing many packages over and over again, having binaries and optimized distributions helps to reduce runtime. + +This page presents snippets for well and lesser known CI/CD engines to help getting started with the R package binaries of this project. + +::: {.callout-note} +The presented snippets rely on external projects and libraries which get updated regurarly. +There is no guarantee to work out-of-the box at all times. +If you found an error, please open a pull request in the linked repo. +::: + +## GitHub Actions + +### VM + +GitHub Actions can be run directly on a VM or in a containered context. +The available VM images can be found [here](https://github.com/actions/runner-images#available-images). +The only Linux distribution available is Ubuntu. + +For VM workflows, [r-lib/actions](https://github.com/r-lib/actions/blob/v2/examples) provides many examples for different use cases. + +To use package binaries from this project, use the following config for `r-lib/actions/setup-r@v2`: + +```yaml + - uses: r-lib/actions/setup-r@v2 + with: + r-version: ${{ matrix.config.r }} + http-user-agent: ${{ matrix.config.http-user-agent }} + Ncpus: 2 + cran: 'https://cran.devxy.io/amd64/noble/latest' +``` + +(`Ncpus: 2` has been set to allow for parallel installations.) + +### Container + +An alternative is to run Actions in a containerized context. +This spins up a container of the selected image in the VM and allows running on other distributions than Ubuntu, e.g. on Alpine. +To avoid having to install R first and configure a custom repository every time, [specialized images](https://hub.docker.com/r/devxygmbh/r-alpine) are provided which already have everything in place: + +```yaml +jobs: + container: + runs-on: ubuntu-latest + container: devxygmbh:r-alpine + steps: + - run: | + R -q -e 'install.packages("pak", repos = sprintf("https://r-lib.github.io/p/pak/devel/%s/%s/%s", .Platform$pkgType, R.Version()$os, R.Version()$arch))' + R -q -e 'getOption("repos")' + R -q -e 'options(Ncpus = 2); pak::local_install_dev_deps()' +``` + +::: {.callout-note} +When running in a containerized context, the predefined actions from `r-lib/actions` cannot be used. +Shell/R commands must be used directly. +::: + +::: {.callout-note} +Running containerized in Alpine should be substantially faster than running in a VM context. +::: + +::: {.callout-tip} +(91 packages) + +- Containerized: **1m 21s** +- VM: 2m 11s + +Both runs are based on the assumption that caching is not used. With caching enabled, the performance of both approaches should be roughly comparable. + +Source: [pat-s/workflow-compare](https://github.com/pat-s/workflow-compare) +::: + + +## GitLab Runner + +WIP \ No newline at end of file diff --git a/docs/configuration/index.qmd b/docs/configuration/index.qmd new file mode 100644 index 0000000..e3b06a4 --- /dev/null +++ b/docs/configuration/index.qmd @@ -0,0 +1,66 @@ +--- +title: Configuration +--- + +In R on Linux, packages are downloaded from CRAN as source packages. +The default CRAN mirror is `https://cloud.r-project.org`. +The default repository URL needs to be **actively changed** to one providing binaries for the respective Linux distribution. +This can be done either for all users of the system, on a project level or for specific users only. +All options will be shown in the following. + +## URL Scheme + +The URL scheme for this project is the same for all operating systems and only differs in the OS and architecture identifiers. + +::: {.callout-note icon=false} + +## URL scheme + +`https://cran.devxy.io///latest` +::: + +For example, the URL for Alpine Linux 3.21 for `arm64` would be `https://cran.devxy.io/arm64/alpine321/latest`. + +The architecture identifiers are: + +- `arm64` +- `amd64` + +The OS identifiers are: + +- `jammy` (Ubuntu 22.04) +- `noble` (Ubuntu 24.04) +- `rhel8` (RedHat Enterprise Linux 8) +- `rhel9` (RedHat Enterprise Linux 9) +- `alpine320` (Alpine Linux 3.20) +- `alpine321` (Alpine Linux 3.21) + +## Repository Configuration + +### System-wide + +To configure the default R repository for all users of a system, create/edit `$R_HOME/etc/Rprofile.site`. +The location of this file depends on how R has been installed. +To find its location, execute `R -q -e "paste0(Sys.getenv('R_HOME'),'/etc/Rprofile.site')"`. + +**At the bottom** of the file, add the following: + +```r +options(repos = structure(c(CRAN = ""))) +``` + +The name "CRAN" is optional. +It is the canonical default and in some cases also used for special actions (e.g. in Posit Workbench and [{pak}](https://github.com/r-lib/pak)). +Unless you have a good reason, it is advisable to stick with that name. + +### User-wide + +To change the default repository option for a specific *user*, add the line from above to `~/.Rprofile`. + +### Project-wide + +To change the default repository option for a specific *project*, add the line from above to `.Rprofile` in the project root directory in which R is started. + +## Verification + +When starting R, execute `getOption("repos")` to verify the repository is correctly configured. \ No newline at end of file diff --git a/docs/containers/index.qmd b/docs/containers/index.qmd new file mode 100644 index 0000000..ad4cb98 --- /dev/null +++ b/docs/containers/index.qmd @@ -0,0 +1,24 @@ +--- +title: Containers +--- + +The [rocker](https://hub.docker.com/u/rocker) project provides container images for R since several years. +Since recently, the images are multi-arch, i.e. `arm64` is supported alongside `amd64`. + +Yet, other distributions than Ubuntu are missing and don't use the devXY binaries out of the box. +To simplify running containers that make use of the devXY R binaries implicitly, the following images are provided: + +- [devxygmbh/r-alpine](https://hub.docker.com/r/devxygmbh/r-alpine) +- [devxygmbh/r-ubuntu](https://hub.docker.com/r/devxygmbh/r-ubuntu) + +These have the devXY repositories configured by default and can be used efficiently without further configuration changes. + +In contrast to the minimal `rocker/r-ver` images, the `r-ubuntu` images contain a few additional system libraries which are essential for troublefree R usage. + +The following screencast shows how quickly the `r-alpine` image can be used to install the full {tidyverse} package universe in just under 30s: + +
+ +::: {.callout-note} +The performance of this screencast (and your local experience) depends on a few factors: local download speed, cached binaries in the CDN, proximity to a local edge node of the CDN and your CPU performance and finally the `Ncpus` option in R, defining how many installations are performed in parallel (by default 1). +::: \ No newline at end of file diff --git a/docs/continuous-updates/index.qmd b/docs/continuous-updates/index.qmd new file mode 100644 index 0000000..6d3f665 --- /dev/null +++ b/docs/continuous-updates/index.qmd @@ -0,0 +1 @@ +WIP \ No newline at end of file diff --git a/docs/contributing/index.qmd b/docs/contributing/index.qmd new file mode 100644 index 0000000..3bf7d20 --- /dev/null +++ b/docs/contributing/index.qmd @@ -0,0 +1,15 @@ +--- +title: Contributing & Help +--- + +Contributions are welcome. +The project is open-source and GPL licensed. + +The most helpful tasks are to investigate in detail why specific packages failed to build a binary. +It usually comes down to a missing system dependency (which is either not declared in the package's DESCRIPTION file or exotic and must be installed from source) or a C code compile issue. + +Please open an issue in the [`r-package-binaries/support`](https://gitlab.com/devxy/r-package-binaries/support) repo. + +::: {.callout-note} +The actual repo executing the builds ([devxy/build-binaries](https://git.devxy.io/devxy/build-binaries)) is hosted in a private git instance to be able to use specific private CI runners and is not easily usable for creating public issues, hence the dedicated repo on GitLab. +::: diff --git a/docs/fair-usage/index.qmd b/docs/fair-usage/index.qmd new file mode 100644 index 0000000..e69de29 diff --git a/docs/favicon.ico b/docs/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..29cda768233277d3391e0b75034530e990dda29b GIT binary patch literal 10990 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 literal 0 HcmV?d00001 diff --git a/docs/index.qmd b/docs/index.qmd new file mode 100644 index 0000000..f8ce941 --- /dev/null +++ b/docs/index.qmd @@ -0,0 +1,24 @@ +--- +title: "CRAN R Package Binaries" +--- + +This project provides R package binaries for various Linux distributions and architectures. +While it provides binaries for [CRAN packages](https://cran.r-project.org/), it is not affiliated with CRAN in any way. + +Binaries are distributed to the community for free with a monthly download cap of **50 Terrabyte**. + +::: {.callout-note} +If you represent a for-profit company and plan to make extensive use of these binaries, please get in touch. We offer the option to obtain a private mirror with unlimited access. +::: + +While we strive to build binaries for all CRAN packages, there are various reasons why building binaries for a package might fail. +(The most common reason is a missing (exotic) external system dependency which the project links against.) +The [R package binary dashboard](https://app.devxy.io/app/r-package-binaries-dashboard) provides global coverage information for each for each operating system and which packages are currently missing. + +## Motivation + +The project was established to offer extensive R CRAN package support for common Linux distributions. +Since CRAN does not build binaries for Linux, Posit began providing binaries in 2020. +However, their efforts were limited to the amd64 architecture and excluded Alpine Linux, which is among the most popular distributions for container-based workflows. + +This project aims to make R a first-class citizien for CI/CD and containers using a community-driven open-source approach. \ No newline at end of file diff --git a/docs/infrastructure/index.qmd b/docs/infrastructure/index.qmd new file mode 100644 index 0000000..6d3f665 --- /dev/null +++ b/docs/infrastructure/index.qmd @@ -0,0 +1 @@ +WIP \ No newline at end of file diff --git a/docs/logo-icon.png b/docs/logo-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c1e2090b1d7f54b7b2fb769b12b5232072628c85 GIT binary patch literal 49921 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�qgTvv#`qzK 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 z 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 POoDFRF|4@h^5nk&O4;$~ literal 0 HcmV?d00001 diff --git a/docs/private-mirror/index.qmd b/docs/private-mirror/index.qmd new file mode 100644 index 0000000..e69de29 diff --git a/docs/r-dev-environments/index.qmd b/docs/r-dev-environments/index.qmd new file mode 100644 index 0000000..57858db --- /dev/null +++ b/docs/r-dev-environments/index.qmd @@ -0,0 +1,32 @@ +An R development environment is a shared Linux VM or Kubernetes Cluster that runs an Integrated Development Environment (IDE), e.g. Posit Workbench or RStudio Server, and other related applications, such as Posit Connect or ShinyProxy. +In such an environment, multiple users can share the available resources and configurations can be set centrally for all users[^1]. + +Using package binaries in shared development environments is a crucial component for the overall success and efficiency of each individual user. + +## Fast Package Downloads + +Besides using R package binaries in the first place, a fast download speed further improves the quality of such an environment. +The binaries of this project are 5-10 times faster in download compared to other available binaries*. + +::: {.callout-note} +The exact timing depends on the location from where the download is initiated. +The closer it is to static cache node of the distributing CDN, the faster. +::: + +## Reduced Costs Through arm64 Servers + +Besides accelerating downloads, this project enabled using `arm64` machines for such environments. +These server types are substantially cheaper than their `amd64` counterparts, allowing for significant cost savings without any negative drawbacks. + +The following example shows the on-demand prices of a 2 CPU 16 GB VM on Azure (2025/01): + +- amd64: 0.1640/h (Standard_E2ds_v6, eastus) +- arm64: 0.1150/h (Standard_E2ps_v6, eastus) + +-> 29.88% savings + +::: {.callout-note} +Servers with the same specifications but from different generations can have significant price variations. For this comparison, an effort was made to use the latest configurations of both architectures to ensure a reasonably fair evaluation. +::: + +[^1]: For more information about managed R environments, see ["Posit Software Installation for Enterprises" offer from devXY](https://www.devxy.io/posit-enterprise/). diff --git a/docs/styles.css b/docs/styles.css new file mode 100644 index 0000000..ce447fc --- /dev/null +++ b/docs/styles.css @@ -0,0 +1,31 @@ +/* css styles */ + +div.sourceCode { + border-radius: 6px; +} + +p code:not(.sourceCode), +li code:not(.sourceCode), +kbd, +pre:not(.sourceCode), +samp { + background-color: #f6f6f6 !important; + padding: 0.25em; + border-radius: 6px !important; +} + +/* sidebar */ +.sidebar-navigation li a { + line-height: 1.2rem; + font-size: 0.8rem; +} + +.navbar { + border-bottom: 1px solid #e5e5e6; + max-height: 50px; + +} + +.navbar-logo { + max-height: 30px; +} \ No newline at end of file diff --git a/provider.tf b/provider.tf new file mode 100644 index 0000000..ccc070c --- /dev/null +++ b/provider.tf @@ -0,0 +1,14 @@ +terraform { + required_providers { + bunnynet = { + source = "registry.terraform.io/BunnyWay/bunnynet" + version = "~> 0.5" + } + } +} + +provider "bunnynet" { +} + +provider "http" { +} diff --git a/vars.tf b/vars.tf new file mode 100644 index 0000000..8168262 --- /dev/null +++ b/vars.tf @@ -0,0 +1,9 @@ +variable "HETZNER_S3_ACCESS_KEY_K3S" { + type = string + sensitive = true +} + +variable "HETZNER_S3_SECRET_KEY_K3S" { + type = string + sensitive = true +}