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.

025-feature-image.jpg
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

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:

025-01.png

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 a PHP 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:

025-02.png

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:

25-03.png

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:

025-05-installing-pip.png

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:

025-07-installing-virtualenv-a.png

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:

025-07-installing-virtualenv-b.png

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:

025-08-creating-virtual-environment-venv.png

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:

025-09-activate-virtual-environment-venv.png

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

025-10-run-test-app-a.png

From Windows, open this URL http://192.168.0.6:9090/:

The application responds as expected:

025-10-run-test-app-b.png

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 host Python 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.