Use multiple database server type
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
365800f441
commit
73d268421a
@ -1,14 +1,9 @@
|
|||||||
FLASK_APP=run.py
|
FLASK_APP=run.py
|
||||||
FLASK_ENV=development
|
FLASK_ENV=development
|
||||||
FLASK_PORT=5000
|
FLASK_PORT=5000
|
||||||
MYSQL_USER=nyaa
|
|
||||||
MYSQL_PASSWORD=nyaa
|
|
||||||
MYSQL_DATABASE=nyaa
|
|
||||||
MYSQL_SERVER=db
|
|
||||||
REDIS_SERVER=redis
|
REDIS_SERVER=redis
|
||||||
ADMIN_USERNAME=admin
|
ADMIN_USERNAME=admin
|
||||||
ADMIN_PASSWORD=secret
|
ADMIN_PASSWORD=secret
|
||||||
REQUESTS_TIMEOUT=5
|
REQUESTS_TIMEOUT=5
|
||||||
CACHE_TIMEOUT=3600
|
CACHE_TIMEOUT=3600
|
||||||
MYSQL_ROOT_PASSWORD=root
|
|
||||||
BLACKLIST_WORDS=Chris44,Vol.,[zza],.ssa,.ass,Ref:rain
|
BLACKLIST_WORDS=Chris44,Vol.,[zza],.ssa,.ass,Ref:rain
|
||||||
|
@ -38,7 +38,7 @@ After a good rewrite in Python, it's time to show it to the public, and here it
|
|||||||
|
|
||||||
All is managed by environment variables.
|
All is managed by environment variables.
|
||||||
Please look into the `.env.dist` file to list all possible environment variables.
|
Please look into the `.env.dist` file to list all possible environment variables.
|
||||||
You have to install MariaDB (or any MySQL server) to be able to access the admin panel.
|
You have to have a running database server to be able to access the admin panel.
|
||||||
|
|
||||||
## Links
|
## Links
|
||||||
|
|
||||||
|
@ -1,32 +0,0 @@
|
|||||||
version: "2.4"
|
|
||||||
|
|
||||||
services:
|
|
||||||
app:
|
|
||||||
build: .
|
|
||||||
ports:
|
|
||||||
- "5000:5000"
|
|
||||||
entrypoint: python3 run.py
|
|
||||||
working_dir: /app
|
|
||||||
depends_on:
|
|
||||||
- db
|
|
||||||
- redis
|
|
||||||
env_file:
|
|
||||||
- .env.dist
|
|
||||||
- .env
|
|
||||||
volumes:
|
|
||||||
- .:/app
|
|
||||||
|
|
||||||
db:
|
|
||||||
image: mariadb
|
|
||||||
ports:
|
|
||||||
- "3306:3306"
|
|
||||||
env_file:
|
|
||||||
- .env.dist
|
|
||||||
- .env
|
|
||||||
volumes:
|
|
||||||
- ./.db:/var/lib/mysql
|
|
||||||
|
|
||||||
redis:
|
|
||||||
image: redis
|
|
||||||
ports:
|
|
||||||
- "6379:6379"
|
|
@ -5,12 +5,12 @@ from operator import attrgetter, itemgetter
|
|||||||
from flask import redirect, render_template, request, url_for, abort
|
from flask import redirect, render_template, request, url_for, abort
|
||||||
|
|
||||||
from . import utils
|
from . import utils
|
||||||
from .config import app, auth, ADMIN_USERNAME, ADMIN_PASSWORD, MYSQL_ENABLED, APP_PORT, IS_DEBUG, TRANSMISSION_ENABLED
|
from .config import app, auth, ADMIN_USERNAME, ADMIN_PASSWORD, DB_ENABLED, APP_PORT, IS_DEBUG, TRANSMISSION_ENABLED
|
||||||
from .connectors import get_instance, run_all, Nyaa
|
from .connectors import get_instance, run_all, Nyaa
|
||||||
from .connectors.core import ConnectorLang, ConnectorReturn
|
from .connectors.core import ConnectorLang, ConnectorReturn
|
||||||
from .forms import SearchForm, DeleteForm, EditForm, FolderDeleteForm, FolderEditForm
|
from .forms import SearchForm, DeleteForm, EditForm, FolderDeleteForm, FolderEditForm
|
||||||
|
|
||||||
if MYSQL_ENABLED:
|
if DB_ENABLED:
|
||||||
from .config import db
|
from .config import db
|
||||||
from .models import AnimeFolder, AnimeTitle, AnimeLink
|
from .models import AnimeFolder, AnimeTitle, AnimeLink
|
||||||
|
|
||||||
@ -18,10 +18,10 @@ if TRANSMISSION_ENABLED:
|
|||||||
from .config import transmission
|
from .config import transmission
|
||||||
|
|
||||||
|
|
||||||
def mysql_required(f):
|
def db_required(f):
|
||||||
@wraps(f)
|
@wraps(f)
|
||||||
def decorated_function(*args, **kwargs):
|
def decorated_function(*args, **kwargs):
|
||||||
if not MYSQL_ENABLED:
|
if not DB_ENABLED:
|
||||||
return abort(404)
|
return abort(404)
|
||||||
return f(*args, **kwargs)
|
return f(*args, **kwargs)
|
||||||
|
|
||||||
@ -50,7 +50,7 @@ def verify_password(username, password):
|
|||||||
def boldify(name):
|
def boldify(name):
|
||||||
query = request.args.get('q', '')
|
query = request.args.get('q', '')
|
||||||
name = utils.boldify(name, query)
|
name = utils.boldify(name, query)
|
||||||
if MYSQL_ENABLED:
|
if DB_ENABLED:
|
||||||
for keyword in db.session.query(AnimeTitle.keyword.distinct()).all():
|
for keyword in db.session.query(AnimeTitle.keyword.distinct()).all():
|
||||||
if keyword[0].lower() != query.lower():
|
if keyword[0].lower() != query.lower():
|
||||||
name = utils.boldify(name, keyword[0])
|
name = utils.boldify(name, keyword[0])
|
||||||
@ -69,7 +69,7 @@ def colorify(model):
|
|||||||
|
|
||||||
@app.context_processor
|
@app.context_processor
|
||||||
def inject_user():
|
def inject_user():
|
||||||
return dict(mysql_disabled=not MYSQL_ENABLED)
|
return dict(db_disabled=not DB_ENABLED)
|
||||||
|
|
||||||
|
|
||||||
@app.route('/')
|
@app.route('/')
|
||||||
@ -108,7 +108,7 @@ def latest(page=1):
|
|||||||
|
|
||||||
@app.route('/list')
|
@app.route('/list')
|
||||||
@app.route('/list/<url_filters>')
|
@app.route('/list/<url_filters>')
|
||||||
@mysql_required
|
@db_required
|
||||||
def list_animes(url_filters='nyaa,yggtorrent'):
|
def list_animes(url_filters='nyaa,yggtorrent'):
|
||||||
filters = None
|
filters = None
|
||||||
for i, to_filter in enumerate(url_filters.split(',')):
|
for i, to_filter in enumerate(url_filters.split(',')):
|
||||||
@ -131,7 +131,7 @@ def list_animes(url_filters='nyaa,yggtorrent'):
|
|||||||
|
|
||||||
|
|
||||||
@app.route('/admin', methods=['GET', 'POST'])
|
@app.route('/admin', methods=['GET', 'POST'])
|
||||||
@mysql_required
|
@db_required
|
||||||
@auth.login_required
|
@auth.login_required
|
||||||
def admin():
|
def admin():
|
||||||
form = DeleteForm(request.form)
|
form = DeleteForm(request.form)
|
||||||
@ -165,7 +165,7 @@ def admin():
|
|||||||
|
|
||||||
|
|
||||||
@app.route('/admin/folder', methods=['GET', 'POST'])
|
@app.route('/admin/folder', methods=['GET', 'POST'])
|
||||||
@mysql_required
|
@db_required
|
||||||
@auth.login_required
|
@auth.login_required
|
||||||
def folder_list():
|
def folder_list():
|
||||||
form = FolderDeleteForm(request.form)
|
form = FolderDeleteForm(request.form)
|
||||||
@ -188,7 +188,7 @@ def folder_list():
|
|||||||
|
|
||||||
@app.route('/admin/folder/edit', methods=['GET', 'POST'])
|
@app.route('/admin/folder/edit', methods=['GET', 'POST'])
|
||||||
@app.route('/admin/folder/edit/<int:folder_id>', methods=['GET', 'POST'])
|
@app.route('/admin/folder/edit/<int:folder_id>', methods=['GET', 'POST'])
|
||||||
@mysql_required
|
@db_required
|
||||||
@auth.login_required
|
@auth.login_required
|
||||||
def folder_edit(folder_id=None):
|
def folder_edit(folder_id=None):
|
||||||
folder = AnimeFolder.query.filter_by(id=folder_id).first()
|
folder = AnimeFolder.query.filter_by(id=folder_id).first()
|
||||||
@ -213,7 +213,7 @@ def folder_edit(folder_id=None):
|
|||||||
|
|
||||||
@app.route('/admin/edit', methods=['GET', 'POST'])
|
@app.route('/admin/edit', methods=['GET', 'POST'])
|
||||||
@app.route('/admin/edit/<int:link_id>', methods=['GET', 'POST'])
|
@app.route('/admin/edit/<int:link_id>', methods=['GET', 'POST'])
|
||||||
@mysql_required
|
@db_required
|
||||||
@auth.login_required
|
@auth.login_required
|
||||||
def admin_edit(link_id=None):
|
def admin_edit(link_id=None):
|
||||||
link = AnimeLink.query.filter_by(id=link_id).first()
|
link = AnimeLink.query.filter_by(id=link_id).first()
|
||||||
|
@ -17,7 +17,7 @@ APP_PORT = int(environ.get('FLASK_PORT', 5000))
|
|||||||
CACHE_TIMEOUT = int(environ.get('CACHE_TIMEOUT', 60 * 60))
|
CACHE_TIMEOUT = int(environ.get('CACHE_TIMEOUT', 60 * 60))
|
||||||
REQUESTS_TIMEOUT = int(environ.get('REQUESTS_TIMEOUT', 5))
|
REQUESTS_TIMEOUT = int(environ.get('REQUESTS_TIMEOUT', 5))
|
||||||
BLACKLIST_WORDS = environ.get('BLACKLIST_WORDS', '').split(',') if environ.get('BLACKLIST_WORDS', '') else []
|
BLACKLIST_WORDS = environ.get('BLACKLIST_WORDS', '').split(',') if environ.get('BLACKLIST_WORDS', '') else []
|
||||||
MYSQL_ENABLED = False
|
DB_ENABLED = False
|
||||||
REDIS_ENABLED = False
|
REDIS_ENABLED = False
|
||||||
TRANSMISSION_ENABLED = False
|
TRANSMISSION_ENABLED = False
|
||||||
|
|
||||||
@ -30,18 +30,10 @@ auth = HTTPBasicAuth()
|
|||||||
logging.basicConfig(level=(logging.DEBUG if IS_DEBUG else logging.INFO))
|
logging.basicConfig(level=(logging.DEBUG if IS_DEBUG else logging.INFO))
|
||||||
logger = logging.getLogger(app.name)
|
logger = logging.getLogger(app.name)
|
||||||
|
|
||||||
db_host = environ.get('MYSQL_SERVER')
|
db_uri = environ.get('DATABASE_URI')
|
||||||
if db_host:
|
if db_uri:
|
||||||
MYSQL_ENABLED = True
|
DB_ENABLED = True
|
||||||
db_user = environ.get('MYSQL_USER')
|
app.config['SQLALCHEMY_DATABASE_URI'] = db_uri
|
||||||
db_password = environ.get('MYSQL_PASSWORD')
|
|
||||||
db_name = environ.get('MYSQL_DATABASE')
|
|
||||||
if not db_user or not db_password or not db_name:
|
|
||||||
logger.error('Missing connection environment variables')
|
|
||||||
exit()
|
|
||||||
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://%s:%s@%s/%s?charset=utf8mb4' % (
|
|
||||||
db_user, db_password, db_host, db_name
|
|
||||||
)
|
|
||||||
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
|
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
|
||||||
app.config['SQLALCHEMY_ECHO'] = IS_DEBUG
|
app.config['SQLALCHEMY_ECHO'] = IS_DEBUG
|
||||||
app.config['SQLALCHEMY_ENGINE_OPTIONS'] = {
|
app.config['SQLALCHEMY_ENGINE_OPTIONS'] = {
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
<i class="fa fa-newspaper-o"></i><i> </i>
|
<i class="fa fa-newspaper-o"></i><i> </i>
|
||||||
<span class="is-hidden-mobile">Latest torrents</span>
|
<span class="is-hidden-mobile">Latest torrents</span>
|
||||||
</a>
|
</a>
|
||||||
{% if not mysql_disabled %}
|
{% if not db_disabled %}
|
||||||
<a class="navbar-item has-tooltip-bottom has-tooltip-hidden-desktop" data-tooltip="My seeded torrents"
|
<a class="navbar-item has-tooltip-bottom has-tooltip-hidden-desktop" data-tooltip="My seeded torrents"
|
||||||
href="{{ url_for('list_animes') }}">
|
href="{{ url_for('list_animes') }}">
|
||||||
<i class="fa fa-cloud-download"></i><i> </i>
|
<i class="fa fa-cloud-download"></i><i> </i>
|
||||||
|
@ -2,11 +2,11 @@ import re
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from dateparser import parse
|
from dateparser import parse
|
||||||
|
|
||||||
from .config import MYSQL_ENABLED, BLACKLIST_WORDS
|
from .config import DB_ENABLED, BLACKLIST_WORDS
|
||||||
|
|
||||||
|
|
||||||
def link_exist_in_db(href):
|
def link_exist_in_db(href):
|
||||||
if MYSQL_ENABLED:
|
if DB_ENABLED:
|
||||||
from .models import AnimeLink
|
from .models import AnimeLink
|
||||||
return AnimeLink.query.filter_by(link=href).first()
|
return AnimeLink.query.filter_by(link=href).first()
|
||||||
return False
|
return False
|
||||||
|
Reference in New Issue
Block a user