Maintaining opendylan.org¶
In this document I aspire to make it easy for someone besides myself (cgay) to manage opendylan.org or move it to another host in my absense.
opendylan.org is a relatively simple site comprised of the following parts:
The main website, http://opendylan.org/, is a static site built using Sphinx. Instructions for building the documentation manually are in the opendylan repository in the file
documentation/README.rst.package.opendylan.org is static documentation automatically built with the gendoc repository.
play.opendylan.org is a dynamic website for executing arbitrary Dylan code, implemented in the dylan-playground repository.
All three parts are hosted on the same machine.
The machine also hosts https://yhoti.org which is just a static site using the same nginx. That is generally for cgay to worry about, but when changing opendylan.org one should be aware that taking down nginx also takes down yhoti.org.
Overview¶
As of December 2025 the machine is run by Hostinger, its IPv4 address is 195.179.193.248, and it is physically located in the Netherlands. The admin UI is at https://hpanel.hostinger.com/vps and the machine is paid for through 2027-12-08. cgay is currently the only one with admin UI access. housel has full access to the machine itself.
The host machine is currently running Debian 13 (Trixie) and the jobs are managed with
systemd. Use systemctl list-units | grep dylan to see the relevant services and
timers.
Machine Setup¶
The following packages were required when installing on the current machine:
apt install autoconf binutils bzip2 certbot clang emacs furo git libgc-dev \
libunwind-dev make nginx python3-sphinx python3-sphinx-copybutton rsync
Install certificates for nginx. I used:
certbot certonly -d 'opendylan.org,*.opendylan.org' --cert-name opendylan.org --manual
This required adding a TXT DNS record for _acme-challenge.opendylan.org, and storing a
file in /.well-known/acme-challenge/2H9B9VYUAg54iEwE1q7W_VAJAH7X9W5QBf7xTUEBX04
for proof of ownership. nginx had to be serving on port 80 for the challenges to
succeed. (Both challenge assets have since been deleted.)
The certs are in /etc/letsencrypt/archive/opendylan.org/. After installation
certbot said:
NEXT STEPS:
- This certificate will not be renewed automatically. Autorenewal of --manual
certificates requires the use of an authentication hook script (--manual-auth-hook)
but one was not provided. To renew this certificate, repeat this same certbot
command before the certificate's expiry date.
I created a link libunwind.so.1 -> libunwind.so.8.0.1 to allow Open Dylan to be able
to link binaries correctly. (Housel says this would be fixed by using non-GNU libunwind.)
Backups¶
The only assets on the machine that can’t be regenerated from Git source files are some
systemd config files (most of which are included below) and the play.opendylan.org
“shares” directory. For a full up-to-date list of such files see
/home/dylan/backup-opendylan.org.sh on the machine or in one of the backups.
/etc/systemd/system/opendylan-backup.service and
/etc/systemd/system/opendylan-backup.timer define the backup schedule. They
simply run /home/dylan/backup-opendylan.org.sh which writes a full backup
of the important files and directories to
/var/backups/opendylan.org/opendylan.org-backup-DATE.tar.bz2.
cgay also has a job to rsync the backups to his machine periodically.
Open Dylan¶
The playground and gendoc need Open Dylan, which is installed in a version-specific
directory in /opt and then linked from /opt/opendylan. Scripts depend on
/opt/opendylan/bin existing.
nginx¶
nginx serves the static sites in /var/www/opendylan.org and
/var/www/package.opendylan.org, and proxies play.opendylan.org to
http://localhost:8001.
See the config in /etc/nginx/sites-availabel/opendylan.org. Various other
subdomain names and URLs redirect to opendylan.org.
(It is now possible to get the Dylan HTTP server running with SSL, so it would be very nice to stop using nginx completely.)
play.opendylan.org¶
The playground is a Dylan web app that runs as the “dylan” user. Because the Dylan HTTP
server didn’t work with SSL at the time the playground was written, nginx is used to
proxy to plain HTTP on port 8001.
The live playground instance is deployed to /opt/dylan-playground/live by logging
in as “dylan” and:
cd ~/dylan/workspaces/dylan-playground
environment=live make install
In general if you redeploy after making source code changes or after upgrading the installed version of Open Dylan you’ll need to test something in the playground to get it past that first very-long build time. Just ask it to run Hello World.
The systemd service to start the playground after reboot, or restart it after a crash is
“dylan-playground”. The current systemd service file
(/etc/systemd/system/dylan-playground.service) looks like this:
[Unit]
Description=Dylan Playground
After=network.target
StartLimitIntervalSec=0
[Service]
Type=simple
Restart=always
RestartSec=2
User=dylan
ExecStart=/opt/dylan-playground/live/bin/dylan-playground --config /opt/dylan-playground/live/config.xml --working-directory /opt/dylan-playground/live
[Install]
WantedBy=multi-user.target
Once that’s in place, use these commands:
systemctl enable dylan-playground
systemctl start dylan-playground
systemctl status dylan-playground
opendylan.org¶
There’s a systemd timer to get the latest docs and rebuild the main website periodically, defined by the following files.
/etc/systemd/system/opendylan.org.service:
[Unit]
Description="Generate main Dylan documentation website"
[Service]
User=dylan
ExecStart=/home/dylan/dylan/workspaces/opendylan/documentation/update-opendylan.org.sh
/etc/systemd/system/opendylan.org.timer:
[Unit]
Description="Run opendylan.org.service"
[Timer]
OnCalendar=Mon-Sun *-*-* 03,09,15,21:30:02
Unit=opendylan.org.service
[Install]
WantedBy=multi-user.target
See opendylan/documentation/README.rst and the script in the service definition
above for more details.
Useful commands:
systemctl status opendylan.org.service
systemctl status opendylan.org.timer
package.opendylan.org (gendoc)¶
Another systemd timer. You get the idea.
/etc/systemd/system/opendylan-gendoc.service:
[Unit]
Description="Generate Dylan package documentation"
[Service]
User=dylan
ExecStart=/home/dylan/dylan/workspaces/gendoc/update-package.opendylan.org.sh
/etc/systemd/system/package.opendylan.org.timer:
[Unit]
Description="Run opendylan-gendoc.service"
[Timer]
OnCalendar=Mon-Sun *-*-* 10,21:10:02
Unit=opendylan-gendoc.service
[Install]
WantedBy=multi-user.target
See gendoc/README.rst for more details on this.