Compare commits

..

No commits in common. "8455d64e311031beecc1165a941d12d92bfc08c6" and "1f43a00c7a826f8770715f383e9f2dd534a108a2" have entirely different histories.

8 changed files with 296 additions and 355 deletions

View File

@ -54,24 +54,6 @@ INSTALLED_APPS = [
# "otp_yubikey", # "otp_yubikey",
"mixins", "mixins",
] ]
# Performance optimisations
CACHES = {
"default": {
"BACKEND": "django.core.cache.backends.redis.RedisCache",
"LOCATION": "unix:///var/run/socks/redis.sock",
"OPTIONS": {
"db": "10",
"parser_class": "redis.connection.PythonParser",
"pool_class": "redis.BlockingConnectionPool",
},
}
}
# CACHE_MIDDLEWARE_ALIAS
# CACHE_MIDDLEWARE_SECONDS
# CACHE_MIDDLEWARE_KEY_PREFIX
CRISPY_TEMPLATE_PACK = "bulma" CRISPY_TEMPLATE_PACK = "bulma"
CRISPY_ALLOWED_TEMPLATE_PACKS = ("bulma",) CRISPY_ALLOWED_TEMPLATE_PACKS = ("bulma",)
DJANGO_TABLES2_TEMPLATE = "django-tables2/bulma.html" DJANGO_TABLES2_TEMPLATE = "django-tables2/bulma.html"
@ -87,9 +69,6 @@ MIDDLEWARE = [
"django.contrib.messages.middleware.MessageMiddleware", "django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware", "django.middleware.clickjacking.XFrameOptionsMiddleware",
"django_htmx.middleware.HtmxMiddleware", "django_htmx.middleware.HtmxMiddleware",
# 'django.middleware.cache.UpdateCacheMiddleware',
# 'django.middleware.common.CommonMiddleware',
# 'django.middleware.cache.FetchFromCacheMiddleware',
] ]
ROOT_URLCONF = "app.urls" ROOT_URLCONF = "app.urls"

View File

@ -4,19 +4,19 @@ from django.contrib.auth.admin import UserAdmin
from .forms import CustomUserCreationForm from .forms import CustomUserCreationForm
from .models import ( from .models import (
Account, Account,
AssetGroup,
AssetRestriction,
Callback, Callback,
Hook, Hook,
NotificationSettings,
Plan, Plan,
RiskModel,
Session, Session,
Signal, Signal,
Strategy, Strategy,
Trade, Trade,
TradingTime, TradingTime,
User, User,
NotificationSettings,
RiskModel,
AssetGroup,
AssetRestriction,
) )
# admin.site.__class__ = OTPAdminSite # admin.site.__class__ = OTPAdminSite
@ -80,27 +80,15 @@ class StrategyAdmin(admin.ModelAdmin):
class NotificationSettingsAdmin(admin.ModelAdmin): class NotificationSettingsAdmin(admin.ModelAdmin):
list_display = ("user", "ntfy_topic", "ntfy_url") list_display = ("user", "ntfy_topic", "ntfy_url")
class RiskModelAdmin(admin.ModelAdmin): class RiskModelAdmin(admin.ModelAdmin):
list_display = ( list_display = ("user", "name", "description", "max_loss_percent", "max_risk_percent", "max_open_trades", "max_open_trades_per_symbol")
"user",
"name",
"description",
"max_loss_percent",
"max_risk_percent",
"max_open_trades",
"max_open_trades_per_symbol",
)
class AssetGroupAdmin(admin.ModelAdmin): class AssetGroupAdmin(admin.ModelAdmin):
list_display = ("user", "name", "description", "account") list_display = ("user", "name", "description", "account")
class AssetRestrictionAdmin(admin.ModelAdmin): class AssetRestrictionAdmin(admin.ModelAdmin):
list_display = ("user", "name", "description", "webhook_id", "group") list_display = ("user", "name", "description", "webhook_id", "group")
admin.site.register(User, CustomUserAdmin) admin.site.register(User, CustomUserAdmin)
admin.site.register(Plan) admin.site.register(Plan)
admin.site.register(Session) admin.site.register(Session)

View File

@ -1,7 +1,7 @@
# Generated by Django 4.1.6 on 2023-02-10 22:57 # Generated by Django 4.1.6 on 2023-02-10 22:57
import django.db.models.deletion
from django.db import migrations, models from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration): class Migration(migrations.Migration):

View File

@ -1,320 +1,315 @@
{% load static %} {% load static %}
{% load has_plan %} {% load has_plan %}
{% load cache %}
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en-GB"> <html lang="en-GB">
{% cache 600 head %} <head>
<head> <meta charset="utf-8">
<meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="viewport" content="width=device-width, initial-scale=1"> <title>XF - {{ request.path_info }}</title>
<title>XF - {{ request.path_info }}</title> <link rel="shortcut icon" href="{% static 'favicon.ico' %}">
<link rel="shortcut icon" href="{% static 'favicon.ico' %}"> <link rel="manifest" href="{% static 'manifest.webmanifest' %}">
<link rel="manifest" href="{% static 'manifest.webmanifest' %}"> <link rel="stylesheet" href="{% static 'css/bulma.min.css' %}">
<link rel="stylesheet" href="{% static 'css/bulma.min.css' %}"> <link rel="stylesheet" href="{% static 'css/bulma-tooltip.min.css' %}">
<link rel="stylesheet" href="{% static 'css/bulma-tooltip.min.css' %}"> <link rel="stylesheet" href="https://site-assets.fontawesome.com/releases/v6.1.1/css/all.css">
<link rel="stylesheet" href="https://site-assets.fontawesome.com/releases/v6.1.1/css/all.css"> <link rel="stylesheet" href="{% static 'css/gridstack.min.css' %}">
<link rel="stylesheet" href="{% static 'css/gridstack.min.css' %}"> <script src="{% static 'js/htmx.min.js' %}" integrity="sha384-cZuAZ+ZbwkNRnrKi05G/fjBX+azI9DNOkNYysZ0I/X5ZFgsmMiBXgDZof30F5ofc" crossorigin="anonymous"></script>
<script src="{% static 'js/htmx.min.js' %}" integrity="sha384-cZuAZ+ZbwkNRnrKi05G/fjBX+azI9DNOkNYysZ0I/X5ZFgsmMiBXgDZof30F5ofc" crossorigin="anonymous"></script> <script defer src="{% static 'js/hyperscript.min.js' %}" integrity="sha384-6GYN8BDHOJkkru6zcpGOUa//1mn+5iZ/MyT6mq34WFIpuOeLF52kSi721q0SsYF9" crossorigin="anonymous"></script>
<script defer src="{% static 'js/hyperscript.min.js' %}" integrity="sha384-6GYN8BDHOJkkru6zcpGOUa//1mn+5iZ/MyT6mq34WFIpuOeLF52kSi721q0SsYF9" crossorigin="anonymous"></script> <script defer src="{% static 'js/remove-me.js' %}" integrity="sha384-6fHcFNoQ8QEI3ZDgw9Z/A6Brk64gF7AnFbLgdrumo8/kBbsKQ/wo7wPegj5WkzuG" crossorigin="anonymous"></script>
<script defer src="{% static 'js/remove-me.js' %}" integrity="sha384-6fHcFNoQ8QEI3ZDgw9Z/A6Brk64gF7AnFbLgdrumo8/kBbsKQ/wo7wPegj5WkzuG" crossorigin="anonymous"></script> <script src="{% static 'js/gridstack-all.js' %}"></script>
<script src="{% static 'js/gridstack-all.js' %}"></script> <script defer src="{% static 'js/magnet.min.js' %}"></script>
<script defer src="{% static 'js/magnet.min.js' %}"></script> <script>
<script> document.addEventListener("restore-scroll", function(event) {
document.addEventListener("restore-scroll", function(event) { var scrollpos = localStorage.getItem('scrollpos');
var scrollpos = localStorage.getItem('scrollpos'); if (scrollpos) {
if (scrollpos) { window.scrollTo(0, scrollpos)
window.scrollTo(0, scrollpos) };
}; });
});
document.addEventListener("htmx:beforeSwap", function(event) { document.addEventListener("htmx:beforeSwap", function(event) {
localStorage.setItem('scrollpos', window.scrollY); localStorage.setItem('scrollpos', window.scrollY);
}); });
</script> </script>
<script> <script>
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
// Get all "navbar-burger" elements // Get all "navbar-burger" elements
const $navbarBurgers = Array.prototype.slice.call(document.querySelectorAll('.navbar-burger'), 0); const $navbarBurgers = Array.prototype.slice.call(document.querySelectorAll('.navbar-burger'), 0);
// Add a click event on each of them // Add a click event on each of them
$navbarBurgers.forEach( el => { $navbarBurgers.forEach( el => {
el.addEventListener('click', () => { el.addEventListener('click', () => {
// Get the target from the "data-target" attribute // Get the target from the "data-target" attribute
const target = el.dataset.target; const target = el.dataset.target;
const $target = document.getElementById(target); const $target = document.getElementById(target);
// Toggle the "is-active" class on both the "navbar-burger" and the "navbar-menu" // Toggle the "is-active" class on both the "navbar-burger" and the "navbar-menu"
el.classList.toggle('is-active'); el.classList.toggle('is-active');
$target.classList.toggle('is-active'); $target.classList.toggle('is-active');
});
}); });
}); });
</script>
<style>
.icon { border-bottom: 0px !important;}
.wrap {
word-wrap: break-word;
}
.nowrap-parent {
white-space: nowrap;
}
.nowrap-child {
display: inline-block;
}
.htmx-indicator{
opacity:0;
transition: opacity 500ms ease-in;
}
.htmx-request .htmx-indicator{
opacity:1
}
.htmx-request.htmx-indicator{
opacity:1
}
.tooltiptext { });
visibility: hidden; </script>
background-color: black; <style>
color: #fff; .icon { border-bottom: 0px !important;}
text-align: center; .wrap {
padding: 5px 0; word-wrap: break-word;
border-radius: 6px; }
position: absolute; .nowrap-parent {
z-index: 1; white-space: nowrap;
} }
.nowrap-child {
display: inline-block;
}
.htmx-indicator{
opacity:0;
transition: opacity 500ms ease-in;
}
.htmx-request .htmx-indicator{
opacity:1
}
.htmx-request.htmx-indicator{
opacity:1
}
.rounded-tooltip:hover .tooltiptext { .tooltiptext {
visibility: visible; visibility: hidden;
} background-color: black;
color: #fff;
text-align: center;
padding: 5px 0;
border-radius: 6px;
position: absolute;
z-index: 1;
}
.table { .rounded-tooltip:hover .tooltiptext {
background: transparent !important; visibility: visible;
} }
tr { .table {
transition: all 0.2s ease-in-out; background: transparent !important;
} }
tr:hover { tr {
cursor:pointer; transition: all 0.2s ease-in-out;
background-color:rgba(221, 224, 255, 0.3) !important; }
}
a.panel-block { tr:hover {
transition: all 0.2s ease-in-out; cursor:pointer;
} background-color:rgba(221, 224, 255, 0.3) !important;
}
a.panel-block:hover { a.panel-block {
cursor:pointer; transition: all 0.2s ease-in-out;
background-color:rgba(221, 224, 255, 0.3) !important; }
}
.panel, .box, .modal { a.panel-block:hover {
background-color:rgba(250, 250, 250, 0.5) !important; cursor:pointer;
} background-color:rgba(221, 224, 255, 0.3) !important;
.modal, .modal.box{ }
background-color:rgba(210, 210, 210, 0.9) !important;
}
.modal-background{
background-color:rgba(255, 255, 255, 0.3) !important;
}
.has-background-grey-lighter{ .panel, .box, .modal {
background-color:rgba(219, 219, 219, 0.5) !important; background-color:rgba(250, 250, 250, 0.5) !important;
} }
.navbar { .modal, .modal.box{
background-color:rgba(0, 0, 0, 0.03) !important; background-color:rgba(210, 210, 210, 0.9) !important;
} }
.modal-background{
background-color:rgba(255, 255, 255, 0.3) !important;
}
.grid-stack-item-content { .has-background-grey-lighter{
display: flex !important; background-color:rgba(219, 219, 219, 0.5) !important;
flex-direction: column !important; }
overflow-x: hidden !important; .navbar {
overflow-y: hidden !important; background-color:rgba(0, 0, 0, 0.03) !important;
} }
.panel { .grid-stack-item-content {
display: flex !important; display: flex !important;
flex-direction: column !important; flex-direction: column !important;
overflow: hidden; overflow-x: hidden !important;
} overflow-y: hidden !important;
}
.panel-block { .panel {
overflow-y:auto; display: flex !important;
overflow-x:auto; flex-direction: column !important;
min-height: 90%; overflow: hidden;
display: block; }
}
.floating-window { .panel-block {
/* background-color:rgba(210, 210, 210, 0.6) !important; */ overflow-y:auto;
display: flex !important; overflow-x:auto;
flex-direction: column !important; min-height: 90%;
overflow-x: hidden !important; display: block;
overflow-y: hidden !important; }
max-height: 300px;
z-index: 9000;
position: absolute;
top: 50px;
left: 50px;
}
.floating-window .panel { .floating-window {
background-color:rgba(250, 250, 250, 0.8) !important; /* background-color:rgba(210, 210, 210, 0.6) !important; */
} display: flex !important;
flex-direction: column !important;
overflow-x: hidden !important;
overflow-y: hidden !important;
max-height: 300px;
z-index: 9000;
position: absolute;
top: 50px;
left: 50px;
}
.float-right { .floating-window .panel {
float: right; background-color:rgba(250, 250, 250, 0.8) !important;
padding-right: 5px; }
padding-left: 5px;
}
.grid-stack-item:hover .ui-resizable-handle {
display: block !important;
}
.ui-resizable-handle {
z-index: 39 !important;
}
</style> .float-right {
<!-- Piwik --> {# Yes it's in the source, fight me #} float: right;
<script type="text/javascript"> padding-right: 5px;
var _paq = _paq || []; padding-left: 5px;
_paq.push(['trackPageView']); }
_paq.push(['enableLinkTracking']); .grid-stack-item:hover .ui-resizable-handle {
(function() { display: block !important;
_paq.push(['setTrackerUrl', 'https://api-f98632bdcf666e3217c6c1a2bafc6c09.s.zm.is']); }
_paq.push(['setSiteId', 5]); .ui-resizable-handle {
_paq.push(['setApiToken', 'En6AFpSwq4vx3fuXEjSUY6jhUPi_MRinYBQw1FxOqsy']); z-index: 39 !important;
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; }
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://c87zpt9a74m181wto33r.s.zm.is/embed.js'; s.parentNode.insertBefore(g,s);
})(); </style>
</script> <!-- Piwik --> {# Yes it's in the source, fight me #}
<!-- End Piwik Code --> <script type="text/javascript">
</head> var _paq = _paq || [];
{% endcache %} _paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
_paq.push(['setTrackerUrl', 'https://api-f98632bdcf666e3217c6c1a2bafc6c09.s.zm.is']);
_paq.push(['setSiteId', 5]);
_paq.push(['setApiToken', 'En6AFpSwq4vx3fuXEjSUY6jhUPi_MRinYBQw1FxOqsy']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://c87zpt9a74m181wto33r.s.zm.is/embed.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Piwik Code -->
</head>
<body> <body>
{% cache 600 nav request.user.id %} <nav class="navbar" role="navigation" aria-label="main navigation">
<nav class="navbar" role="navigation" aria-label="main navigation"> <div class="navbar-brand">
<div class="navbar-brand"> <a class="navbar-item" href="{% url 'home' %}">
<a class="navbar-item" href="{% url 'home' %}"> <img src="{% static 'logo.svg' %}" width="112" height="28" alt="logo">
<img src="{% static 'logo.svg' %}" width="112" height="28" alt="logo"> </a>
</a>
<a role="button" class="navbar-burger" aria-label="menu" aria-expanded="false" data-target="bar"> <a role="button" class="navbar-burger" aria-label="menu" aria-expanded="false" data-target="bar">
<span aria-hidden="true"></span> <span aria-hidden="true"></span>
<span aria-hidden="true"></span> <span aria-hidden="true"></span>
<span aria-hidden="true"></span> <span aria-hidden="true"></span>
</a>
</div>
<div id="bar" class="navbar-menu">
<div class="navbar-start">
<a class="navbar-item" href="{% url 'home' %}">
Home
</a>
{% if user.is_authenticated %}
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link">
Exchange
</a>
<div class="navbar-dropdown">
<a class="navbar-item" href="{% url 'profit' type='page' %}">
Profit
</a>
<a class="navbar-item" href="{% url 'positions' type='page' %}">
Positions
</a>
<a class="navbar-item" href="{% url 'trades' type='page' %}">
Trades
</a>
<a class="navbar-item" href="{% url 'accounts' type='page' %}">
Accounts
</a>
</div>
</div>
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link">
Setup
</a>
<div class="navbar-dropdown">
<a class="navbar-item" href="{% url 'strategies' type='page' %}">
Strategies
</a>
<a class="navbar-item" href="{% url 'signals' type='page' %}">
Signals
</a>
<a class="navbar-item" href="{% url 'hooks' type='page' %}">
Hooks
</a>
<a class="navbar-item" href="{% url 'tradingtimes' type='page' %}">
Trading Times
</a>
<a class="navbar-item" href="{% url 'risks' type='page' %}">
Risk Management
</a>
<a class="navbar-item" href="{% url 'assetgroups' type='page' %}">
Asset Groups
</a>
</div>
</div>
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link">
Account
</a>
<div class="navbar-dropdown">
<a class="navbar-item" href="{% url 'two_factor:profile' %}">
Security
</a>
<a class="navbar-item" href="{% url 'notifications_update' type='page' %}">
Notifications
</a>
</div>
</div>
{% endif %}
{% if settings.STRIPE_ENABLED %}
{% if user.is_authenticated %}
<a class="navbar-item" href="{% url 'billing' %}">
Billing
</a>
{% endif %}
{% endif %}
<a class="navbar-item add-button">
Install
</a> </a>
</div> </div>
<div id="bar" class="navbar-menu"> <div class="navbar-end">
<div class="navbar-start"> <div class="navbar-item">
<a class="navbar-item" href="{% url 'home' %}"> <div class="buttons">
Home {% if not user.is_authenticated %}
</a> <a class="button" href="{% url 'signup' %}">
{% if user.is_authenticated %} <strong>Sign up</strong>
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link">
Exchange
</a> </a>
<div class="navbar-dropdown"> <a class="button" href="{% url 'two_factor:login' %}">
<a class="navbar-item" href="{% url 'profit' type='page' %}"> Log in
Profit
</a>
<a class="navbar-item" href="{% url 'positions' type='page' %}">
Positions
</a>
<a class="navbar-item" href="{% url 'trades' type='page' %}">
Trades
</a>
<a class="navbar-item" href="{% url 'accounts' type='page' %}">
Accounts
</a>
</div>
</div>
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link">
Setup
</a>
<div class="navbar-dropdown">
<a class="navbar-item" href="{% url 'strategies' type='page' %}">
Strategies
</a>
<a class="navbar-item" href="{% url 'signals' type='page' %}">
Signals
</a>
<a class="navbar-item" href="{% url 'hooks' type='page' %}">
Hooks
</a>
<a class="navbar-item" href="{% url 'tradingtimes' type='page' %}">
Trading Times
</a>
<a class="navbar-item" href="{% url 'risks' type='page' %}">
Risk Management
</a>
<a class="navbar-item" href="{% url 'assetgroups' type='page' %}">
Asset Groups
</a>
</div>
</div>
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link">
Account
</a>
<div class="navbar-dropdown">
<a class="navbar-item" href="{% url 'two_factor:profile' %}">
Security
</a>
<a class="navbar-item" href="{% url 'notifications_update' type='page' %}">
Notifications
</a>
</div>
</div>
{% endif %}
{% if settings.STRIPE_ENABLED %}
{% if user.is_authenticated %}
<a class="navbar-item" href="{% url 'billing' %}">
Billing
</a> </a>
{% endif %} {% endif %}
{% endif %}
<a class="navbar-item add-button">
Install
</a>
</div>
<div class="navbar-end"> {% if user.is_authenticated %}
<div class="navbar-item"> <a class="button" href="{% url 'logout' %}">Logout</a>
<div class="buttons"> {% endif %}
{% if not user.is_authenticated %}
<a class="button" href="{% url 'signup' %}">
<strong>Sign up</strong>
</a>
<a class="button" href="{% url 'two_factor:login' %}">
Log in
</a>
{% endif %}
{% if user.is_authenticated %}
<a class="button" href="{% url 'logout' %}">Logout</a>
{% endif %}
</div>
</div> </div>
</div> </div>
</div> </div>
</nav> </div>
{% endcache %} </nav>
<script> <script>
let deferredPrompt; let deferredPrompt;
const addBtn = document.querySelector('.add-button'); const addBtn = document.querySelector('.add-button');

View File

@ -1,5 +1,3 @@
import json
from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.mixins import LoginRequiredMixin
from django.http import HttpResponse from django.http import HttpResponse
from mixins.views import AbortSave, ObjectCreate, ObjectDelete, ObjectList, ObjectUpdate from mixins.views import AbortSave, ObjectCreate, ObjectDelete, ObjectList, ObjectUpdate
@ -10,6 +8,7 @@ from rest_framework.views import APIView
from core.forms import AssetGroupForm, AssetRestrictionForm from core.forms import AssetGroupForm, AssetRestrictionForm
from core.models import AssetGroup, AssetRestriction from core.models import AssetGroup, AssetRestriction
from core.util import logs from core.util import logs
import json
log = logs.get_logger(__name__) log = logs.get_logger(__name__)
@ -66,9 +65,7 @@ class AssetRestrictionList(
list_template = "partials/assetrestriction-list.html" list_template = "partials/assetrestriction-list.html"
model = AssetRestriction model = AssetRestriction
page_title = "List of asset restrictions. Linked to asset groups." page_title = "List of asset restrictions. Linked to asset groups."
page_subtitle = ( page_subtitle = "Allows API calls to permit or prohibit trading on defined currency pairs."
"Allows API calls to permit or prohibit trading on defined currency pairs."
)
list_url_name = "assetrestrictions" list_url_name = "assetrestrictions"
list_url_args = ["type", "group"] list_url_args = ["type", "group"]

View File

@ -43,8 +43,6 @@ services:
- ${PORTAINER_GIT_DIR}:/code - ${PORTAINER_GIT_DIR}:/code
- ${APP_DATABASE_FILE}:/conf/db.sqlite3 - ${APP_DATABASE_FILE}:/conf/db.sqlite3
- fisk_static:${STATIC_ROOT} - fisk_static:${STATIC_ROOT}
volumes_from:
- tmp
env_file: env_file:
- stack.env - stack.env
@ -60,8 +58,6 @@ services:
- ${PORTAINER_GIT_DIR}:/code - ${PORTAINER_GIT_DIR}:/code
- ${APP_DATABASE_FILE}:/conf/db.sqlite3 - ${APP_DATABASE_FILE}:/conf/db.sqlite3
- fisk_static:${STATIC_ROOT} - fisk_static:${STATIC_ROOT}
volumes_from:
- tmp
env_file: env_file:
- stack.env - stack.env
@ -102,33 +98,24 @@ services:
volumes: volumes:
- /var/run/socks - /var/run/socks
# For caching # redis:
redis: # image: redis
image: redis # command: redis-server /etc/redis.conf
container_name: redis_fisk # ulimits:
command: redis-server /etc/redis.conf # nproc: 65535
ulimits: # nofile:
nproc: 65535 # soft: 65535
nofile: # hard: 65535
soft: 65535 # volumes:
hard: 65535 # - ${PORTAINER_GIT_DIR}/docker/redis.conf:/etc/redis.conf
volumes: # - redis_data:/data
- ${PORTAINER_GIT_DIR}/docker/redis.conf:/etc/redis.conf # volumes_from:
- fisk_redis_data:/data # - tmp
volumes_from: # healthcheck:
- tmp # test: "redis-cli -s /var/run/redis/redis.sock ping"
healthcheck: # interval: 2s
test: "redis-cli -s /var/run/socks/redis.sock ping" # timeout: 2s
interval: 2s # retries: 15
timeout: 2s
retries: 15
# pyroscope:
# image: "pyroscope/pyroscope:latest"
# ports:
# - "4040:4040"
# command:
# - "server"
networks: networks:
default: default:
@ -140,4 +127,3 @@ networks:
volumes: volumes:
fisk_static: {} fisk_static: {}
fisk_redis_data: {}

View File

@ -1,2 +1,2 @@
unixsocket /var/run/socks/redis.sock unixsocket /var/run/redis/redis.sock
unixsocketperm 777 unixsocketperm 777

View File

@ -22,7 +22,3 @@ oandapyV20
glom glom
elasticsearch elasticsearch
git+https://git.zm.is/XF/django-crud-mixins git+https://git.zm.is/XF/django-crud-mixins
# pyroscope-io
# For caching
redis
hiredis