READ ALSO: Advantages of Ubuntu VPS Servers for Your Business
What is Concourse CI?
Concourse CI is a modern, open-source continuous integration and continuous delivery (CI/CD) system designed to automate software build, test, and deployment workflows in a scalable, repeatable, and declarative manner.
🔍 Key Concepts of Concourse CI
1. Pipeline-Based
Concourse uses pipelines as the fundamental unit of automation. Pipelines are written in YAML and describe every step in the software lifecycle—from fetching code to testing, building, and deploying.
2. Containers for Everything
Every step runs in a stateless container, making builds highly reproducible and isolated. This ensures consistent environments across teams and systems.
3. Immutable and Declarative
Concourse emphasizes immutability and declarative configuration, meaning pipelines always describe what should happen, not how, and won’t carry over state from previous runs unless explicitly defined.
🧩 Core Components
Component | Description |
---|---|
Web | UI and API server, handles authentication, job scheduling, and orchestration |
Worker | Executes build tasks and steps in containers |
TSA (SSH) | Secure tunnel between web and worker nodes |
PostgreSQL | Backend database storing pipeline state and metadata |
Fly CLI | Command-line tool used to manage pipelines, log in, and trigger builds |
🚀 Why Use Concourse CI?
✅ Pros:
- Lightweight & container-native
- Built-in parallelism and task caching
- Strong GitOps support (pipelines stored as code)
- No vendor lock-in — fully open source
- Supports all languages, frameworks, and platforms
⚠️ Considerations:
- Learning curve for new users due to its unique model
- No native UI-based pipeline editor (CLI and YAML required)
- Requires PostgreSQL for operation
📌 Example Use Cases
- Continuous Integration for microservices
- Deployment pipelines to Kubernetes or cloud VMs
- Automated infrastructure testing with Terraform
- Building and publishing Docker images
🛠️ How to Install Concourse CI on Ubuntu VPS
This guide walks through installing Concourse CI on Ubuntu 22.04 or later, using a local PostgreSQL database and a single-node web + worker deployment.
📋 Prerequisites
Before you begin:
- Ubuntu 22.04+ VPS with root or sudo access
- At least 2 GB RAM, 2 CPUs, and 10 GB+ disk space
- Open TCP ports:
8080
(web UI/API),2222
(worker SSH), and5432
(PostgreSQL) - Domain name or static IP
- Install
curl
,wget
, andunzip
Update system packages
sudo apt update && sudo apt upgrade -y sudo apt install -y curl wget unzip postgresql postgresql-contrib
To install Concourse CI on Ubuntu VPS, follow the steps provided below:
-
Install and Configure PostgreSQL
Concourse uses PostgreSQL for pipeline and user data.
Create PostgreSQL database and user
sudo -u postgres psql
Then, run the following commands inside the
psql
shell:CREATE DATABASE concourse; CREATE USER concourse WITH PASSWORD 'changeme'; GRANT ALL PRIVILEGES ON DATABASE concourse TO concourse; \q
Secure PostgreSQL to listen only on localhost:
sudo sed -i "s/#listen_addresses = 'localhost'/listen_addresses = 'localhost'/" /etc/postgresql/*/main/postgresql.conf sudo systemctl restart postgresql
-
Install Concourse CI
Download the latest Concourse and Fly CLI
wget https://github.com/concourse/concourse/releases/download/v7.11.0/concourse-7.11.0-linux-amd64.tgz wget https://github.com/concourse/concourse/releases/download/v7.11.0/fly-7.11.0-linux-amd64.tgz
Extract and move binaries:
tar -xvzf concourse-7.11.0-linux-amd64.tgz sudo mv concourse /usr/local/bin/ tar -xvzf fly-7.11.0-linux-amd64.tgz sudo mv fly /usr/local/bin/
Verify installation:
concourse --version fly --version
-
Generate Keys for Concourse
Concourse uses RSA keys to secure communication between web and workers.
mkdir -p ~/concourse-keys cd ~/concourse-keys ssh-keygen -t rsa -f host_key -N '' ssh-keygen -t rsa -f worker_key -N '' cp worker_key.pub worker_key.pub cp worker_key worker_key cp host_key host_key ssh-keygen -t rsa -f session_signing_key -N ''
-
Create a Systemd Service File for Concourse
Create a new systemd service unit:
sudo nano /etc/systemd/system/concourse-web.service
Paste the following content:
[Unit] Description=Concourse CI web After=postgresql.service Requires=postgresql.service [Service] User=root Restart=always Environment=CONCOURSE_POSTGRES_HOST=127.0.0.1 Environment=CONCOURSE_POSTGRES_USER=concourse Environment=CONCOURSE_POSTGRES_PASSWORD=changeme Environment=CONCOURSE_POSTGRES_DATABASE=concourse Environment=CONCOURSE_EXTERNAL_URL=http://YOUR_DOMAIN_OR_IP:8080 Environment=CONCOURSE_SESSION_SIGNING_KEY=/root/concourse-keys/session_signing_key Environment=CONCOURSE_TSA_HOST_KEY=/root/concourse-keys/host_key Environment=CONCOURSE_TSA_AUTHORIZED_KEYS=/root/concourse-keys/worker_key.pub ExecStart=/usr/local/bin/concourse web [Install] WantedBy=multi-user.target
Replace
YOUR_DOMAIN_OR_IP
with your actual IP or domain.Then create the worker service:
sudo nano /etc/systemd/system/concourse-worker.service
Paste the following:
[Unit] Description=Concourse CI worker After=concourse-web.service Requires=concourse-web.service [Service] User=root Restart=always Environment=CONCOURSE_WORK_DIR=/opt/concourse/worker Environment=CONCOURSE_TSA_HOST=127.0.0.1:2222 Environment=CONCOURSE_TSA_PUBLIC_KEY=/root/concourse-keys/host_key.pub Environment=CONCOURSE_TSA_WORKER_PRIVATE_KEY=/root/concourse-keys/worker_key ExecStart=/usr/local/bin/concourse worker [Install] WantedBy=multi-user.target
-
Enable and Start Concourse
sudo mkdir -p /opt/concourse/worker sudo systemctl daemon-reexec sudo systemctl daemon-reload sudo systemctl enable concourse-web sudo systemctl enable concourse-worker sudo systemctl start concourse-web sudo systemctl start concourse-worker
Check status:
sudo systemctl status concourse-web sudo systemctl status concourse-worker
-
Access Concourse Web Interface
Visit:
http://YOUR_DOMAIN_OR_IP:8080
You’ll see the login prompt.
-
Use Fly CLI
Authenticate and target your Concourse instance:
fly -t main login -c http://YOUR_DOMAIN_OR_IP:8080
You can now create and upload pipelines.
-
How to Set Up SSL for Concourse CI on Ubuntu VPS
What This Guide Covers:
- Installing Nginx
- Setting up reverse proxy to Concourse on port 8080
- Securing with Let’s Encrypt SSL certificate (auto-renewed)
To set up SSL for Concourse CI on Ubuntu VPS, follow the steps below:
-
Install Nginx and Certbot
sudo apt update sudo apt install -y nginx certbot python3-certbot-nginx
-
Configure DNS (If Using a Domain)
Ensure your domain (e.g.
ci.example.com
) is pointed to your server’s IP via A record. -
Set Up Nginx Reverse Proxy
Edit (or create) a new Nginx server block:
sudo nano /etc/nginx/sites-available/concourse
Paste the following configuration:
server { listen 80; server_name ci.example.com; location / { proxy_pass http://localhost:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
Enable the site:
sudo ln -s /etc/nginx/sites-available/concourse /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginx
-
Obtain a Let’s Encrypt SSL Certificate
Replace
ci.example.com
with your actual domain name:sudo certbot --nginx -d ci.example.com
Certbot will:
- Configure HTTPS in your Nginx file
- Set up an automatic redirect from HTTP to HTTPS
- Schedule auto-renewals
-
Verify and Test
Visit:
https://ci.example.com
You should now see the secure Concourse web interface with a valid SSL certificate.
To check certificate auto-renewal:
sudo certbot renew --dry-run
-
Optional: Harden SSL
Edit your Nginx config for stronger SSL security:
ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers HIGH:!aNULL:!MD5;
-
Troubleshooting Tips
- Port 80 and 443 must be open on your firewall:
sudo ufw allow 'Nginx Full'
- If using a VPS provider firewall (like AWS security groups), ensure ports 80/443 are allowed.
-
🏁 Done!
You now have:
- A production-ready Concourse CI instance
- Secured with HTTPS
- Auto-renewing Let’s Encrypt SSL certificates
-
Optional: Clean Up
Remove downloaded tar files:
rm -f concourse-*.tgz fly-*.tgz
✅ Final Notes
- This is a single-node setup, best for small teams or dev testing
- For production: separate web/worker nodes, high availability PostgreSQL, and TLS is advised
- Store secret values using Vault, CredHub, or SSM
Conclusion
You now know how to install Concourse CI on Ubuntu VPS.