1
0
mirror of https://codeberg.org/diginaut/digimarks.git synced 2026-05-07 05:32:35 +02:00

6 Commits

Author SHA1 Message Date
diginaut 39f4b43b7f Correct type for the directory settings 2026-03-29 13:17:29 +02:00
diginaut 99d2011e65 Favicon config 2026-02-11 16:11:30 +01:00
diginaut bade114b40 Fixed some links 2026-02-11 16:07:28 +01:00
diginaut 8558b518f8 Example nginx configuration 2026-02-11 15:59:47 +01:00
diginaut 9524fec672 Updated example configuration files 2026-02-11 15:59:10 +01:00
diginaut 157303aba2 Disable Alpine.js clipboard for now 2026-02-11 15:50:48 +01:00
9 changed files with 119 additions and 71 deletions
+5 -5
View File
@@ -89,7 +89,7 @@ Url's are of the form `https://hook.example.com/app/<appkey>/<triggerkey>`
API documentation is auto-generated, and can be browsed at https://hook.example.com/docs API documentation is auto-generated, and can be browsed at https://hook.example.com/docs
### Bookmarklet ## 🧩 Bookmarklet
To easily save a link from your browser, open its bookmark manager and create a new bookmark with as url: To easily save a link from your browser, open its bookmark manager and create a new bookmark with as url:
@@ -115,14 +115,14 @@ If you for whatever reason would lose this user key, just either look on the con
## 🔧 Server configuration ## 🔧 Server configuration
- [systemd for digimarks API](https://codeberg.org/diginaut/digimarks/blob/master/example_config/systemd/digimarks.service) which uses the [gunicorn config](https://codeberg.org/diginaut/digimarks/src/branch/master/example_config/uwsgi.ini) - [systemd for digimarks API](https://codeberg.org/diginaut/digimarks/src/branch/fastapi/example_config/systemd/digimarks.service) which uses the [gunicorn config](https://codeberg.org/diginaut/digimarks/src/branch/fastapi/example_config/gunicorn_digimarks_conf.py)
- [nginx for digimarks API]() - [nginx for digimarks API](https://codeberg.org/diginaut/digimarks/src/branch/fastapi/example_config/nginx_digimarks.conf)
- [more config](https://codeberg.org/diginaut/digimarks/src/branch/master/example_config) - [more config](https://codeberg.org/diginaut/digimarks/src/branch/fastapi/example_config)
## ✨ What's new? ## ✨ What's new?
See the [Changelog](https://codeberg.org/diginaut/digimarks/blob/master/CHANGELOG.md) See the [Changelog](https://codeberg.org/diginaut/digimarks/src/branch/fastapi/CHANGELOG.md)
## 🙏 Attributions ## 🙏 Attributions
-29
View File
@@ -1,29 +0,0 @@
<VirtualHost *:80>
ServerAdmin webmaster@example.com
ServerName marks.example.com
WSGIDaemonProcess digimarks user=youruser group=youruser threads=5 python-path=/srv/marks.example.com/digimarks/
WSGIScriptAlias / /srv/marks.example.com/digimarks/wsgi.py
<Directory /srv/marks.example.com/digimarks>
WSGIProcessGroup digimarks
WSGIApplicationGroup %{GLOBAL}
Require all granted
</Directory>
<Directory /srv/marks.example.com/digimarks>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
ErrorLog /var/log/apache2/error_marks.example.com.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog /var/log/apache2/access_marks.example.com.log combined
ServerSignature On
</VirtualHost>
+14
View File
@@ -0,0 +1,14 @@
# gunicorn_conf.py
from multiprocessing import cpu_count
bind = "127.0.0.1:8890"
# Worker Options
#workers = cpu_count() + 1
workers = 1
worker_class = 'uvicorn.workers.UvicornWorker'
# Logging Options
loglevel = 'debug'
accesslog = '/var/log/digimarks/access_log'
errorlog = '/var/log/digimarks/error_log'
+73
View File
@@ -0,0 +1,73 @@
server {
server_name marks.example.org;
listen [::]:443 ssl; # managed by Certbot
listen 443 ssl; # managed by Certbot
real_ip_header X-Forwarded-For;
access_log /var/log/nginx/access_marks.example.org.log;
error_log /var/log/nginx/error_marks.example.org.log warn;
# Media: images, icons, video, audio, HTC
#location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|mp3|ogg|ogv|webm|htc|woff2|woff)$ {
# expires 1M;
# access_log off;
# # max-age must be in seconds
# add_header Cache-Control "max-age=2629746, public";
#}
# CSS and Javascript
#location ~* \.(?:css|js)$ {
# expires 1M;
# access_log off;
# add_header Cache-Control "max-age=31556952, public";
#}
location / {
proxy_pass http://127.0.0.1:8890;
proxy_read_timeout 60;
proxy_connect_timeout 60;
proxy_redirect off;
# Allow the use of websockets
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
location /content/favicons/ {
alias /srv/www/marks.example.org/favicons/;
# This can certainly be cached, so do so for a month
expires 1M;
add_header Cache-Control "public";
}
location /static/ {
alias /srv/www/marks.example.org/digimarks/src/digimarks/static/;
# This can certainly be cached, so do so for a month
#expires 1M;
#add_header Cache-Control "public";
}
location /favicon.ico {
# Favicon for the webapp, shown in the browser
alias /srv/www/marks.example.org/digimarks/src/digimarks/static/favicon.ico;
}
ssl_certificate /etc/letsencrypt/live/marks.example.org/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/marks.example.org/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = marks.example.org) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen [::]:80 ;
listen 80;
server_name marks.example.org;
return 404; # managed by Certbot
}
-20
View File
@@ -1,20 +0,0 @@
# Virtualenv to use with the wsgi file (optional)
VENV = '/srv/marks.example.com/venv/bin/activate_this.py'
PORT = 8086
DEBUG = False
# Password/url key to do admin stuff with, like adding a user
# NB: change this to something else! For example, in bash:
# echo -n "yourstring" | sha1sum
SYSTEMKEY = 'S3kr1t'
# RapidAPI key for favicons
# https://rapidapi.com/realfavicongenerator/api/realfavicongenerator
MASHAPE_API_KEY = 'your_MASHAPE_key'
LOG_LOCATION = 'digimarks.log'
#LOG_LOCATION = '/var/log/digimarks/digimarks.log'
# How many logs to keep in log rotation:
LOG_BACKUP_COUNT = 10
+22
View File
@@ -0,0 +1,22 @@
[Unit]
Description=Gunicorn Daemon for digimarks FastAPI
After=network.target
[Service]
User=YOUR_USER
Group=YOUR_USER
WorkingDirectory=/srv/www/marks.example.org/digimarks/src
Environment="SYSTEM_KEY=RanDomSeCretKeyFoRAdmin"
Environment="FAVICONS_DIR=/srv/www/marks.example.org/favicons"
Environment="DATABASE_FILE=/srv/www/marks.example.org/bookmarks.db"
Environment="STATIC_DIR=digimarks/static"
Environment="TEMPLATE_DIR=digimarks/templates"
ExecStart=/srv/www/marks.example.org/venv/bin/gunicorn -c /srv/www/marks.example.org/gunicorn_digimarks_conf.py digimarks.main:app
StandardOutput=file:///var/log/digimarks/stdout.log
StandardError=file:///var/log/digimarks/stderr.log
[Install]
WantedBy=multi-user.target
-15
View File
@@ -1,15 +0,0 @@
# Example supervisord configuration
# Run with /srv/venv/bin/uwsgi --ini /srv/digimarks/uwsgi.ini:digimarks
[digimarks]
chdir = /srv/digimarks
socket = /tmp/uwsgi_digimarks.sock
module = wsgi
threads = 4
master = true
processes = 5
vacuum = true
no-orphans = true
chmod-socket = 666
logger = main file:/var/log/webapps/digimarks.log
logger = file:/var/log/webapps/digimarks_debug.log
+3 -2
View File
@@ -4,6 +4,7 @@ import logging
from collections.abc import Sequence from collections.abc import Sequence
from contextlib import asynccontextmanager from contextlib import asynccontextmanager
from datetime import UTC, datetime from datetime import UTC, datetime
from pathlib import Path
from typing import Annotated, AsyncGenerator, cast from typing import Annotated, AsyncGenerator, cast
import httpx import httpx
@@ -36,8 +37,8 @@ class Settings(BaseSettings):
# inside the codebase # inside the codebase
# static_dir: DirectoryPath = Path('digimarks/static') # static_dir: DirectoryPath = Path('digimarks/static')
# template_dir: DirectoryPath = Path('digimarks/templates') # template_dir: DirectoryPath = Path('digimarks/templates')
static_dir: DirectoryPath = DirectoryPath('digimarks/static') static_dir: DirectoryPath = Path('digimarks/static')
template_dir: DirectoryPath = DirectoryPath('digimarks/templates') template_dir: DirectoryPath = Path('digimarks/templates')
media_url: str = '/static/' media_url: str = '/static/'
+2
View File
@@ -13,8 +13,10 @@
<link rel="icon" type="image/png" sizes="16x16" href="/static/images/favicon-16x16.png"> <link rel="icon" type="image/png" sizes="16x16" href="/static/images/favicon-16x16.png">
<link rel="manifest" href="/static/images/site.webmanifest"> <link rel="manifest" href="/static/images/site.webmanifest">
<script src="https://cdn.jsdelivr.net/npm/@alpinejs/persist@3.x.x/dist/cdn.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/@alpinejs/persist@3.x.x/dist/cdn.min.js"></script>
{#-
<script src="https://cdn.jsdelivr.net/npm/@ryangjchandler/alpine-clipboard@2.x.x/dist/alpine-clipboard.js" <script src="https://cdn.jsdelivr.net/npm/@ryangjchandler/alpine-clipboard@2.x.x/dist/alpine-clipboard.js"
defer></script> defer></script>
#}
<script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script> <script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script>
</head> </head>
<body> <body>