diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml index f55d13b5..392ec5ee 100644 --- a/.github/workflows/docker.yaml +++ b/.github/workflows/docker.yaml @@ -61,7 +61,7 @@ jobs: if: github.event_name != 'pull_request' strategy: matrix: - project: [delta, bonfire, autumn, january] + project: [delta, bonfire, pigeon, dove] name: Build ${{ matrix.project }} image steps: # Configure build environment @@ -93,13 +93,13 @@ jobs: "path": "crates/bonfire", "tag": "${{ github.repository_owner }}/bonfire" }, - "autumn": { - "path": "crates/services/autumn", - "tag": "${{ github.repository_owner }}/autumn" + "pigeon": { + "path": "crates/services/pigeon", + "tag": "${{ github.repository_owner }}/pigeon" }, - "january": { - "path": "crates/services/january", - "tag": "${{ github.repository_owner }}/january" + "dove": { + "path": "crates/services/dove", + "tag": "${{ github.repository_owner }}/dove" } } export_to: output diff --git a/Dockerfile b/Dockerfile index 57ef759e..c2e09d75 100644 --- a/Dockerfile +++ b/Dockerfile @@ -27,8 +27,8 @@ COPY crates/core/models/Cargo.toml ./crates/core/models/ COPY crates/core/permissions/Cargo.toml ./crates/core/permissions/ COPY crates/core/presence/Cargo.toml ./crates/core/presence/ COPY crates/core/result/Cargo.toml ./crates/core/result/ -COPY crates/services/autumn/Cargo.toml ./crates/services/autumn/ -COPY crates/services/january/Cargo.toml ./crates/services/january/ +COPY crates/services/pigeon/Cargo.toml ./crates/services/pigeon/ +COPY crates/services/dove/Cargo.toml ./crates/services/dove/ RUN sh /tmp/build-image-layer.sh deps # Build all apps diff --git a/Dockerfile.useCurrentArch b/Dockerfile.useCurrentArch index a6605093..d60c3be3 100644 --- a/Dockerfile.useCurrentArch +++ b/Dockerfile.useCurrentArch @@ -23,8 +23,8 @@ COPY crates/core/models/Cargo.toml ./crates/core/models/ COPY crates/core/permissions/Cargo.toml ./crates/core/permissions/ COPY crates/core/presence/Cargo.toml ./crates/core/presence/ COPY crates/core/result/Cargo.toml ./crates/core/result/ -COPY crates/services/autumn/Cargo.toml ./crates/services/autumn/ -COPY crates/services/january/Cargo.toml ./crates/services/january/ +COPY crates/services/pigeon/Cargo.toml ./crates/services/pigeon/ +COPY crates/services/dove/Cargo.toml ./crates/services/dove/ RUN sh /tmp/build-image-layer.sh deps # Build all apps diff --git a/README.md b/README.md index 4e525bac..13db7d0c 100644 --- a/README.md +++ b/README.md @@ -2,12 +2,12 @@

Revolt Backend - [![Stars](https://img.shields.io/github/stars/revoltchat/backend?style=flat-square&logoColor=white)](https://github.com/revoltchat/backend/stargazers) - [![Forks](https://img.shields.io/github/forks/revoltchat/backend?style=flat-square&logoColor=white)](https://github.com/revoltchat/backend/network/members) - [![Pull Requests](https://img.shields.io/github/issues-pr/revoltchat/backend?style=flat-square&logoColor=white)](https://github.com/revoltchat/backend/pulls) - [![Issues](https://img.shields.io/github/issues/revoltchat/backend?style=flat-square&logoColor=white)](https://github.com/revoltchat/backend/issues) - [![Contributors](https://img.shields.io/github/contributors/revoltchat/backend?style=flat-square&logoColor=white)](https://github.com/revoltchat/backend/graphs/contributors) - [![License](https://img.shields.io/github/license/revoltchat/backend?style=flat-square&logoColor=white)](https://github.com/revoltchat/backend/blob/main/LICENSE) + [![Stars](https://img.shields.io/github/stars/upryzing/parrot?style=flat-square&logoColor=white)](https://github.com/upryzing/parrot/stargazers) + [![Forks](https://img.shields.io/github/forks/upryzing/parrot?style=flat-square&logoColor=white)](https://github.com/upryzing/parrot/network/members) + [![Pull Requests](https://img.shields.io/github/issues-pr/upryzing/parrot?style=flat-square&logoColor=white)](https://github.com/upryzing/parrot/pulls) + [![Issues](https://img.shields.io/github/issues/upryzing/parrot?style=flat-square&logoColor=white)](https://github.com/upryzing/parrot/issues) + [![Contributors](https://img.shields.io/github/contributors/upryzing/parrot?style=flat-square&logoColor=white)](https://github.com/upryzing/parrot/graphs/contributors) + [![License](https://img.shields.io/github/license/upryzing/parrot?style=flat-square&logoColor=white)](https://github.com/upryzing/parrot/blob/main/LICENSE)

The services and libraries that power the Revolt service.

@@ -23,8 +23,8 @@ The services and libraries that power the Revolt service.
| `core/result` | [crates/core/result](crates/core/result) | Core: Result and Error types | ![Crates.io Version](https://img.shields.io/crates/v/upryzing-result) ![Crates.io Version](https://img.shields.io/crates/msrv/upryzing-result) ![Crates.io Version](https://img.shields.io/crates/size/upryzing-result) ![Crates.io License](https://img.shields.io/crates/l/upryzing-result) | | `delta` | [crates/delta](crates/delta) | REST API server | ![License](https://img.shields.io/badge/license-AGPL--3.0--or--later-blue) | | `bonfire` | [crates/bonfire](crates/bonfire) | WebSocket events server | ![License](https://img.shields.io/badge/license-AGPL--3.0--or--later-blue) | -| `services/january` | [crates/services/january](crates/services/january) | Proxy server | ![License](https://img.shields.io/badge/license-AGPL--3.0--or--later-blue) | -| `services/autumn` | [crates/services/autumn](crates/services/autumn) | File server | ![License](https://img.shields.io/badge/license-AGPL--3.0--or--later-blue) | +| `services/dove` | [crates/services/dove](crates/services/dove) | Proxy server | ![License](https://img.shields.io/badge/license-AGPL--3.0--or--later-blue) | +| `services/pigeon` | [crates/services/pigeon](crates/services/pigeon) | File server | ![License](https://img.shields.io/badge/license-AGPL--3.0--or--later-blue) | | `bindings/node` | [crates/bindings/node](crates/bindings/node) | Node.js bindings for the Revolt software | ![License](https://img.shields.io/badge/license-AGPL--3.0--or--later-blue) | @@ -39,7 +39,7 @@ Rust 1.76 or higher. ## Development Guide -Before contributing, make yourself familiar with [our contribution guidelines](https://developers.revolt.chat/contrib.html) and the [technical documentation for this project](https://revoltchat.github.io/backend/). +Before contributing, make yourself familiar with [our contribution guidelines](https://developers.revolt.chat/contrib.html) and the [technical documentation for this project](https://upryzing.github.io/backend/). Before getting started, you'll want to install: @@ -53,17 +53,17 @@ Before getting started, you'll want to install: As a heads-up, the development environment uses the following ports: -| Service | Port | -| ------------------------- | :------------: | -| MongoDB | 14017 | -| Redis | 14079 | -| MinIO | 14009 | -| Maildev | 14025
14080 | -| Revolt Web App | 14701 | -| `crates/delta` | 14702 | -| `crates/bonfire` | 14703 | -| `crates/services/autumn` | 14704 | -| `crates/services/january` | 14705 | +| Service | Port | +| ------------------------ | :------------: | +| MongoDB | 14017 | +| Redis | 14079 | +| MinIO | 14009 | +| Maildev | 14025
14080 | +| Revolt Web App | 14701 | +| `crates/delta` | 14702 | +| `crates/bonfire` | 14703 | +| `crates/services/pigeon` | 14704 | +| `crates/services/dove` | 14705 | Now you can clone and build the project: diff --git a/Revolt.toml b/Revolt.toml index 5d3ffe30..9f56b0fb 100644 --- a/Revolt.toml +++ b/Revolt.toml @@ -18,8 +18,8 @@ redis = "redis://127.0.0.1:14079/" app = "http://local.revolt.chat:14701" api = "http://local.revolt.chat:14702" events = "ws://local.revolt.chat:14703" -autumn = "http://local.revolt.chat:14704" -january = "http://local.revolt.chat:14705" +pigeon = "http://local.revolt.chat:14704" +dove = "http://local.revolt.chat:14705" voso_legacy = "" voso_legacy_ws = "" @@ -42,8 +42,8 @@ endpoint = "http://127.0.0.1:14009" # S3 region name region = "minio" # S3 protocol key ID -access_key_id = "minioautumn" +access_key_id = "miniopigeon" # S3 protocol access key -secret_access_key = "minioautumn" +secret_access_key = "miniopigeon" # Bucket to upload to by default default_bucket = "upryzing-uploads" diff --git a/compose.yml b/compose.yml index 98d567d8..70d66981 100644 --- a/compose.yml +++ b/compose.yml @@ -18,8 +18,8 @@ services: image: minio/minio command: server /data environment: - MINIO_ROOT_USER: minioautumn - MINIO_ROOT_PASSWORD: minioautumn + MINIO_ROOT_USER: miniopigeon + MINIO_ROOT_PASSWORD: miniopigeon volumes: - ./.data/minio:/data ports: @@ -35,7 +35,7 @@ services: entrypoint: > /bin/sh -c " while ! /usr/bin/mc ready minio; do - /usr/bin/mc config host add minio http://minio:9000 minioautumn minioautumn; + /usr/bin/mc config host add minio http://minio:9000 miniopigeon miniopigeon; echo 'Waiting minio...' && sleep 1; done; /usr/bin/mc mb minio/upryzing-uploads; diff --git a/crates/bindings/node/package.json b/crates/bindings/node/package.json index 600e72fa..a2e1299f 100644 --- a/crates/bindings/node/package.json +++ b/crates/bindings/node/package.json @@ -20,16 +20,16 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/revoltchat/backend" + "url": "git+https://github.com/upryzing/parrot" }, "keywords": [ "revolt", "chat" ], "bugs": { - "url": "https://github.com/revoltchat/backend/issues" + "url": "https://github.com/upryzing/parrot/issues" }, - "homepage": "https://github.com/revoltchat/backend#readme", + "homepage": "https://github.com/upryzing/parrot#readme", "dependencies": { "revolt-api": "^0.7.15" } diff --git a/crates/core/config/Revolt.toml b/crates/core/config/Revolt.toml index 4c6d6bd3..7b7d02c6 100644 --- a/crates/core/config/Revolt.toml +++ b/crates/core/config/Revolt.toml @@ -15,8 +15,8 @@ redis = "redis://redis/" app = "http://local.revolt.chat" api = "http://local.revolt.chat/api" events = "ws://local.revolt.chat/ws" -autumn = "http://local.revolt.chat/autumn" -january = "http://local.revolt.chat/january" +pigeon = "http://local.revolt.chat/pigeon" +dove = "http://local.revolt.chat/dove" voso_legacy = "" voso_legacy_ws = "" @@ -146,9 +146,9 @@ path_style_buckets = false # S3 region name region = "minio" # S3 protocol key ID -access_key_id = "minioautumn" +access_key_id = "miniopigeon" # S3 protocol access key -secret_access_key = "minioautumn" +secret_access_key = "miniopigeon" # Bucket to upload to by default default_bucket = "upryzing-uploads" diff --git a/crates/core/config/src/lib.rs b/crates/core/config/src/lib.rs index fcc25a33..1ed5901c 100644 --- a/crates/core/config/src/lib.rs +++ b/crates/core/config/src/lib.rs @@ -84,8 +84,8 @@ pub struct Hosts { pub app: String, pub api: String, pub events: String, - pub autumn: String, - pub january: String, + pub pigeon: String, + pub dove: String, pub voso_legacy: String, pub voso_legacy_ws: String, } diff --git a/crates/core/database/src/tasks/process_embeds.rs b/crates/core/database/src/tasks/process_embeds.rs index 05f5c932..f0f1e8cf 100644 --- a/crates/core/database/src/tasks/process_embeds.rs +++ b/crates/core/database/src/tasks/process_embeds.rs @@ -55,7 +55,7 @@ pub async fn worker(db: Database) { let config = config().await; let embeds = generate( task.content, - &config.hosts.january, + &config.hosts.dove, config.features.limits.global.message_embeds, semaphore, ) @@ -132,7 +132,7 @@ pub async fn generate( return Err(create_error!(LabelMe)); } - // TODO: batch request to january + // TODO: batch request to dove let mut tasks = Vec::new(); for link in links { diff --git a/crates/core/models/src/v0/channels.rs b/crates/core/models/src/v0/channels.rs index 5678efef..a3f6a6cb 100644 --- a/crates/core/models/src/v0/channels.rs +++ b/crates/core/models/src/v0/channels.rs @@ -195,7 +195,7 @@ auto_derived!( /// Icon /// - /// Provide an Autumn attachment Id. + /// Provide an Pigeon attachment ID. #[cfg_attr(feature = "validator", validate(length(min = 1, max = 128)))] pub icon: Option, diff --git a/crates/core/models/src/v0/embeds.rs b/crates/core/models/src/v0/embeds.rs index 4944afae..47f589c2 100644 --- a/crates/core/models/src/v0/embeds.rs +++ b/crates/core/models/src/v0/embeds.rs @@ -144,7 +144,7 @@ auto_derived!( /// Description of text embed #[serde(skip_serializing_if = "Option::is_none")] pub description: Option, - /// ID of uploaded autumn file + /// ID of uploaded pigeon file #[serde(skip_serializing_if = "Option::is_none")] pub media: Option, /// CSS Colour diff --git a/crates/core/models/src/v0/messages.rs b/crates/core/models/src/v0/messages.rs index a9aa7711..4dd6c98f 100644 --- a/crates/core/models/src/v0/messages.rs +++ b/crates/core/models/src/v0/messages.rs @@ -447,7 +447,7 @@ impl PushNotification { let icon = if let Some(author) = &author { if let Some(avatar) = author.avatar() { - format!("{}/avatars/{}", config.hosts.autumn, avatar) + format!("{}/avatars/{}", config.hosts.pigeon, avatar) } else { format!("{}/users/{}/default_avatar", config.hosts.api, author.id()) } @@ -458,7 +458,7 @@ impl PushNotification { let image = msg.attachments.as_ref().and_then(|attachments| { attachments .first() - .map(|v| format!("{}/attachments/{}", config.hosts.autumn, v.id)) + .map(|v| format!("{}/attachments/{}", config.hosts.pigeon, v.id)) }); let body = if let Some(ref sys) = msg.system { diff --git a/crates/delta/src/routes/customisation/emoji_create.rs b/crates/delta/src/routes/customisation/emoji_create.rs index 8e76faca..02d65d5f 100644 --- a/crates/delta/src/routes/customisation/emoji_create.rs +++ b/crates/delta/src/routes/customisation/emoji_create.rs @@ -9,7 +9,7 @@ use rocket::{serde::json::Json, State}; /// # Create New Emoji /// -/// Create an emoji by its Autumn upload id. +/// Create an emoji by its Pigeon upload ID. #[openapi(tag = "Emojis")] #[put("/emoji/", data = "")] pub async fn create_emoji( diff --git a/crates/delta/src/routes/root.rs b/crates/delta/src/routes/root.rs index 3abd2521..f8fd45b0 100644 --- a/crates/delta/src/routes/root.rs +++ b/crates/delta/src/routes/root.rs @@ -42,9 +42,9 @@ pub struct RevoltFeatures { /// Whether this server is invite only pub invite_only: bool, /// File server service configuration - pub autumn: Feature, + pub pigeon: Feature, /// Proxy service configuration - pub january: Feature, + pub dove: Feature, /// Voice server configuration pub voso: VoiceFeature, } @@ -98,13 +98,13 @@ pub async fn root() -> Result> { }, email: !config.api.smtp.host.is_empty(), invite_only: config.api.registration.invite_only, - autumn: Feature { - enabled: !config.hosts.autumn.is_empty(), - url: config.hosts.autumn, + pigeon: Feature { + enabled: !config.hosts.pigeon.is_empty(), + url: config.hosts.pigeon, }, - january: Feature { - enabled: !config.hosts.january.is_empty(), - url: config.hosts.january, + dove: Feature { + enabled: !config.hosts.dove.is_empty(), + url: config.hosts.dove, }, voso: VoiceFeature { enabled: !config.hosts.voso_legacy.is_empty(), diff --git a/crates/services/january/Cargo.toml b/crates/services/dove/Cargo.toml similarity index 100% rename from crates/services/january/Cargo.toml rename to crates/services/dove/Cargo.toml diff --git a/crates/services/january/Dockerfile b/crates/services/dove/Dockerfile similarity index 87% rename from crates/services/january/Dockerfile rename to crates/services/dove/Dockerfile index 663024b7..1ec7557f 100644 --- a/crates/services/january/Dockerfile +++ b/crates/services/dove/Dockerfile @@ -1,5 +1,5 @@ # Build Stage -FROM ghcr.io/revoltchat/base:latest AS builder +FROM ghcr.io/upryzing/base:latest AS builder # Bundle Stage FROM gcr.io/distroless/cc-debian12:nonroot diff --git a/crates/services/january/src/api.rs b/crates/services/dove/src/api.rs similarity index 96% rename from crates/services/january/src/api.rs rename to crates/services/dove/src/api.rs index ca94028c..89c9c241 100644 --- a/crates/services/january/src/api.rs +++ b/crates/services/dove/src/api.rs @@ -19,7 +19,7 @@ pub async fn router() -> Router { /// Successful root response #[derive(Serialize, Debug, ToSchema)] pub struct RootResponse { - january: &'static str, + dove: &'static str, version: &'static str, } @@ -36,7 +36,7 @@ static CRATE_VERSION: &str = env!("CARGO_PKG_VERSION"); )] async fn root() -> Json { Json(RootResponse { - january: "Hello, I am a media proxy server!", + dove: "Hello, I am a media proxy server!", version: CRATE_VERSION, }) } diff --git a/crates/services/january/src/main.rs b/crates/services/dove/src/main.rs similarity index 100% rename from crates/services/january/src/main.rs rename to crates/services/dove/src/main.rs diff --git a/crates/services/january/src/requests.rs b/crates/services/dove/src/requests.rs similarity index 99% rename from crates/services/january/src/requests.rs rename to crates/services/dove/src/requests.rs index c9159392..b6f6b8a4 100644 --- a/crates/services/january/src/requests.rs +++ b/crates/services/dove/src/requests.rs @@ -253,7 +253,7 @@ impl Request { if RE_USER_AGENT_SPOOFING_AS_DISCORD.is_match(url) { "Mozilla/5.0 (compatible; Discordbot/2.0; +https://discordapp.com)" } else { - "Mozilla/5.0 (compatible; January/2.0; +https://github.com/revoltchat/backend)" + "Mozilla/5.0 (compatible; Dove/2.0; +https://github.com/upryzing/parrot)" }, ) .header("Accept-Language", "en-US,en;q=0.5") diff --git a/crates/services/january/src/website_embed.rs b/crates/services/dove/src/website_embed.rs similarity index 100% rename from crates/services/january/src/website_embed.rs rename to crates/services/dove/src/website_embed.rs diff --git a/crates/services/autumn/Cargo.toml b/crates/services/pigeon/Cargo.toml similarity index 100% rename from crates/services/autumn/Cargo.toml rename to crates/services/pigeon/Cargo.toml diff --git a/crates/services/autumn/Dockerfile b/crates/services/pigeon/Dockerfile similarity index 87% rename from crates/services/autumn/Dockerfile rename to crates/services/pigeon/Dockerfile index 88c926f2..2113d269 100644 --- a/crates/services/autumn/Dockerfile +++ b/crates/services/pigeon/Dockerfile @@ -1,5 +1,5 @@ # Build Stage -FROM ghcr.io/revoltchat/base:latest AS builder +FROM ghcr.io/upryzing/base:latest AS builder # Bundle Stage FROM gcr.io/distroless/cc-debian12:nonroot diff --git a/crates/services/autumn/src/api.rs b/crates/services/pigeon/src/api.rs similarity index 99% rename from crates/services/autumn/src/api.rs rename to crates/services/pigeon/src/api.rs index 1759723d..56c31867 100644 --- a/crates/services/autumn/src/api.rs +++ b/crates/services/pigeon/src/api.rs @@ -74,7 +74,7 @@ async fn retrieve_file_by_hash(hash: &FileHash) -> Result> { /// Successful root response #[derive(Serialize, Debug, ToSchema)] pub struct RootResponse { - autumn: &'static str, + pigeon: &'static str, version: &'static str, } @@ -91,7 +91,7 @@ static CRATE_VERSION: &str = env!("CARGO_PKG_VERSION"); )] async fn root() -> Json { Json(RootResponse { - autumn: "Hello, I am a file server!", + pigeon: "Hello, I am a file server!", version: CRATE_VERSION, }) } diff --git a/crates/services/autumn/src/clamav.rs b/crates/services/pigeon/src/clamav.rs similarity index 100% rename from crates/services/autumn/src/clamav.rs rename to crates/services/pigeon/src/clamav.rs diff --git a/crates/services/autumn/src/exif.rs b/crates/services/pigeon/src/exif.rs similarity index 100% rename from crates/services/autumn/src/exif.rs rename to crates/services/pigeon/src/exif.rs diff --git a/crates/services/autumn/src/main.rs b/crates/services/pigeon/src/main.rs similarity index 100% rename from crates/services/autumn/src/main.rs rename to crates/services/pigeon/src/main.rs diff --git a/crates/services/autumn/src/metadata.rs b/crates/services/pigeon/src/metadata.rs similarity index 100% rename from crates/services/autumn/src/metadata.rs rename to crates/services/pigeon/src/metadata.rs diff --git a/crates/services/autumn/src/mime_type.rs b/crates/services/pigeon/src/mime_type.rs similarity index 100% rename from crates/services/autumn/src/mime_type.rs rename to crates/services/pigeon/src/mime_type.rs diff --git a/scripts/build-image-layer.sh b/scripts/build-image-layer.sh index 5043b09b..1aa25929 100644 --- a/scripts/build-image-layer.sh +++ b/scripts/build-image-layer.sh @@ -32,13 +32,13 @@ deps() { crates/core/permissions/src \ crates/core/presence/src \ crates/core/result/src \ - crates/services/autumn/src \ - crates/services/january/src + crates/services/pigeon/src \ + crates/services/dove/src echo 'fn main() { panic!("stub"); }' | tee crates/bonfire/src/main.rs | tee crates/delta/src/main.rs | - tee crates/services/autumn/src/main.rs | - tee crates/services/january/src/main.rs + tee crates/services/pigeon/src/main.rs | + tee crates/services/dove/src/main.rs echo '' | tee crates/bindings/node/src/lib.rs | tee crates/core/config/src/lib.rs | diff --git a/scripts/publish-debug-image.sh b/scripts/publish-debug-image.sh index 1f0eb2e4..6042f3f4 100755 --- a/scripts/publish-debug-image.sh +++ b/scripts/publish-debug-image.sh @@ -20,17 +20,17 @@ fi TAG=$1-debug echo "Building images, will tag for ghcr.io with $TAG!" -docker build -t ghcr.io/revoltchat/base:latest -f Dockerfile.useCurrentArch . -docker build -t ghcr.io/revoltchat/server:$TAG - < crates/delta/Dockerfile -docker build -t ghcr.io/revoltchat/bonfire:$TAG - < crates/bonfire/Dockerfile -docker build -t ghcr.io/revoltchat/autumn:$TAG - < crates/services/autumn/Dockerfile -docker build -t ghcr.io/revoltchat/january:$TAG - < crates/services/january/Dockerfile +docker build -t ghcr.io/upryzing/base:latest -f Dockerfile.useCurrentArch . +docker build -t ghcr.io/upryzing/server:$TAG - < crates/delta/Dockerfile +docker build -t ghcr.io/upryzing/bonfire:$TAG - < crates/bonfire/Dockerfile +docker build -t ghcr.io/upryzing/pigeon:$TAG - < crates/services/pigeon/Dockerfile +docker build -t ghcr.io/upryzing/dove:$TAG - < crates/services/dove/Dockerfile if [ "$DEBUG" = "true" ]; then git restore Cargo.toml fi -docker push ghcr.io/revoltchat/server:$TAG -docker push ghcr.io/revoltchat/bonfire:$TAG -docker push ghcr.io/revoltchat/autumn:$TAG -docker push ghcr.io/revoltchat/january:$TAG +docker push ghcr.io/upryzing/server:$TAG +docker push ghcr.io/upryzing/bonfire:$TAG +docker push ghcr.io/upryzing/pigeon:$TAG +docker push ghcr.io/upryzing/dove:$TAG