This project uses Python 3.13. The codebase has been updated from the original Python 3.7 version to use modern Python features and updated dependencies.
This guide assumes you are using Linux and are somewhat capable with the commandline.
Running Nyaa on Windows may be possible, but it's currently unsupported.
- Updated from Python 3.7 to Python 3.13
- Updated all dependencies to their latest versions
- Modernized code patterns for Flask 3.0 and SQLAlchemy 2.0
- Replaced deprecated Flask-Script, orderedset and
flask.Markup
with Flask CLI, orderly-set and markupsafe - Implemented mail error handling
- Before we get any deeper, remember to follow PEP8 style guidelines and run
python dev.py lint
before committing to see a list of warnings/problems.- You may also use
python dev.py fix && python dev.py isort
to automatically fix some of the issues reported by the previous command.
- You may also use
- Other than PEP8, try to keep your code clean and easy to understand, as well. It's only polite!
The tests
folder contains tests for the the nyaa
module and the webserver. To run the tests:
- Make sure that you are in the Python virtual environment.
- Run
python dev.py test
while in the repository directory.
pyenv eases the use of different Python versions, and as not all Linux distros offer 3.13 packages, it's right up our alley.
- Install dependencies
- Install pyenv
- Install pyenv-virtualenv
- Install Python 3.13 with
pyenv
and create a virtualenv for the project:pyenv install 3.13.2
pyenv virtualenv 3.13.2 nyaa
pyenv activate nyaa
- Install dependencies with
pip install -r requirements.txt
- Copy
config.example.py
intoconfig.py
- Change
SITE_FLAVOR
in yourconfig.py
depending on which instance you want to host
- Change
Warning
You may use SQLite but it is currently untested and unsupported.
- Enable
USE_MYSQL
flag in config.py - Install MariaDB by following instructions here
- Run the following commands logged in as your root db user (substitute for your own
config.py
values if desired):CREATE USER 'test'@'localhost' IDENTIFIED BY 'test123';
GRANT ALL PRIVILEGES ON *.* TO 'test'@'localhost';
FLUSH PRIVILEGES;
CREATE DATABASE nyaav3 DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
- Run
python db_create.py
to create the database and import categories- Follow the advice of
db_create.py
and runpython db_migrate.py stamp head
to mark the database version for Alembic
- Follow the advice of
- Start the dev server with
python run.py
- When you are finished developing, deactivate your virtualenv with
pyenv deactivate
orsource deactivate
(or just close your shell session)
You're now ready for simple testing and development!
Continue below to learn about database migrations and enabling the advanced search engine, Elasticsearch.
Warning
The database migration feature has been updated but will no longer be supported in NyaaV3.
- Database migrations are done with Flask-Migrate, a wrapper around Alembic.
- The migration system has been updated to use Flask CLI instead of the deprecated Flask-Script.
- If someone has made changes in the database schema and included a new migration script:
- If your database has never been marked by Alembic (you're on a database from before the migrations), run
python db_migrate.py db stamp head
before pulling the new migration script(s).- If you already have the new scripts, check the output of
python db_migrate.py db history
instead and choose a hash that matches your current database state, then runpython db_migrate.py db stamp <hash>
.
- If you already have the new scripts, check the output of
- Update your branch (eg.
git fetch && git rebase origin/master
) - Run
python db_migrate.py db upgrade head
to run the migration. Done!
- If your database has never been marked by Alembic (you're on a database from before the migrations), run
- If you have made a change in the database schema:
- Save your changes in
models.py
and ensure the database schema matches the previous version (ie. your new tables/columns are not added to the live database) - Run
python db_migrate.py db migrate -m "Short description of changes"
to automatically generate a migration script for the changes- Check the script (
migrations/versions/...
) and make sure it works! Alembic may not able to notice all changes.
- Check the script (
- Run
python db_migrate.py db upgrade
to run the migration and verify the upgrade works.- (Run
python db_migrate.py db downgrade
to verify the downgrade works as well, then upgrade again)
- (Run
- Save your changes in
- Install JDK with
sudo apt-get install openjdk-8-jdk
- Install Elasticsearch
- From packages
- Enable the service:
sudo systemctl enable elasticsearch.service
sudo systemctl start elasticsearch.service
- Enable the service:
- or simply extracting the archives and running the files, if you don't feel like permanently installing ES
- From packages
- Run
curl -XGET 'localhost:9200'
and make sure ES is running - Install Kibana as a search debug frontend for ES (optional)
- Edit your MariaDB/MySQL server configuration and add the following under
[mariadb]
:log-bin server_id=1 log-basename=master1 binlog-format=row
- Restart MariaDB/MySQL (
sudo service mysql restart
) - Copy the example configuration (
es_sync_config.example.json
) ases_sync_config.json
and adjust options in it to your liking (verify the connection options!) - Connect to mysql as root
- Verify that the result of
SHOW VARIABLES LIKE 'binlog_format';
isROW
- Execute
GRANT REPLICATION SLAVE ON *.* TO 'username'@'localhost';
to allow your configured user access to the binlog
- Verify that the result of
- Run
./create_es.sh
to create the indices for the torrents:nyaa
andsukebei
- The output should show
acknowledged: true
twice
- The output should show
- Stop the Nyaa app if you haven't already
- Run
python import_to_es.py
to import all the torrents (on nyaa and sukebei) into the ES indices.- This may take some time to run if you have plenty of torrents in your database.
Enable the USE_ELASTIC_SEARCH
flag in config.py
and (re)start the application.
Elasticsearch should now be functional! The ES indices won't be updated "live" with the current setup, continue below for instructions on how to hook Elasticsearch up to MySQL binlog.
However, take note that binglog is not necessary for simple ES testing and development; you can simply run import_to_es.py
from time to time to reindex all the torrents.
sync_es.py
keeps the Elasticsearch indices updated by reading the binlog and pushing the changes to the ES indices.
- Make sure
es_sync_config.json
is configured with the user you grated theREPLICATION
permissions - Run
import_to_es.py
and copy the outputted JSON into the file specified bysave_loc
in youres_sync_config.json
- Run
sync_es.py
as-is or, for actual deployment, set it up as a service and run it, preferably as the system/root- Make sure
sync_es.py
runs within the venv with the right dependencies!
- Make sure
You're done! The script should now be feeding updates from the database to Elasticsearch.
Take note, however, that the specified ES index refresh interval is 30 seconds, which may feel like a long time on local development. Feel free to adjust it or poke Elasticsearch yourself!
This project is licensed under the GNU General Public License v3.0 (GPL-3.0). See the LICENSE file for more details.
Caution
This project was created as a learning experience, and while it's a torrent tracker, I can't control how people choose to use it.
By using this software, you're agreeing to a few things:
- I'm not responsible for any legal issues that might come up from using this tracker, especially if it's used to share copyrighted content without permission.
- It's your responsibility to make sure you're following the laws in your area when using this software.
Please use this project wisely and stay on the right side of the law. Happy coding!