diff --git a/apps/docs/content/homepage.mdx b/apps/docs/content/homepage.mdx
index 8ea992eb..7fa5613a 100644
--- a/apps/docs/content/homepage.mdx
+++ b/apps/docs/content/homepage.mdx
@@ -31,6 +31,7 @@ export const runtimes = [
{ name: "Bun", link: "/bun/overview", icon: },
{ name: "Elixir", link: "/elixir/overview", icon: },
{ name: "Gleam", link: "/gleam/overview", icon: },
+ { name: "Ruby", link: "/ruby/overview", icon: },
{ name: "Nginx", link: "/nginx/overview", icon: },
{ name: "Static", link: "/static/overview", icon: },
]
diff --git a/apps/docs/content/ruby/how-to/build-pipeline.mdx b/apps/docs/content/ruby/how-to/build-pipeline.mdx
new file mode 100644
index 00000000..959f7302
--- /dev/null
+++ b/apps/docs/content/ruby/how-to/build-pipeline.mdx
@@ -0,0 +1,937 @@
+---
+title: Configure Your Ruby build & deploy pipeline
+description: Learn more about how you can configure your Ruby service for build & deploy pipeline.
+---
+
+import data from '@site/static/data.json';
+import UnorderedCodeList from 'docs/src/components/UnorderedCodeList';
+
+Zerops provides a customizable build and runtime environment for your Ruby application.
+
+## Add zerops.yaml to your repository
+
+Start by adding `zerops.yaml` file to the **root of your repository** and modify it to fit your application:
+
+```yaml
+zerops:
+ # define hostname of your service
+ - setup: app
+ # ==== how to build your application ====
+ build:
+ # REQUIRED. Set the base technology for the build environment:
+ base: ubuntu/ruby@4.0
+
+ # OPTIONAL. Customise the build environment by installing additional packages
+ # or tools to the base build environment.
+ # prepareCommands:
+ # - sudo apt-get update
+ # - sudo apt-get install -y some-package
+
+ # OPTIONAL. Set the env variables for the build environment.
+ # BUNDLE_PATH makes Bundler install gems into ./vendor/bundle
+ # so they can be deployed together with your application.
+ envVariables:
+ BUNDLE_PATH: vendor/bundle
+
+ # OPTIONAL. Build your application
+ buildCommands:
+ - bundle install
+
+ # REQUIRED. Select which files / folders to deploy after
+ # the build has successfully finished
+ deployFiles:
+ - ./vendor
+ - ./Gemfile
+ - ./Gemfile.lock
+ - ./config.ru
+ - ./src
+
+ # OPTIONAL. Which files / folders you want to cache for the next build.
+ # Next builds will be faster when the cache is used.
+ cache: vendor
+
+ # ==== how to run your application ====
+ run:
+ # OPTIONAL. Sets the base technology for the runtime environment:
+ base: ubuntu/ruby@4.0
+
+ # OPTIONAL. Sets the internal port(s) your app listens on:
+ ports:
+ # port number
+ - port: 8080
+
+ # OPTIONAL. Customise the runtime Ruby environment by installing additional
+ # dependencies to the base Ruby runtime environment.
+ # prepareCommands:
+ # - sudo apt-get update
+ # - sudo apt-get install -y some-package
+
+ # OPTIONAL. Run one or more commands each time a new runtime container
+ # is started or restarted. These commands are triggered before
+ # your Ruby application is started.
+ # initCommands:
+ # - rm -rf ./cache
+
+ # OPTIONAL. Set the env variables for the runtime environment.
+ envVariables:
+ BUNDLE_PATH: vendor/bundle
+
+ # REQUIRED. Your Ruby application start command
+ start: bundle exec puma -p 8080 -b tcp://0.0.0.0
+```
+
+The top-level element is always `zerops`.
+
+### Setup
+
+The first element `setup` contains the **hostname** of your service. A runtime service with the same hostname must exist in Zerops.
+Zerops supports the definition of multiple runtime services in a single `zerops.yaml`. This is useful when you use a monorepo. Just add multiple setup elements in your `zerops.yaml`:
+
+```yaml
+zerops:
+ # definition for app service
+ - setup: app
+ # optional
+ build: ...
+ # optional
+ deploy: ...
+ # required
+ run: ...
+
+ # definition for api service
+ - setup: api
+ # optional
+ build: ...
+ # optional
+ deploy: ...
+ # required
+ run: ...
+```
+
+Each service configuration contains at least the `run` section. Optional `build` and `deploy` sections can be added to further customize your process.
+
+## Build pipeline configuration
+
+### base
+
+_REQUIRED._ Sets the base technology for the build environment.
+
+Following options are available for Ruby builds:
+
+
+
+The base value always includes the operating system prefix (`ubuntu/` or `alpine/`). The `@latest` tag is an alias that points to Ruby 4.0.
+
+```yaml
+zerops:
+ # hostname of your service
+ - setup: app
+ # ==== how to build your application ====
+ build:
+ # REQUIRED. Sets the base technology for the build environment:
+ base: ubuntu/ruby@4.0
+ ...
+```
+
+
+ The base build environment contains {data.ubuntu.default} or {data.alpine.default} (depending on the chosen base prefix), the selected
+ major version of Ruby, Zerops command line tool, `gem`, `bundler` and `git` tools. A full native-extension
+ toolchain (gcc, make, libpq-dev, libyaml-dev, libffi-dev, etc.) is included, so gems with C extensions build out of the box.
+
+
+:::info
+You can change the base environment when you need to. Just simply modify the `zerops.yaml` in your repository.
+:::
+
+If you need to install more technologies to the build environment, set multiple values as a yaml array. For example:
+
+```yaml
+zerops:
+ # hostname of your service
+ - setup: app
+ # ==== how to build your application ====
+ build:
+ # REQUIRED. Sets the base technology for the build environment:
+ base:
+ - ubuntu/ruby@4.0
+ prepareCommands:
+ - zsc add nodejs@latest
+ ...
+```
+
+See the full list of supported [build base environments](/zerops-yaml/base-list#runtime-services).
+
+To customise your build environment use the [prepareCommands](#preparecommands) attribute.
+
+:::note
+Modifying the base technology will invalidate your build cache. See our [Build Cache Documentation](/features/build-cache) for more details about cache invalidation.
+:::
+
+### os
+
+The operating system for the build environment is selected as part of the [base](#base) value. There is no separate `os` attribute for Ruby, choose one of:
+
+- `ubuntu/ruby@4.0`
+- `alpine/ruby@4.0`
+
+We are currently using following os version:
+
+- {data.alpine.default}
+- {data.ubuntu.default}
+
+:::caution
+The os version is fixed and cannot be customised.
+:::
+
+:::note
+Changing the OS prefix of your base will invalidate your build cache. See our [Build Cache Documentation](/features/build-cache) for details about cache behavior.
+:::
+
+### prepareCommands
+
+_OPTIONAL._ Customises the build environment by installing additional dependencies or tools to the base build environment.
+
+The base build environment contains:
+
+- {data.ubuntu.default} or {data.alpine.default} (depending on the chosen base prefix)
+- selected version of Ruby defined in the [base](#base) attribute
+- [Zerops command line tool](/references/cli)
+- `gem`, `bundler` and `git` tools
+
+To install additional packages or tools add one or more prepare commands:
+
+```yaml
+zerops:
+ # hostname of your service
+ - setup: app
+ # ==== how to build your application ====
+ build:
+ # REQUIRED. Set the base technology for the build environment:
+ base: ubuntu/ruby@4.0
+
+ # OPTIONAL. Customise the build environment by installing additional packages
+ # or tools to the base build environment.
+ prepareCommands:
+ - sudo apt-get update
+ - sudo apt-get install -y some-package
+ ...
+```
+
+On the `alpine/ruby@4.0` base use `sudo apk add --no-cache some-package` instead.
+
+When the first build is triggered, Zerops will
+
+1. create a build container
+2. download your application code from your repository
+3. run the prepare commands in the defined order
+
+The application code is available in `/build/source` before the prepare commands are triggered, so you can use any file from your repository in your prepare commands (e.g. a configuration file). The commands themselves run in the `/home/zerops` directory.
+
+:::note
+These commands are skipped when using cached environment. Modifying `prepareCommands` will invalidate your build cache. See our [Build Cache Documentation](/features/build-cache) for details about cache invalidation.
+:::
+
+#### Command exit code
+
+If any command fails, it returns an exit code other than 0 and the build is canceled. Read the [build log](/ruby/how-to/logs#build-log) to troubleshoot the error. If the command ends successfully, it returns the exit code 0 and Zerops triggers the following command. When all prepare commands are finished, your custom build environment is ready for the build phase.
+
+#### Single or separated shell instances
+
+You can configure your prepare commands to be run in a single shell instance or multiple shell instances. The format is identical to [build commands](#buildcommands).
+
+### buildCommands
+
+_OPTIONAL._ Defines build commands.
+
+```yaml
+zerops:
+ # hostname of your service
+ - setup: app
+ # ==== how to build your application ====
+ build:
+ # REQUIRED. Set the base technology for the build environment:
+ base: ubuntu/ruby@4.0
+
+ # OPTIONAL. Set the env variables for the build environment:
+ envVariables:
+ BUNDLE_PATH: vendor/bundle
+
+ # OPTIONAL. Build your application
+ buildCommands:
+ - bundle install
+ ...
+```
+
+Build commands are optional. Zerops triggers each command in the defined order in a dedicated build container, running from the `/build/source` directory.
+
+With `BUNDLE_PATH` set to `vendor/bundle`, Bundler installs your gems into the `vendor` folder inside your project, so they can be deployed together with your application and used at runtime via `bundle exec`.
+
+Before the build commands are triggered the build container contains:
+
+1. base environment defined by the [base](#base) attribute
+2. optional customisation of the base environment defined in the [prepareCommands](#preparecommands) attribute
+3. your application code
+
+#### Run build commands as a single shell instance
+
+Use following syntax to run all commands in the same environment context. For example, if one command changes the current directory, the next command continues in that directory. When one command creates an environment variable, the next command can access it.
+
+```yaml
+buildCommands:
+ - |
+ bundle install
+ bundle exec rake assets:precompile
+```
+
+#### Run build commands as a separate shell instances
+
+When the following syntax is used, each command is triggered in a separate environment context. For example, each shell instance starts in the home directory again. When one command creates an environment variable, it won't be available for the next command.
+
+```yaml
+buildCommands:
+ - bundle install
+ - bundle exec rake assets:precompile
+```
+
+#### Command exit code
+
+If any command fails, it returns an exit code other than 0 and the build is canceled. Read the [build log](/ruby/how-to/logs#build-log) to troubleshoot the error. If the error log doesn't contain any specific error message, try to run your build with the --verbose option.
+
+```yaml
+buildCommands:
+ - bundle install --verbose
+```
+
+If the command ends successfully, it returns the exit code 0 and Zerops triggers the following command. When all `buildCommands` are finished, the application build is completed and ready for the deploy phase.
+
+### deployFiles
+
+_REQUIRED._ Selects which files or folders will be deployed after the build has successfully finished. To filter out specific files or folders, use `.deployignore` file.
+
+```yaml
+# REQUIRED. Select which files / folders to deploy after
+# the build has successfully finished
+deployFiles:
+ - ./vendor
+ - ./Gemfile
+ - ./Gemfile.lock
+ - ./config.ru
+ - ./src
+```
+
+Determines files or folders produced by your build, which should be deployed to your runtime service containers.
+
+The path starts from the **root directory** of your project (the location of `zerops.yaml`). You must enclose the name in quotes if the folder or the file name contains a space.
+
+The files/folders will be placed into `/var/www` folder in runtime, e.g. `./src/assets/fonts` would result in `/var/www/src/assets/fonts`.
+
+#### Examples
+
+Deploys a folder, and a file from the project root directory:
+
+```yaml
+deployFiles:
+ - vendor
+ - Gemfile
+```
+
+Deploys the whole content of the build container:
+
+```yaml
+deployFiles: .
+```
+
+Deploys a folder, and a file in a defined path:
+
+```yaml
+deployFiles:
+ - ./path/to/file.txt
+ - ./path/to/dir/
+```
+
+#### How to use a wildcard in the path
+
+Zerops supports the `~` character as a wildcard for one or more folders in the path.
+
+Deploys all `file.txt` files that are located in any path that begins with `/path/` and ends with `/to/`
+
+```yaml
+deployFiles: ./path/~/to/file.txt
+```
+
+Deploys all folders that are located in any path that begins with `/path/to/`
+
+```yaml
+deployFiles: ./path/to/~/
+```
+
+Deploys all folders that are located in any path that begins with `/path/` and ends with `/to/`
+
+```yaml
+deployFiles: ./path/~/to/
+```
+
+:::note Example
+By default, `./src/assets/fonts` deploys to `/var/www/src/assets/fonts`, keeping the full path. Adding `~`, like `./src/assets/~fonts`, shortens it to `/var/www/fonts`
+:::
+#### .deployignore
+
+Add a `.deployignore` file to the root of your project to specify which files and folders Zerops should ignore during deploy. The syntax follows the same pattern format as `.gitignore`.
+
+To ignore a specific file or directory path, start the pattern with a forward slash (`/`). Without the leading slash, the pattern will match files with that name in any directory.
+
+:::tip
+For consistency, it's recommended to configure both your `.gitignore` and `.deployignore` files with the same patterns.
+:::
+
+Examples:
+
+```yaml title="zerops.yaml"
+zerops:
+ - setup: app
+ build:
+ deployFiles: ./
+```
+
+```text title=".deployignore"
+/src/file.txt
+```
+The example above ignores `file.txt` only in the root src directory.
+```text title=".deployignore"
+src/file.txt
+```
+This example above ignores `file.txt` in ANY directory named `src`, such as:
+- `/src/file.txt`
+- `/folder2/folder3/src/file.txt`
+- `/src/src/file.txt`
+
+:::note
+`.deployignore` file also works with `zcli service deploy` command.
+:::
+
+### cache
+
+_OPTIONAL._ Defines which files or folders will be cached for the next build.
+
+```yaml
+# OPTIONAL. Which files / folders you want to cache for the next build.
+# Next builds will be faster when the cache is used.
+cache: vendor
+```
+
+The cache attribute helps optimize build times by preserving specified files between builds. Caching the `vendor` folder means the next `bundle install` only fetches gems that changed in your `Gemfile.lock`.
+
+The cache attribute supports the [~ wildcard character](#how-to-use-a-wildcard-in-the-path).
+
+Learn more about the [build cache system](/features/build-cache) in Zerops.
+
+### envVariables
+
+_OPTIONAL._ Defines the environment variables for the build environment.
+
+Enter one or more env variables in following format:
+
+```yaml
+zerops:
+ # define hostname of your service
+ - setup: app
+ # ==== how to build your application ====
+ build:
+ base: ubuntu/ruby@4.0
+ …
+
+ # OPTIONAL. Defines the env variables for the build environment:
+ envVariables:
+ BUNDLE_PATH: vendor/bundle
+ BUNDLE_WITHOUT: development
+```
+
+Read more about [environment variables](/ruby/how-to/env-variables) in Zerops.
+
+## Runtime configuration
+
+### base
+
+_OPTIONAL._ Sets the base technology for the runtime environment.
+If you don't specify the `run.base` attribute, Zerops keeps the current Ruby version for your runtime.
+
+Following options are available for Ruby runtimes:
+
+
+
+```yaml
+zerops:
+ # hostname of your service
+ - setup: app
+ # ==== how to build your application ====
+ build:
+ # REQUIRED. Sets the base technology for the build environment:
+ base: ubuntu/ruby@4.0
+ ...
+
+ # ==== how to run your application ====
+ run:
+ # OPTIONAL. Sets the base technology for the runtime environment:
+ base: ubuntu/ruby@4.0
+ ...
+```
+
+
+ The base runtime environment contains {data.ubuntu.default} or {data.alpine.default} (depending on the chosen base prefix), the
+ selected major version of Ruby, Zerops command line tool, `gem`, `bundler` and `git` tools. A full native-extension toolchain
+ (gcc, make, libpq-dev, libyaml-dev, libffi-dev, etc.) is included, so gems with C extensions work out of the box.
+
+
+:::info
+You can change the base environment when you need to. Just simply modify the `zerops.yaml` in your repository.
+:::
+
+If you need to install more technologies to the runtime environment, set multiple values as a yaml array. For example:
+
+```yaml
+zerops:
+ # hostname of your service
+ - setup: app
+ # ==== how to build your application ====
+ build:
+ # REQUIRED. Sets the base technology for the build environment:
+ base: ubuntu/ruby@4.0
+ ...
+
+ # ==== how to run your application ====
+ run:
+ # OPTIONAL. Sets the base technology for the runtime environment:
+ base:
+ - ubuntu/ruby@4.0
+ prepareCommands:
+ - zsc add nodejs@latest
+ ...
+```
+
+See the full list of supported [run base environments](/zerops-yaml/base-list).
+
+To customise your build environment use the `prepareCommands` attribute.
+
+### os
+
+The operating system for the runtime environment is selected as part of the [base](#base-1) value. There is no separate `os` attribute for Ruby, choose one of:
+
+- `ubuntu/ruby@4.0`
+- `alpine/ruby@4.0`
+
+We are currently using following os version:
+
+- {data.alpine.default}
+- {data.ubuntu.default}
+
+:::caution
+The os version is fixed and cannot be customised.
+:::
+
+### ports
+
+_OPTIONAL._ Specifies one or more internal ports on which your application will listen.
+
+Projects in Zerops represent a group of one or more services. Services can be of different types (runtime services, databases, message brokers, object storage, etc.). All services of the same project share a **dedicated private network**. To connect to a service within the same project, just use the service hostname and its internal port.
+
+For example, to connect to a Ruby service with hostname = "app" and port = 8080 from another service of the same project, simply use `app:8080`. Read more about [how to access a Ruby service](/references/networking/internal-access#basic-service-communication).
+
+Each port has following attributes:
+
+| parameter | description |
+| ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| port | Defines the port number. You can set any port number between _10_ and _65435_. Ports outside this interval are reserved for internal Zerops systems. |
+| protocol | **Optional.** Defines the protocol. Allowed values are `TCP` or `UDP`. Default value is `TCP`. |
+| httpSupport | **Optional.** `httpSupport = true` is the default setting for TCP protocol. Set `httpSupport = false` if a web server isn't running on the port. Zerops uses this information for the configuration of [public access](/features/access). `httpSupport = true` is available only in combination with the TCP protocol. |
+
+### prepareCommands
+
+_OPTIONAL._ Customises the Ruby runtime environment by installing additional dependencies or tools to the runtime base environment.
+
+
+ The base Ruby environment contains {data.ubuntu.default} or {data.alpine.default} (depending on the chosen base prefix), the selected
+ major version of Ruby, Zerops command line tool and `gem`, `bundler` and `git` tools. To install
+ additional packages or tools add one or more prepare commands:
+
+
+```yaml
+zerops:
+ # hostname of your service
+ - setup: app
+ # ==== how to build your application ====
+ build:
+ ...
+
+ # ==== how to run your application ====
+ run:
+ # OPTIONAL. Customise the runtime environment by installing additional packages
+ # or tools to the base Ruby runtime environment.
+ prepareCommands:
+ - sudo apt-get update
+ - sudo apt-get install -y some-package
+ ...
+```
+
+On the `alpine/ruby@4.0` base use `sudo apk add --no-cache some-package` instead.
+
+When the first deploy with a defined prepare attribute is triggered, Zerops will
+
+1. create a prepare runtime container
+2. optionally: [copy selected folders or files from your build container](#copy-folders-or-files-from-your-build-container)
+3. run the `prepareCommands` commands in the defined order
+
+:::note
+`run.prepareCommands` run in the `/home/zerops` directory.
+:::
+
+#### Command exit code
+
+If any command fails, it returns an exit code other than 0 and the deploy is canceled. Read the [prepare runtime log](/ruby/how-to/logs#prepare-runtime-log) to troubleshoot the error. If the command ends successfully, it returns the exit code 0 and Zerops triggers the following command. When all `prepareCommands` commands are finished, your custom runtime environment is ready for the deploy phase.
+
+#### Cache of your custom runtime environment
+
+Some packages or tools can take a long time to install. Therefore, Zerops caches your custom runtime environment after the installation of your custom packages or tools is completed. When the second or following deploy is triggered, Zerops will use the custom runtime cache from the previous deploy if following conditions are met:
+
+1. Content of the [build.addToRunPrepare](#copy-folders-or-files-from-your-build-container) and `run.prepareCommands` attributes didn't change from the previous deploy
+2. The custom runtime cache wasn't invalidated in the Zerops GUI.
+
+To invalidate the custom runtime cache go to `yyy`
+
+{/*TODO screenshot*/}
+
+When the custom runtime cache is used, Zerops doesn't create a prepare runtime container and executes the deployment of your application directly.
+
+#### Single or separated shell instances
+
+You can configure your prepare commands to be run in a single shell instance or multiple shell instances. The format is identical to [build commands](#buildcommands).
+
+### Copy folders or files from your build container
+
+
+ The prepare runtime container contains {data.ubuntu.default} or {data.alpine.default} (depending on the chosen base prefix), the
+ selected major version of Ruby, Zerops command line tool and `gem`, `bundler` and `git` tools.
+
+
+The prepare runtime container does not contain your application code nor the built application. If you need to copy some folders or files from the build container to the runtime container (e.g. a configuration file) use the `addToRunPrepare` attribute in the [build section](#build-pipeline-configuration).
+
+```yaml
+zerops:
+ # hostname of your service
+ - setup: app
+ # ==== how to build your application ====
+ build:
+ ...
+ addToRunPrepare: ./runtime-config.yaml
+
+ # ==== how to run your application ====
+ run:
+ # OPTIONAL. Customise the runtime environment by installing additional packages
+ # or tools to the base Ruby runtime environment.
+ prepareCommands:
+ - sudo apt-get update
+ - sudo apt-get install -y some-package
+ ...
+```
+
+In the example above Zerops will copy the `runtime-config.yaml` file from your build container **after the build has finished** into the new **prepare runtime** container. The copied files and folders will be available in the `/home/zerops` folder in the new prepare runtime container before the prepare commands are triggered.
+
+### initCommands
+
+_OPTIONAL._ Defines one or more commands to be run each time a new runtime container is started or a container is restarted.
+
+```yaml
+zerops:
+ # hostname of your service
+ - setup: app
+ # ==== how to build your application ====
+ build: ...
+
+ # ==== how to run your application ====
+ run:
+ # OPTIONAL. Run one or more commands each time a new runtime container
+ # is started or restarted. These commands are triggered before
+ # your Ruby application is started.
+ initCommands:
+ - rm -rf ./cache
+```
+
+These commands are triggered in the runtime container before your Ruby application is started via the [start command](#start).
+
+:::note
+`run.initCommands` run in the `/var/www` directory.
+:::
+
+Use init commands to clean or initialise your application cache or similar operations.
+
+:::caution
+The init commands will delay the start of your application each time a new runtime container is started (including the horizontal [scaling](/ruby/how-to/scaling) or when a runtime container is restarted).
+
+Do not use the init commands for customising your runtime environment. Use the [run:prepareCommands](#preparecommands-1) attribute instead.
+:::
+
+#### Command exit code
+
+If any of the `initCommands` fails, it returns an exit code other than 0, but deploy is **not** canceled. After all init commands are finished, regardless of the status code, the application is started. Read the [runtime log](/ruby/how-to/logs#runtime-log) to troubleshoot the error.
+
+#### Single or separated shell instances
+
+You can configure your `initCommands` to be run in a single shell instance or multiple shell instances. The format is identical to [build commands](#buildcommands).
+
+### envVariables
+
+_OPTIONAL._ Defines the environment variables for the runtime environment.
+
+Enter one or more env variables in following format:
+
+```yaml
+zerops:
+ # define hostname of your service
+ - setup: app
+ # ==== how to run your application ====
+ run:
+ # OPTIONAL. Defines the env variables for the runtime environment:
+ envVariables:
+ RACK_ENV: production
+ BUNDLE_PATH: vendor/bundle
+ DB_NAME: db
+ DB_HOST: db
+ DB_USER: db
+ DB_PASS: ${db_password}
+```
+
+Read more about [environment variables](/ruby/how-to/env-variables) in Zerops.
+
+### start
+
+_REQUIRED._ Defines the start command for your Ruby application.
+
+```yaml
+zerops:
+ # hostname of your service
+ - setup: app
+ # ==== how to build your application ====
+ build: ...
+
+ # ==== how to run your application ====
+ run:
+ # REQUIRED. Your Ruby application start command
+ start: bundle exec puma -p 8080 -b tcp://0.0.0.0
+```
+
+We recommend starting your Ruby application via `bundle exec`, so the gems vendored into `vendor/bundle` during the build are used at runtime. The `-b tcp://0.0.0.0` option makes Puma bind to all interfaces, not just localhost.
+
+### health check
+
+_OPTIONAL._ Defines a health check.
+
+`healthCheck` requires either one `httpGet` object or one `exec` object.
+
+#### httpGet
+
+Configures the health check to request a local URL using a HTTP GET method.
+
+Following attributes are available:
+
+
+
+
+
Parameter
+
Description
+
+
+
+
+
port
+
Defines the port of the HTTP GET request. The readiness check will trigger a GET request on {'http://127.0.0.1:{port}/{path}'}
+
+
+
path
+
Defines the URL path of the HTTP GET request. The readiness check will trigger a GET request on {'http://127.0.0.1:{port}/{path}'}
+
+
+
host
+
Optional. The readiness check is triggered from inside of your runtime container so it always uses the localhost 127.0.0.1. If you need to add a host to the request header, specify it in the host attribute.
+
+
+
scheme
+
Optional. The readiness check is triggered from inside of your runtime container so no https is required. If your application requires a https request, set scheme: https
+
+
+
+
+**Example:**
+
+```yaml
+zerops:
+ # hostname of your service
+ - setup: app
+ # ==== how to build your application ====
+ build: ...
+
+ # ==== how to run your application ====
+ run:
+ # REQUIRED. Your Ruby application start command
+ start: bundle exec puma -p 8080 -b tcp://0.0.0.0
+
+ # OPTIONAL. Define a health check with a HTTP GET request option.
+ # Configures the check on http://127.0.0.1:80/status
+ healthCheck:
+ httpGet:
+ port: 80
+ path: /status
+```
+
+
+
+#### exec
+
+Configures the health check to run a local command.
+Following attributes are available:
+
+| Parameter | Description |
+| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **command** | Defines a local command to be run. The command has access to the same [environment variables](/ruby/how-to/create#set-secret-environment-variables) as your Ruby application. A single string is required. If you need to run multiple commands create a shell script or, use a multiline format as in the example below. |
+
+**Example:**
+
+```yaml
+zerops:
+ # hostname of your service
+ - setup: app
+ # ==== how to build your application ====
+ build: ...
+
+ # ==== how to run your application ====
+ run:
+ # REQUIRED. Your Ruby application start command
+ start: bundle exec puma -p 8080 -b tcp://0.0.0.0
+
+ # OPTIONAL. Define a health check with a shell command.
+ healthCheck:
+ exec:
+ command: |
+ touch grass
+ rm -rf life
+ mv /outside/user /home/user
+```
+
+
+
+### crontab
+
+_OPTIONAL._ Defines cron jobs.
+
+Setup cron jobs in the following format:
+
+```yaml
+zerops:
+ # define hostname of your service
+ - setup: app
+
+ # ==== how to run your application ====
+ run:
+ crontab:
+ # REQUIRED. Sets the command to execute:
+ - command: ""
+ # REQUIRED. Sets the interval time to execute:
+ timing: "0 * * * *"
+```
+
+Read more about setting up [cron](/zerops-yaml/cron) in Zerops.
+
+## Deploy configuration
+
+### readiness check
+
+_OPTIONAL._ Defines a readiness check. Read more about how the [readiness check works](/ruby/how-to/deploy-process#readiness-checks) in Zerops.
+
+`readinessCheck` requires either one `httpGet` object or one `exec` object.
+
+#### httpGet
+
+Configures the readiness check to request a local URL using a http GET method.
+
+Following attributes are available:
+
+
+
+
+
Parameter
+
Description
+
+
+
+
+
port
+
Defines the port of the HTTP GET request. The readiness check will trigger a GET request on {'http://127.0.0.1:{port}/{path}'}
+
+
+
path
+
Defines the URL path of the HTTP GET request. The readiness check will trigger a GET request on {'http://127.0.0.1:{port}/{path}'}
+
+
+
host
+
Optional. The readiness check is triggered from inside of your runtime container so it always uses the localhost 127.0.0.1. If you need to add a host to the request header, specify it in the host attribute.
+
+
+
scheme
+
Optional. The readiness check is triggered from inside of your runtime container so no https is required. If your application requires a https request, set scheme: https
+
+
+
+
+**Example:**
+
+```yaml
+zerops:
+ # hostname of your service
+ - setup: app
+ # ==== how to build your application ====
+ build: ...
+
+ # ==== how to deploy your application ====
+ deploy:
+ # OPTIONAL. Define a readiness check with a HTTP GET request option.
+ # Configures the check on http://127.0.0.1:80/status
+ readinessCheck:
+ httpGet:
+ port: 80
+ path: /status
+
+ # ==== how to run your application ====
+ run: ...
+```
+
+Read more about how the [readiness check works](/ruby/how-to/deploy-process#readiness-checks) in Zerops.
+
+#### exec
+
+Configures the readiness check to run a local command.
+Following attributes are available:
+
+| Parameter | Description |
+| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **command** | Defines a local command to be run. The command has access to the same [environment variables](/ruby/how-to/create#set-secret-environment-variables) as your Ruby application. A single string is required. If you need to run multiple commands create a shell script or, use a multiline format as in the example below. |
+
+**Example:**
+
+```yaml
+zerops:
+ # hostname of your service
+ - setup: app
+ # ==== how to build your application ====
+ build: ...
+
+ # ==== how to deploy your application ====
+ deploy:
+ # OPTIONAL. Define a readiness check with a HTTP GET request option.
+ # Configures the check on http://127.0.0.1:80/status
+ readinessCheck:
+ exec:
+ command: |
+ touch grass
+ rm -rf life
+ mv /outside/user /home/user
+```
+
+Read more about how the [readiness check works](/ruby/how-to/deploy-process#readiness-checks) in Zerops.
diff --git a/apps/docs/content/ruby/how-to/build-process.mdx b/apps/docs/content/ruby/how-to/build-process.mdx
new file mode 100644
index 00000000..0d827d12
--- /dev/null
+++ b/apps/docs/content/ruby/how-to/build-process.mdx
@@ -0,0 +1,16 @@
+---
+title: Ruby build process
+description: Learn more about build process of Ruby application
+---
+
+import { SetVar } from '@site/src/components/content/var';
+import BuildProcessContent from '@site/src/components/content/build-process.mdx';
+
+
+
+
+
+
+
+
diff --git a/apps/docs/content/ruby/how-to/controls.mdx b/apps/docs/content/ruby/how-to/controls.mdx
new file mode 100644
index 00000000..9ac96616
--- /dev/null
+++ b/apps/docs/content/ruby/how-to/controls.mdx
@@ -0,0 +1,12 @@
+---
+title: Stop, start and delete Ruby service
+description: Learn how you can stop, start and delete your Ruby service in Zerops.
+---
+
+import { SetVar } from '/src/components/content/var';
+import ServiceContent from '/src/components/content/manage.mdx';
+
+
+
+
+
diff --git a/apps/docs/content/ruby/how-to/create.mdx b/apps/docs/content/ruby/how-to/create.mdx
new file mode 100644
index 00000000..842ee6c9
--- /dev/null
+++ b/apps/docs/content/ruby/how-to/create.mdx
@@ -0,0 +1,366 @@
+---
+title: Create a Ruby service in Zerops
+description: Learn how you can create a Ruby service in Zerops.
+---
+
+import Image from '/src/components/Image';
+import data from '@site/static/data.json';
+import UnorderedList from '@site/src/components/UnorderedList';
+import ResourceTable from '/src/components/ResourceTable';
+
+Zerops provides a powerful Ruby runtime service with extensive build support. The Ruby runtime is highly scalable and customizable to suit your development and production needs. With just a few clicks or commands, you can have a production-ready Ruby environment up and running in no time.
+
+## Create a Ruby service using Zerops GUI
+
+First, set up a project in the Zerops GUI. Then go to the project dashboard page and choose **Add new service** in the left menu under the **Services** section. Pick **Ruby** from the list of runtime services, choose a version and operating system (Ubuntu or Alpine), set a hostname and confirm to create the service.
+
+### Choose a Ruby version
+
+Zerops supports the following Ruby versions:
+
+
+
+The service type is always specified together with the operating system, e.g. `ubuntu/ruby@4.0` or `alpine/ruby@4.0`. The `@latest` tag (e.g. `ubuntu/ruby@latest`) is an alias that points to Ruby 4.0.
+
+The Ruby runtime images include a full native-extension toolchain (gcc, make, libpq-dev, libyaml-dev, libffi-dev, etc.), so gems with C extensions build out of the box.
+
+:::info
+You can easily [upgrade](/ruby/how-to/upgrade) the major version at any time later.
+:::
+
+### Set a hostname
+
+Enter a unique service identifier like "app", "cache", "gui", etc. Duplicate services with the same name within the same project are not allowed.
+
+#### Limitations:
+
+- Maximum 25 characters
+- Must contain only lowercase ASCII letters (a-z) or numbers (0-9)
+
+:::caution
+The hostname is fixed after the service is created and cannot be changed later.
+:::
+
+### Set secret environment variables
+
+Add environment variables with sensitive data, such as passwords, tokens, salts, certificates, etc. These will be securely saved inside Zerops and added to your runtime service upon start.
+
+Setting secret environment variables is optional. You can always set them later in the Zerops GUI.
+
+Read more about the [different types of environment variables](/ruby/how-to/env-variables#service-env-variables) in Zerops.
+
+import { SetVar } from '/src/components/content/var';
+import AutoScalingSection from '/src/components/content/create-scaling.mdx';
+
+
+
+
+
+
+## Create a Ruby service using zCLI
+
+zCLI is the Zerops command-line tool. To create a new Ruby service via the command line, follow these steps:
+
+1. [Install & setup zCLI](/references/cli)
+2. [Create a project description file](/ruby/how-to/create#create-a-project-description-file)
+3. [Create a project with a Ruby and PostgreSQL service](#full-example)
+
+### Create a project description file
+
+Zerops uses a YAML format to describe the project infrastructure.
+
+#### Basic example:
+
+Create a directory called `my-project`. Inside the `my-project` directory, create a `description.yaml` file with the following content:
+```yaml
+# basic project data
+project:
+ # project name
+ name: my-project
+# array of project services
+services:
+ - # service name
+ hostname: app
+ # service type and version number in {os}/ruby@{version} format
+ type: ubuntu/ruby@4.0
+ # defines the minimum number of containers for horizontal autoscaling
+ minContainers: 1
+ # defines the maximum number of containers for horizontal autoscaling. Max value = 6.
+ maxContainers: 6
+ # optional: create env variables
+ envSecrets:
+ S3_ACCESS_KEY_ID: 'P8cX1vVVb'
+ S3_ACCESS_SECRET: 'ogFthuiLYki8XoL73opSCQ'
+```
+
+The yaml file describes your future project infrastructure. The project will contain one Ruby version 4.0 service with default [auto scaling](/ruby/how-to/scaling) configuration. Hostname will be set to "app", the internal port(s) the service listens on will be defined later in the [zerops.yaml](/ruby/how-to/build-pipeline#ports). Following secret env variables will be configured:
+
+```env
+S3_ACCESS_KEY_ID="P8cX1vVVb"
+S3_ACCESS_SECRET="ogFthuiLYki8XoL73opSCQ"
+```
+
+#### Full example:
+
+Create a directory my-project. Create an description.yaml file inside the my-project directory with following content:
+
+```yaml
+# basic project data
+project:
+ # project name
+ name: my-project
+ # optional: project description
+ description: A project with a Ruby and PostgreSQL database
+ # optional: project tags
+ tags:
+ - DEMO
+ - ZEROPS
+# array of project services
+services:
+ - # service name
+ hostname: app
+ # service type and version number in {os}/ruby@{version} format
+ type: ubuntu/ruby@4.0
+ # optional: vertical auto scaling customization
+ verticalAutoscaling:
+ cpuMode: DEDICATED
+ minCpu: 2
+ maxCpu: 5
+ minRam: 2
+ maxRam: 24
+ minDisk: 6
+ maxDisk: 50
+ startCpuCoreCount: 3
+ minFreeRamGB: 0.5
+ minFreeRamPercent: 20
+ # defines the minimum number of containers for horizontal autoscaling. Max value = 6.
+ minContainers: 2
+ # defines the maximum number of containers for horizontal autoscaling. Max value = 6.
+ maxContainers: 4
+ # optional: create env variables
+ envSecrets:
+ S3_ACCESS_KEY_ID: 'P8cX1vVVb'
+ S3_ACCESS_SECRET: 'ogFthuiLYki8XoL73opSCQ'
+ - # second service hostname
+ hostname: db
+ # service type and version number in postgresql@{version} format
+ type: postgresql@16
+ # mode of operation "HA"/"non_HA"
+ mode: NON_HA
+```
+
+The yaml file describes your future project infrastructure. The project will contain a Ruby service and a [PostgreSQL](/postgresql/overview) service.
+
+Ruby service with "app" hostname, the internal port(s) the service listens on will be defined later in the [zerops.yaml](/ruby/how-to/build-pipeline#ports). Ruby service will run on version 4.0 with a custom vertical and horizontal scaling. Following secret env variables will be configured:
+
+```env
+S3_ACCESS_KEY_ID="P8cX1vVVb"
+S3_ACCESS_SECRET="ogFthuiLYki8XoL73opSCQ"
+```
+
+The hostname of the PostgreSQL service will be set to "db". The [single container](/features/scaling#single-container-mode)(/features/scaling#deployment-modes-databases-and-shared-storage) mode will be chosen and the default auto [scaling configuration](/postgresql/how-to/scale#configure-scaling) will be set.
+
+#### Description of description.yaml parameters
+
+The `project:` section is required. Only one project can be defined.
+
+| Parameter | Description | Limitations |
+| --------------- | ------------------------------------------------------------------------------------------------------------------------------- | ----------------------- |
+| **name** | The name of the new project. Duplicates are allowed. | |
+| **description** | **Optional.** Description of the new project. | Maximum 255 characters. |
+| **tags** | **Optional.** One or more string tags. Tags do not have a functional meaning, they only provide better orientation in projects. |
+
+At least one service in `services:` section is required. You can create a project with multiple services. The example above contains Ruby and PostgreSQL services but you can create a `description.yaml` with your own combination of [services](/features/infrastructure).
+
+
+
+
+
Parameter
+
Description
+
+
+
+
+
+ hostname
+
+
+ The unique service identifier.
+
+
duplicate services with the same name in the same project are forbidden
+
maximum 25 characters
+
must contain only lowercase ASCII letters (a-z) or numbers (0-9)
+
+
+
+
+
+ type
+
+
+ Specifies the service type and version.
+
+ See what [Ruby service types](/references/import-yaml/type-list#runtime-services) are currently supported.
+
+
+
+
+ verticalAutoscaling
+
+
+ Optional. Defines custom vertical auto scaling parameters.
+ All verticalAutoscaling attributes are optional. Not specified
+ attributes will be set to their default values.
+
+
+
+
+ - cpuMode
+
+
+ Optional. Accepts `SHARED`, `DEDICATED` values. Default is `SHARED`
+
+
+
+
+ - minCpu/maxCpu
+
+
+ Optional. Set the minCpu or maxCpu in CPU cores (integer).
+
+
+
+
+ - minRam/maxRam
+
+
+ Optional. Set the minRam or maxRam in GB (float).
+
+
+
+
+ - minDisk/maxDisk
+
+
+ Optional. Set the minDisk or maxDisk in GB (float).
+
+
+
+
+ minContainers
+
+
+ Optional. Default = 1. Defines the minimum number of containers
+ for horizontal autoscaling.
+
+ Limitations:
+
+ Current maximum value = 10.
+
+
+
+
+ maxContainers
+
+
+ Defines the maximum number of containers for horizontal autoscaling.
+
+ Limitations:
+
+ Current maximum value = 10.
+
+
+
+
+ envSecrets
+
+
+ Optional. Defines one or more secret env variables as a key value
+ map. See env variable restrictions.
+
+
+
+
+
+### Create a project based on the description.yaml
+
+When you have your `description.yaml` ready, use the `zcli project project-import` command to create a new project and the service infrastructure.
+
+```sh
+Usage:
+ zcli project project-import importYamlPath [flags]
+
+Flags:
+ -h, --help Help for the project import command.
+ --org-id string If you have access to more than one organization, you must specify the org ID for which the
+ project is to be created.
+ --working-dir string Sets a custom working directory. Default working directory is the current directory. (default "./")
+```
+
+Zerops will create a project and one or more services based on the `description.yaml` content.
+
+Maximum size of the `description.yaml` file is 100 kB.
+
+You don't specify the project name in the `zcli project project-import` command, because the project name is defined in the `description.yaml`.
+
+If you have access to more than one client, you must specify the client ID for which the project is to be created. The `clientID` is located in the Zerops GUI under the client name on the project dashboard page.
+
+
+
+
+### Add Ruby service to an existing project
+
+#### Example:
+
+Create a directory `my-project` if it doesn't exist. Create an `import.yaml` file inside the `my-project` directory with following content:
+
+```yaml
+# basic project data
+project:
+ # project name
+ name: my-project
+# array of project services
+services:
+ - # service name
+ hostname: app
+ # service type and version number in {os}/ruby@{version} format
+ type: ubuntu/ruby@4.0
+ # defines the minimum number of containers for horizontal autoscaling
+ minContainers: 1
+ # defines the maximum number of containers for horizontal autoscaling. Max value = 6.
+ maxContainers: 6
+ # optional: create env variables
+ envSecrets:
+ S3_ACCESS_KEY_ID: 'P8cX1vVVb'
+ S3_ACCESS_SECRET: 'ogFthuiLYki8XoL73opSCQ'
+```
+
+The yaml file describes the list of one or more services that you want to add to your existing project. In the example above, one Ruby service version 4.0 with default [auto scaling](/ruby/how-to/scaling) configuration will be added to your project. Hostname of the new service will be set to `app`. Following secret env variables will be configured:
+
+```env
+S3_ACCESS_KEY_ID="P8cX1vVVb"
+S3_ACCESS_SECRET="ogFthuiLYki8XoL73opSCQ"
+```
+
+The content of the `services:` section of `import.yaml` is identical to the project description file. The `import.yaml` never contains the `project:` section because the project already exists.
+
+When you have your `import.yaml` ready, use the `zcli project service-import` command to add one or more services to your existing Zerops project.
+
+```sh
+Usage:
+ zcli project service-import importYamlPath [flags]
+
+Flags:
+ -h, --help Help for the project service import command.
+ -P, --project-id string If you have access to more than one project, you must specify the project ID for which the
+ command is to be executed.
+```
+
+zCLI commands are interactive, when you press enter after `zcli project service-import importYamlPath`, you will be given a list of your projects to choose from.
+
+Maximum size of the import.yaml file is 100 kB.
diff --git a/apps/docs/content/ruby/how-to/customize-runtime.mdx b/apps/docs/content/ruby/how-to/customize-runtime.mdx
new file mode 100644
index 00000000..55e328e1
--- /dev/null
+++ b/apps/docs/content/ruby/how-to/customize-runtime.mdx
@@ -0,0 +1,36 @@
+---
+title: Customise Ruby runtime environment
+description: Learn how you can customise your Ruby runtime environment in Zerops.
+---
+
+import data from '@site/static/data.json';
+import { SetVar } from '@site/src/components/content/var';
+import CustomizeRuntimeContent from '@site/src/components/content/customize-runtime.mdx';
+
+
+
+
+
+
+
+System packages for processing: When your app processes images, videos, or files (requiring packages like sudo apt-get install -y imagemagick on Ubuntu or sudo apk add --no-cache imagemagick on Alpine)',
+ 'Native gem dependencies: When a gem links against a system library that isn\'t included in the default environment',
+ 'Different base OS: When you need Alpine instead of Ubuntu (or vice versa) for specific compatibility requirements, selected via the base prefix (ubuntu/ruby@4.0 or alpine/ruby@4.0)'
+]} />
+
+
+
+
diff --git a/apps/docs/content/ruby/how-to/deploy-process.mdx b/apps/docs/content/ruby/how-to/deploy-process.mdx
new file mode 100644
index 00000000..9aea2dce
--- /dev/null
+++ b/apps/docs/content/ruby/how-to/deploy-process.mdx
@@ -0,0 +1,12 @@
+---
+title: Ruby Deploy process
+description: More about how Ruby deploy process works in Zerops.
+---
+
+import { SetVar } from '/src/components/content/var';
+import DeployProcessContent from '/src/components/content/deploy-process.mdx';
+
+
+
+
+
diff --git a/apps/docs/content/ruby/how-to/env-variables.mdx b/apps/docs/content/ruby/how-to/env-variables.mdx
new file mode 100644
index 00000000..68d93358
--- /dev/null
+++ b/apps/docs/content/ruby/how-to/env-variables.mdx
@@ -0,0 +1,14 @@
+---
+title: How to set and use environment variables in Ruby service
+description: Learn how you can setup and use environment variables in a ruby service in Zerops.
+---
+
+import { SetVar } from '/src/components/content/var';
+import EnvVariablesContent from '/src/components/content/env-variables.mdx';
+
+
+
+
+
+
+
diff --git a/apps/docs/content/ruby/how-to/filebrowser.mdx b/apps/docs/content/ruby/how-to/filebrowser.mdx
new file mode 100644
index 00000000..a8563e22
--- /dev/null
+++ b/apps/docs/content/ruby/how-to/filebrowser.mdx
@@ -0,0 +1,11 @@
+---
+title: Browse container files
+description: Browsing files on your container using file browser in Zerops.
+---
+
+import { SetVar } from '@site/src/components/content/var';
+import FileBrowserContent from '@site/src/components/content/file-browser.mdx';
+
+
+
+
diff --git a/apps/docs/content/ruby/how-to/logs.mdx b/apps/docs/content/ruby/how-to/logs.mdx
new file mode 100644
index 00000000..605dc0aa
--- /dev/null
+++ b/apps/docs/content/ruby/how-to/logs.mdx
@@ -0,0 +1,11 @@
+---
+title: Setup & access Ruby logs
+description: Learn how you can setup & access Ruby logs in Zerops.
+---
+
+import { SetVar } from '@site/src/components/content/var';
+import LogsContent from '@site/src/components/content/logs.mdx';
+
+
+
+
diff --git a/apps/docs/content/ruby/how-to/scaling.mdx b/apps/docs/content/ruby/how-to/scaling.mdx
new file mode 100644
index 00000000..4682a0a6
--- /dev/null
+++ b/apps/docs/content/ruby/how-to/scaling.mdx
@@ -0,0 +1,12 @@
+---
+title: How Zerops scales Ruby
+description: Get to know how Zerops scales your Ruby service.
+---
+
+import { SetVar } from '/src/components/content/var';
+import ScalingContent from '/src/components/content/scaling.mdx';
+
+
+
+
+
diff --git a/apps/docs/content/ruby/how-to/shared-storage.mdx b/apps/docs/content/ruby/how-to/shared-storage.mdx
new file mode 100644
index 00000000..9e2529a8
--- /dev/null
+++ b/apps/docs/content/ruby/how-to/shared-storage.mdx
@@ -0,0 +1,14 @@
+---
+title: Create shared storage service for Ruby
+description: Learn how to create shared storage which you can use with your Ruby service in Zerops.
+---
+
+import data from '@site/static/data.json';
+import { SetVar } from '/src/components/content/var';
+import SharedStorageContent from '/src/components/content/shared-storage.mdx';
+
+
+
+
+
+
diff --git a/apps/docs/content/ruby/how-to/trigger-pipeline.mdx b/apps/docs/content/ruby/how-to/trigger-pipeline.mdx
new file mode 100644
index 00000000..4c34b3b7
--- /dev/null
+++ b/apps/docs/content/ruby/how-to/trigger-pipeline.mdx
@@ -0,0 +1,12 @@
+---
+title: Trigger Ruby build & deploy pipeline
+description: Learn how to trigger build & deploy pipeline in Ruby service in Zerops.
+---
+
+import { SetVar } from '/src/components/content/var';
+import TriggerPipelineContent from '/src/components/content/trigger-pipeline.mdx';
+
+
+
+
+
diff --git a/apps/docs/content/ruby/how-to/upgrade.mdx b/apps/docs/content/ruby/how-to/upgrade.mdx
new file mode 100644
index 00000000..2dd3b983
--- /dev/null
+++ b/apps/docs/content/ruby/how-to/upgrade.mdx
@@ -0,0 +1,12 @@
+---
+title: How to upgrade the Ruby version
+description: Learn how to upgrade your Ruby service's version
+---
+
+import { SetVar } from '/src/components/content/var';
+import VersionUpgradeContent from '/src/components/content/upgrade.mdx';
+
+
+
+
+
diff --git a/apps/docs/content/ruby/overview.mdx b/apps/docs/content/ruby/overview.mdx
new file mode 100644
index 00000000..18af8f7d
--- /dev/null
+++ b/apps/docs/content/ruby/overview.mdx
@@ -0,0 +1,204 @@
+---
+title: Ruby Getting Started
+description: Learn about working with Ruby with ease in Zerops.
+---
+
+import DocCardList from '@theme/DocCardList';
+import Icons from '@theme/Icon';
+import LargeCardList from '@site/src/components/LargeCardList';
+import LargeCard from '@site/src/components/LargeCard';
+import CustomCard from '@site/src/components/CustomCard';
+
+[Ruby ↗](https://www.ruby-lang.org/en/) is a dynamic, object-oriented programming language with a focus on simplicity and programmer happiness.
+
+As said, there is no need for coding yet, we have created a [Github repository ↗](https://github.com/zerops-recipe-apps/ruby-hello-world-app), a **_recipe_**, containing a simple Ruby (Sinatra) web application served by Puma. The repo will be used as a source from which the app will be built.
+
+1. Log in/sign up to [Zerops GUI ↗](https://app.zerops.io)
+
+
+2. In the **Projects** box click on **Import a project** and paste in the following YAML config:
+
+```yaml
+project:
+ name: recipe-ruby
+ tags:
+ - zerops-recipe
+
+services:
+ - hostname: app
+ type: ubuntu/ruby@4.0
+ zeropsSetup: prod
+ enableSubdomainAccess: true
+ buildFromGit: https://github.com/zerops-recipe-apps/ruby-hello-world-app
+
+ - hostname: db
+ type: postgresql@16
+ mode: NON_HA
+ priority: 1
+```
+
+3. Click on **Import project** and wait until all pipelines have finished.
+
+**That's it, your application is now up and running! :star: Let's check it works:**
+
+1. A _subdomain_ should have been enabled and visible in the project's **IP addressed & Public Routing Overview** box. Its format should look similar to this `https://app-808-8080.prg1.zerops.app`.
+2. Click or the `subdomain` URL to open it in a browser and you should see
+
+```
+{"type":"ruby","greeting":"Hello from Zerops!","status":{"database":"OK"}}
+```
+
+:::tip
+Do you have any questions? Check the step-by-step tutorial, browse the documentation and join our **[Discord](https://discord.com/invite/WDvCZ54)** community to get help from our team and other members.
+:::
+
+## How to start
+
+It doesn't matter whether it's your first curious introduction to Zerops, you have already mastered the basics and are looking for a tiny detail or inspiration. Below, choose a section that fits your needs:
+
+
+
+## Feature Highlights
+
+
+
+{" "}
+
+
+
+## When in doubt, reach out
+
+Don't know how to start or got stuck during the process? You might not be the first one, visit the FAQ section to find out.
+
+In case you haven't found an answer (and also if you have), we and our community are looking forward to hearing from you on Discord.
+
+Have you build something that others might find useful? Don't hesitate to share your knowledge!
+
+
+
+## Popular Guides
+
+
diff --git a/apps/docs/sidebars.js b/apps/docs/sidebars.js
index 85d904d0..9df06910 100644
--- a/apps/docs/sidebars.js
+++ b/apps/docs/sidebars.js
@@ -309,6 +309,15 @@ module.exports = {
},
className: 'homepage-sidebar-item service-sidebar-item',
},
+ {
+ type: 'ref',
+ id: 'ruby/overview',
+ label: 'Ruby',
+ customProps: {
+ sidebar_icon: 'ruby',
+ },
+ className: 'homepage-sidebar-item service-sidebar-item',
+ },
{
type: 'ref',
id: 'nginx/overview',
@@ -3213,6 +3222,131 @@ module.exports = {
],
},
],
+ ruby: [
+ {
+ type: 'ref',
+ id: 'homepage',
+ label: 'Back to home',
+ customProps: {
+ sidebar_is_back_link: true,
+ sidebar_icon: 'back-arrow',
+ },
+ },
+ {
+ type: 'doc',
+ id: 'ruby/overview',
+ label: 'Ruby',
+ customProps: {
+ sidebar_is_title: true,
+ sidebar_icon: 'ruby',
+ },
+ },
+ {
+ type: 'category',
+ label: 'Management',
+ collapsible: false,
+ customProps: {
+ sidebar_is_group_headline: true,
+ },
+ items: [
+ {
+ type: 'doc',
+ id: 'ruby/how-to/create',
+ label: 'Create Ruby service',
+ },
+ {
+ type: 'doc',
+ id: 'ruby/how-to/upgrade',
+ label: 'Upgrade Ruby service',
+ },
+ {
+ type: 'doc',
+ id: 'ruby/how-to/controls',
+ label: 'Stop, start & delete Ruby runtime service',
+ },
+ ],
+ },
+ {
+ type: 'category',
+ label: 'Configuration & Environment',
+ collapsible: false,
+ customProps: {
+ sidebar_is_group_headline: true,
+ },
+ items: [
+ {
+ type: 'doc',
+ id: 'ruby/how-to/env-variables',
+ label: 'Manage environment variables',
+ },
+ {
+ type: 'doc',
+ id: 'ruby/how-to/customize-runtime',
+ label: 'Customize Ruby runtime',
+ },
+ {
+ type: 'doc',
+ id: 'ruby/how-to/scaling',
+ label: 'Scale Ruby runtime service',
+ },
+ ],
+ },
+ {
+ type: 'category',
+ label: 'Build & Deployment',
+ collapsible: false,
+ customProps: {
+ sidebar_is_group_headline: true,
+ },
+ items: [
+ {
+ type: 'doc',
+ id: 'ruby/how-to/build-pipeline',
+ label: 'Configure build & deploy pipeline',
+ },
+ {
+ type: 'doc',
+ id: 'ruby/how-to/trigger-pipeline',
+ label: 'Trigger build pipeline',
+ },
+ {
+ type: 'doc',
+ id: 'ruby/how-to/build-process',
+ label: 'Build process',
+ },
+ {
+ type: 'doc',
+ id: 'ruby/how-to/deploy-process',
+ label: 'Deploy process',
+ },
+ ],
+ },
+ {
+ type: 'category',
+ label: 'Maintenance & Monitoring',
+ collapsible: false,
+ customProps: {
+ sidebar_is_group_headline: true,
+ },
+ items: [
+ {
+ type: 'doc',
+ id: 'ruby/how-to/logs',
+ label: 'Setup & access logs',
+ },
+ {
+ type: 'doc',
+ id: 'ruby/how-to/filebrowser',
+ label: 'Browse container files',
+ },
+ {
+ type: 'doc',
+ id: 'ruby/how-to/shared-storage',
+ label: 'Connect / disconnect shared storage',
+ },
+ ],
+ },
+ ],
elixir: [
{
type: 'ref',
diff --git a/apps/docs/src/theme/Icon/Ruby/index.tsx b/apps/docs/src/theme/Icon/Ruby/index.tsx
new file mode 100644
index 00000000..857d7819
--- /dev/null
+++ b/apps/docs/src/theme/Icon/Ruby/index.tsx
@@ -0,0 +1,47 @@
+import { IconProps } from '@medusajs/icons/dist/types';
+import clsx from 'clsx';
+import React from 'react';
+
+const IconRuby = (props: IconProps) => {
+ return (
+
+ );
+};
+
+export default IconRuby;
diff --git a/apps/docs/src/theme/Icon/index.tsx b/apps/docs/src/theme/Icon/index.tsx
index 7a52209d..d69ec8ad 100644
--- a/apps/docs/src/theme/Icon/index.tsx
+++ b/apps/docs/src/theme/Icon/index.tsx
@@ -144,6 +144,7 @@ import IconDeno from './Deno';
import IconBun from './Bun';
import IconGleam from './Gleam';
import IconElixir from './Elixir';
+import IconRuby from './Ruby';
import IconQdrant from './Qdrant';
import IconNats from './Nats';
import IconKafka from './Kafka';
@@ -316,6 +317,7 @@ export default {
bun: IconBun,
gleam: IconGleam,
elixir: IconElixir,
+ ruby: IconRuby,
qdrant: IconQdrant,
nats: IconNats,
kafka: IconKafka,
diff --git a/apps/docs/static/data.json b/apps/docs/static/data.json
index 9dfbb987..a1e48e87 100644
--- a/apps/docs/static/data.json
+++ b/apps/docs/static/data.json
@@ -130,18 +130,18 @@
"readable": ["3"]
},
"ruby": {
- "default": "3.4",
+ "default": "4.0",
"base": [
- ["ruby@3.4", "ruby@latest"],
- ["ruby@3.3"],
- ["ruby@3.2"]
+ ["alpine/ruby@4.0", "ubuntu/ruby@4.0", "alpine/ruby@latest", "ubuntu/ruby@latest"],
+ ["alpine/ruby@3.4", "ubuntu/ruby@3.4"],
+ ["alpine/ruby@3.3", "ubuntu/ruby@3.3"]
],
"import": [
- ["ruby@3.4"],
- ["ruby@3.3"],
- ["ruby@3.2"]
+ ["alpine/ruby@4.0", "ubuntu/ruby@4.0"],
+ ["alpine/ruby@3.4", "ubuntu/ruby@3.4"],
+ ["alpine/ruby@3.3", "ubuntu/ruby@3.3"]
],
- "readable": ["3.4", "3.3", "3.2"]
+ "readable": ["4.0", "3.4", "3.3"]
},
"rust": {
"default": "1.86",