# How to Deploy OpenSRE to Railway with Specific Project and Service Names

> Deploy OpenSRE to Railway using the opensre deploy command with specific project and service names. This guide simplifies your deployment process.

- Repository: [Tracer/opensre](https://github.com/Tracer-Cloud/opensre)
- Tags: how-to-guide
- Published: 2026-04-18

---

**Use the `opensre deploy railway` command with the `--project` and `--service` flags to target specific Railway resources.**

OpenSRE is an open-source SRE platform developed by Tracer-Cloud. When you deploy OpenSRE to Railway, you can specify exact project and service names using CLI flags to ensure your deployment lands in the correct infrastructure context. This guide walks through the exact commands, source code implementation, and configuration steps needed to deploy with precision.

## Prerequisites for Railway Deployment

Before running the deploy command, ensure you have the following configured:

- **Railway CLI** installed globally (`npm install -g @railway/cli`)
- **Active authentication** with Railway (`railway login`)
- **Database resources** created in your target project (Postgres and Redis instances with connection strings available as `DATABASE_URI` and `REDIS_URI`)
- **Environment variables** copied from `.env.example` to `.env` and filled with your Railway-specific values

## Deploy Command Syntax

### Command Structure

The deployment command follows this structure:

```bash
opensre deploy railway [--project <PROJECT_NAME>] [--service <SERVICE_NAME>]

```

### Flag Definitions

- **`--project`** (`project_name`): The name of the Railway project you want to link to. If provided, the CLI executes `railway link <project>` before deployment.
- **`--service`** (`service_name`): The name of the specific Railway service that will host OpenSRE. If provided, the CLI executes `railway up --service <service>` to target that specific service.

## How the CLI Handles Project and Service Names

### Command Parsing

The flags are defined in [`app/cli/commands/deploy.py`](https://github.com/Tracer-Cloud/opensre/blob/main/app/cli/commands/deploy.py) at lines 271-272 using Click decorators:

```python
@click.option("--project", "project_name", default=None, help="Railway project name.")
@click.option("--service", "service_name", default=None, help="Railway service name.")
def deploy_railway(project_name: Optional[str], service_name: Optional[str], ...):
    result = deploy_to_railway(
        project_name=project_name,
        service_name=service_name,
        auth_detail=auth_detail,
    )

```

### Deployment Execution

The core logic resides in [`app/cli/deploy.py`](https://github.com/Tracer-Cloud/opensre/blob/main/app/cli/deploy.py) at lines 125-132 within the `deploy_to_railway` function:

- If `project_name` is supplied, the CLI runs `railway link <project>` to associate the local repository with that specific project.
- If `service_name` is supplied, the CLI runs `railway up --service <service>` to ensure the deployment occurs on the designated service rather than the default.

Error handling for missing CLI tools or authentication issues is implemented at lines 155-168 in the same file.

## Complete Deployment Workflow

### Environment Configuration

Before deploying, configure your environment variables using the template in `.env.example` (lines 178-180):

```bash
cp .env.example .env

# Edit .env to include:

# DATABASE_URI=postgres://...

# REDIS_URI=redis://...

```

### Verification Steps

After deployment, verify the service status using the Remote Ops provider:

```bash
opensre remote ops status

```

According to `docs/remote-runtime-investigation.mdx` (line 41), Railway is currently the only supported provider for remote operations.

## Summary

- Use `opensre deploy railway --project <NAME> --service <NAME>` to target specific Railway resources.
- The `--project` flag links to a specific Railway project via `railway link`.
- The `--service` flag deploys to a specific service via `railway up --service`.
- Configuration is handled through environment variables defined in `.env.example`.
- Verify deployments using `opensre remote ops status`.

## Frequently Asked Questions

### What if I don't specify a project name?

If you omit the `--project` flag, the CLI will use the currently linked Railway project in your working directory. If no project is linked, the deployment will fail with an authentication or context error.

### Can I deploy to multiple services at once?

No, the current implementation in [`app/cli/deploy.py`](https://github.com/Tracer-Cloud/opensre/blob/main/app/cli/deploy.py) processes a single service name per command execution. To deploy to multiple services, you must run the `opensre deploy railway` command multiple times with different `--service` values.

### How do I update environment variables after deployment?

Update your local `.env` file with the new values, then run the deploy command again with the appropriate `--project` and `--service` flags. The Railway platform will detect the changes and redeploy the service with the updated environment configuration.

### Is authentication handled automatically?

The CLI checks for Railway CLI installation and active authentication at the start of the deployment process (lines 155-168 in [`app/cli/deploy.py`](https://github.com/Tracer-Cloud/opensre/blob/main/app/cli/deploy.py)). If you are not logged in, the command will exit with a clear error message instructing you to run `railway login` first.