Currently for Asimov testnet validators, we follow the public documentation and the Google doc provided by GenLayer Foundation to setup the node. This post introduces two improvements for the setup:
configure the validator as a systemd service
create a cronjob that collects the validator service’s logs every week as we are required to submit them to the foundation
The last step mentioned in the documentation is Running the node
, where we use the following command to start the validator service:
./bin/genlayernode run -c $(pwd)/configs/node/config.yaml --password "your secret password"
As a systemd service config is visible to all the users, we recommend saving this value into a .env
file so that the permission can be restricted to the service user later on.
# create a .env file that holds the password and HEURISTKEY value required by Heurist mode
echo "GENLAYERNODE_PASS=<the_password>" >> ~/.env
echo "HEURISTKEY=<your_llm_provider_api_key>" >> ~/.env
# restrict the access of this file
chmod 600 ~/.env
Then we create a systemd service for the validator. Note that this should be done by a sudo user. In our setup, we have created a dedicated user genlayer
to run the genlayernode
service. You need to change the name in the service definition accordingly if this is not your case.
sudo vim /etc/systemd/system/genlayer-validator.service
[Unit]
Description=Genlayer Validator Node
After=network-online.target
[Service]
User=genlayer
WorkingDirectory=/home/genlayer/genlayer-node-linux-amd64
ExecStart=/bin/bash -c '/home/genlayer/genlayer-node-linux-amd64/bin/genlayernode run -c /home/genlayer/genlayer-node-linux-amd64/configs/node/config.yaml --password "$GENLAYERNODE_PASS"'
Restart=always
RestartSec=3
EnvironmentFile=/home/genlayer/.env
[Install]
WantedBy=multi-user.target
# reload the daemon and start the service
sudo systemctl daemon-reload
sudo systemctl enable --now genlayer-validator.service
As now the validator service is running as a systemd service, you can use journalctl
to check the logs. For examples:
# show the latest 100 lines of logs and tail the new logs
sudo journalctl -n 100 -f -u genlayer-validator.service
# show today's logs
sudo journalctl --since="today" -u genlayer-validator.service
# show the logs from 2025-04-30 00:00:00 to 2025-05-06 23:59:59
sudo journalctl --since="2025-04-30" --until="2025-05-06" --no-pager -u genlayer-validator.service
As mentioned in the Google doc: “For the first few weeks please keep a copy of the stdout logs and send them once a week to the GenLayer Foundation until we have better tools for metrics and monitoring”. We can create a cronjob that exports the logs as a tar file so that we can easily scp
and submit it.
Create a bash file with the following content, for example, vim ~/export-validator-logs.sh
.
#!/bin/bash
# Configuration
SERVICE_NAME="genlayer-validator.service"
BASE_DIR="/tmp"
OWNER_AND_GROUP="root:root"
# Calculate date range (excluding today)
# xxx_ISO format is used for journalctl commands while the other pair is used for folder and tar file names
END_DAY_ISO=$(date -d "yesterday" +%Y-%m-%d)
START_DAY_ISO=$(date -d "$END_DAY_ISO - 6 days" +%Y-%m-%d)
END_DAY=$(date -d "yesterday" +%Y%m%d)
START_DAY=$(date -d "$END_DAY_ISO - 6 days" +%Y%m%d)
# Temporary directory for logs
TEMP_DIR="$BASE_DIR/validator-logs-$START_DAY-$END_DAY"
# Check if the temporary directory exists, and remove it if it does
if [ -d "$TEMP_DIR" ]; then
echo "Removing existing temporary directory: $TEMP_DIR"
rm -rf "$TEMP_DIR"
fi
# Create the temporary directory
mkdir -p "$TEMP_DIR"
# Extract the logs for each day (excluding today)
for ((i=0; i<=6; i++)); do
LOG_DATE_ISO=$(date -d "$START_DAY_ISO + $i days" +%Y-%m-%d)
journalctl -u "$SERVICE_NAME" --since "$LOG_DATE_ISO 00:00:00" --until "$LOG_DATE_ISO 23:59:59" > "$TEMP_DIR/$(date -d "$START_DAY + $i days" +%Y%m%d).log"
if [ $? -ne 0 ]; then
echo "Failed to extract logs for $LOG_DATE"
exit 1
fi
done
# Create a compressed tar file
TAR_FILE="$BASE_DIR/validator-logs-$START_DAY-$END_DAY.tar.gz"
tar -czf "$TAR_FILE" -C "$BASE_DIR" "validator-logs-$START_DAY-$END_DAY"
# Cleanup
if [ $? -eq 0 ]; then
echo "Logs archived successfully: $TAR_FILE"
chown -R $OWNER_AND_GROUP $TEMP_DIR
chown $OWNER_AND_GROUP $TAR_FILE
echo "Changing the generated files ownership to $OWNER_AND_GROUP"
else
echo "Failed to create tar file"
exit 1
fi
Change the mod of this script and then add it to the root user’s cronjob list (because journalctl
requires sudo access).
chmod +x ~/export-validator-logs.sh
sudo cronjob -e
# execute the script at 01:00 on Friday, adjust the time if you need
0 1 * * 5 /absolute/path/to/export-validator-logs.sh
You can also run the script directly to generate the log collection tar file when you need:
sudo ./export-validator-logs.sh
# output:
Logs archived successfully: /home/genlayer/validator-logs-20250507-20250513.tar.gz
Changing the generated files ownership to genlayer:genlayer
ls validator*
# output:
validator-logs-20250507-20250513.tar.gz
validator-logs-20250507-20250513:
20250507.log 20250508.log 20250509.log 20250510.log 20250511.log 20250512.log 20250513.log
Firstset