Taking SajiloCloud from "runs on my laptop" to "runs reliably on my always-on machine" - plus firewall, VPN, and remote-access options.
Security warning: SajiloCloud has no TLS and no user authentication. It trusts its network. Only expose it to the internet behind a VPN and/or a hardened reverse proxy, at your own risk. See SECURITY.md.
Any always-on device with Python works:
- Old laptop / mini PC / Raspberry Pi
- Windows / macOS / Linux
Install Python + dependencies (INSTALLATION.md), then set a static IP (router DHCP reservation) so the address never changes.
Clients on the LAN need access to the server's ports.
- Press
Win-> type "Windows Defender Firewall with Advanced Security" -> open it. - Inbound Rules -> New Rule...
- Port -> TCP -> Specific local ports:
4142,4143 - Allow the connection -> Profile: Private (and Public if you trust the network).
- Name it
SajiloCloud.
First run usually prompts "Allow Python to accept incoming connections?" -> click Allow - that often adds the rule automatically.
sudo ufw allow 4142/tcp
sudo ufw allow 4143/tcp
sudo ufw reloadSystem Settings -> Network -> Firewall -> Options -> Allow incoming connections for the Python process.
So the server survives reboots and you don't need an open terminal.
- Create a
.bat(e.g.sajilocloud.bat):
@echo off
cd /d "C:\path\to\sajilocloud"
python server.py- Task Scheduler -> Create Basic Task -> Trigger: At startup -> Action:
Start a program -> pick the
.bat-> enable "Run with highest privileges" (needed ifportis 80).
# /etc/systemd/system/sajilocloud.service
[Unit]
Description=SajiloCloud File Server
After=network.target
[Service]
WorkingDirectory=/opt/sajilocloud
ExecStart=/usr/bin/python3 server.py
Restart=always
User=sajilocloud
[Install]
WantedBy=multi-user.targetsudo systemctl daemon-reload
sudo systemctl enable --now sajilocloud- DHCP reservation on your router -> the machine always gets the same IP.
- mDNS (
http://<alias>.local) means you rarely need the IP at all - but it only works on the LAN and only while the server runs.
If you run with "port": 80, LAN clients can use http://<alias>.local with no
:port suffix. Port 80 needs admin/root privileges (Task Scheduler -> highest
privileges, or sudo).
Keeping the default 4142 avoids all that - the URL just includes the port.
By default the internet can't reach SajiloCloud. Two ways to change that:
WireGuard or Tailscale on the server + each device. Remote clients join your
virtual LAN and reach http://<server>:4142 exactly as if they were home.
- No internet exposure, no TLS worries, no extra auth needed.
- mDNS
.localnames still work inside the VPN.
- Router -> port forward
WAN:4142 -> <server-ip>:4142. - Put a reverse proxy (Caddy/Nginx) in front with HTTPS and an allow-list / basic-auth if possible.
- Understand you are now exposing an unauthenticated file server to the internet. If the admin key leaks or the proxy is misconfigured, anyone can read/delete your files.
You are fully responsible for anything that happens with remote access.
- Change
admin_keyto something long and random (see CONFIGURATION.md). - Keep
config.jsonout of git (already ignored). - Use a VPN for remote access instead of port forwarding.
- If port-forwarding anyway: HTTPS + auth via reverse proxy.
- Don't set
"upload_root"to a system directory. - Back up
Home/(the actual data) regularly - a straypurgeor disk error is permanent. - Run as a low-privilege user, not root/Administrator, if you can.
Everything important lives under Home/ plus data/:
# Example: nightly tar to an external disk
tar -czf /backup/sajilocloud-$(date +%F).tar.gz Home/ data/The code itself can be re-cloned from git; the files in Home/ cannot.