This guide is for testing and evaluation purposes only and is not intended for production deployments. Please reach out to us at support@openops.com if you’d like to learn how to set up OpenOps in a production environment.

This guide explains how to install the OpenOps Docker Compose release on a newly created EC2 instance.

It assumes you have appropriate permissions on an existing AWS account.

Initial deployment

Create a new EC2 instance

  1. On the EC2 home page, click Launch Instance:
  2. Choose a name for your instance and configure the following settings:
    • Application and OS Images (Amazon Machine Image)
      • Choose Ubuntu as the instance image, as it simplifies Docker installation. Ubuntu Server 24.04 LTS was the latest available version when this guide was written.
      • Keep 64-bit (x86) as the instance architecture.
    • Instance Type. The t3.large instance type provides decent performance. You can choose a different type according to your needs, but it’s not recommended to select a size smaller than t3.medium.
    • Key Pair. Creating a new SSH key pair is recommended but not mandatory.
    • Network Settings. Allow SSH traffic from your own IP address:
    • Configure Storage. Choose 50GB to ensure you have enough space for Docker images and databases.
  3. Launch the instance and navigate to it once it’s created by clicking on the instance ID.
  4. Configure the network settings and open the necessary ports. Under Security, click on the security group. Click Edit inbound rules, then Add rule, and add two rules:
    1. In the first rule, for Type, choose HTTP, and under Source, select My IP.
    2. In the second rule, for Type, choose SSH. Click the text box next to Source, and select the prefix list that contains the words “ec2-instance-connect”. The full name should be similar to com.amazonaws.us-east-1.ec2-instance-connect, depending on your region. This allows you to connect to the instance via AWS CloudShell. The final rules should look like this:
  5. Click Save rules to finish the configuration.

Connect to the instance with CloudShell

  1. Navigate to your EC2 instance and click Connect to open an in-browser CloudShell session.
  2. Click Connect and wait for CloudShell to initialize.

Automatically install OpenOps

Run the following command to install, configure and run OpenOps:

    curl -fsSL https://openops.sh/install | sh

Manually install OpenOps

Alternatively, you can follow the manual installation steps:

  1. Install the unzip utility:
    sudo apt install unzip
    
  2. In CloudShell, create a new directory and download the release files:
    mkdir -p openops && cd openops && \
    wget https://github.com/openops-cloud/openops/releases/download/0.2.8/openops-dc-0.2.8.zip && \
    unzip -o openops-dc-0.2.8.zip && cp --update=none .env.defaults .env
    
  3. Update the application URL to use the instance’s public IP address:
    sed -i 's/http:\/\/localhost/http:\/\/'$(wget -4qO - https://ifconfig.io/ip)'/g' .env
    
  4. Open the .env file in the OpenOps installation folder. Change the values of the following variables that represent credentials. Do it now, as you won’t be able to change these values after the initial deployment:
    • OPS_OPENOPS_ADMIN_EMAIL: the email of your OpenOps installation’s root admin account.
    • OPS_OPENOPS_ADMIN_PASSWORD: the password of your OpenOps installation’s root admin account.
    • OPS_POSTGRES_USERNAME: the username of the Postgres database that OpenOps uses.
    • OPS_POSTGRES_PASSWORD: the password of the Postgres database that OpenOps uses.
    • OPS_ANALYTICS_ADMIN_PASSWORD: the password of the OpenOps Analytics admin account (the username is hardcoded to admin).
  5. Install Docker using Snap:
    sudo snap install docker
    
  6. Pull the images and start the Docker containers:
    sudo COMPOSE_PARALLEL_LIMIT=4 docker compose pull -q && sudo docker compose up -d
    
    If you encounter a rate limit, rerun the pull command. Note that pulling images may take several minutes.

You can now access the OpenOps application by navigating to the public IP address of your EC2 instance (e.g., http://20.20.20.20). If you did not update credentials in the .env file, the default username is admin@openops.com and the password is please-change-this-password-1.

External databases

To use external PostgreSQL or Redis databases, modify the relevant variables in the .env file. You can disable the corresponding containers by adding a profile in the docker-compose.yml file:

After making changes, restart the Docker Compose containers:

sudo docker compose down && sudo docker compose up -d

Configuring TLS (HTTPS) and a custom domain

For production usage, it’s recommended to enable TLS (HTTPS). In addition to the security aspect, this also ensures that workflow templates load properly in all browsers.

TLS requires configuring a custom domain (e.g., https://openops.your-company.com) to serve your OpenOps installation instead of its public IP address.

To get a custom domain with TLS up and running, you need to set up an AWS Application Load Balancer (ALB) with a valid TLS certificate from AWS Certificate Manager (ACM), then create a new DNS record and update your OpenOps configuration.

Request an ACM certificate

  1. Open the ACM console.
  2. Request a public certificate for your domain (e.g., openops.your-company.com).
  3. Validate the domain using DNS. If you’re using Route 53, ACM can create the necessary records automatically.
  4. Wait until the certificate status changes to Issued.

Create an Application Load Balancer

Once the ALB is in place, all access should go through it — you can no longer use the EC2 public IP directly.
  1. In the EC2 > Load Balancers section, click Create Load Balancer.
  2. Choose Application Load Balancer, and configure the following:
    • Scheme: Internet-facing
    • Listeners:
      • Add a listener for HTTPS (443) using the ACM certificate.
      • Optionally, add a listener on port 80 with a rule to redirect HTTP traffic to HTTPS.
  3. Under Security Groups, create a security group that allows inbound traffic on port 443.
  4. Create a target group:
    • Target type: Instance
    • Protocol: HTTP
    • Port: 80
    • Health check path: /api/v1/health
  5. Register your EC2 instance as a target.
  6. Finish creating the ALB and wait for its status to become Active.

Create a DNS record

  1. In Route 53 (or your DNS provider), create a DNS record:
    • Name: openops.your-company.com
    • Type: A (Alias) or CNAME
    • Value: The DNS name of your ALB (for example, openops-alb-123456789.us-east-1.elb.amazonaws.com)
  2. Save and wait for DNS changes to propagate.

Update OpenOps configuration

  1. SSH into your EC2 instance or use CloudShell.
  2. Update the .env file to reflect your new domain:
    OPS_PUBLIC_URL=https://openops.your-company.com
    
  3. Restart the containers:
    sudo docker compose down && sudo docker compose up -d
    

Troubleshooting

If you encounter a 503 error:

  • Ensure you restarted Docker containers after updating .env.
  • Confirm that the ALB’s health check is configured with the correct path (/api/v1/health).
  • Make sure the EC2 instance’s security group allows traffic from the ALB.
  • Look for more cues in the Nginx container logs:
    sudo docker compose logs nginx
    

For more troubleshooting guidance, see this AWS troubleshooting guide.

Updating OpenOps to a newer version

See Updating OpenOps.

Support

Feel free to join our Slack community if you have any questions or need help with the installation.