On this page
What you end up with
The finished setup is a small machine you can SSH into from a laptop, use to run Python or Node applications, serve an internal web page or API, keep scripts running in the background and reach privately from outside your home network through Tailscale.
The useful mental model is simple: the phone is still Android. Termux does not turn it into Ubuntu or give it a traditional init system. It gives you a capable command-line environment inside Android's application sandbox.
Before you start
- An Android 7 or newer phone. The Termux project currently lists Android 7+ as the fully supported baseline for the app and package ecosystem. Android 5 and 6 have legacy app builds but do not receive normal package support.
- Wi-Fi and a reliable charger. For an always-on experiment, a built-in charge limit is useful if the phone supports one. Do not repurpose a device with a swollen or damaged battery as an unattended server.
- A laptop or desktop on the same network. Use this for the first SSH and browser test.
- Optional: Tailscale. Its current Android client requires Android 8 or later and is the remote-access path used later in this guide.
One installation detail is easy to miss. Termux's own installation documentation explains that the main app and add-ons are signed differently depending on their source. If Termux comes from F-Droid, install Termux:Boot and other Termux add-ons from the same source. Do not mix an F-Droid main app with GitHub-signed add-ons.
Install Termux and the basic server tools
For this walkthrough, use the F-Droid build of Termux and keep any Termux add-ons on the same source. Once Termux opens, update the package index and install the tools we need:
pkg update && pkg upgrade -y
pkg install -y openssh git curl wget nano python nodejs tmux
That gives you OpenSSH for remote shell access, Python and Node.js for lightweight applications, Git for projects, and tmux for keeping an interactive process alive after you disconnect.
Set up SSH and connect from your laptop
First, see the Termux username and set a password:
whoami
passwd
The username often looks like u0_a123. Then start OpenSSH:
sshd
Termux's OpenSSH setup normally listens on port 8022, rather than port 22. Find the phone's Wi-Fi address:
ip addr show wlan0
On some Android versions that command can expose limited network information. If it does, open Android's Wi-Fi settings and read the current network details there instead. The local address will usually look like 192.168.x.x or 10.x.x.x.
From macOS, Linux or Windows PowerShell:
ssh -p 8022 USERNAME@PHONE_IP
For example:
ssh -p 8022 u0_a123@192.168.1.47
Accept the host-key prompt on the first connection and enter the password you created. If it times out, confirm both devices are on the same Wi-Fi, verify that sshd is running, recheck the address, and look for router settings such as client/AP isolation that prevent devices on one wireless network from talking to each other.
Serve a web page or a tiny API
The quickest proof that the phone is accepting normal network traffic is Python's built-in development server:
mkdir -p ~/server
cd ~/server
echo '<h1>Hello from my Android server</h1>' > index.html
python -m http.server 8080 --bind 0.0.0.0
From another device on the same Wi-Fi, open http://PHONE_IP:8080. If the page appears, the phone is serving HTTP to your network.
python -m http.server is excellent for a local test, but it is not a hardened production web server and should not be exposed directly to the public internet.For a small JSON API, Flask is enough to demonstrate the same idea:
pip install flask
mkdir -p ~/api
cd ~/api
nano app.py
Put this in app.py:
from flask import Flask, jsonify
app = Flask(__name__)
@app.get('/')
def home():
return jsonify(server='android-phone', status='online')
app.run(host='0.0.0.0', port=5000)
Run python app.py and open http://PHONE_IP:5000. Flask's built-in server is also a development server; this is a prototype pattern, not a production deployment recipe.
Keep processes running after you disconnect
For an ad-hoc command, tmux is the simplest option:
tmux new -s server
python -m http.server 8080 --bind 0.0.0.0
Detach with Ctrl+B, then D. Return later with:
tmux attach -t server
For SSH itself, Termux has an official runit-based service helper. The termux-services project documents this flow:
pkg install termux-services
Close and reopen the Termux shell after installation, then enable and inspect the SSH service:
sv-enable sshd
sv up sshd
sv status sshd
Useful controls are sv down sshd, sv up sshd, sv-disable sshd and sv-enable sshd. If the service has a problem, termux-services writes logs under $PREFIX/var/log/sv/.
Start services after the phone reboots
Install Termux:Boot from the same source as Termux, then launch the Termux:Boot app once. The official Termux:Boot instructions require that first launch before boot events are handled.
Create the boot directory and a startup script:
mkdir -p ~/.termux/boot
nano ~/.termux/boot/start-server
If you are already using termux-services for sshd, start the service layer at boot instead of launching a second independent SSH daemon:
#!/data/data/com.termux/files/usr/bin/sh
termux-wake-lock
. "$PREFIX/etc/profile.d/start-services.sh"
cd "$HOME/server"
python -m http.server 8080 --bind 0.0.0.0 >> "$HOME/server.log" 2>&1 &
Make it executable:
chmod +x ~/.termux/boot/start-server
termux-wake-lock asks Android to keep the CPU awake; it does not need to keep the display on. The web-server line is still the demo server from earlier—replace it with the real application process when your prototype grows.
Android can still stop your server
This is the part that surprises people who are used to Linux servers. Android and phone manufacturers aggressively manage apps in the background. A perfectly configured Termux process can still disappear if the OS decides the app should sleep.
Open Android's app settings for Termux and Termux:Boot and look for battery/background controls. The names vary by manufacturer, but the practical goals are:
- set battery usage to unrestricted, or disable optimization for Termux;
- allow Termux to run in the background;
- avoid manually swiping it away on devices that kill background processes aggressively;
- keep the screen off—the server does not require the display;
- keep the phone cool and use a charge-limit feature if the hardware provides one.
This is also why a phone server should not carry an uptime promise. Android's process management is part of the platform, not a bug you can fully configure away on every manufacturer build.
Reach the phone remotely with Tailscale
Do not make your first remote-access experiment a router port-forward to SSH. A private overlay network is much easier to reason about.
Tailscale's Android documentation currently supports Android 8 or later. Install Tailscale on the phone and on your laptop, sign both into the same tailnet, then enable Tailscale on the phone.
The phone receives a private Tailscale address, typically in the 100.x.x.x range. From the laptop:
ssh -p 8022 USERNAME@TAILSCALE_IP
For the demo web server:
http://TAILSCALE_IP:8080
You normally do not need to open a port on the home router for this. If MagicDNS is enabled for the tailnet, you can also use the device's Tailscale DNS name instead of memorizing the IP.
Make the setup safer
A spare phone is still a networked computer. Treat it that way.
- Keep services private. Prefer the local network or Tailscale instead of exposing ports 8022, 8080 or 5000 directly to the internet.
- Update packages. Run
pkg update && pkg upgraderegularly. - Move to SSH keys. A password is convenient for the first connection; public-key authentication is the better long-term choice.
- Stay unprivileged. This guide does not require root. Do not add it just to make the setup feel more server-like.
- Keep backups elsewhere. A phone should never be the only copy of important data.
- Limit the data you put on it. Personal experiments are one thing; regulated, customer or business-critical data deserves proper infrastructure and access controls.
On your laptop, generate an Ed25519 key if you do not already have one:
ssh-keygen -t ed25519
Copy it to Termux:
ssh-copy-id -p 8022 USERNAME@PHONE_IP
Test key-based login before disabling password authentication in $PREFIX/etc/ssh/sshd_config. Always keep a recovery path—especially when the machine you are locking yourself out of is a phone in another room or another city.
What can you realistically run on it?
The useful workloads are the ones that are lightweight, tolerant of interruptions and easy to recover:
- a personal Flask, FastAPI or Node.js API;
- a Telegram or Discord bot;
- a private webhook receiver for development and test events;
- small home-automation glue and scheduled scripts;
- SFTP/SCP file transfer between your own devices;
- a Git and scripting box for cloning repositories, running utilities and experimenting with toolchains;
- a small internal dashboard for home data or device experiments;
- a disposable development playground for Python, Node, Go and lightweight databases.
What would we avoid? Public customer applications, an irreplaceable database, payment processing, security monitoring that must never miss an event, or anything whose availability depends on your home Wi-Fi, one consumer battery and Android background policy.
Troubleshooting the failures you are most likely to hit
- Connection refused on 8022: run
sshdagain for a manual setup, or usesv status sshdif you enabled termux-services. - SSH times out: verify the IP, confirm both devices are on the same LAN, check router client isolation, and confirm Android has not suspended Termux.
- The site works on the phone but not another device: make sure the application binds to
0.0.0.0, not only127.0.0.1. - The process stops after the screen turns off: revisit battery optimization and background permissions and use
termux-wake-lockwhere appropriate. - The boot script never runs: open Termux:Boot once manually, confirm the add-on came from the same installation source, check
~/.termux/boot/, and verify executable permissions. - Port already in use: stop the earlier process or pick another unprivileged application port such as 8081, 5001 or 3001.
- Android 5 or 6: use a newer device if you want current Termux package support. The project treats Android 7+ as the supported package baseline.
The fastest possible setup
If all you want is a five-minute proof that the idea works, this is the minimum useful path:
pkg update && pkg upgrade -y
pkg install -y openssh python
passwd
sshd
mkdir -p ~/server
echo '<h1>My phone is a server</h1>' > ~/server/index.html
cd ~/server
python -m http.server 8080 --bind 0.0.0.0
Then SSH in from the laptop on port 8022 and open http://PHONE_IP:8080. Once that works, add managed services, boot startup, Tailscale and key-based authentication one layer at a time.
When should you move to real hosting?
A phone server is most valuable when it helps you learn or prove a small idea without another monthly bill. The signal to move on is not traffic alone. It is responsibility.
Move the workload to proper hosting when it needs predictable uptime, handles real customer or business data, requires automated backups and monitoring, needs clean deployment/rollback, must survive home power or internet failures, or becomes important enough that you would care if Android killed it at 3am.
That does not make the phone experiment wasted work. It did its job: you validated the application before spending time and money on infrastructure it did not yet need.
At Aahav Labs, that same principle carries into client work: match infrastructure to the real workload, prove the risky parts early, and add production complexity only when the product actually needs it. Related capabilities include SaaS Development, AI Automation, Mobile App Development and Cybersecurity.
FAQs
Is it actually safe to run a server on an old Android phone?
For learning, personal tools and private-network prototypes, it can be a reasonable setup when packages are kept updated, remote access stays private and the device itself is healthy. It is not a good place for sensitive customer data or a service whose uptime matters to a business.
Do I need to root the phone?
No. SSH, Python/Node applications, Termux services, Termux:Boot and Tailscale can all be used for this setup without rooting the device.
Why does Termux SSH use port 8022 instead of 22?
Termux runs as a normal Android application user rather than a privileged system service. Its OpenSSH package therefore uses the unprivileged port 8022 by default.
Can I access the server away from home?
Yes. Tailscale can give the phone and your laptop private addresses on the same tailnet, so you can reach SSH or your private application without configuring a public router port-forward.
Will the server keep running with the screen off?
It can, but Android and manufacturer-specific battery policies can still suspend or kill background work. Termux:Boot, termux-services, wake locks and battery-exemption settings improve reliability; they do not turn Android into a high-availability server OS.
When should I replace the phone with a VPS or proper server?
When the service needs dependable uptime, proper observability and backups, handles important data, or should stay online independently of one phone, one charger and your home internet connection.
Primary sources
- Termux app — official repository: supported Android versions, installation sources, add-on compatibility and Android background-process limitations.
- Termux:Services — official repository: managed service installation and
runit-based service commands. - Termux:Boot — official repository: boot-time setup, installation-source requirements and the
~/.termux/boot/directory. - Tailscale — Android installation: official Android client setup and supported distribution channels.
- Tailscale — MagicDNS: private device naming and tailnet DNS behavior.
Last fact-checked: 12 August 2026. Android background policy, Termux package support and Tailscale behavior can change; verify the linked documentation for the device and versions you deploy.