Gorse Recommender Engine on AWS User Guide
Overview
This guide covers deploying and operating Gorse on AWS using cloudimg's pre-configured Amazon Machine Image. Gorse is an open source recommender system engine written in Go. You feed it users, items and feedback through a clean REST API and it returns personalized recommendations, with popular and latest non personalized fallbacks, all served from a single self contained process.
The image installs Gorse as the official single all in one gorse-in-one binary (master, server and worker in one process), backed by an embedded SQLite data and cache store on the instance disk, so there is no Redis and no separate database to run. The engine binds loopback only (127.0.0.1:8088) and nginx is the sole network facing surface, reverse proxying HTTP on port 80 and ready for you to add your TLS certificate. It is a CPU only engine with no GPU requirement.
Secure by default. Gorse ships upstream with an empty API key and empty dashboard credentials, which leaves both the REST API and the admin dashboard wide open. This image never boots in that state: a unique API key, dashboard password and admin key are generated on each instance's first boot and written to a root only file, and the engine is started only after those secrets are in place. There are no shared or default credentials and nothing usable is baked into the image. On first boot the appliance also refreshes itself to the newest Gorse release, so every launch runs current software.
The recommended security group for this listing opens port 22 (SSH) and port 80 (HTTP) only. Restrict both to your own trusted network, and place TLS in front of the engine before exposing it to the public internet.
Connecting to your instance
Connect over SSH as the default login user for your operating system variant, using the EC2 key pair you selected at launch:
| OS variant | SSH login user | Example |
|---|---|---|
| Ubuntu 24.04 LTS | ubuntu |
ssh -i your-key.pem ubuntu@<instance-public-ip> |
The web dashboard is reached over HTTP at http://<instance-public-ip>/ and the REST API at http://<instance-public-ip>/api/.
Prerequisites
- An AWS account with permission to launch EC2 instances and subscribe to AWS Marketplace products
- An EC2 key pair for administrative SSH access
- A security group allowing inbound TCP
80(HTTP) from the networks that should reach the service, and22(SSH) from your management network only - A recommended instance type of m5.large or larger
Step 1: Launch from the AWS Marketplace
- Locate the Gorse listing in AWS Marketplace and choose Continue to Subscribe, then Continue to Configuration and Continue to Launch.
- Select the Ubuntu 24.04 delivery option, your region, an instance type (m5.large or larger) and your EC2 key pair.
- For the security group, allow inbound
80from your users and restrict22to your management network. - Launch the instance. When it is running, browse to
http://<instance-public-ip>/.
Step 2: Launch from the AWS CLI
Launch the image from the command line, restricting access with a security group of your own. Replace the placeholder values with your own before running:
aws ec2 run-instances \
--image-id <ami-id-from-listing> \
--instance-type m5.large \
--key-name my-key \
--security-group-ids sg-yourgroup \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=gorse}]'
# when the instance is running, browse to http://<public-ip>/
Step 3: Retrieve your per instance secrets
Gorse's REST API requires an API key and the dashboard requires a login. Both, plus an admin key and the resolved URLs, are generated uniquely on this instance's first boot and written to a root only file. Retrieve them over SSH:
sudo cat /root/gorse-info.txt
The file lists the values your applications and operators need (secrets shown redacted here):
GORSE_API_KEY=<redacted>
GORSE_ADMIN_API_KEY=<redacted>
GORSE_DASHBOARD_USER=admin
GORSE_DASHBOARD_PASSWORD=<redacted>
GORSE_URL=http://<instance-public-ip>/
GORSE_API_URL=http://<instance-public-ip>/api/
Keep this file secret. No two instances share these values and none is baked into the image.
Step 4: Sign in to the dashboard
Browse to http://<instance-public-ip>/. You are redirected to the Gorse dashboard login.

Sign in with the username admin and the GORSE_DASHBOARD_PASSWORD from your info file. The Overview opens, with live counts of users, items and feedback, a recommendation performance chart, and non personalized recommendation lists.

Step 5: Verify the deployment
Over SSH on the instance, confirm the services are up, the engine is the expected version, the health endpoint is ready, and the API key is enforced.
Both services are active:
systemctl is-active gorse.service nginx.service
active
active
The engine is the pinned Gorse release (each instance also self updates to the newest release on first boot):
/usr/local/bin/gorse-in-one --version
Version: 0.5.11
API version: v0.2.7
Go version: go1.26.4
OS/Arch: linux/amd64
The health endpoint reports the data and cache stores connected:
curl -s http://127.0.0.1/api/health/ready
{
"Ready": true,
"DataStoreConnected": true,
"CacheStoreConnected": true
}
The REST API rejects an unauthenticated request (401) and accepts your per instance key. The following call reads the latest items back; substitute the GORSE_API_KEY from your info file for <your-api-key>:
curl -s -o /dev/null -w 'unauthenticated: %{http_code}\n' http://127.0.0.1/api/latest
curl -s -H "X-API-Key: <your-api-key>" "http://127.0.0.1/api/latest?n=5"
unauthenticated: 401
[{"Id":"demo_item_5","Score":...},{"Id":"demo_item_4","Score":...}, ... ]
On a freshly launched instance the datastore is empty until you insert your own data (Step 7).
Step 6: Browse your data in the dashboard
The dashboard's Items, Users and Advance views let you browse and search the data you have loaded, inspect individual records, and review recommendations.

Step 7: Use the REST API from your application
Your application talks to Gorse over the REST API, passing your key in the X-API-Key header. Insert users, items and feedback, then request recommendations. Replace YOUR_API_KEY with your GORSE_API_KEY and <instance-public-ip> with your instance address:
# insert an item
curl -s -X POST "http://<public-ip>/api/items" \
-H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
-d '[{"ItemId":"item_42","IsHidden":false,"Categories":["news"],"Timestamp":"2026-07-24T00:00:00Z","Labels":{},"Comment":"example"}]'
# record positive feedback from a user
curl -s -X POST "http://<public-ip>/api/feedback" \
-H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
-d '[{"FeedbackType":"star","UserId":"user_1","ItemId":"item_42","Timestamp":"2026-07-24T00:00:00Z","Value":1}]'
# get recommendations for a user
curl -s -H "X-API-Key: YOUR_API_KEY" "http://<public-ip>/api/recommend/user_1?n=10"
Gorse serves collaborative filtering and content aware recommendations, item to item and user to user neighbors, session based recommendations, and latest and popular non personalized lists. Personalized results appear once the background training tasks have run over your data.
Step 8: Monitor background training tasks
The Tasks view shows Gorse's background jobs (loading the dataset, generating recommendations, cache maintenance) with their status, timing and progress.

Step 9: Enable TLS for production
The engine is fronted by nginx on port 80 and is ready for your certificate. For a production deployment, point a domain name at the instance and add a CA signed certificate, for example with the ACME client of your choice:
# point http://<your-domain> at this instance first, then obtain a certificate
sudo certbot --nginx -d <your-domain>
After enabling TLS, update your security group to allow 443, redirect 80 to HTTPS, and update the URLs your applications use.
Security notes
- The API key, dashboard password and admin key are generated per instance on first boot and stored only in
/root/gorse-info.txt(mode0600, owned by root). Rotate them by regenerating the values in/etc/gorse/config.tomland restartinggorse.service. - Gorse binds loopback only (
127.0.0.1:8088); nginx on port 80 is the sole network facing surface. Keep the security group restricted to the networks that need access, and place TLS in front before exposing the service publicly. - The image ships with no data and no usable credential. The engine will not start until first boot has written per instance secrets.
- Keep the instance patched. The dashboard footer links to the Gorse documentation and API reference.
Support
cloudimg provides 24/7 technical support for this product by email and live chat. Our engineers help with deployment, securing the API, enabling a real domain and CA signed certificate, integrating your application through the REST API and client libraries, and recommender tuning.
- Email: support@cloudimg.co.uk
- Live chat: available 24/7