Afanasy 3.4.1
Overview
Afanasy is the render farm manager from CGRU (github.com/CGRU/cgru, LGPL-3.0), an open source computer graphics tools pack. Its afserver is the central coordinator that dispatches rendering work. Render nodes connect to it, pull tasks and report progress, while artists and administrators submit jobs and watch the farm through afserver's built-in browser Web Monitor, a live dashboard of jobs, render nodes, pools and users.
This guide covers deploying Afanasy 3.4.1 on Ubuntu 24.04 on Azure from the SecureAnyCloud Azure Marketplace image. The image ships the afserver coordinator and its Web Monitor as a secure, standalone, single-VM appliance. It boots ready to run, with the server live and the Web Monitor rendering the farm, and you add your own render nodes (afrender) afterwards.
The image is built from the official CGRU 3.4.1 source, verified against a sha256 checksum at build time, and compiled server-only (no Qt desktop tools). The result is a lightweight C++ service that fits comfortably on a Standard_B2s.
What you get:
- Afanasy afserver 3.4.1 (
github.com/CGRU/cgru, LGPL-3.0), compiled from a sha256-pinned source tarball, server-only (--nogui --nosql) - The Afanasy browser Web Monitor (the render farm dashboard), served by afserver's built-in HTTP server
afserver.servicesystemd unit running the coordinator as a dedicated unprivilegedafanasyaccountcgru-firstboot.servicesystemd oneshot that mints the per-VM Web Monitor credential, generates a per-VM TLS certificate and starts the server before anything is exposed- nginx fronting
:443(per-VM self-signed certificate) with:80redirecting to:443, reverse proxying the Web Monitor behind HTTP Basic auth - An unauthenticated
/healthzendpoint (HTTP 200) wired to the server for load balancer and probe checks - All render farm state (the afserver store) on a dedicated 30 GiB Azure data disk mounted at
/var/lib/cgru - Ubuntu 24.04 LTS base with latest security patches applied at build time and unattended security updates enabled
- Azure Linux Agent for cloud integration and SSH key injection
- 24/7 SecureAnyCloud support with a guaranteed 24 hour response SLA
Architecture
afserver binds 0.0.0.0:51000, a single port that carries both the binary render-node protocol (how afrender nodes connect) and the built-in HTTP server that serves the Web Monitor. On the shipped image, the Azure Network Security Group opens only ports 22, 80 and 443, so :51000 is never reachable from outside the VM.
nginx terminates :443 with a per-VM self-signed certificate and reverse proxies the Web Monitor to 127.0.0.1:51000, gated by per-VM HTTP Basic auth. :80 redirects to :443. Afanasy has no built-in Web Monitor login, so this authenticated front door is what keeps the dashboard private. The image ships with no credential baked in.
Deploy the image
Launch the Afanasy 3.4.1 on Ubuntu 24.04 by SecureAnyCloud image from the Azure Marketplace on a Standard_B2s or larger VM. In the Network Security Group, open inbound ports 22 (SSH), 80 (HTTP) and 443 (HTTPS). The image provisions the 30 GiB data disk that holds the afserver store automatically.
When the VM is running, connect over SSH as azureuser with the SSH key you selected at launch:
ssh azureuser@<public-ip>Confirm the services are running
The Afanasy server and nginx start automatically on boot. Confirm both are active:
systemctl is-active afserver nginxEach command should print active. For the full status view:
systemctl --no-pager status afserver nginx | grep -E 'afserver.service|nginx.service|Active:' | headRetrieve the per-VM Web Monitor credential
HTTP Basic auth protects the Web Monitor with a username and password that are unique to your VM and generated on first boot. Read them from the credentials file:
sudo cat /var/lib/sac/secrets/sac-credentials.txtThe AFANASY_WEB_USER and AFANASY_WEB_PASSWORD values are your Web Monitor credential. Keep the password secret, because it grants full access to the render farm dashboard.
Check server health
The /healthz endpoint is unauthenticated and confirms that the server is up, so you can safely use it for a load balancer or availability probe. The server's own HTTP port 51000 is reachable only from inside the VM:
curl -ks https://127.0.0.1/healthz echo
curl -s -o /dev/null -w 'afserver HTTP %{http_code}\n' http://127.0.0.1:51000/Both should report HTTP 200. nginx answers /healthz, and afserver answers on its own port on the loopback interface.
Prove the authenticated front door
The Web Monitor requires the per-VM credential. A request that authenticates with it returns HTTP 200. A request with no credential, or the wrong one, is rejected by nginx with HTTP 401, because the image ships no default login:
WEB_USER=$(sudo grep '^AFANASY_WEB_USER=' /var/lib/sac/secrets/sac-credentials.txt | cut -d= -f2-)
WEB_PASS=$(sudo grep '^AFANASY_WEB_PASSWORD=' /var/lib/sac/secrets/sac-credentials.txt | cut -d= -f2-)
echo "authenticated: $(curl -ks -o /dev/null -w '%{http_code}' -u "$WEB_USER:$WEB_PASS" https://127.0.0.1/)"
echo "no credential: $(curl -ks -o /dev/null -w '%{http_code}' https://127.0.0.1/)"
echo "wrong password: $(curl -ks -o /dev/null -w '%{http_code}' -u "$WEB_USER:wrong" https://127.0.0.1/)"The authenticated request returns 200. The other two return 401.
Open the Web Monitor
Browse to https://<public-ip>/ and accept the per-VM self-signed certificate. Your browser prompts for the Basic auth credential. Enter the AFANASY_WEB_USER and AFANASY_WEB_PASSWORD from Step 3. The Afanasy Web Monitor opens on its Jobs view, which shows the live server and its built-in system jobs (post_commands, wake-on-lan, events) that keep the farm running:
Review the render farm
Select Farm in the top navigation to see the render pool tree. On a fresh appliance the farm is empty. The root pool / is present and ready, and you add render nodes to it. The left-hand panel gives you the full pool controls: create pools, free or heal hosts, and manage power and tickets.
Open the Users view to see the users the server knows about, with their job and error-solving settings.
Open the Monitors view to see the connected Web Monitors. Your live dashboard session appears here, which confirms that it is registered with the server.
Add your own render nodes
The appliance ships the coordinator only, so you connect your own render machines to it. On each render machine, install CGRU, point it at this server's address and start afrender so that it registers with the farm.
The server port 51000 is closed at the Network Security Group by default. Open it, or a private subset of it, to the machines that will run afrender. Treat it as a trusted-network port rather than a public one, because the Basic auth that protects the Web Monitor does not front the render protocol.
As nodes come online, they appear in the Farm view and start taking tasks from any jobs you submit.
Where the data lives
The afserver store holds jobs, the render-node registry and the server's working state. It lives on the dedicated Azure data disk mounted at /var/lib/cgru. Confirm that the store is on the data disk:
mountpoint /var/lib/cgru ls -la /var/lib/cgru/storeThe store directory is /var/lib/cgru/store. Your render farm state is independent of the OS disk, and you can resize the volume on its own.
Managing the service
Restart or check the Afanasy services with systemd:
sudo systemctl restart afserver
sudo systemctl status afserver --no-pager | headafserver is a lightweight C++ service and idles in a few hundred megabytes, so a Standard_B2s (2 vCPU / 4 GB) comfortably runs the coordinator for a small-to-medium farm. For very large farms with many nodes and heavy job volumes, launch on a larger VM size. The server picks up the additional resources automatically.
Security notes
- No default credential. The image ships with no Web Monitor password and no TLS certificate; first boot mints a unique Basic auth credential and generates a per-VM certificate. The image contains no shared login.
- Rotate the Web Monitor credential for production use: generate a new entry with
sudo htpasswd -B /etc/nginx/.htpasswd afadminand reload nginx. - The Web Monitor is only reachable over
:443(nginx, TLS, Basic auth); afserver's:51000binds inside the VM and is firewalled by the Network Security Group, which opens only 22, 80 and 443. - Treat the render port
51000as a trusted-network port. Open it only to the trusted machines that runafrender, not to the public internet. The render protocol has no Basic auth. - Replace the per-VM self-signed certificate under
/etc/nginx/ssl/with a CA-issued certificate for your DNS name in production. - Keep the VM patched. Unattended security updates are enabled by default.
Troubleshooting
- Browser shows a certificate warning: This is expected, because the image generates a per-VM self-signed certificate. Install a CA-issued certificate for production.
- The Web Monitor prompts for a password again: confirm that you are entering the exact
AFANASY_WEB_USERandAFANASY_WEB_PASSWORDfrom/var/lib/sac/secrets/sac-credentials.txt. - A render node does not appear in the Farm view: confirm the node can reach the server on port
51000(open it at the Network Security Group for that machine) and thatafrenderis pointed at this server's address. - Inspect logs:
journalctl -u afserverandjournalctl -u nginx.
Support
SecureAnyCloud images come with 24/7 support and a guaranteed 24 hour response SLA. Contact support through the Azure Marketplace listing or at secureanycloud.com.
Deploy on Azure
Launch Afanasy 3.4.1 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
Afanasy is the render farm manager from CGRU, the open source computer graphics tools pack. Its server, afserver, keeps the queue. Artists submit jobs (a Blender, Houdini, Nuke or Maya render split into frame ranges, or any command line), and render nodes running afrender connect to the server and pull tasks. Everyone watches progress in the browser-based Web Monitor, which shows jobs and their tasks, the render farm and its pools, users and connected monitors.
This guide covers launching and using the Afanasy 3.4.1 on Ubuntu 24.04 AMI from SecureAnyCloud on Amazon EC2. It is one version of the SecureAnyCloud media servers listing on AWS Marketplace. Select it as the software version when you subscribe and launch.
Afanasy itself has no login. Anyone who can reach afserver can see and control the whole farm, and a job can run commands on the server and on every render node. The SecureAnyCloud image is built around that fact.
What you get:
- afserver listens on loopback only. Upstream afserver always listens on every address; SecureAnyCloud patches it to listen on the address in /etc/default/afserver, which ships as 127.0.0.1. Nothing outside the instance reaches it until you deliberately admit your render nodes from your VPC (Step 8).
- HTTPS from the first boot. nginx serves the Web Monitor and its API on port 443 with a certificate generated on your instance's first boot. Port 80 redirects to HTTPS, and requests for host names the instance does not serve are dropped.
- A login unique to your instance. The Web Monitor sits behind a username and password generated on first boot and written to
/var/lib/sac/secrets/sac-credentials.txt. No password is baked into the image, and the stored copy is a bcrypt hash. - Fail closed. afserver refuses to start until first boot has created the login and the certificate, and nginx refuses to start before first boot has finished.
- Cross-site requests refused. A web page on another site cannot drive your farm through a signed-in browser. State-changing requests from a foreign origin are rejected, and sign-in attempts are rate limited.
- Hardened defaults. afserver, and every job pre command it runs, works as an unprivileged
afanasyuser in a systemd sandbox where only the farm data is writable. afserver, nginx and the first boot service are all blocked from the instance metadata service, the AMI requires IMDSv2, and no compiler ships on the image. - Farm data on its own volume. Jobs, users, pools and render node records live on a dedicated EBS volume mounted at
/var/lib/cgru, which you can resize or snapshot on its own. - Fully patched Ubuntu 24.04 LTS at build time, with unattended security upgrades switched on.
What is on the image: afserver 3.4.1 built from the official CGRU 3.4.1 source (checksum verified, server only, with the SecureAnyCloud listen address patch), the Afanasy Web Monitor, nginx, Ubuntu 24.04 LTS, cloud-init and the AWS Systems Manager agent. The CGRU source, including the patch, is in /opt/cgru.
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.
- A security group that allows:
- TCP 22 (SSH) from your own networks only
- TCP 443 (the Web Monitor) from the networks your artists and administrators work from
- TCP 80 (redirects to HTTPS) from the same sources as 443
Do not open TCP 51000 here. Render nodes reach afserver on that port only after Step 8, and only from their own security group.
afserver is a light C++ service, and the queue for a farm of dozens of nodes fits easily on an m5.large. The rendering itself happens on your render nodes, so size those for your renderer.
Launch the instance
In the AWS Marketplace listing, choose Continue to Subscribe, then Continue to Configuration. Pick Afanasy 3.4.1 on Ubuntu 24.04 as the software version and select your Region, then choose Launch through EC2. Choose m5.large, your key pair and a security group as described in Prerequisites. The AMI includes the farm data volume, so leave its block device mapping in place.
With the AWS CLI (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=afanasy}]'Connect to your instance
For Afanasy 3.4.1 on Ubuntu 24.04, the SSH user is ubuntu.
ssh -i <your-key.pem> ubuntu@<public-ip>Check the services
On first boot, the instance generates the certificate and the login, and then afserver and nginx start:
systemctl is-active cgru-firstboot afserver nginx
sudo test -f /var/lib/sac/data/cgru-firstboot.done && echo FIRSTBOOT_DONEAll three units are active and the first boot marker is present:
active active active FIRSTBOOT_DONEnginx is the only service on public addresses (80 and 443). afserver listens on loopback:
sudo ss -lntp | awk 'NR>1 {print $4, $6}' | 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:51000 users:(("afserver",...)) 127.0.0.53%lo:53 users:(("systemd-resolve",...)) 127.0.0.54:53 users:(("systemd-resolve",...)) [::]:22 users:(("sshd",...),("systemd",...)) [::]:443 users:(("nginx",...),("nginx",...),("nginx",...)) [::]:80 users:(("nginx",...),("nginx",...),("nginx",...))Get your URL and login
sudo cat /var/lib/sac/secrets/sac-credentials.txtThe file is readable by root only:
# Afanasy 3.4.1 - generated on first boot by cgru-firstboot.service
# The Web Monitor login is unique to this instance; none was baked into the image. Keep this file secret. AFANASY_URL=https://ec2-<public-ip-dashed>.<region>.compute.amazonaws.com/ AFANASY_WEB_USER=afadmin AFANASY_WEB_PASSWORD=<AFANASY_WEB_PASSWORD>
# afserver listens on 127.0.0.1:51000 only (render nodes: see the guide, "Connect render nodes").
# Change the name the Web Monitor is served as:
sudo afanasy-set-hostname <your-dns-name>
# User guide: https://secureanycloud.com/stacks/afanasy-3-4-1/The URL uses the instance's public DNS name from the EC2 instance metadata. The certificate also names the public and private IP addresses, so https://<public-ip>/ works too. To use your own DNS name, see Step 9. To share the file, for example in a support request, print it with the password masked:
sudo sed -E 's/^(AFANASY_WEB_PASSWORD=).*/\1********/' /var/lib/sac/secrets/sac-credentials.txt | grep '^AFANASY_'Check the server from the command line
Port 80 redirects to HTTPS, the health check is open for load balancers, and a host name the instance does not serve gets no answer:
H=$(sudo grep '^AFANASY_URL=' /var/lib/sac/secrets/sac-credentials.txt | sed -E 's#^AFANASY_URL=https://([^/]+)/.*#\1#')
curl -s -o /dev/null -w 'http:// -> %{http_code} %{redirect_url}\n' --resolve "$H:80:127.0.0.1" "http://$H/"
curl -sk -o /dev/null -w 'healthz -> HTTP %{http_code}\n' --resolve "$H:443:127.0.0.1" "https://$H/healthz"
curl -sk -o /dev/null -w 'unknown host -> HTTP %{http_code}\n' -H 'Host: other.example' https://127.0.0.1/ || truehttp:// -> 301 https://ec2-<public-ip-dashed>.<region>.compute.amazonaws.com/ healthz -> HTTP 200 unknown host -> HTTP 000The Web Monitor refuses a request with no password or a wrong one, and accepts this instance's login. The password is passed to curl on standard input, so it never appears in the process list or your shell history:
sudo bash -c ' F=/var/lib/sac/secrets/sac-credentials.txt P=$(grep "^AFANASY_WEB_PASSWORD=" $F | cut -d= -f2-) H=$(grep "^AFANASY_URL=" $F | sed -E "s#^AFANASY_URL=https://([^/]+)/.*#\1#") R="--resolve $H:443:127.0.0.1" curl -sk $R -o /dev/null -w "no password -> HTTP %{http_code}\n" "https://$H/" printf "user = \"afadmin:wrong\"\n" | curl -K - -sk $R -o /dev/null -w "wrong password -> HTTP %{http_code}\n" "https://$H/" printf "user = \"afadmin:%s\"\n" "$P" | curl -K - -sk $R -o /dev/null -w "per-instance login -> HTTP %{http_code}\n" "https://$H/" 'no password -> HTTP 401 wrong password -> HTTP 401 per-instance login -> HTTP 200The same login protects afserver's JSON API, which the Web Monitor and your scripts use. This lists the jobs on the farm; a new farm holds only afserver's own system job, afanasy:
sudo bash -c ' F=/var/lib/sac/secrets/sac-credentials.txt P=$(grep "^AFANASY_WEB_PASSWORD=" $F | cut -d= -f2-) H=$(grep "^AFANASY_URL=" $F | sed -E "s#^AFANASY_URL=https://([^/]+)/.*#\1#") Q="{\"get\":{\"type\":\"jobs\"}}" printf "user = \"afadmin:%s\"\n" "$P" | curl -K - -sk --resolve "$H:443:127.0.0.1" -X POST \
-H "AFANASY: ${#Q}" -H "Origin: https://$H" --data-binary "$Q" "https://$H/" | jq -r ".jobs[].name" 'afanasyUse the Web Monitor
Open AFANASY_URL in your browser and sign in as afadmin with the password from Step 4. The certificate is self-signed, so your browser asks you to confirm it the first time. To install your own certificate, see Step 9.
Jobs lists every job with its state, owner, priority and frame range. The afanasy job is afserver's own system job, which runs post commands, wake-on-LAN and events. In this example, demo-render is a 24-frame job waiting for render nodes. The buttons on the left start, pause, stop, restart and delete the selected job:
Double-click a job to open its tasks. Each frame is a task with its state, error count and starts; SKIP, RESTART and CONTINUE act on the selected tasks:
Farm shows the render pools and the render nodes connected to them, with controls to add pools, pause nodes, mark them busy (NIMBY), eject tasks and run services. A new farm has only the root pool / until render nodes connect (Step 8):
Users lists everyone who has submitted jobs, with their priority, error handling and how their jobs are ordered:
Monitors lists the connected Web Monitor sessions. Every browser session arrives from 127.0.0.1 because nginx is the only path to afserver; the real client addresses are in /var/log/nginx/access.log:
A note on Afanasy's own permissions: the Web Monitor's VISOR and GOD modes, which let a user manage other users' jobs and the farm, are switches in the browser, not passwords checked by the server. Treat everyone who has the Web Monitor login as a farm administrator.
Submit a job
Artists normally submit from their applications with CGRU's submitters or the af Python module on a workstation that can reach afserver (Step 8). You can also submit through the authenticated API. This request sends a small two-frame test job, lists it and deletes it again. With no render nodes connected, its tasks wait in the queue:
sudo bash -c ' F=/var/lib/sac/secrets/sac-credentials.txt P=$(grep "^AFANASY_WEB_PASSWORD=" $F | cut -d= -f2-) H=$(grep "^AFANASY_URL=" $F | sed -E "s#^AFANASY_URL=https://([^/]+)/.*#\1#") api() { printf "user = \"afadmin:%s\"\n" "$P" | curl -K - -sk --resolve "$H:443:127.0.0.1" -X POST \
-H "AFANASY: ${#1}" -H "Origin: https://$H" --data-binary "$1" "https://$H/"; } J="{\"job\":{\"name\":\"hello-farm\",\"user_name\":\"afadmin\",\"host_name\":\"guide\",\"blocks\":[{\"name\":\"frames\",\"service\":\"generic\",\"capacity\":1000,\"flags\":1,\"frame_first\":1,\"frame_last\":2,\"frames_per_task\":1,\"frames_inc\":1,\"command\":\"echo frame @#@\"}]}}" ID=$(api "$J" | jq -r ".id") echo "submitted job id $ID" api "{\"get\":{\"type\":\"jobs\"}}" | jq -r ".jobs[] | select(.name==\"hello-farm\") | \"\(.name): \(.blocks[0].tasks_num) tasks\"" api "{\"action\":{\"type\":\"jobs\",\"ids\":[$ID],\"user_name\":\"afadmin\",\"host_name\":\"guide\",\"operation\":{\"type\":\"delete\"}}}" | jq -r ".info.text" 'submitted job id 2 hello-farm: 2 tasks Action processed.Connect render nodes
Render nodes, and workstations that submit with CGRU's own tools, connect straight to afserver on TCP 51000. That protocol has no authentication, so admit only machines you control and only from inside your VPC.
- Find the instance's private address:
jq -r '.ds["meta-data"]["local-ipv4"]' /run/cloud-init/instance-data.json- Make afserver listen on that address. Edit
/etc/default/afserverand setAF_SERVER_BIND_ADDRESSto the private address, then restart afserver:
sudo sed -i 's/^AF_SERVER_BIND_ADDRESS=.*/AF_SERVER_BIND_ADDRESS=<private-ip>/' /etc/default/afserver
sudo systemctl restart afserver
sudo ss -lntp | grep afserver- Allow TCP 51000 into this instance's security group only from the render nodes' security group (never from
0.0.0.0/0):
aws ec2 authorize-security-group-ingress --group-id <afanasy-server-sg> \
--protocol tcp --port 51000 --source-group <render-nodes-sg>- On each render node, install CGRU 3.4.1 (the same release as the server), point it at the server in
<cgru-location>/config.jsonand startafrender:
{"cgru_config": {"af_servername": "<private-ip>", "af_serverport": 51000}} <cgru-location>/start/AFANASY/_afrender.shThe node appears in Farm within a few seconds and starts taking tasks. Render nodes run job commands as the user that runs afrender, so run it as a dedicated unprivileged user on each node.
To close the server again, set AF_SERVER_BIND_ADDRESS=127.0.0.1, restart afserver and remove the security group rule. afserver refuses to start if the address is empty or not an IPv4 address.
Use your own DNS name and certificate
Point a DNS record at the instance (an Elastic IP keeps the address stable), then tell the instance its name. This command regenerates the self-signed certificate for that name, updates the credentials file and reloads nginx:
sudo afanasy-set-hostname farm.your-domain.exampleTo use a certificate from a public CA instead, replace /etc/nginx/ssl/afanasy.crt (full chain) and /etc/nginx/ssl/afanasy.key (mode 0600) and run sudo systemctl reload nginx.
Security checks
afserver listens on loopback and cannot start without the first boot login; afserver, nginx and the first boot service are blocked from the instance metadata service:
grep '^AF_SERVER_BIND_ADDRESS=' /etc/default/afserver systemctl show afserver -p Requires --value systemctl show afserver nginx cgru-firstboot -p IPAddressDeny --valueAF_SERVER_BIND_ADDRESS=127.0.0.1 -.mount var-lib-cgru.mount cgru-firstboot.service sysinit.target system.slice 169.254.169.254/32 168.63.129.16/32 fd00:ec2::254/128 169.254.169.254/32 168.63.129.16/32 fd00:ec2::254/128 169.254.169.254/32 168.63.129.16/32 fd00:ec2::254/128afserver runs unprivileged in a read-only system with only the farm data writable, and there is no compiler on the image:
systemctl show afserver -p User -p ProtectSystem -p NoNewPrivileges -p ReadWritePaths command -v gcc g++ make cmake || echo "no compiler toolchain on the image"User=afanasy ReadWritePaths=/var/lib/cgru ProtectSystem=strict NoNewPrivileges=yes no compiler toolchain on the imageMaintenance
- Configuration:
/opt/cgru/config.json(port, store folder) and/etc/default/afserver(listen address). Apply changes withsudo systemctl restart afserver. CGRU's full list of settings is in/opt/cgru/afanasy/config_default.json; put overrides in/opt/cgru/config.jsonrather than editing the defaults. - Changing the Web Monitor password:
printf '%s\n' '<new-password>' | sudo htpasswd -i -B -C 12 /etc/nginx/.htpasswd afadmin, then update/var/lib/sac/secrets/sac-credentials.txt. First boot runs only once, so it never overwrites your change. Add more people with the same command and their own usernames. - Farm data: jobs, users, pools and render node records are in
/var/lib/cgru/storeon the data volume. Snapshot that volume to back up the farm; stop afserver first for a consistent copy. - Logs: afserver logs to the journal (
journalctl -u afserver); nginx, with the real client addresses, logs to/var/log/nginx/. - Security updates: unattended security upgrades are on. Reboot when a new kernel is installed.
Support
SecureAnyCloud provides 24/7/365 expert technical support for this image. Contact sales@secureanycloud.com. Afanasy is part of CGRU, developed by the CGRU team and licensed under the GNU Lesser General Public License version 3; the corresponding source, including the SecureAnyCloud listen address patch in afanasy/src/server/threadacceptclient.cpp, is on the image in /opt/cgru and upstream at github.com/CGRU/cgru. This image is provided by SecureAnyCloud and is not affiliated with or endorsed by the CGRU project.
Deploy on AWS
Launch Afanasy 3.4.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