1. Tell my router to route certain traffic to the Raspberry Pi. For example, I route HTTP and SSH traffic to one of my Pi’s. I disabled password login for SSH, using public key authentication instead: in /etc/ssh/sshd_config, use the following setting and restart SSH service using `sudo service ssh restart’.
RSAAuthentication yes PubkeyAuthentication yes # To disable password authentication: ChallengeResponseAuthentication no PasswordAuthentication no UsePAM no # To disable root login: PermitRootLogin no
2. Getting my IP address of the Raspberry Pi. I firstly created a PHP script on my domain to record the IP address in a text file.
<?php $token = 'secret'; if ($_GET['token'] == $token) { if (!empty($_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } else { $ip = $_SERVER['REMOTE_ADDR']; } $fp = fopen('home_ip.txt', 'w'); fwrite($fp, $ip); } ?>
Then tell the Raspberry Pi to report its IP address every 5 minutes, using crontab:
pi@alice ~ $ crontab -l */5 * * * * curl daoyuan.li/home_ip.php?token=secret
After a while the IP address is recorded in the text file and updated every 5 minutes.
3. Optionally create a DNS record for the Pi. I use Cloudflare to manage DNS settings by myself, so just add/update an entry in Cloudflare’s settings. I point pi.daoyuan.li to the IP address of one Pi. This can be done automatically in the future.
4. Install Flask on the Pi.
sudo apt-get update sudo apt-get install python-pip sudo pip install Flask
5. Install nginx and uwsgi on the Pi.
sudo apt-get install nginx sudo apt-get install build-essential python python-dev sudo apt-get install python-virtualenv sudo pip install uwsgi
6. Set up nginx along with uwsgi and Flask.
mkdir flask && cd $_ virtualenv env . env/bin/activate pip install Flask
Edit nginx config:
~/flask $ cat flask_nginx.conf server { listen 5000; server_name localhost; charset utf-8; client_max_body_size 75M; location / { try_files $uri @flask; } location @flask{ include uwsgi_params; uwsgi_pass unix:/home/pi/flask/uwsgi.sock; } }
sudo rm /etc/nginx/sites-enabled/default sudo ln -s flask_nginx.conf /etc/nginx/sites-enabled/default sudo service nginx restart
Edit uwsgi config:
~/flask $ cat flask_uwsgi.ini [uwsgi] #application's base folder base = /home/pi/flask #python module to import app = hello module = %(app) home = %(base)/env pythonpath = %(base) #socket file's location socket = /home/pi/flask/uwsgi.sock #permissions for the socket file chmod-socket = 666 #the variable that holds a flask application inside the module imported at line #6 callable = app #location of log files logto = /home/pi/flask/uwsgi.log
Create a simple Flask app:
~/flask $ cat hello.py from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "Hello World!" if __name__ == "__main__": app.run()
Start up uwsgi:
uwsgi --ini flask_uwsgi.ini &
7. Done! http://pi.daoyuan.li:5000/
Update on June 24, 2014:
Getting the external address in step 2 can be done by running this command in Raspberry Pi:
curl ifconfig.me
See: http://www.commandlinefu.com/commands/view/5427/get-your-external-ip-address
Leave a Comment