How it works, in one minute
Three parties take part. EduLink prepares everything. You only run the delivery.
The installer is safe to run again. If something stops halfway, fix the cause and run the same command once more.
Type your details once
Fill in the boxes. Every command below then shows your own values in yellow, ready to copy. These values stay in your browser only.
EduLink's side: make the kit and the license
Only for EduLink, the vendor. A customer skips this part: they receive the kit, its checksum and the license from EduLink. If you install EduLink for yourself, you play both parts: do this first, then follow the steps from "Before you start".
Everything here runs on your own computer, the one that has the source code, Go and Flutter, and the license signing key. Never on a server. Commands start in the root folder of the source code.
Once ever: the license signing key
Every license is signed with a private key that only EduLink has. The program checks the signature with the matching public key, which is built into it. If services/api/internal/license/publickey.go already holds a key, this is done: skip to "Each customer".
cd services/api
go build -o edulink-license ./cmd/license
./edulink-license keygenIt writes the private key to ~/.config/edulink/license-signing.key and prints the public key. Paste the public key into publickey.go and commit it.
Back it up offline. It must never go into git, a kit, an email or a server. Whoever has it can issue licenses. If it is lost, every installation needs a new program with a new public key.
Each customer: 1. Make the kit
First agree the website address and the instance name with the customer (step 1). Type them into the boxes above. One kit belongs to one address, because the website has the address built in. Prepare the tool once, as in step 7, then build:
cd infrastructure/pyinfra
python3 -m venv .venv && . .venv/bin/activate && pip install -r requirements.txt
python3 make_kit.py --domain YOUR_DOMAIN --instance YOUR_INSTANCEIt takes about five minutes, mostly for the website. It builds the program for both server types; add --arch amd64 (or arm64) to build for one only. Add --reuse-web to skip the website build when you rebuild for the same address.
Kit written : …/dist/edulink-deploy-kit-YOUR_DOMAIN-….tar.gz and, at the end, KIT sha256 with a 64-character code. It refuses to build while publickey.go has no key, because such a program could never be licensed.
Commit your changes before you build, so the kit names an exact version of the source. Send the kit file, and send the checksum in a different message, for example by phone.
Each customer: 2. Issue the license
Build the license tool once (as above, in services/api), then create the license. Change the customer name, limits, end date and modules to what you agreed. Leave a limit out, or set it to 0, for no limit.
cd services/api
./edulink-license create \
--instance YOUR_INSTANCE \
--customer "Customer name" \
--students 20000 \
--schools 120 \
--accounts teacher=1500,school_admin=240,parent=30000,student=20000 \
--expires 2027-09-30 \
--grace 30 \
--modules attendance,assessments,communicationOne long line: that is the license. Below it a readable summary of what it allows. The line is what the superadmin pastes in step 12.
To check a license before you send it, run ./edulink-license show followed by the line. It shows the contents and confirms that the signature matches the public key in your source code.
The instance name in the license must be exactly the one in the kit and the settings file, or the installation refuses it. --expires is the last day of full use. After it come --grace days of warnings, then read-only. To renew or change limits, issue a new license the same way; installing it replaces the old one. Every option is explained in docs/licensing.md.
Before you start
Tick each item when you have it. If one is missing, get it first. It saves time later.
- Any provider that rents Linux servers works, for example UpCloud, DigitalOcean, Hetzner, Vultr, AWS or Google Cloud. You need a payment method. The provider charges while the server exists, so you delete it when a test is over.
- This is the place where you manage the address, for example at the company you bought it from. You will add one line there.
- Linux or a Mac works as it is. On Windows, use WSL (Ubuntu inside Windows). You do not need Go, Flutter or any source code. Ask your technical contact if you are unsure.
- One file whose name starts with
edulink-deploy-kit-and ends with.tar.gz. It is built for your web address and works on both common server types. - A long code of 64 letters and digits that fingerprints the whole kit, sent in a different message than the kit, for example by phone. Step 2 explains it.
- EduLink issues it. It names your instance, so EduLink needs your instance name first.
- An Ethiopian mobile number (+251…) that you keep. The superadmin, the top account, has no password to copy: it is activated with a code sent to this phone.
- An AfroMessage token, an identifier ID and an approved sender name. Decide now. Adding SMS after the first install needs a technical helper.
Pick three names and tell EduLink
Decide these things and write them down. EduLink needs them before it can make your kit, because the website part has your address built in.
- Website address. The web address people will type, for example YOUR_DOMAIN.
- Instance name. One short word in lowercase letters and digits that starts with a letter, for example
myschool. It names the folders on the server and it is written into your license, so it cannot change later. - Your email (optional). Let's Encrypt, the free certificate service, sends a warning here if the padlock is ever about to expire.
Send EduLink the address and the instance name. Type your values into the boxes near the top of this page.
Receive and check your kit
EduLink sends you two things through different channels: the kit file, and a code called a checksum. The checksum is a fingerprint of the whole kit: the program, the website and the installer that will run on your server. If the fingerprint you compute matches the one EduLink told you, nobody changed anything on the way. Check it before you unpack the kit.
- Save the kit file in a folder you can find, for example your Downloads folder.
- Open a terminal in that folder and compute the fingerprint of the kit file. On Linux:
sha256sum edulink-deploy-kit-*.tar.gzOn a Mac use shasum -a 256 edulink-deploy-kit-*.tar.gz instead.
A line that starts with 64 letters and digits. Compare it with the checksum EduLink sent you separately. Every character must match.
Do not unpack or install. The download may be damaged or changed. Ask EduLink to send the kit again, and tell them both codes.
- Only when they match, unpack the kit:
tar -xzf edulink-deploy-kit-*.tar.gz- Go into the new folder. Its name starts with
edulink-deploy-kit-. Then go to the tool folder:
cd edulink-deploy-kit-*/infrastructure/pyinfraYou are EduLink and make the kit yourself? See EduLink's side first, then continue here with your own kit file and checksum.
You keep this terminal folder for the rest of the guide. Every command below is typed in infrastructure/pyinfra inside your kit. The installer also checks the program against the fingerprint file inside the kit before it uploads anything.
Make your digital key
The installer needs a way to log in to the server without a password. You make a pair of files. The public file is like a padlock that you hand out. The private file is the only key that opens it, and it never leaves your computer.
- Copy this command, paste it in the terminal, and press Enter. It creates the two files.
ssh-keygen -t ed25519 -f ~/.ssh/edulink_deploy -N "" -C "edulink-deploy"- Now show the public file, which is the only one you will share:
cat ~/.ssh/edulink_deploy.pubOne long line that starts with ssh-ed25519 AAAA and ends with edulink-deploy. Leave the terminal open. You copy that line in the next step.
The file called edulink_deploy (without .pub) is your private key. Do not email it, paste it into a chat, or put it in a shared folder.
It says the file already exists
You made this key before. You can reuse it and skip to step 4, or choose a new name such as edulink_deploy2 and use that name everywhere below.
Give your cloud provider the public key
The provider will put your padlock (the public key) on the new server, so that only your private key can open it.
- Sign in to your cloud provider's website.
- Find the place where SSH keys are stored. Depending on the provider it is called SSH keys, Key pairs or Public keys. It is usually under Account, Security or Settings.
- Choose Add or Import. Paste the long line from step 3 and give it a name such as
edulink-deploy. Save it.
Some providers only let you add a key while you create the server. That is fine. Add it in step 5 instead, then tick this step once the server exists.
Create the server
Your provider may call it a server, a VM, a droplet, an instance or a cloud server. It is all the same thing: a small computer you rent.
- Choose Create or Deploy a new server.
- Choose a location close to your users.
- Choose a size with at least 2 GB of memory and 2 CPU cores. A small size is enough for a first installation. Choose the common x86-64 type. An ARM type works too.
- For the operating system choose Ubuntu Server 24.04 LTS or newer (26.04 LTS has been tested). Debian 12 or newer also works.
- For login choose SSH key and select the key from step 4. Do not use a password.
- Make sure the server gets a public IPv4 address. Some providers make this a checkbox.
- If the provider has its own firewall (it may be called firewall, security group or network rules), allow incoming connections on ports 22, 80 and 443.
- Give the server a name, such as
edulink, and create it. - Wait until it says it is running. Copy the server's public IPv4 address and type it into the "Server address" box at the top of this page. Also note the user name your provider says to log in with. Many providers use
root. Others useubuntu,adminor another name.
Now check that your computer can reach the new server. If your provider's user name is not root, replace root below with it:
ssh -i ~/.ssh/edulink_deploy root@YOUR_SERVER_IP "hostname"The first time, the computer asks whether to continue connecting. Type yes and press Enter. It then prints the server's name and returns to your prompt. No password is asked.
The provider bills for the server while it exists. The last part of this guide explains how to delete it when you are done.
It says "Permission denied (publickey)"
Either the key was not attached to this server, or the user name is wrong. Check the user name in your provider's instructions. If the key was not selected when you created the server, delete the server and create it again with the key selected. Also check that the key file name in the command matches the one you made.
It hangs and then says "Connection timed out"
The provider's firewall is blocking port 22, or the server has no public IPv4 address. Fix that in the provider's website (step 5, points 6 and 7) and try again.
Point your address at the server
Your website address is a name. DNS is the phone book that turns that name into the server's number. You add one line to the phone book.
- Open the DNS settings of your domain, at the company where you manage it.
- Add a new record with type A.
- For Name (or Host) enter the first part of your address. For YOUR_DOMAIN that is the part before your main domain.
- For Value (or Points to) enter YOUR_SERVER_IP. Leave the other fields at their defaults and save.
- Want monitoring (step 13)? Add a second A record the same way, for the monitoring address YOUR_MONITOR_DOMAIN, with the same value YOUR_SERVER_IP. Doing it now gives it time to spread.
Check whether it worked. This can take a few minutes, and sometimes up to an hour:
ping -c 1 YOUR_DOMAINA first line that shows your server address in brackets, for example PING school.example.org (203.0.113.10). It is fine if the replies say the server does not answer. Only the number in brackets matters.
The number is different or the command says the name is unknown. The installer checks this too and stops before changing anything, so waiting costs nothing.
Prepare the tool
The installer is a small tool called pyinfra. This step puts it in its own private folder inside your kit, so it cannot disturb anything else on your computer. You do it once.
- Make sure your terminal is in the
infrastructure/pyinfrafolder of your kit (step 2). Then create the private folder and install the tool. This needs internet.
python3 -m venv .venv
. .venv/bin/activate
pip install -r requirements.txtYour prompt now starts with (.venv). That means the tool is ready. Check with pyinfra --version.
Go to the same folder and run . .venv/bin/activate again. If you see pyinfra: command not found, this is the reason.
It says "ensurepip is not available"
On Ubuntu, install the missing part first with sudo apt install python3-venv, then repeat the commands.
Create the settings file
Instead of running steps 8 to 13 one by one, you can run them all with one command. It asks the step 8 questions, waits for your address to point at the server, secures it, installs EduLink and monitoring, and sends (or offers to show) the superadmin's activation code. It shows what it does as it goes, writes everything to a log in local/, and ends with a list of exactly what is left for you and the command for each. If it stops, it says why: fix that and run it again. Finished parts are skipped.
python3 install.pyAfter it finishes, do steps 11 and 12 in the browser (activate the superadmin, then install the license) and the final check in step 14. The steps below explain what each part does, and how to do it by hand.
One small file tells the installer which server to use and how to name things. A helper asks you a few questions and writes the file for you, so you never edit it by hand and cannot break it. The file stays on your computer and is never shared.
- In the tool folder, with
(.venv)showing, run the helper and answer each question:
python3 make_inventory.pyA short list of questions. When they are done it prints Written: …/local/inventory.py (only you can read it).
What to answer
- Server IP address: the public IPv4 address from step 5 (YOUR_SERVER_IP).
- Instance name: only asked if the kit does not know it. Use the name you gave EduLink in step 1 (YOUR_INSTANCE).
- Your email: optional, for certificate expiry notices (YOUR_EMAIL). Press Enter to skip.
- Region name: optional. It creates the region your installation serves, for example Dire Dawa.
- SSH private key file: press Enter to accept
~/.ssh/edulink_deploy, the key from step 4. - This computer's public IP: optional. It lists your own internet address so the firewall never slows you down.
- Send SMS: answer
nounless you have your AfroMessage token, identifier ID and approved sender name. Decide now: adding SMS after the first install needs a technical helper. The token is typed hidden. - Monitoring address: press Enter to accept the suggested name (
monitorfollowed by your website address), type another name, or typenonefor no monitoring. It needs its own A record (step 6). - Super-admin mobile phone: the phone that receives the superadmin's activation code. Type it twice; the helper then shows it with only the last four digits and asks you to confirm.
Read the line under it, fix that one answer and run the helper again. Nothing is saved until every answer passes the checks. You do not have to tell it where the program or the website is: it finds them in the artifacts folder of the kit.
The user name in the file is deployer. That account does not exist yet. Step 9 creates it.
Secure the server
A new server lets the all-powerful root account log in from the internet. That is risky. This step creates a normal account named deployer, tests it, and only then switches the risky logins off.
pyinfra local/inventory.py bootstrap.py --user root -y--user root is used only this one time. -y means "yes, go ahead" so it does not ask before each action.
My provider does not give me a root user
Use the user name your provider gave you in step 5, for example ubuntu, and add --sudo: pyinfra local/inventory.py bootstrap.py --user ubuntu --sudo -y. Everything else in this step stays the same.
About ten lines that each end in Success. Two of them print a message: guard ok: deployer logs in with the key and has sudo, and near the end verified: root login refused, deployer works.
The installer proves that deployer can log in before it touches anything else. If that test fails, it stops and leaves the server as it was.
Install EduLink
This is the main step. The installer checks your program and website, sends them to the server, and sets up the database, the secure web address, the firewall, the intrusion blocker and the nightly backup. Nothing is built on your computer.
pyinfra local/inventory.py deploy.py --sudo -y- Do not close the window until it finishes.
--sudois required. Without it the installer refuses to start, which protects your passwords.
Near the start: program api-linux-amd64: sha256 … (matches the kit) and web app: …. Then a long list of steps, each ending in Success or No Change. At the very end: https://YOUR_DOMAIN is live. and where the superadmin's activation code went. No password is printed.
With SMS on, the code arrives on the superadmin phone within minutes. With SMS off, or if it never arrives, step 11 shows how to get it from the server.
It stopped with an error
Read the last lines. Most messages say exactly what to fix, for example the address does not point at the server yet, or the checksum does not match. Fix it and run the same command again. See "If something goes wrong" below.
Activate the superadmin
- Open
https://YOUR_DOMAIN/staff-activatein your web browser. You should see a padlock next to the address. - Enter the superadmin phone and the 6-digit code from the SMS. The code works once and expires after 24 hours.
- Choose your password: at least 8 characters with a letter and a digit. Save it in your password manager. You are signed in as
superadmin.
No SMS arrived, or SMS is off
Show a fresh code on the server instead. It must run in an interactive terminal (-t), so the code never lands in a log:
ssh -t -i ~/.ssh/edulink_deploy deployer@YOUR_SERVER_IP 'sudo edulink-superadmin issue-code --show'The whole superadmin journey on one page, with every SMS step marked: Superadmin setup.
Install the license
Until a license is installed, EduLink lets people look at data but blocks every change. This is by design.
- Get the license line from EduLink. It must be issued for the instance name YOUR_INSTANCE.
- In EduLink open Home, then License, then Install license.
- Paste the whole line and confirm.
The license page shows the license as active, with your limits and an end date. The read-only warning disappears.
It says the license belongs to a different instance
The instance name in the license does not match the one in your settings file. Ask EduLink for a license with the right name. The name cannot be edited afterwards.
Add monitoring
Optional, but recommended. Monitoring keeps a year of graphs about the server and EduLink (memory, disk space, the database, requests and errors) and shows them on a password-protected page at your monitoring address. It runs on the same server and changes nothing in EduLink. The tools are VictoriaMetrics, which stores the numbers, and Grafana, which draws them.
- Check that the monitoring address from step 6 shows your server's number. Continue only when it does:
ping -c 1 YOUR_MONITOR_DOMAIN- Copy the monitoring files from your kit to the server. Run this in
infrastructure/pyinfra, as before:
tar -czf - -C .. monitoring | ssh -i ~/.ssh/edulink_deploy deployer@YOUR_SERVER_IP 'rm -rf ~/monitoring && tar -xzf - -C ~'- Install it. This downloads the tools, checks their fingerprints, gets a padlock for the monitoring address and starts everything. It takes a few minutes:
ssh -i ~/.ssh/edulink_deploy deployer@YOUR_SERVER_IP 'sudo MONITOR_DOMAIN=YOUR_MONITOR_DOMAIN bash ~/monitoring/install-ubuntu.sh'Near the end, four checks that say OK (VictoriaMetrics, Grafana, Node Exporter and PostgreSQL Exporter), then VictoriaMetrics Monitoring Stack Successfully Installed!. If one says "starting", wait a minute: it is still starting up.
- Show the Grafana password. It was made at random during the install and is kept on the server only:
ssh -t -i ~/.ssh/edulink_deploy deployer@YOUR_SERVER_IP 'sudo cat /etc/grafana/admin-password; echo'- Open
https://YOUR_MONITOR_DOMAIN, sign in with useradminand that password, and save it in your password manager. The home page is the EduLink System Overview dashboard. Its graphs fill in over the next minutes.
The install is safe to repeat. Running it again keeps the same password. Only the web page is public, behind the padlock and the password: everything else listens on the server itself only.
It stopped at the certificate (certbot)
The monitoring address does not point at the server yet. Wait, check again with the ping command in point 1, then run the install command again.
Alerts by email
Alert rules come pre-installed, but sending email needs a mail account (SMTP). A technical helper can add it later by running the same install again with the extra settings described in infrastructure/monitoring/README.md in your kit.
Final check
Tick each line that is true.
- Your address opens with
https://and no warning. - Open
https://YOUR_DOMAIN/readyz. It shows a short "ready" message. - After the license, try adding a test record and remove it again.
- Backups run every night but stay on the same server until someone copies them elsewhere.
- If you did step 13:
https://YOUR_MONITOR_DOMAINasks for the Grafana password and then shows the EduLink System Overview.
Afterwards: new versions, backups and undo
A new version of the program
When EduLink improves the program, they send you a new kit and, in a separate message, its new checksum. Your settings and your data stay as they are.
- Save the new kit file next to the old one and check its fingerprint against the new checksum, exactly as in step 2. Then unpack it. It makes a new folder.
- In the new folder, repeat step 7 to prepare the tool, then copy your settings over from the old kit:
cp -r OLD/infrastructure/pyinfra/local .- Run the fast update. It takes under a minute:
pyinfra local/inventory.py deploy_binary.py --sudo -yprogram … (matches the kit), then Success on the upload, the switch and the restart. If the program is the same as before, it says No Change and nothing restarts.
The older versions stay on the server. The newest three are kept.
A new website (screens) or new settings
EduLink sends a new kit. Unpack it into a new folder and repeat step 7 there. Then copy your local/inventory.py into the new local folder, and run the full install again. It is safe to repeat. It only changes what differs and never rewrites your passwords.
pyinfra local/inventory.py deploy.py --sudo -ySettings stored in the server's api.env file, such as SMS details, are written once at the first install. Changing them later needs a technical helper.
Go back to the previous program version
First list the saved versions. The newest is at the top:
ssh -i ~/.ssh/edulink_deploy deployer@YOUR_SERVER_IP 'sudo ls -1t /opt/edulink-YOUR_INSTANCE/releases'Then switch to the older one. Replace api-OLDVERSION with its name from the list:
ssh -i ~/.ssh/edulink_deploy deployer@YOUR_SERVER_IP 'sudo ln -sfn /opt/edulink-YOUR_INSTANCE/releases/api-OLDVERSION /opt/edulink-YOUR_INSTANCE/api && sudo systemctl restart edulink-api@YOUR_INSTANCE'Going back is safe unless the newer version changed the database layout. Ask EduLink before rolling back across such a version.
Backups
- A backup runs every night at about 02:17 server time. It contains the database, the user accounts and uploaded documents.
- The newest 14 days are kept on the server in
/var/backups/edulink. - These backups sit on the same machine as the data. If the server is lost, so are they. Ask a technical helper to copy them to another place.
Forgot the superadmin password?
It can only be reset on the server, never by SMS: whoever can reset the superadmin owns the whole installation. This asks for the new password twice, without showing it, and signs the superadmin out everywhere:
ssh -t -i ~/.ssh/edulink_deploy deployer@YOUR_SERVER_IP 'sudo edulink-superadmin recover'To change the superadmin phone: sudo edulink-superadmin set-phone the same way. It texts a code to the new phone and changes nothing until you type it back.
Finished with a test? Stop the bill
- In your provider's website delete the server. If it asks, delete its disks too.
- Also delete anything attached to it that keeps billing: extra disks, reserved or floating IP addresses, snapshots and backups.
- Remove the A record from your DNS settings, and the monitoring one if you made it.
- On your computer run
rm ~/.ssh/edulink_deploy ~/.ssh/edulink_deploy.pub, and remove the public key from your provider's SSH keys list.
If something goes wrong
Nothing here is dangerous to retry. Fix the cause and run the same command again.
| What you see | What it means | What to do |
|---|---|---|
CHECKSUM MISMATCH | The program file is not the one EduLink made. It may be damaged or replaced. Nothing was changed on the server. | Do not install it. Ask EduLink to send the kit again and give them both codes. |
built for a different kind of CPU | The program in the kit does not fit this server. The file was swapped or damaged. | Check the kit's checksum again as in step 2. If it matches, tell EduLink. |
not a 64-bit Linux program | The file is damaged or the wrong file. | Unpack the kit again from the original download. |
built for a different web address | The website in the kit was made for another domain. | Ask EduLink for a kit made for your exact address. One kit belongs to one address. |
pyinfra: command not found | The tool's private folder is not switched on in this window. | Run . .venv/bin/activate inside infrastructure/pyinfra. |
DNS: … resolves to nothing | Your address does not point at the server yet. | Wait, recheck with the ping command in step 6, then run again. |
not running as root — pass --sudo | You left out --sudo. | Add --sudo to the command. This protects your passwords. |
LOCK-OUT GUARD | The new deployer account could not log in. Nothing was changed. | Check that the key was attached to the server and that the key file name in your settings is right. |
Permission denied (publickey) | The server does not know your key, or the user name is wrong. | Check the user name your provider uses, that your key was selected when the server was created (step 5), and the key path. |
Connection timed out to the server | The provider's firewall blocks the port, or the server has no public IPv4 address. | Allow ports 22, 80 and 443 in the provider's website and check the server has a public IPv4 address. |
python3: command not found | Python 3 is missing on your computer. | Install Python 3, or ask your technical contact. |
| The browser warns "not secure" | The certificate could not be issued, usually because DNS was not ready. | Fix DNS, then run the full install again. |
| People can look but cannot change anything | No license is installed yet. | Do step 12. |
Some challenges have failed during the monitoring install | The monitoring address does not point at the server yet, so no padlock could be issued for it. | Add or fix its A record (step 6), wait, then run the step 13 install again. |
| The connection times out after several quick attempts | The server's firewall slows down anyone who connects many times within half a minute. This is a protection, not a fault. | Wait one minute and run the command again. For a lasting fix, add your own public internet address to the optional trusted list in step 8. |
| The installer seems to pause a long time | The server is finishing its own automatic updates and the installer waits its turn. | Wait up to 15 minutes. It continues by itself. |
| It stopped and mentions different ports | The settings changed after the first install. | Use the same settings as the first time, or ask a technical helper. |
Words you will see
- Kit
- The file EduLink sends you. It holds the ready-made program, the website, and the installer.
- Program (binary)
- The ready-made EduLink software. "Binary" means it is already built and you only run it.
- Checksum
- A fingerprint of a file, 64 letters and digits. If one character of the file changes, the fingerprint changes completely.
- Cloud provider
- A company that rents you servers by the hour or month, such as UpCloud, DigitalOcean, Hetzner, Vultr, AWS or Google Cloud.
- Server / VM
- A computer you rent that is always on. "VM" means virtual machine. Some providers say droplet or instance.
- IP address
- The number of a computer on the internet, four numbers with dots.
- Domain
- The name people type, such as school.example.org.
- DNS / A record
- The phone book that links a name to an IP address. An A record is one line in it.
- Terminal
- The window where you type commands instead of clicking.
- SSH key
- A pair of files that replace a password. Public is the padlock you share. Private is the key you keep.
- Instance
- One complete installation of EduLink, with its own database and license.
- License
- A signed line of text that allows your instance to change data, up to agreed limits and dates.
- Deploy
- Install or update the software on the server.
- HTTPS / certificate
- The padlock. It scrambles traffic so nobody can read it on the way.
- Firewall
- A gate that lets only web and login traffic reach the server.
- Safe to repeat
- Running a command twice gives the same result as running it once. Technical people say idempotent.
Six safety rules
- Always compare the checksum before you unpack a kit. Get the checksum from EduLink through a different channel than the file.
- Never share the private key file
edulink_deploy. Only the.pubfile may be shared. - Never paste the superadmin password or an activation code into email or chat. Use a password manager.
- Keep
local/inventory.pyon your computer only. It names your server. - Do not run a command you do not understand. Ask first. Every command in this guide says what it does.
- Delete test servers when you finish, so the bill stops.