Logdy 0.17.1
Overview
Logdy is an open-source, self-hosted, real-time log viewer. It follows a log file on the instance and streams every new line to a browser. Structured JSON logs are parsed into sortable columns with faceted filters, full-text search and a detail drawer for each line. Logdy is a single Go binary that keeps the lines it shows in an in-memory buffer, so there is no database to run or back up.
An upstream Logdy binary serves its interface with no login. This image changes that, and it adds HTTPS, a per-instance password and a hardened service around Logdy.
This guide covers launching and using Logdy 0.17.1 on Ubuntu 24.04 on Amazon EC2. It is one version of the SecureAnyCloud log management listing on AWS Marketplace. You pick it as the software version when you subscribe and launch.
What you get:
- HTTPS from first boot. nginx is the only network entry point. It serves Logdy on port 443 with a certificate generated on your instance's first boot. Port 80 only redirects to HTTPS.
- A password unique to your instance. The whole interface needs HTTP Basic Auth as the user
admin. That includes the WebSocket that streams the log lines and every/apipath. First boot generates the password and writes it to the root-only file/root/logdy-info.txt. nginx stores only its bcrypt hash. No password is baked into the image, and no two instances share one. Only a static/healthendpoint answers without a login. - Logdy on loopback only, with no network ingest. Logdy listens on
127.0.0.1:8080and only follows files on the instance. Its socket, forward and HTTP ingest modes are not enabled, so nothing on the network can push lines into your viewer. - Fail closed. nginx refuses to start until first boot has written the certificate and the password, so the interface is never served without a login.
- Built from source with a current toolchain. The newest upstream release binary was built with an old Go toolchain that carries known Go security advisories. SecureAnyCloud compiles the unmodified Logdy 0.17.1 source with Go 1.27.3 instead (details in Step 9).
- Key-only SSH. Password logins, root logins and X11 forwarding are switched off.
- Hardened service. Logdy and the demo generator run as an unprivileged
logdyuser in a systemd sandbox. The instance drops requests for a host name it does not serve and refuses cross-site WebSocket connections. nginx logs the real client address rather than anyX-Forwarded-Forheader a client sends. - Fully patched Ubuntu 24.04 LTS at build time, with unattended security upgrades switched on.
- No scheduled firmware metadata refresh. The
fwupdfirmware updater stays installed, but its LVFS metadata refresh (fwupd-refresh.timerand.service) is masked, so an LVFS outage never marks your instance unhealthy. Runsudo fwupdmgr refreshyourself if you use it. - The software on the image. Logdy 0.17.1 (
/usr/local/bin/logdy, Apache License 2.0), a column and facet layout for the demo log (/etc/logdy/logdy.config.json), a small demo log generator so the interface has data on first sign-in, nginx, Ubuntu 24.04 LTS, cloud-init and the AWS Systems Manager agent.
Default user: ubuntu · Architecture: x86_64 · Recommended instance type: m5.large
Prerequisites
- An AWS account subscribed to the listing, an EC2 key pair and a VPC subnet with a route to the internet (or a private route that you use for management).
- A security group that allows TCP 22 (SSH), TCP 443 (the Logdy interface) and TCP 80 (redirects to HTTPS) from your own networks only. Never open port 8080, because Logdy listens on loopback.
Launch the instance
In the AWS Marketplace listing, choose Continue to Subscribe, then Continue to Configuration. Pick Logdy 0.17.1 on Ubuntu 24.04 as the software version, choose your Region, then choose Launch through EC2. Select m5.large (Logdy itself is very light), your key pair and a security group as above.
To launch with the AWS CLI instead, replace the values in angle brackets.
aws ec2 run-instances --region <region> --image-id <ami-id-from-the-listing> \
--instance-type m5.large --key-name <your-key-pair> \
--security-group-ids <your-security-group> --subnet-id <your-subnet> \
--metadata-options HttpTokens=required,HttpEndpoint=enabled \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=logdy}]'Connect to your instance
For Logdy 0.17.1 on Ubuntu 24.04, the SSH user is ubuntu. Connect with your key pair.
ssh -i <your-key.pem> ubuntu@<public-ip>The login message shows the web address and where to find the password.
Check the services
First boot takes a few seconds. It generates the password and the certificate, and then nginx starts in front of Logdy. Check the services.
systemctl is-active logdy-firstboot logdy logdy-demo nginx
sudo test -f /var/lib/sac/data/logdy-firstboot.done && echo FIRSTBOOT_DONE /usr/local/bin/logdy --versionactive active active active FIRSTBOOT_DONE logdy version 0.17.1Only SSH and nginx listen on public addresses. Logdy listens on loopback. Check the listening sockets.
sudo ss -Hlntp | awk '{print $4, $6}' | grep -v '127.0.0.5' | sed -E 's/,pid=[0-9]+,fd=[0-9]+//g' | sort0.0.0.0:22 users:(("sshd"),("systemd")) 0.0.0.0:443 users:(("nginx"),("nginx"),("nginx")) 0.0.0.0:80 users:(("nginx"),("nginx"),("nginx")) 127.0.0.1:8080 users:(("logdy")) [::]:22 users:(("sshd"),("systemd")) [::]:443 users:(("nginx"),("nginx"),("nginx")) [::]:80 users:(("nginx"),("nginx"),("nginx"))SSH accepts keys only. Passwords, root logins and X11 forwarding are switched off in /etc/ssh/sshd_config.d/00-sac.conf, which sorts before every other SSH setting. Check the effective values.
sudo sshd -T | grep -E '^(passwordauthentication|kbdinteractiveauthentication|permitrootlogin|x11forwarding|pubkeyauthentication) 'permitrootlogin no pubkeyauthentication yes passwordauthentication no kbdinteractiveauthentication no x11forwarding noGet your address and password
The address and user name are in the root-only file /root/logdy-info.txt. Print them.
sudo grep -E '^LOGDY_(URL|UI_USERNAME)=' /root/logdy-info.txtLOGDY_UI_USERNAME=admin LOGDY_URL=https://ec2-<public-ip-dashed>.compute-1.amazonaws.com/The password is the LOGDY_UI_PASSWORD line of the same file: sudo grep '^LOGDY_UI_PASSWORD=' /root/logdy-info.txt. Store it in your password manager. It is unique to this instance.
The address uses the instance's public DNS name from EC2 instance metadata (IMDSv2), or its public or private IPv4 address when it has no public name. The certificate names that host plus the instance's public and private IP addresses. Inspect the certificate.
openssl x509 -in /etc/ssl/logdy/logdy.crt -noout -subject -ext subjectAltName -enddatesubject=CN = ec2-<public-ip-dashed>.compute-1.amazonaws.com, O = sac X509v3 Subject Alternative Name: DNS:ec2-<public-ip-dashed>.compute-1.amazonaws.com, IP Address:<public-ip>, IP Address:<private-ip>, IP Address:127.0.0.1, DNS:localhost notAfter=<date about 27 months after first boot>Check the login
These checks confirm the following:
- Port 80 redirects to HTTPS.
/healthanswers without a login.- The interface refuses a missing or wrong password and accepts yours.
- The instance drops a request for a host name it does not serve.
The commands read the password into a shell variable and hand it to curl through a file descriptor, so it never appears in the process list or your shell history.
H=$(sudo sed -n 's#^LOGDY_URL=https://\([^/]*\)/.*#\1#p' /root/logdy-info.txt)
PW=$(sudo sed -n 's/^LOGDY_UI_PASSWORD=//p' /root/logdy-info.txt) CA=/etc/ssl/logdy/logdy.crt curl -s -o /dev/null -w 'http:// -> %{http_code} %{redirect_url}\n' --resolve "$H:80:127.0.0.1" "http://$H/" curl -s -w ' <- health, HTTP %{http_code}\n' --cacert $CA --resolve "$H:443:127.0.0.1" "https://$H/health" curl -s -o /dev/null -w 'no login -> HTTP %{http_code}\n' --cacert $CA --resolve "$H:443:127.0.0.1" "https://$H/" curl -s -o /dev/null -w 'wrong password -> HTTP %{http_code}\n' --cacert $CA --resolve "$H:443:127.0.0.1" -u admin:not-the-password "https://$H/" curl -s -o /dev/null -w 'your password -> HTTP %{http_code}\n' --cacert $CA --resolve "$H:443:127.0.0.1" -K <(printf 'user = "admin:%s"\n' "$PW") "https://$H/" curl -sk -o /dev/null -w 'other host -> HTTP %{http_code} (000 = connection dropped)\n' -H 'Host: evil.example' https://127.0.0.1/ || truehttp:// -> 301 https://ec2-<public-ip-dashed>.compute-1.amazonaws.com/ OK <- health, HTTP 200 no login -> HTTP 401 wrong password -> HTTP 401 your password -> HTTP 200 other host -> HTTP 000 (000 = connection dropped)--resolve sends the request to this instance while keeping the real host name, so the certificate check passes. From another machine, drop --resolve and use the address directly.
The image also carries a self-test. It runs the same checks, then opens the live WebSocket stream through nginx with your password. It confirms that new lines arrive while the stream is connected and that Logdy's HTTP ingest endpoint stays closed.
sudo /usr/local/sbin/logdy-selftest.shOK logdy round-trip over https: health-200 public, UI 401-without / 200-with per-VM creds, wrong-401, api/log ingest off, demo log streaming via WebSocket [demo_lines=75 streamed_live_after_5s=3 seq_range=1-75]Sign in to the web interface
Open the LOGDY_URL address from Step 4 in your browser. The certificate is self-signed and made on your instance, so your browser asks you to accept it once. Step 10 shows how to use your own name and certificate. When the browser asks for a login, enter admin and your password.
Logdy opens on the demo log and keeps streaming. Each JSON line is split into columns for time, level, service, method, path, status, duration and message. The left rail shows each column's values with live counts.
Filter, search and inspect
Click a value in the left rail to filter the stream. For example, ERROR under level narrows the stream to the error lines, and every count updates as new lines arrive. Choose Reset all filters to clear them. The search box at the top takes free text and field queries across the parsed columns.
Click a row to open the detail drawer. It lists every field of that line and steps to the next or previous line. Choose Show/hide raw message to see the original JSON.
Point Logdy at your own logs
The demo generator exists only to fill the interface on first boot. It writes a structured JSON line every two seconds to /var/log/logdy-demo/app.log. Look at the latest line.
tail -n 1 /var/log/logdy-demo/app.log{"time":"2026-10-20T22:26:06Z","level":"INFO","service":"search","source":"sac-demo","host":"vm-01","method":"PATCH","path":"/healthz","status":200,"duration_ms":447,"seq":76,"message":"queue drained"}When you are ready to view your own logs, stop the demo and repoint Logdy. These commands change the service, so run them yourself.
sudo systemctl disable --now logdy-demo.service
sudo systemctl edit --full logdy.serviceIn the editor, change the file in the ExecStart line from /var/log/logdy-demo/app.log to your own log. Keep the other options, which keep Logdy on loopback with analytics and update checks off. Add the log's directory to ReadWritePaths= only if Logdy must write there, because it needs only to read. For example:
ExecStart=/usr/local/bin/logdy follow /var/log/myapp/app.log --full-read --config /etc/logdy/logdy.config.json --port 8080 --ui-ip 127.0.0.1 -n -uThe logdy user must be able to read the file. For system logs in /var/log, add the user to the adm group with sudo usermod -aG adm logdy. Then apply the change.
sudo systemctl daemon-reload
sudo systemctl restart logdy.service/etc/logdy/logdy.config.json defines the columns and facets for the demo log's fields. For your own format, adjust the columns in the interface (the gear icon) and export the layout over that file. Alternatively, remove --config to start from Logdy's defaults.
The Logdy documentation at https://logdy.dev/docs covers columns, parsers and the other input modes. If you enable a network input (socket, forward or the HTTP ingest API with --api-key), keep its port closed in your security group except to the hosts that send logs.
How the Logdy binary was built
The newest upstream release, 0.17.1, publishes a binary built with Go 1.23.2 and older WebSocket and networking libraries, which carry known Go security advisories.
SecureAnyCloud compiles the unmodified 0.17.1 source instead. The build uses the official Go 1.27.3 toolchain, gorilla/websocket raised from 1.5.1 to 1.5.3 (a patch release with a security fix) and the module set to current Go defaults. The build is reproducible, and Go's own vulnerability scanner reports nothing for the shipped binary.
The build record ships on the image. Print its key lines and the binary checksum.
grep -E '^(toolchain |dependency |module language|binary sha256|govulncheck )' /usr/share/doc/logdy/BUILD-PROVENANCE.txt sha256sum /usr/local/bin/logdytoolchain go1.27.3 linux/amd64, official tarball https://go.dev/dl/go1.27.3.linux-amd64.tar.gz dependency github.com/gorilla/websocket v1.5.1 -> v1.5.3 (GO-2026-6278; go get via the module proxy + sum.golang.org) module language go 1.23.2 -> go 1.27.0 (no DefaultGODEBUG compatibility overrides: every current Go security default applies) binary sha256 96b857fc429cc196b6eeff8d29d55e1a4dbfddece3faa2d261817a5486f8942d (reproducible build) govulncheck v1.9.0 -mode=binary on the compiled binary: no vulnerabilities found 96b857fc429cc196b6eeff8d29d55e1a4dbfddece3faa2d261817a5486f8942d /usr/local/bin/logdyUse your own DNS name, certificate or password
The served host name comes from configuration, never from a request. To serve Logdy under your own DNS name, point the name at the instance and run the helper. The helper records the name, makes a new self-signed certificate for it, updates /root/logdy-info.txt and reloads nginx.
sudo logdy-set-hostname logs.example.comTo use a certificate from your own certificate authority instead, put the full chain in /etc/ssl/logdy/logdy.crt and the private key in /etc/ssl/logdy/logdy.key (owner root, mode 0600). Then run sudo nginx -t && sudo systemctl reload nginx. Running logdy-set-hostname again replaces them with a self-signed pair.
To change the password, let htpasswd prompt for it, and never put a password on the command line. Then reload nginx and update your note in /root/logdy-info.txt.
sudo htpasswd -B /etc/nginx/logdy.htpasswd admin
sudo systemctl reload nginxSecurity notes and operations
- Restrict ports 443 and 80 to the networks your team uses. Port 8080 is never exposed.
- Logdy shows whatever the followed file contains to anyone with the password. Point it only at logs your viewers may see, and give separate teams separate instances.
- Logdy keeps lines in memory only. A restart clears the view, and nothing is written to disk unless you add
--append-to-file. There is no database to back up. - SSH accepts key logins as
ubuntuonly, with no passwords, no root login and no X11 forwarding. Usesudofor administration. - The AMI requires IMDSv2. nginx logs the real client address of every request and ignores
X-Forwarded-Forheaders sent by clients. - Manage the services with
systemctl status logdy nginxand read their logs withjournalctl -u logdy -u nginx. Unattended upgrades keep Ubuntu and nginx patched. Check the listing for newer Logdy versions.
Support and licensing
Logdy is open source under the Apache License 2.0. The licence, README and build record are in /usr/share/doc/logdy/. There is no per-user or per-CPU licence fee. The AMI price covers SecureAnyCloud's hardening, first-boot setup, the source build and support.
- Email: sales@secureanycloud.com
- Website: https://secureanycloud.com
The Logdy project (logdyhq) develops Logdy. For Logdy features, see the upstream documentation at https://logdy.dev/docs.
Logdy is a trademark of its respective owner. SecureAnyCloud is not affiliated with or endorsed by the Logdy project, and the name is used only to identify the upstream software.
Deploy on AWS
Launch Logdy 0.17.1 on Ubuntu 24.04 on AWS with 24/7 support from SecureAnyCloud.
View on Marketplace
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com