diff --git a/cmd/release/Dockerfile b/cmd/release/Dockerfile deleted file mode 100644 index bb2f7ae53c7..00000000000 --- a/cmd/release/Dockerfile +++ /dev/null @@ -1,19 +0,0 @@ -FROM docker.io/library/golang:1.21-alpine3.17 AS builder -WORKDIR /app - -ADD go.mod go.mod -ADD go.sum go.sum -RUN go mod download - -ADD . . - -ARG GITHUB_TOKEN - -RUN go build -o releaser main.go -RUN ./releaser --github-token=$GITHUB_TOKEN - -FROM nginx:1.21.3-alpine - -COPY page /usr/share/nginx/html -COPY nginx.conf /etc/nginx/conf.d/default.conf -COPY --from=builder /app/releases.json /usr/share/nginx/html/data.json diff --git a/cmd/release/README.md b/cmd/release/README.md deleted file mode 100644 index bfff17a30f4..00000000000 --- a/cmd/release/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# release - -Flags: - - `--github-token` - GitHub token - - `--releases` - Number of releases to fetch (default 5) - -Takes a GitHub token, and an optional number of releases. - -Fetches the last 5 releases from GitHub and adds them to a JSON file which the download page can use. diff --git a/cmd/release/docker-compose.yml b/cmd/release/docker-compose.yml deleted file mode 100644 index 55857d26509..00000000000 --- a/cmd/release/docker-compose.yml +++ /dev/null @@ -1,45 +0,0 @@ -version: "3" - -services: - traefik: - image: traefik:latest - restart: always - command: - - "--providers.docker=true" - - "--providers.docker.exposedbydefault=false" - - "--entrypoints.web.address=:80" - - "--entrypoints.websecure.address=:443" - - "--certificatesresolvers.letsencrypt.acme.email=max.revitt@gateway.fm" - - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json" - - "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web" - ports: - - "80:80" - - "443:443" - volumes: - - "/var/run/docker.sock:/var/run/docker.sock:ro" - - "./letsencrypt:/letsencrypt" - networks: - - traefik - - download: - image: thorax/download:latest - restart: always - labels: - - "traefik.enable=true" - - "traefik.docker.network=traefik" - - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https" - - "traefik.http.middlewares.redirect-to-https.redirectscheme.permanent=true" - - "traefik.http.routers.app-insecure.rule=Host(`download.erigon.ch`)" - - "traefik.http.routers.app-insecure.entrypoints=web" - - "traefik.http.routers.app-insecure.middlewares=redirect-to-https" - - "traefik.http.routers.app-secure.rule=Host(`download.erigon.ch`)" - - "traefik.http.routers.app-secure.entrypoints=websecure" - - "traefik.http.routers.app-secure.tls=true" - - "traefik.http.routers.app-secure.tls.certresolver=letsencrypt" - - "traefik.http.services.app.loadbalancer.server.port=80" - networks: - - traefik - -networks: - traefik: - name: traefik diff --git a/cmd/release/go.mod b/cmd/release/go.mod deleted file mode 100644 index 99bfb880ce5..00000000000 --- a/cmd/release/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module github.com/ledgerwatch/erigon/cmd/release/v2 - -go 1.20 - -require github.com/hashicorp/go-version v1.6.0 diff --git a/cmd/release/go.sum b/cmd/release/go.sum deleted file mode 100644 index 805e323fbbc..00000000000 --- a/cmd/release/go.sum +++ /dev/null @@ -1,2 +0,0 @@ -github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= -github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= diff --git a/cmd/release/main.go b/cmd/release/main.go deleted file mode 100644 index 854260728a7..00000000000 --- a/cmd/release/main.go +++ /dev/null @@ -1,425 +0,0 @@ -package main - -import ( - "bufio" - "encoding/json" - "flag" - "fmt" - "net/http" - "os" - "sort" - "strings" - "time" - - "github.com/hashicorp/go-version" -) - -type Binary struct { - Name string `json:"name"` - FileName string `json:"file_name"` - File string `json:"file"` - OS string `json:"os"` - Arch string `json:"arch"` - SigFile string `json:"sig"` - Checksum string `json:"checksum"` - Commit string `json:"commit"` - Version string `json:"version"` - Tag string `json:"tag"` - Release string `json:"release"` -} - -type Release struct { - Version string `json:"version"` - Binaries []Binary `json:"binaries"` -} - -type Releases struct { - Releases []Release `json:"releases"` -} - -type GithubReleaseAsset struct { - Url string `json:"url"` - Name string `json:"name"` - BrowserDownloadUrl string `json:"browser_download_url"` - Size int `json:"size"` - ContentType string `json:"content_type"` -} - -type GithubRelease struct { - TagName string `json:"tag_name"` - Name string `json:"name"` - PublishedAt time.Time `json:"published_at"` - Assets []GithubReleaseAsset `json:"assets"` -} - -type DockerImage struct { - Creator int `json:"creator"` - Id int `json:"id"` - Images []struct { - Architecture string `json:"architecture"` - Features string `json:"features"` - Variant interface{} `json:"variant"` - Digest string `json:"digest"` - Os string `json:"os"` - OsFeatures string `json:"os_features"` - OsVersion interface{} `json:"os_version"` - Size int `json:"size"` - Status string `json:"status"` - LastPulled time.Time `json:"last_pulled"` - LastPushed time.Time `json:"last_pushed"` - } `json:"images"` - LastUpdated time.Time `json:"last_updated"` - LastUpdater int `json:"last_updater"` - LastUpdaterUsername string `json:"last_updater_username"` - Name string `json:"name"` - Repository int `json:"repository"` - FullSize int `json:"full_size"` - V2 bool `json:"v2"` - TagStatus string `json:"tag_status"` - TagLastPulled time.Time `json:"tag_last_pulled"` - TagLastPushed time.Time `json:"tag_last_pushed"` - MediaType string `json:"media_type"` - ContentType string `json:"content_type"` - Digest string `json:"digest"` -} - -var githubToken string -var releasesCount int - -func init() { - flag.StringVar(&githubToken, "github-token", "", "Github token") - flag.IntVar(&releasesCount, "releases", 5, "Number of releases to fetch") - - flag.Parse() - - // check all flags are set - flag.VisitAll(func(f *flag.Flag) { - if f.Value.String() == "" { - fmt.Printf("Flag %s is not set\n", f.Name) - os.Exit(1) - } - }) -} - -// release is a small program which takes command line flags from a ci release job for an individual binary -// and adds the binary to the releases.json file which is then served by downloads.erigon.ch -func main() { - // read releases from disk (same file as used to populate downloads.erigon.ch) - releases, err := readJsonFile() - if err != nil { - fmt.Println(err) - os.Exit(1) - } - - // get last 5 releases - ghReleases, err := getReleases(githubToken, "https://api.github.com/repos/ledgerwatch/erigon/releases", releasesCount) - if err != nil { - fmt.Println(err) - os.Exit(1) - } - - // loop binaries to get stable and rc versions - var stable []GithubRelease - var rc []GithubRelease - for _, ghRelease := range ghReleases { - if strings.Contains(ghRelease.TagName, "rc") { - if len(rc) < releasesCount { - rc = append(rc, ghRelease) - } - } else { - if len(stable) < releasesCount { - stable = append(stable, ghRelease) - } - } - } - - allReleases := append(stable, rc...) - - for _, ghRelease := range allReleases { - checksums := map[string]string{} - - // get checksums first - for _, asset := range ghRelease.Assets { - if strings.Contains(asset.Name, "checksums") { - checksums, err = parseChecksums(asset) - if err != nil { - fmt.Println(err) - continue - } - } - } - - for _, asset := range ghRelease.Assets { - if strings.Contains(asset.Name, "checksums") { - continue - } - - name, v, o, arch, err := parseAssetName(asset) - binary := Binary{ - Name: name, - File: asset.BrowserDownloadUrl, - FileName: asset.Name, - OS: o, - Arch: arch, - SigFile: "", - Checksum: checksums[asset.Name], - Commit: "", - Version: v, - Tag: ghRelease.TagName, - Release: ghRelease.Name, - } - - // add current binary to releases (if doesn't already exist) - releases, err = addCurrentBinary(releases, binary) - if err != nil { - fmt.Println(err) - continue - } - } - - v := strings.TrimPrefix(ghRelease.TagName, "v") - - // add docker images - repositories, err := getDockerImages("https://hub.docker.com/v2/repositories/thorax/erigon/tags", v) - if err != nil { - fmt.Println(err) - continue - } - for _, repo := range repositories { - file := fmt.Sprintf("https://hub.docker.com/r/thorax/erigon/tags?page=1&ordering=last_updated&name=%s", repo.Name) - binary := Binary{ - Name: repo.Name, - File: file, - FileName: fmt.Sprintf("%s (%s, %s)", repo.Name, repo.Images[0].Os, repo.Images[0].Architecture), - OS: "docker", - Arch: repo.Images[0].Architecture, - SigFile: "", - Checksum: repo.Images[0].Digest, - Commit: "", - Version: v, - Tag: ghRelease.TagName, - Release: ghRelease.Name, - } - - releases, err = addCurrentBinary(releases, binary) - if err != nil { - fmt.Println(err) - continue - } - } - } - - // sort releases descending by version - sort.Slice(releases.Releases, func(i, j int) bool { - return releases.Releases[i].Version > releases.Releases[j].Version - }) - - // write releases back to disk - err = writeJsonFile(releases) -} - -func getDockerImages(url string, search string) ([]DockerImage, error) { - var images []DockerImage - - for { - // Make GET request to DockerHub API - resp, err := http.Get(url) - if err != nil { - return nil, err - } - - // Decode JSON response - var data struct { - Results []DockerImage `json:"results"` - Next string `json:"next"` - } - - if err := json.NewDecoder(resp.Body).Decode(&data); err != nil { - return nil, err - } - resp.Body.Close() - - // Append images with matching prefix to results - for _, image := range data.Results { - if strings.Contains(image.Name, search) { - images = append(images, image) - } - } - - // Stop if there are no more pages to retrieve - if data.Next == "" { - break - } - - // Update URL to retrieve next page - url = data.Next - } - - return images, nil -} - -func getReleases(token string, releasesUrl string, count int) ([]GithubRelease, error) { - // make request to github api to get release at url using token - req, err := http.NewRequest("GET", releasesUrl, nil) - if err != nil { - return nil, fmt.Errorf("error creating request: %w", err) - } - req.Header.Set("Accept", "application/vnd.github+json") - req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token)) - req.Header.Set("X-GitHub-Api-Version", "2022-11-28") - req.Header.Set("Per-Page", fmt.Sprintf("%d", count)) - req.Header.Set("Page", "1") - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, fmt.Errorf("error making request: %w", err) - } - defer resp.Body.Close() - - var releases []GithubRelease - err = json.NewDecoder(resp.Body).Decode(&releases) - if err != nil { - return nil, fmt.Errorf("error parsing json: %w", err) - } - - return releases, nil - -} - -func getLatestRelease(token string, releaseUrl string) (GithubRelease, error) { - // make request to github api to get release at url using token - req, err := http.NewRequest("GET", releaseUrl, nil) - if err != nil { - return GithubRelease{}, fmt.Errorf("error creating request: %w", err) - } - req.Header.Set("Accept", "application/vnd.github+json") - req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token)) - req.Header.Set("X-GitHub-Api-Version", "2022-11-28") - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return GithubRelease{}, fmt.Errorf("error making request: %w", err) - } - defer resp.Body.Close() - - var release GithubRelease - err = json.NewDecoder(resp.Body).Decode(&release) - if err != nil { - return GithubRelease{}, fmt.Errorf("error parsing json: %w", err) - } - - return release, nil -} - -func parseAssetName(asset GithubReleaseAsset) (name string, version string, os string, arch string, err error) { - // parse asset name to get binary name, os and arch - // example: erigon_2.39.0_darwin_amd64.tar.gz - - fileName := strings.TrimSuffix(asset.Name, ".tar.gz") - list := strings.Split(fileName, "_") - if len(list) != 4 { - if strings.Contains(asset.Name, "checksum") { - // tbc - return "checksums", list[1], "", "", nil - } - return "", "", "", "", fmt.Errorf("error parsing asset name: %s", asset.Name) - } - - return list[0], list[1], list[2], list[3], nil -} - -func parseChecksums(asset GithubReleaseAsset) (map[string]string, error) { - // download checksum file - resp, err := http.Get(asset.BrowserDownloadUrl) - if err != nil { - return nil, fmt.Errorf("error downloading checksum file: %w", err) - } - - // parse checksum file - checksums := map[string]string{} - scanner := bufio.NewScanner(resp.Body) - for scanner.Scan() { - line := scanner.Text() - list := strings.Split(line, " ") - if len(list) != 3 { - return nil, fmt.Errorf("error parsing checksum file: %s", line) - } - checksums[list[2]] = list[0] - } - - return checksums, nil -} - -func readJsonFile() (Releases, error) { - data, err := os.ReadFile("./releases.json") - if err != nil { - if os.IsNotExist(err) { - return Releases{}, nil - } - return Releases{}, fmt.Errorf("error reading file: %w", err) - } - - var releases Releases - err = json.Unmarshal(data, &releases) - if err != nil { - return Releases{}, fmt.Errorf("error parsing json: %w", err) - } - return releases, nil -} - -func addCurrentBinary(releases Releases, b Binary) (Releases, error) { - // check if the binary is already in the release, if so return (no change to be made) - for _, release := range releases.Releases { - for _, binary := range release.Binaries { - if binary.Name == b.Name && binary.OS == b.OS && binary.Arch == b.Arch && binary.Version == b.Version { - return releases, fmt.Errorf("binary already exists in release") - } - } - } - - var found bool - // add binary to existing release - for i, release := range releases.Releases { - if release.Version == b.Version { - releases.Releases[i].Binaries = append(releases.Releases[i].Binaries, b) - found = true - break - } - } - - // if no releases exist or there isn't one for the current binary version, create one - if len(releases.Releases) == 0 || !found { - releases.Releases = append(releases.Releases, Release{ - Version: b.Version, - Binaries: []Binary{b}, - }) - } - - // sort releases by version - sort.Slice(releases.Releases, func(i, j int) bool { - v1, _ := version.NewVersion(releases.Releases[i].Version) - v2, _ := version.NewVersion(releases.Releases[j].Version) - return v1.LessThan(v2) - }) - - // remove the oldest release to maintain a list of 5 - if len(releases.Releases) > releasesCount { - releases.Releases = releases.Releases[1:] - } - - return releases, nil -} - -func writeJsonFile(releases Releases) error { - data, err := json.MarshalIndent(releases, "", " ") - if err != nil { - return fmt.Errorf("error marshalling json: %w", err) - } - - err = os.WriteFile("releases.json", data, 0644) - if err != nil { - return fmt.Errorf("error writing file: %w", err) - } - - return nil -} diff --git a/cmd/release/nginx.conf b/cmd/release/nginx.conf deleted file mode 100644 index d1d2398a6ef..00000000000 --- a/cmd/release/nginx.conf +++ /dev/null @@ -1,11 +0,0 @@ -server { - listen 80; - server_name download.erigon.ch; - - root /usr/share/nginx/html; - index index.html; - - location / { - try_files $uri $uri/ /index.html; - } -} diff --git a/cmd/release/page/assets/Erigon_Logotipo_color.svg b/cmd/release/page/assets/Erigon_Logotipo_color.svg deleted file mode 100644 index 74a3147927a..00000000000 --- a/cmd/release/page/assets/Erigon_Logotipo_color.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/cmd/release/page/assets/Erigon_cartoon_no_Helmet.svg b/cmd/release/page/assets/Erigon_cartoon_no_Helmet.svg deleted file mode 100644 index 03e99281c67..00000000000 --- a/cmd/release/page/assets/Erigon_cartoon_no_Helmet.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/cmd/release/page/assets/Rubik-Black.ttf b/cmd/release/page/assets/Rubik-Black.ttf deleted file mode 100644 index 1613299f9a9..00000000000 Binary files a/cmd/release/page/assets/Rubik-Black.ttf and /dev/null differ diff --git a/cmd/release/page/assets/Rubik-Regular.ttf b/cmd/release/page/assets/Rubik-Regular.ttf deleted file mode 100644 index 0967c8c4374..00000000000 Binary files a/cmd/release/page/assets/Rubik-Regular.ttf and /dev/null differ diff --git a/cmd/release/page/favicon-16x16.png b/cmd/release/page/favicon-16x16.png deleted file mode 100644 index ab0d6c9705c..00000000000 Binary files a/cmd/release/page/favicon-16x16.png and /dev/null differ diff --git a/cmd/release/page/favicon-32x32.png b/cmd/release/page/favicon-32x32.png deleted file mode 100644 index a9f9ecd3c49..00000000000 Binary files a/cmd/release/page/favicon-32x32.png and /dev/null differ diff --git a/cmd/release/page/favicon.ico b/cmd/release/page/favicon.ico deleted file mode 100644 index 61e4b261c4b..00000000000 Binary files a/cmd/release/page/favicon.ico and /dev/null differ diff --git a/cmd/release/page/index.html b/cmd/release/page/index.html deleted file mode 100644 index 6f98b0944dd..00000000000 --- a/cmd/release/page/index.html +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - - - - - Erigon - Downloads - - - - - - -
-
- -

Downloads

- -
-
- - -
-
- - -

RC

- -
-

- All release candiate versions of Erigon are listed below. -

-
- - - - -
- -
-
- -
-

There are no release candiate versions of Erigon available.

- -
-
- - -

Stable

- -
-

- All stable versions of Erigon are listed below. -

-
- - - - -
- -
-
- -
-

There are no stable versions of Erigon available.

-
- -
-
- - - -