Understanding the components that make up Anthias
Here is a high-level overview of the different components that make Anthias:
These components and their dependencies are mostly installed and handled with Ansible and Docker.
- The NGINX component (
anthias-nginx
) forwards requests to the backend and serves static files. It also acts as a reverse proxy.
- The viewer (
anthias-viewer
) is what drives the screen (e.g., shows web page, image or video).
- The web app component (
anthias-server
) — which consists of the front-end and back-end code – is what the user interacts with via browser.
- The Celery (
anthias-celery
) component is for aynschronouslt queueing and executing tasks outside the HTTP request-response cycle (e.g., doing assets cleanup).
- The WebSocket (
anthias-websocket
) component is used for forwarding requests from NGINX to the backend.
- Redis (
redis
) is used as a database, cache and message broker.
- The database component uses SQLite for storing the assets information.
Dockerized development environment
To simplify development of the server module of Anthias, we’ve created a Docker container. This is intended to run on your local machine with the Anthias repository mounted as a volume.
[!IMPORTANT]
Anthias is using Docker’s buildx for the image builds. This is used both for cross compilation as well as for local caching. You might need to run docker buildx create --use
first.
Assuming you’re in the source code repository, simply run:
$ ./bin/start_development_server.sh
The console output was truncated for brevity.
...
[+] Running 6/6
✔ Network anthias_default Created 0.1s
✔ Container anthias-redis-1 Started 0.2s
✔ Container anthias-anthias-server-1 Started 0.2s
✔ Container anthias-anthias-celery-1 Started 0.3s
✔ Container anthias-anthias-websocket-1 Started 0.4s
✔ Container anthias-anthias-nginx-1 Started 0.5s
Running the command above will start the development server and you should be able to
access the web interface at http://localhost:8000
.
To stop the development server, run the following:
docker compose -f docker-compose.dev.yml down
Building containers locally
Dependencies
buildx
[!IMPORTANT]
Make sure that you have buildx
installed and that you have run
docker buildx create --use
before you run the image build script.
Poetry
We have switched from using Bash to Poetry for building the Docker images.
Make sure that you have Python 3.11 and Poetry installed on your machine.
[!TIP]
You can install Poetry by running the following script:
./bin/install_poetry.sh
After running the script, you can add the following to your ~/.bashrc
or similar file:
# Add `pyenv` to the load path.
export PYENV_ROOT="$HOME/.pyenv"
[[ -d $PYENV_ROOT/bin ]] && \
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
Add `poetry to the load path.
export PATH="$HOME/.local/bin:$PATH"
poetry install --only=docker-image-builder
You can either restart your terminal or run source ~/.bashrc
to start using Poetry.
Building only specific services
Say that you would only like to build the anthias-server
and anthias-viewer
services. Just run the following:
$ poetry run python tools/image_builder \
--service anthias-server \
--service anthias-viewer
Generating only Dockerfiles
If you’d like to just generate the Dockerfiles from the templates provided
inside the docker/
directory, run the following:
$ poetry run python tools/image_builder \
--dockerfiles-only
Disabling cache mounts
If you’d like to disable cache mounts in the generated Dockerfiles, run the
following:
$ poetry run python tools/image_builder \
--disable-cache-mounts
Testing
Running the unit tests
Build and start the containers.
$ poetry run python tools/image_builder \
--dockerfiles-only \
--disable-cache-mounts \
--service celery \
--service redis \
--service test
$ docker compose \
-f docker-compose.test.yml up -d --build
Run the unit tests.
$ docker compose \
-f docker-compose.test.yml \
exec anthias-test bash ./bin/prepare_test_environment.sh -s
Integration and non-integration tests should be run separately as the
former doesn't run as expected when run together with the latter.
$ docker compose
-f docker-compose.test.yml
exec anthias-test ./manage.py test --exclude-tag=integration
$ docker compose
-f docker-compose.test.yml
exec anthias-test ./manage.py test --tag=integration
The QA checklist
We’ve also provided a checklist that can serve as a guide for testing Anthias manually.
Generating CSS and JS files
To get started, you need to start the development server first. See this section
for details.
Starting Webpack in development mode
To start Webpack in development mode, run the following command:
$ docker compose -f docker-compose.dev.yml exec anthias-server \
npm run dev
Making changes to the CoffeeScript or SCSS files will automatically trigger a recompilation,
generating the corresponding JavaScript and CSS files.
Closing the transpiler
Just press Ctrl-C
to close Webpack in development mode.
Linting Python code locally
The project uses flake8
for linting the Python codebase. While the linter is being run on the CI/CD pipeline,
you can also run it locally. There are several ways to do this.
Run the linter using act
act
lets you run GitHub Actions locally. This is useful for testing the CI/CD pipeline locally.
Installation instructions can be found here.
After installing and setting up act
, run the following command:
$ act -W .github/workflows/python-lint.yaml
The command above will run the linter on the all the Python files in the repository. If you want to run the linter
on a specific file, you can try the commands in the next section.
Running the linter using Poetry
You have to install Poetry first. You can find the installation instructions
here.
After installing Poetry, run the following commands:
# Install the dependencies
$ poetry install --only=dev-host
$ poetry run flake8 $(git ls-files '*.py')
To run the linter on a specific file, run the following command:
$ poetry run flake8 path/to/file.py
Managing releases
Creating a new release
Check what the latest release is:
$ git pull
$ git tag
Running the git tag
command should output something like this:
0.16
…
v0.18.6
Create a new release:
$ git tag -a v0.18.7 -m "Test new automated disk images"
Push release:
$ git push origin v0.18.7
Delete a broken release
$ git tag -d v0.18.5 [±master ✓]
Deleted tag 'v0.18.5' (was 9b86c39)
$ git push --delete origin v0.18.5 [±master ✓]
Directories and files explained
In this section, we’ll explain the different directories and files that are
present in a Raspberry Pi with Anthias installed.
home/${USER}/screenly/
- All of the files and folders from the Github repo should be cloned into this directory.
/home/${USER}/.screenly/
default_assets.yml
— configuration file which contains the default assets that get added to the assets list if enabled
initialized
— tells whether access point service (for Wi-Fi connectivity) runs or not
screenly.conf
— configuration file for web interface settings
screenly.db
– database file containing current assets information.
/etc/systemd/system/
wifi-connect.service
— starts the Balena wifi-connect
program to dynamically set the Wi-Fi config on the device via the captive portal
anthias-host-agent.service
— starts the Python script host_agent.py
, which subscribes from the Redis component and performs a system call to shutdown or reboot the device when the message is received.
/etc/sudoers.d/screenly_overrides
sudoers
configuration file that allows pi user to execute certain sudo
commands without being a superuser (i.e., root
)
/usr/share/plymouth/themes/anthias
anthias.plymouth
— Plymouth config file (sets module name, ImageDir
and ScriptFile
dir)
anthias.script
– plymouth script file that loads and scales the splash screen image during the boot process
splashscreen.png
— the spash screen image that is displayed during the boot process
Debugging the Anthias WebView
export QT_LOGGING_DEBUG=1
export QT_LOGGING_RULES="*.debug=true"
export QT_QPA_EGLFS_DEBUG=1
The Anthias WebView is a custom-built web browser based on the Qt toolkit framework.
The browser is assembled with a Dockerfile and built by a webview/build_qt#.sh
script.
For further info on these files and more, visit the following link: https://github.com/Screenly/Anthias/tree/master/webview