OpenRefine
Overview
OpenRefine is a free, open source power tool for working with messy data. You import tabular data (CSV, TSV, Excel, JSON, XML) into a project workbench. You then explore it with facets and filters, clean and normalise values with GREL, Jython or Clojure expressions, cluster near-duplicate entries, and reconcile your data against external sources such as Wikidata, all through a browser-based interface. Every change is recorded as a reproducible operation history. OpenRefine is released under the BSD 3-Clause licence.
This SecureAnyCloud image runs OpenRefine 3.10 on Ubuntu 24.04 on Azure. OpenRefine assumes a single trusted local user and ships with no built-in authentication of its own, so the image never exposes it directly. The server is bound to loopback only (127.0.0.1:3333, headless) and fronted by nginx on port 80 with HTTP Basic Auth, so the workbench is never reachable without a credential.
At first boot, openrefine-firstboot.service generates a unique per-VM Basic Auth password, reloads nginx, proves an authenticated round trip, and writes the password to /root/openrefine-credentials.txt (mode 0600, root only). No default login is baked into the image.
What you get:
- OpenRefine 3.10.1 (official Linux distribution), pinned and sha256-verified, installed under
/opt/openrefine - OpenJDK 17 headless runtime (OpenRefine requires Java 11 to 21), with the JVM heap pinned to a conservative 2 GB maximum so that OpenRefine fits alongside the OS and nginx on a
Standard_B2s openrefine.service, a systemd unit that runs the workbench as the unprivilegedopenrefineuser, bound to loopback with a hardened service sandboxopenrefine-firstboot.service, a systemd one-shot that generates the per-VM HTTP Basic Auth password, reloads nginx, proves an authenticated round trip and writes/root/openrefine-credentials.txt- nginx on port 80, reverse proxying to the loopback-bound OpenRefine listener, with HTTP Basic Auth and an unauthenticated
/healthzfor load balancer probes - The OpenRefine project workbench, reachable at
http://<vm-ip>/after you sign in - Ubuntu 24.04 LTS base, patched at build time
- The Azure Linux Agent for cloud integration and SSH key injection
- 24/7 SecureAnyCloud support with a guaranteed 24 hour response SLA
Prerequisites
You need an active Azure subscription, an SSH public key, a VNet with a subnet in the target region, and a subscription to the OpenRefine 3.10 on Ubuntu 24.04 listing on Azure Marketplace.
Recommended virtual machine size: Standard_B2s (2 vCPU, 4 GB RAM) for evaluation and small to medium datasets. For large datasets and heavier transforms, use Standard_D2s_v5 or larger and raise the JVM heap in /opt/openrefine/openrefine-3.10.1/refine.ini (REFINE_MEMORY).
Deploy from the Azure Portal
Search the Azure Marketplace for OpenRefine, select the SecureAnyCloud publisher entry, and click Create.
Configure the network security group (NSG) to allow TCP 22 from your management IP and TCP 80 from your client IPs. The OpenRefine server is bound to loopback, so only nginx on port 80 is exposed.
HTTP Basic Auth protects the workbench. For any deployment beyond a private network, put a TLS-terminating reverse proxy in front of port 80 so that credentials and data are encrypted in transit.
Deploy from the Azure CLI
RG="openrefine-prod"; LOCATION="eastus"; VM_NAME="openrefine-01" IMAGE_URN="sac1647283583153:openrefine:default:latest" SSH_KEY="$(cat ~/.ssh/id_rsa.pub)" az group create --name "$RG" --location "$LOCATION" az network vnet create -g "$RG" --name or-vnet --address-prefix 10.90.0.0/16 --subnet-name or-subnet --subnet-prefix 10.90.1.0/24 az network nsg create -g "$RG" --name or-nsg az network nsg rule create -g "$RG" --nsg-name or-nsg --name allow-ssh --priority 100 \
--source-address-prefixes "<your-mgmt-cidr>" --destination-port-ranges 22 --access Allow --protocol Tcp az network nsg rule create -g "$RG" --nsg-name or-nsg --name allow-http --priority 110 \
--source-address-prefixes "<your-client-cidr>" --destination-port-ranges 80 --access Allow --protocol Tcp
# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:openrefine:default:latest
az vm create -g "$RG" --name "$VM_NAME" --image "$IMAGE_URN" \
--size Standard_B2s --storage-sku StandardSSD_LRS \
--admin-username azureuser --ssh-key-values "$SSH_KEY" \
--vnet-name or-vnet --subnet or-subnet --nsg or-nsg --public-ip-sku StandardConnect over SSH
ssh azureuser@<vm-ip>openrefine.service and nginx.service start automatically. On the first boot, openrefine-firstboot.service generates the per-VM Basic Auth password.
Verify the OpenRefine service
sudo systemctl is-active openrefine.service nginx.service
sudo test -f /var/lib/sac/data/openrefine-firstboot.done && echo FIRSTBOOT_DONEBoth services should report active, and the first-boot sentinel should be present.
Inspect the listeners and runtime
The OpenRefine server is bound to 127.0.0.1:3333, and nginx serves it on port 80. Nothing but nginx listens on a public interface. The JVM heap is pinned in refine.ini.
sudo ss -tln | grep -E ':80 |:3333' grep -E 'REFINE_MEMORY|REFINE_MIN_MEMORY' /opt/openrefine/openrefine-3.10.1/refine.iniThe output shows nginx on port 80, OpenRefine on loopback port 3333, and the pinned 2 GB maximum heap.
Retrieve the access password
The image generates the per-VM HTTP Basic Auth password at first boot and stores it in a root-only file. Read it with sudo:
sudo cat /root/openrefine-credentials.txtThe file lists the sign-in user, the per-VM password and the endpoint URLs:
OPENREFINE_HTTP_USER=admin OPENREFINE_BASIC_AUTH_PASSWORD=<OPENREFINE_BASIC_AUTH_PASSWORD> OPENREFINE_URL=http://<vm-ip>/ OPENREFINE_HEALTHZ=http://<vm-ip>/healthz OPENREFINE_LOCAL_HTTP=http://127.0.0.1:3333/Verify access control over HTTP
OpenRefine is reachable only through the authenticated nginx proxy. Confirm that an unauthenticated request is rejected, that the per-VM password works and that the command API responds:
PW=$(sudo grep '^OPENREFINE_BASIC_AUTH_PASSWORD=' /root/openrefine-credentials.txt | cut -d= -f2-)
curl -s -o /dev/null -w 'no creds: %{http_code}\n' http://127.0.0.1/
curl -s -o /dev/null -w 'workbench index: %{http_code}\n' -u "admin:$PW" http://127.0.0.1/
curl -s -u "admin:$PW" http://127.0.0.1/command/core/get-versionThe unauthenticated request returns 401. The authenticated workbench index returns 200, and the command API returns the OpenRefine version JSON. The unauthenticated /healthz endpoint stays open for load balancer probes.
Open the workbench in a browser
Open http://<vm-ip>/ from your workstation. This assumes the NSG allows TCP 80.
Your browser prompts for HTTP Basic Auth. Sign in with user admin and the per-VM password from /root/openrefine-credentials.txt. OpenRefine opens on the Create Project screen, where you choose a data source.
Create a project by importing data
On This Computer, choose a data file (CSV, TSV, Excel, JSON or XML) and click Next. OpenRefine shows a parsing preview where you confirm the column separator, header rows and value types.
Click Create Project. Your data loads into the project workbench as a grid of rows and columns.
Explore the data grid
The workbench shows your data as an editable grid. Each column header has a dropdown menu of operations. The Facet / Filter panel on the left is where you slice and clean the data.
OpenRefine is built to fix inconsistencies like those in a sample import of customer contacts: mixed spellings of the same country, and inconsistent casing and whitespace.
Facet and filter
Open a column's dropdown menu and choose Facet, Text facet to see every distinct value in that column with a count. In the sample import, the country column reveals eight variants of what should be a handful of countries (United Kingdom, uk, U.K., France, FR, Germany, germany, Deutschland).
Click Cluster to let OpenRefine group near-duplicate values automatically, or click a value to filter the grid to just those rows.
Clean and transform with GREL
Open a column menu and choose Edit cells, Transform to run a GREL expression across every cell, with a live before-and-after preview. For example, value.trim().toTitlecase() normalises casing and strips stray whitespace.
OpenRefine records transforms in the operation history, so you can undo them or replay the whole cleanup on a fresh dataset.
Export the cleaned data
When the data is clean, use the Export menu at the top right to write it out as CSV, TSV, Excel, JSON, HTML or a custom template. You can also export the operation history as JSON, so the same cleanup can be applied to future imports.
Projects are stored in the workspace at /var/lib/openrefine.
Server components
These are the key paths on the VM:
- OpenRefine install: /opt/openrefine/openrefine-3.10.1
- Launcher: /opt/openrefine/openrefine-3.10.1/refine
- Heap config: /opt/openrefine/openrefine-3.10.1/refine.ini
- Workspace and projects: /var/lib/openrefine
- Systemd unit: /etc/systemd/system/openrefine.service
- First-boot script: /usr/local/sbin/openrefine-firstboot.sh
- First-boot service: /etc/systemd/system/openrefine-firstboot.service
- Credentials file: /root/openrefine-credentials.txt (mode 0600)
- First-boot sentinel: /var/lib/sac/data/openrefine-firstboot.done
- nginx site: /etc/nginx/sites-available/sac-openrefine
- Basic Auth file: /etc/nginx/.openrefine_htpasswd
Managing the service
sudo systemctl status openrefine.service --no-pager | head -6 sudo journalctl -u openrefine.service --no-pager | tail -5To restart the workbench after you change the heap or options, run sudo systemctl restart openrefine.service.
Security recommendations
- Rotate the Basic Auth password. Regenerate
/etc/nginx/.openrefine_htpasswdwithsudo htpasswd -B /etc/nginx/.openrefine_htpasswd admin, reload nginx, and store the password in your secrets manager. - Keep the OpenRefine listener on loopback. Leave it as shipped, expose only nginx on port 80, and put TLS in front of it with Azure Application Gateway or nginx with a real certificate.
- Restrict the NSG. Allow port 80 only from trusted client networks, because a data cleaning workbench often holds sensitive data.
- Make the workbench public only if intended. To do so, remove the
auth_basiclines from/etc/nginx/sites-available/sac-openrefineand reload nginx. - Back up the workspace. Back up
/var/lib/openrefine, or take Azure disk snapshots, so your projects and operation histories are preserved. - Raise the JVM heap for large datasets. Increase it in
refine.ini(REFINE_MEMORY) and use a larger VM size accordingly. - Patch the OS monthly. Run
sudo apt-get update && sudo apt-get upgrade && sudo reboot.
Support and licensing
OpenRefine is licensed under the BSD 3-Clause licence. There are no per-node, per-CPU or per-GB fees.
SecureAnyCloud produces this image. It is not affiliated with, endorsed by or sponsored by the OpenRefine project. OpenRefine is a trademark of its respective owner and is used here only to describe the software included in the image.
SecureAnyCloud provides commercial support for this image separately from the upstream project.
Email: sales@secureanycloud.com
Website: secureanycloud.com
Support hours: 24/7 with a guaranteed 24 hour response SLA
Deploy on Azure
Launch OpenRefine 3.10 Data Cleaning Workbench on Ubuntu 24.04 with 24/7 support from SecureAnyCloud.
View on Marketplace
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com
Deploy on Azure
Launch OpenRefine 3.10 Data Cleaning Workbench on Ubuntu 24.04 LTS on Azure with 24/7 support from SecureAnyCloud.
View this image
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com
Overview
OpenRefine is a free, open source power tool for working with messy data. You import tabular data (CSV, TSV, Excel, JSON, XML) into a project workbench. You then explore it with facets and filters, clean and normalise values with GREL, Jython or Clojure expressions, cluster near-duplicate entries, and reconcile your data against external sources such as Wikidata, all through a browser-based interface. Every change is recorded as a reproducible operation history. OpenRefine is released under the BSD 3-Clause licence.
This SecureAnyCloud AMI runs OpenRefine on AWS. OpenRefine assumes a single trusted local user and ships with no built-in authentication of its own, so the image never exposes it directly. The server is bound to loopback only (127.0.0.1:3333, headless) and fronted by nginx on port 443 over HTTPS with HTTP Basic Auth, so the workbench is never reachable without a credential.
At first boot, openrefine-firstboot.service generates a unique per-instance Basic Auth password and a per-instance self-signed TLS certificate, reloads nginx, proves an authenticated round trip, and writes the password to /root/openrefine-credentials.txt (mode 0600, root only). No default login is baked into the image.
What you get:
- OpenRefine 3.10.1 (official Linux distribution), pinned and sha256-verified, installed under
/opt/openrefine - OpenJDK 17 headless runtime (OpenRefine requires Java 11 to 21), with the JVM heap pinned to a conservative 2 GB maximum
openrefine.service, a systemd unit that runs the workbench as the unprivilegedopenrefineuser, bound to loopback with a hardened service sandboxopenrefine-firstboot.service, a systemd one-shot that generates the per-instance HTTP Basic Auth password and TLS certificate, reloads nginx, proves an authenticated round trip and writes/root/openrefine-credentials.txt- nginx on port 443 (HTTPS), reverse proxying to the loopback-bound OpenRefine listener, with HTTP Basic Auth and an unauthenticated
/healthzfor load balancer probes. Port 80 serves the same health endpoint and redirects everything else to HTTPS. - A dedicated EBS data volume mounted at
/var/lib/openrefinefor your projects, imported datasets and operation history, independently resizable from the OS disk - Ubuntu 24.04 LTS base with the latest security patches
- 24/7 SecureAnyCloud support with a guaranteed 24 hour response SLA
Connecting to your instance
Connect over SSH on port 22 as the default login user for your AMI variant, using the EC2 key pair you selected at launch. For the Ubuntu 24.04 variant, the login user is ubuntu.
ssh ubuntu@<vm-ip>openrefine.service and nginx.service start automatically. On the first boot, openrefine-firstboot.service generates the per-instance Basic Auth password and TLS certificate.
Prerequisites
You need an AWS account and a subscription to the OpenRefine listing on AWS Marketplace.
You also need an EC2 key pair in the target region and a security group that allows TCP 22 from your management IP and TCP 443 from your client IPs. TCP 80 is optional, because it only redirects to HTTPS.
Recommended instance type: m5.large (2 vCPU, 8 GB RAM) for general use. For large datasets and heavier transforms, use a larger instance and raise the JVM heap in /opt/openrefine/openrefine-3.10.1/refine.ini (REFINE_MEMORY).
Launch from the AWS Console
Subscribe to the listing in AWS Marketplace, then Launch an instance from the AMI. Choose your instance type, key pair and subnet. Choose a security group that allows TCP 22 from your management IP and TCP 443 from your client IPs.
OpenRefine is bound to loopback, so only nginx (ports 80 and 443) is reachable. HTTP Basic Auth over HTTPS protects the workbench itself.
Launch from the AWS CLI
aws ec2 run-instances --region us-east-1 \
--image-id ami-xxxxxxxxxxxxxxxxx \
--instance-type m5.large \
--key-name my-key \
--security-group-ids sg-xxxxxxxx \
--subnet-id subnet-xxxxxxxx \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=openrefine}]'Verify the OpenRefine service
sudo systemctl is-active openrefine.service nginx.service
sudo test -f /var/lib/sac/data/openrefine-firstboot.done && echo FIRSTBOOT_DONEBoth services should report active, and the first-boot sentinel should be present.
Inspect the listeners and runtime
The OpenRefine server is bound to 127.0.0.1:3333, and nginx serves it over HTTPS on port 443. Nothing but nginx listens on a public interface. The JVM heap is pinned in refine.ini.
sudo ss -tln | grep -E ':443|:3333' || true grep -E 'REFINE_MEMORY|REFINE_MIN_MEMORY' /opt/openrefine/openrefine-3.10.1/refine.iniThe output shows nginx on port 443, OpenRefine on loopback port 3333, and the pinned 2 GB maximum heap.
Confirm the dedicated data volume
Your projects live on a dedicated EBS volume mounted at /var/lib/openrefine, separate from the OS disk. Confirm the mount:
findmnt -no SOURCE,TARGET,FSTYPE /var/lib/openrefineRetrieve the access password
The image generates the per-instance HTTP Basic Auth password at first boot and stores it in a root-only file. Read it with sudo:
sudo cat /root/openrefine-credentials.txtThe file lists the sign-in user, the per-instance password and the endpoint URLs:
OPENREFINE_HTTP_USER=admin OPENREFINE_BASIC_AUTH_PASSWORD=<OPENREFINE_BASIC_AUTH_PASSWORD> OPENREFINE_URL=https://<vm-ip>/ OPENREFINE_HEALTHZ=https://<vm-ip>/healthz OPENREFINE_LOCAL_HTTP=http://127.0.0.1:3333/Verify access control over HTTPS
OpenRefine is reachable only through the authenticated nginx proxy over HTTPS. Confirm that an unauthenticated request is rejected, that the per-instance password works and that the command API responds. The -k flag accepts the per-instance self-signed certificate. For production, replace the certificate with your own trusted one.
PW=$(sudo grep '^OPENREFINE_BASIC_AUTH_PASSWORD=' /root/openrefine-credentials.txt | cut -d= -f2-)
curl -ks -o /dev/null -w 'no creds: %{http_code}\n' https://127.0.0.1/
curl -ks -o /dev/null -w 'wrong pw: %{http_code}\n' -u "admin:wrong-password" https://127.0.0.1/
curl -ks -o /dev/null -w 'workbench index: %{http_code}\n' -u "admin:$PW" https://127.0.0.1/
curl -ks -u "admin:$PW" https://127.0.0.1/command/core/get-versionThe unauthenticated request returns 401, and a wrong password also returns 401. The authenticated workbench index returns 200, and the command API returns the OpenRefine version JSON. The unauthenticated /healthz endpoint stays open for load balancer probes.
Open the workbench in a browser
Open https://<vm-ip>/ from your workstation. This assumes the security group allows TCP 443.
The certificate is self-signed and unique to this instance, so your browser shows a certificate warning the first time. Accept it to proceed, or terminate TLS at nginx with your own domain and certificate.
Your browser then prompts for HTTP Basic Auth. Sign in with user admin and the per-instance password from /root/openrefine-credentials.txt. OpenRefine opens on the Create Project screen, where you choose a data source.
Create a project by importing data
On This Computer, choose a data file (CSV, TSV, Excel, JSON or XML) and click Next. OpenRefine shows a parsing preview where you confirm the column separator, header rows and value types.
Click Create Project. Your data loads into the project workbench as a grid of rows and columns.
Explore the data grid
The workbench shows your data as an editable grid. Each column header has a dropdown menu of operations. The Facet / Filter panel on the left is where you slice and clean the data.
OpenRefine is built to fix inconsistencies like those in a sample import of customer signups: mixed spellings of the same country, and inconsistent casing.
Facet and filter
Open a column's dropdown menu and choose Facet, Text facet to see every distinct value in that column with a count. In the sample import, the country column reveals many variants of what should be a handful of countries (UK and uk, Ireland and IRELAND and South-Africa), each with its row count.
Click Cluster to let OpenRefine group near-duplicate values automatically, or click a value to filter the grid to just those rows.
Clean and transform with GREL
Open a column menu and choose Edit cells, Transform to run a GREL expression across every cell, with a live before-and-after preview. For example, value.trim().toTitlecase() normalises casing and strips stray whitespace.
OpenRefine records transforms in the operation history, so you can undo them or replay the whole cleanup on a fresh dataset.
Export the cleaned data
When the data is clean, use the Export menu at the top right to write it out as CSV, TSV, Excel, JSON, HTML or a custom template. You can also export the operation history as JSON, so the same cleanup can be applied to future imports.
Projects are stored on the dedicated data volume at /var/lib/openrefine.
Server components
These are the key paths on the instance:
- OpenRefine install: /opt/openrefine/openrefine-3.10.1
- Launcher: /opt/openrefine/openrefine-3.10.1/refine
- Heap config: /opt/openrefine/openrefine-3.10.1/refine.ini
- Workspace and projects (data volume): /var/lib/openrefine
- Systemd unit: /etc/systemd/system/openrefine.service
- First-boot script: /usr/local/sbin/openrefine-firstboot.sh
- First-boot service: /etc/systemd/system/openrefine-firstboot.service
- Credentials file: /root/openrefine-credentials.txt (mode 0600)
- First-boot sentinel: /var/lib/sac/data/openrefine-firstboot.done
- nginx site: /etc/nginx/sites-available/sac-openrefine
- Basic Auth file: /etc/nginx/.openrefine_htpasswd
- TLS certificate and key: /etc/nginx/ssl/openrefine.crt and /etc/nginx/ssl/openrefine.key
Managing the service
sudo systemctl status openrefine.service --no-pager sudo journalctl -u openrefine.service --no-pager -n 5To restart the workbench after you change the heap or options, run sudo systemctl restart openrefine.service.
Security recommendations
- Use a trusted certificate in production. Replace the per-instance self-signed certificate at
/etc/nginx/ssl/openrefine.crt/.keywith your own, or terminate TLS at an Application Load Balancer with an ACM certificate. - Rotate the Basic Auth password. Regenerate
/etc/nginx/.openrefine_htpasswdwithsudo htpasswd -B /etc/nginx/.openrefine_htpasswd admin, reload nginx, and store the password in AWS Secrets Manager. - Keep the OpenRefine listener on loopback. Leave it as shipped, expose only nginx, and restrict the security group so that port 443 is reachable only from trusted client networks, because a data cleaning workbench often holds sensitive data.
- Make the workbench public only if intended. To do so, remove the
auth_basiclines from/etc/nginx/sites-available/sac-openrefineand reload nginx. - Back up the workspace. Back up
/var/lib/openrefine, or take EBS snapshots, so your projects and operation histories are preserved. - Raise the JVM heap for large datasets. Increase it in
refine.ini(REFINE_MEMORY) and use a larger instance type accordingly. - Patch the OS monthly. Run
sudo apt-get update && sudo apt-get upgrade && sudo reboot.
Support and licensing
OpenRefine is licensed under the BSD 3-Clause licence. There are no per-node, per-CPU or per-GB fees.
SecureAnyCloud produces this image. It is not affiliated with, endorsed by or sponsored by the OpenRefine project. OpenRefine is a trademark of its respective owner and is used here only to describe the software included in the image.
SecureAnyCloud provides commercial support for this image separately from the upstream project.
Email: sales@secureanycloud.com
Website: secureanycloud.com
Support hours: 24/7 with a guaranteed 24 hour response SLA
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com
Deploy on AWS
Launch OpenRefine - Secure Data Cleaning Workbench AMI by SecureAnyCloud with 24/7 support from SecureAnyCloud.
View on Marketplace
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com