We discuss how to set up a Python 3.9 Beta development environment on
Synology DS218 DiskStation running DSM version 7.1-42661 Update 1. The
development environment includes: pip, virtualenv, setuptools, wheel
and the flask development web server.
Synology DS218: preparing Python 3.9 Beta compelete devepment environment. |
Synology DS218 DiskStation -- Versatile 2-bay NAS for small offices and home users is a Linux device. It runs a Linux distro named DSM, and the version on my device is 7.1-42661 Update 1.
There're so many different Linux flavours. During my research on this topic, I realised I'll have some difficulties. And I did. I have not found a complete guide on how to do this, the steps that work for me, which I've put together in this post come from several other existing posts, I'm listing those referenced posts along the way.
I'd like to mention that, following the instructions in this post How Do I use Synology Web Station?, I've successfully got a PHP port-based virtual site hosted by Apache 2.4 to run in under 30 ( thirty ) minutes -- and I can access it from my Windows 10 machine. Python, somehow is not that straightforward.
Table of contents
- Determining Synology NAS' IP address
- Enable home service
- Enable SSH
- SSH to DSM from Windows 10
- Existing Python installation
- Install Web Station and Python 3.9 Beta
- Where is Python 3.9 Beta installed, how do I invoke it?
- Install pip, upgrade pip, and verify pip has been installed
- Checking pip version
- Update setuptools and wheel packages
- Install virtualenv and verify installation
- Create virtual environment venv
- Activate and Deactivate the virtual environment venv
- The test app
- Concluding remarks
Determining Synology NAS' IP address
Go to Control Panel > Network > Network Interface tab: look under LAN.
Mine's 192.168.0.6 -- and I'll reference this throughout this post.
Enable home service
Home service means the user home directory.
“behai” is the user I set up when first installed DSM. This is not the root user.
Go to Control Panel > User & Group > select behai > Advanced tab:
Check “Enable user home service”, then click “Apply”.
Enable SSH
Go to Control Panel > Terminal & SNMP > Terminal tab:
Check “Enable SSH service”, then click “Apply”.
SSH to DSM from Windows 10
From a Windows command prompt, we should now be able to access DSM command line via SSH, using:
ssh behai@192.168.0.6
It'll ask for the password, this's the same password we use to log into the device.
After logging into SSH terminal, both commands:
$ echo $HOME
$ pwd
will return the same value, which is the home directory, mine is:
/var/services/homes/behai
Existing Python installation
From Package Center under Installed, it shows Python2 comes pre-installed ( when we first installed
DSM ).
But both:
$ python
$ python3
show Python 3.8.12, please see the screen capture below:
Install Web Station and Python 3.9 Beta
I thought I would need Web Station, in hindsight, however, at this stage, I don't think I need Web Station yet, but I did install it. So I will just go ahead and include this step in this post.
Install Web Station
To start off, I follow the instructions in How Do I use Synology Web Station? to install Web Station, PHP 8.0, set up aPHP port-based virtual site hosted by Apache 2.4, and I was able to get this virtual site to run in under 30 ( thirty ) minutes -- and I can access it from my Windows 10 machine.
Basically, use Package Center to install Web Station. The installation will create a web root directory:
/volume1/web/
File Station also sees this directory.
Install Python 3.9 Beta
At this point, I thought, similar to PHP, I would need to carry out the same process for Python:
Go to Main Menu > Web Station > Script Language Settings > Python tab -- please see screen capture below:
Python 3.8.12 has been installed, but it still said no Python 3 package. Use Package Center to install Python 3.9 Beta. Click on “Join Beta” to install. See screen capture below:
After this a User-defined customised profile for Python 3.9 should appear under Web Station's Script Language Settings.
Where is Python 3.9 Beta installed, how do I invoke it?
This post Re-Install pip and virtualenv Site Packages After Package Center Python 3.8.2 Upgrade, is a bit outdated ( I think ), but it helps me to figure out where Python 3.9 is installed:
/volume1/\@appstore/Python3.9/usr/bin/python3.9
In fact:
/volume1/\@appstore/Python3.9/usr/bin/
is where Python 3.9 related tools live. This path is recognised by the system. Command:
$ python3.9
should just run.
Install pip, upgrade pip, and verify pip has been installed
Install pip
I tried various instructions, they did not work. This https://jackgruber.github.io/2021-06-27-install-pip-on-synology/ post works. I changed to python3.9:
$ sudo python3.9 -m ensurepip
Please see the following screen capture:
Regarding the warning:
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
I don't know what it means yet. As for the warning:
WARNING: The scripts pip3 and pip3.9 are installed in
'/var/packages/Python3.9/target/usr/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress
this warning, use --no-warn-script-location.
I've not taken any action yet... I'll be using the full path initially.
Upgrade pip
To upgrade pip, I ran the following command:
$ sudo python3.9 -m pip install --upgrade pip
I'm also just sleeping on the warnings for the time being, till something stops working.
Verify pip has been installed
Using this already mentioned post Re-Install pip and virtualenv Site Packages After Package Center Python 3.8.2 Upgrade, the following command verifies that pip directory exists:
$ ls -l /volume1/\@appstore/Python3.9/usr/lib/python3.9/site-packages
pip, pip3, pip3.9 and pip3.10 also exist in:
$ ls -l /volume1/\@appstore/Python3.9/usr/bin
Checking pip version
**I HAVE TRIED VARIOUS COMMANDS, but none has worked. I don't know how to do this presently**. I'll post an update after I have figured it out.
Update setuptools and wheel packages
Run this command:
$ sudo python3.9 -m pip install --upgrade pip setuptools wheel
I included pip, which was unnecessary as it has already been done.
Install virtualenv and verify installation
Install virtualenv
Run this command:
$ sudo /volume1/\@appstore/Python3.9/usr/bin/python3.9 -m pip install virtualenv
I included the full path for python3.9, which I don't think is necessary.
Verify virtualenv has been installed
To verify, run this command:
$ ls /volume1/\@appstore/Python3.9/usr/lib/python3.9/site-packages
See the screen capture below, virtualenv has been installed:
The bin directory is where related executables live:
$ ls -l /volume1/\@appstore/Python3.9/usr/bin/
Please see the output in the screen capture below:
Create virtual environment venv
Under $HOME, i.e. /var/services/homes/behai/ directory, create directory app_demo with command:
$ mkdir app_demo
Then go to this directory:
$ cd app_demo
Issue the below command to create virtual environment venv:
$ sudo /volume1/\@appstore/Python3.9/usr/bin/virtualenv -p python3.9 venv
Verify venv created:
$ ls -l venv/
Check venv/bin directory:
$ ls -l venv/bin/
-- We can also see the content of these directories using File Station.
The running of these commands is shown in the screen capture below:
Please note, in Windows, venv\Scripts\ is the equivalence of venv/bin.
Activate and Deactivate the virtual environment venv
Activate the virtual environment venv
To activate, run:
$ source venv/bin/activate
The prompt changes as seen in the screen capture below:
Deactivate the virtual environment venv
**I DON'T KNOW HOW TO DEACTIVATE IT YET. I'm not sure what venv/bin/deactivate.nu is for. I can't find info on it either**. I just terminate the SSH session, get back in, and it still works.
The test app
This part is similar to Python: Application ( Self ) Installation, Built Distribution and Test the Built Distribution. , which I have written for Windows 10.
Install required packages
Under /var/services/homes/behai/app_demo, create setup.py file and src/ directory.
/var/services/homes/behai/app_demo
|
|-- setup.py
|
|-- src/
File /var/services/homes/behai/app_demo/setup.py
"""Installation script for flask_restx demo project."""
from pathlib import Path
from setuptools import setup, find_packages
setup(
name='dsm-python-demo',
description='flask dev server on Synology DSM demo.',
version='1.0.0',
author='Van Be Hai Nguyen',
author_email='behai_nguyen@hotmail.com',
packages=find_packages(where="src"),
package_dir={"": "src"},
python_requires='>=3.9',
install_requires=[
'Flask',
'python-dotenv',
],
)
Run the command below to install packages for the test application that we are going to write:
$ sudo venv/bin/pip install -e .
This should run with no problems. After finished, use File Station to scan through the directories to verify that we have the specified packages installed.
Complete the test application
Updated 21/07/2022 -- the code can be cloned from GitHub using:
git clone -b v1.0.0 https://github.com/behai-nguyen/app-demo.git
Now create the rest of the application:
/var/services/homes/behai/app_demo/
|
|-- .env
|-- app.py
|-- setup.py
|
|-- src/
| |
| |-- app_demo/
| |
| |-- __init__.py
| |-- config.py
|
|-- venv/
File /var/services/homes/behai/app_demo/.env
FLASK_APP=app.py
FLASK_ENV=development
SECRET_KEY=">s3g;?uV^K=`!(3.#ms_cdfy<c4ty%"
File /var/services/homes/behai/app_demo/app.py
"""Flask Application entry point."""
from app_demo import create_app
app = create_app()
File /var/services/homes/behai/app_demo/src/app_demo/__init__.py
"""Flask app initialization via factory pattern."""
from flask import Flask
from app_demo.config import get_config
def create_app():
app = Flask( 'dsm-python-demo' )
app.config.from_object( get_config() )
@app.route( '/' )
def hello_world():
return '<p>Hello, World!</p>'
return app
File /var/services/homes/behai/app_demo/src/app_demo/config.py
"""Flask app config settings."""
import os
class Config:
"""Set Flask configuration from .env file."""
# General Config
SECRET_KEY = os.getenv( 'SECRET_KEY' )
FLASK_APP = os.getenv( 'FLASK_APP' )
FLASK_ENV = os.getenv( 'FLASK_ENV' )
def get_config():
"""Retrieve environment configuration settings."""
return Config
Run the test application
Run it with:
$ sudo venv/bin/flask run --host=0.0.0.0 --port=9090
From Windows, open this URL http://192.168.0.6:9090/:
The application responds as expected:
Recall that 192.168.0.6 is my Synology NAS address.
Concluding remarks
This's been an interesting exercise. I've learned a lot along the way. What I really want to achieve is to get the DSM Apache 2.4 web server to hostPython web applications in a similar manner as Internet Information Services (IIS) -- which I've done and described in Python: hosting a virtualenv Flask application in Windows 10 Pro's Internet Information Services (IIS). I'll continue to work towards this objective, I'll do another post after I've learned how to do it, and do it successfully.
Thank you for reading, and I hope you find this post useful.
Top comments (0)