Compare commits

...

3 Commits

24 changed files with 2524 additions and 0 deletions
+222
View File
@@ -0,0 +1,222 @@
{
"$schema": "https://json-schema.org/draft-07/schema#",
"title": ".digital_hq",
"description": "My network's specification v0.1",
"type": "object",
"properties": {
"name": {"$ref": "#/$defs/name"},
"domain": {"$ref": "#/$defs/domain"},
"home_url": {
"description": "the first url to enter the network",
"$ref": "#/$defs/url"
},
"regions": {
"type": "array",
"items": {
"$ref": "#/$defs/region"
}
},
"machines": {
"type": "array",
"items": {
"$ref": "#/$defs/machine"
},
"minItems": 1
},
"services": {
"type": "array",
"items": {
"$ref": "#/$defs/service"
},
"minItems": 1
},
"groups": {
"type": "array",
"items": {
"$ref": "#/$defs/group"
},
"minItems": 3
},
"users": {
"type": "array",
"items": {
"$ref": "#/$defs/user"
},
"minItems": 1
}
},
"$defs": {
"id": {
"type": "string",
"examples": ["cortex", "maurane", "postgres-shared"]
},
"ip": {
"type": "string",
"pattern": "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"
},
"name": {
"type": "string",
"examples": ["Maurane", "AFFiNE", "Gaufre"]
},
"domain": {
"type": "string",
"pattern": "^[a-z]+\\.([a-z]*\\.)*[a-z]{2,10}"
},
"url": {
"type": "string",
"pattern": "^(https?|postgres)://[a-z0-9.-]+(\\.[a-z]{2,10})?(:[0-9]+)?(/.*)?$"
},
"email": {
"type": "string",
"pattern": "^[a-z0-9-\\.]+@[a-z]+\\.[a-z]{2,10}"
},
"service": {
"type": "object",
"properties": {
"id": {"$ref": "#/$defs/id"},
"name": {"$ref": "#/$defs/name"},
"machine_id": {"$ref": "#/$defs/id"},
"ports": {
"type": "array",
"items": {
"type": "number",
"minimum": 1
},
"minItems": 1
},
"public_url": {"$ref": "#/$defs/url"},
"internal_url": {"$ref": "#/$defs/url"},
"status": {
"type": "string",
"enum": ["active", "inactive", "planned", "wip" , "tested", "broken"]
},
"auth": {
"type": "string",
"enum": ["session cookie", "trusted headers", "oidc", "vpn", "internal", "none"]
},
"installation_mode": {
"type": "string",
"enum": ["docker", "native"]
},
"categories": {
"type": "array",
"items": {
"enum": ["ai", "auth", "automation", "backup", "caldav", "communication", "database", "dev", "experimental", "finance", "media", "monitoring", "network", "productivity", "storage"]
}
},
"service_group": {
"enum": ["mandatory", "de-googling", "productivity", "account", "bonus"]
},
"dependencies": {
"type": "array",
"items": {"$ref": "#/$defs/name"}
},
"allowed_groups": {
"type": "array",
"items": {"$ref": "#/$defs/name"},
"minItems": 1
}
},
"required": ["id", "name", "machine_id", "status", "allowed_groups"]
},
"machine": {
"type": "object",
"properties": {
"id": {"$ref": "#/$defs/id"},
"name": {"$ref": "#/$defs/name"},
"ip": {
"description": "private ip addresss of a server",
"$ref": "#/$defs/ip"
},
"public_ip": {
"description": "public ip address of a server",
"$ref": "#/$defs/ip"
},
"provider": {
"type": "string",
"enum": ["ovh", "hostinger", "aws", "hertzner"]
},
"role": {
"type": "string"
},
"domains": {
"type": "array",
"items": {
"type": "object",
"properties": {
"internal": {
"$ref": "#/$defs/domain"
},
"external": {
"$ref": "#/$defs/domain"
}
},
"minProperties": 1,
"maxProperties": 1,
"additionalProperties": false
},
"contains": {"required": ["internal"]},
"uniqueItems": true
}
},
"required": ["id", "ip", "name", "domains"]
},
"region": {
"description": "sub part of the main digital hq land",
"type": "object",
"properties": {
"id": {"$ref": "#/$defs/id"},
"region_type": {"type": "string"},
"vn": {"type": "string"},
"fr": {"type": "string"},
"kre": {"type": "string"},
"en": {"type": "string"}
},
"required": ["id"]
},
"group": {
"type": "object",
"properties": {
"id": {"$ref": "#/$defs/id"},
"name": {"$ref": "#/$defs/name"},
"group_description": {"type": "string"},
"region": {"$ref": "#/$defs/name"}
},
"required": ["id", "name", "region"]
},
"user": {
"type": "object",
"properties": {
"id": {"$ref": "#/$defs/id"},
"name": {"$ref": "#/$defs/name"},
"nickname": {"$ref": "#/$defs/name"},
"email": {"$ref": "#/$defs/email"},
"groups": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1
}
},
"required": ["id", "name", "groups", "email"]
}
},
"additionalProperties": false
}
+6
View File
@@ -0,0 +1,6 @@
{
"yaml.schemas": {
"file:///home/maurane/Projets/homelab/.vscode/homelab.json": "file:///home/maurane/Projets/homelab/services.yml"
},
"yaml.disableSchemaDetection": [],
}
+162
View File
@@ -0,0 +1,162 @@
theme: grey
log:
file_path: /config/authelia.log
keep_stdout: true
# Stockage (fichier SQLite local) suffisant pour commencer
storage:
local:
path: /config/db.sqlite3
# Base de données des utilisateurs (fichier)
authentication_backend:
file:
path: /config/users.yml
# Accès par défaut (à ajuster selon tes besoins)
access_control:
default_policy: 'one_factor'
rules:
- domain:
- "paperless.crenam.space"
- "git.crenam.space"
- "task.crenam.space"
- "seafile.crenam.space"
policy: one_factor
# Session et cookie
session:
cookies:
- name: authelia_session
domain: crenam.space
authelia_url: "https://auth.crenam.space"
default_redirection_url: "https://dashboard.crenam.space"
expiration: "16h"
remember_me: "1 month"
# sercret
# Notifications (par mail on laisse vide pour le moment, pas de SMTP)
notifier:
disable_startup_check: true
filesystem:
filename: /config/notifications.yml
# ban regulation if attempt to penetrate the network without authorization
regulation:
modes:
- "user"
max_retries: 5
ban_time: '10m'
find_time: '2m'
# identity_validation:
# definitions:
# user_attributes:
# username
# email
# nickname
# if needed, it will be lldap
# ldap: http://localhost:111
#
# identity_providers:
# oidc:
# # hmac secret is used for OAuth2 tokens
# hmac_secret:
# # jwks issuer is needed to configure multiple jwk. Must be based on RS256 algorithm
# # or on 2048 bit RSA/PA key
# jwks:
# # recommended not to configure this
# - key_id: {{ secret "/secrets/private.pem" | mindent 10 "|" | msquote }}
# # key algorithm
# algorithm: "RS256"
# use: "sig"
# key: |
# -----BEGIN PRIVATE KEY-----
# -----END PRIVATE KEY-----
# # Optionnally matchin certificate in PEM DER form
# certificate_chain: {{ secret "/secrets/public.crt" | mindent 10 "|" | msquote }}
# # the signing algorithm used for signing discovery and metdata responses
# # most client ignore this so set it to none
# discovery_signed_response_alg: 'none'
# # the signing key used for signing discovery and metdata responses
# # most client ignore this so set it to ''
# discovery_signed_response_key_id: ''
# # authorization policies
# authorization_policy:
# policy_name:
# default_policy: 'two_factor'
# rules:
# - policy: 'one_factor'
# subject: 'group:services'
# clients:
#########################################
# sso configuration for vikunja #
#########################################
# - client_id: 'vikunja'
# client_name: 'Vikunja'
# # generated with
# client_secret: '$pbkdf2-sha512$310000$hPnUYU6BCaRSZYulOiWXwA$5hsAJD494cyoQ/X9JlAbsMF//yGDg009lfDe2WhGQ>
# public: false
# redirect_uris:
# - 'https://task.crenam.space/auth/openid/authelia'
# - 'https://task.crenam.space/login?redirectToProvider=authentik'
#
# # audience this client is allowed to request
# audience: []
# # scopes this client is allowed to request
# scopes:
# -
#
# # list of response modes the client support
# response_modes:
# - 'form_post'
# - 'query'
# # the policy required for this client
# # can also be the key names fot eh authorization policies section
# authorization_policy: 'one_factor'
# require_pkce: false
# pkce_challenge_method: ''
# scopes:
# - 'openid'
# - 'profile'
# - 'email'
# response_types:
# - 'code'
# grant_types:
# - 'authorization_code'
# access_token_signed_response_alg: 'none'
# userinfo_signed_response_alg: 'none'
# token_endpoint_auth_method: 'client_secret_post'
#########################################
# config sso for gitea #
#########################################
# - client_id: 'gitea'
# client_name: 'Gitea'
# client_secret: '$pbkdf2-sha512$310000$pJR7colZSiWF7SWIfUsoqg$IGGqIZGVqcpXpzVCBgptZ3zBMqpFk4oaIKvOZPa1f>
# public: false
# authorization_policy: 'one_factor'
# require_pkce: false
# pkce_challenge_method: ''
# redirect_uris:
# - 'https://git.crenam.space/user/oauth2/authelia/callback'
# scopes:
# - 'openid'
# - 'email'
# - 'profile'
# response_types:
# - 'code'
# grant_types:
# - 'authorization_code'
# access_token_signed_response_alg: 'none'
# userinfo_signed_response_alg: 'none'
# token_endpoint_auth_method: 'client_secret_basic'
+392
View File
@@ -0,0 +1,392 @@
# Firefly Data Importer (FIDI) configuration file
# Where is Firefly III?
#
# 1) Make sure you ADD http:// or https://
# 2) Make sure you REMOVE any trailing slash from the end of the URL.
# 3) In case of Docker, refer to the internal IP of your Firefly III installation.
#
# Setting this value is not mandatory. But it is very useful.
#
# This variable can be set from a file if you append it with _FILE
#
FIREFLY_III_URL=http://app:8080
#
# Imagine Firefly III can be reached at "http://172.16.0.2:8082" (internal Docker network or something).
# But you have a fancy URL: "https://personal-finances.bill.microsoft.com/"
#
# In those cases, you can overrule the URL so when the data importer links back to Firefly III, it uses the correct URL.
#
# 1) Make sure you ADD http:// or https://
# 2) Make sure you REMOVE any trailing slash from the end of the URL.
#
# IF YOU SET THIS VALUE, YOU MUST ALSO SET THE FIREFLY_III_URL
#
# This variable can be set from a file if you append it with _FILE
#
VANITY_URL=http://gaufre.home:8800
#
# Set your Firefly III Personal Access Token (OAuth)
# You can create a Personal Access Token on the /profile/oauth page:
# go to the "Remote access and tokens" page, then Personal Access Token and "Create new token".
#
# - Do not use the "command line token". That's the WRONG one.
# - Do not use "APP_KEY" value from your Firefly III installation. That's the WRONG one.
#
# Setting this value is not mandatory. Instructions will follow if you omit this field.
#
# This variable can be set from a file if you append it with _FILE
#
FIREFLY_III_ACCESS_TOKEN= # à faire une fois firefly lancé
#
# You can also use a public client ID. This is available in Firefly III 5.4.0-alpha.3 and higher.
# This is a number (1, 2, 3). If you use the client ID, you can leave the access token empty and vice versa.
#
# This value is not mandatory to set. Instructions will follow if you omit this field.
#
# This variable can be set from a file if you append it with _FILE
#
FIREFLY_III_CLIENT_ID=
#
# Lunch Flow
#
LUNCH_FLOW_API_KEY=
#
# Unless you know what you are doing, please do not change this.
#
LUNCH_FLOW_API_URL=https://lunchflow.app/api/v1/
#
# Sophtron
#
SOPHTRON_USER_ID=
SOPHTRON_ACCESS_KEY=
SOPHTRON_SANDBOX=false
#
# GoCardless information.
# The key and ID can be set from a file if you append it with _FILE
#
NORDIGEN_ID=
NORDIGEN_KEY=
#
# If you want to use the GoCardless sandbox, set this to true.
#
NORDIGEN_SANDBOX=false
#
# GoCardless has a rate limit in place. The data importer can wait it out, or exit.
# Valid values are "wait" or "exit"
#
RESPOND_TO_GOCARDLESS_LIMIT=wait
#
# The data importer collects account details, which are currently unused.
# This is disabled, since it costs a lot of API calls.
# You can enable it if you want to.
#
GOCARDLESS_GET_ACCOUNT_DETAILS=false
#
# The data importer also collects balances, which can be used for (manual)
# balance verification ("did the import go well?").
# This is disabled by default, since it costs a lot of API calls.
# You can enable it if you want to.
#
GOCARDLESS_GET_BALANCE_DETAILS=false
#
# Locale information.
# Set this to your locale. It is used during CSV imports to parse amounts.
#
FALLBACK_LOCALE=en_US
#
# Enable Banking
#
# The application ID and private key can be set from a file if you append it with _FILE
ENABLE_BANKING_APP_ID=
ENABLE_BANKING_PRIVATE_KEY=
#
# If your bank requires a special "PSU-IP-Address" header, set the following variable
# to true instead of false.
#
ENABLE_BANKING_IMPORT_IP_HEADER=false
#
# Your external IP must be filled in here.
# If you use "autodetect", the data importer will detect it for you.
#
# If you leave the default value it will NOT work. Either fill in your actual IP or set it to "autodetect"
#
# THE DATA IMPORTER WILL USE AN EXTERNAL SERVICE TO DO AUTO DETECTION (icanhazip.com).
#
ENABLE_BANKING_IMPORT_IP=127.0.0.1
#
# Spectre information
#
# The ID and secret can be set from a file if you append it with _FILE
SPECTRE_APP_ID=
SPECTRE_SECRET=
#
# SimpleFIN settings
#
# SimpleFIN Bridge Configuration
SIMPLEFIN_TOKEN=
#
# Which demo environment to connect to.
#
SIMPLEFIN_DEMO_URL=
SIMPLEFIN_DEMO_TOKEN=
#
# Connection settings.
# As a rule, if you need to set larger timeout values, it will not solve the issue.
#
SIMPLEFIN_CONNECTION_TIMEOUT=30
SIMPLEFIN_REQUEST_TIMEOUT=60
SIMPLEFIN_RETRY_ATTEMPTS=3
# delay in seconds between retries
SIMPLEFIN_RETRY_DELAY=
#
# Import size settings.
#
SIMPLEFIN_MAX_TRANSACTIONS=10000
SIMPLEFIN_DEFAULT_DATE_RANGE=90
SIMPLEFIN_ENABLE_CACHING=true
# In seconds
SIMPLEFIN_CACHE_DURATION=3600
#
# Smart expense matching settings.
#
SIMPLEFIN_SMART_EXPENSE_MATCHING=true
SIMPLEFIN_EXPENSE_MATCHING_THRESHOLD=0.7
SIMPLEFIN_AUTO_CREATE_EXPENSE_ACCOUNTS=true
#
# Transaction clustering settings.
#
SIMPLEFIN_ENABLE_TRANSACTION_CLUSTERING=true
SIMPLEFIN_CLUSTERING_SIMILARITY_THRESHOLD=0.7
#
# Use cache. No need to do this.
#
USE_CACHE=true
#
# If set to true, the data import will not complain about running into duplicates.
# This will give you cleaner import mails if you run regular imports.
#
# This means that the data importer will not import duplicates, but it will not complain about them either.
#
# This setting has no influence on the settings in your configuration(.json).
#
# Of course, if something goes wrong *because* the transaction is a duplicate you will
# NEVER know unless you start digging in your log files. So be careful with this.
#
IGNORE_DUPLICATE_ERRORS=false
#
# If you set this to true, the importer will not complain about transactions that can't be found after they've
# been imported. This happens when rule on the Firefly III side deletes the transaction immediately after creating it.
# This can be useful when you have a rule that immediately deletes GoCardless' "pending" transactions. Setting this
# to true reduces some noise.
#
IGNORE_NOT_FOUND_TRANSACTIONS=false
#
# Auto import settings. Due to security constraints, you MUST enable each feature individually.
# You must also set a secret. The secret is used for the web routes.
#
# The auto-import secret must be a string of at least 16 characters.
# Visit this page for inspiration: https://www.random.org/passwords/?num=1&len=16&format=html&rnd=new
#
# Submit it using ?secret=X
#
# This variable can be set from a file if you append it with _FILE
#
AUTO_IMPORT_SECRET=qtyrNFCbe4Jawyda
#
# Is the /autoimport even endpoint enabled?
# By default it's disabled, and the secret alone will not enable it.
#
CAN_POST_AUTOIMPORT=true
#
# Is the /autoupload endpoint enabled?
# By default it's disabled, and the secret alone will not enable it.
#
CAN_POST_FILES=true
#
# Import directory white list. You need to set this before the auto importer will accept a directory to import from.
#
# This variable can be set from a file if you append it with _FILE
#
IMPORT_DIR_ALLOWLIST=
#
# If you import from a directory, you can save a fallback configuration file in the directory.
# This file must be called "_fallback.json" and will be used when your CSV or CAMT.053 file is not accompanied
# by a configuration file.
#
# This fallback configuration will only be used if this variable is set to true.
# https://docs.firefly-iii.org/how-to/data-importer/advanced/post/#importing-a-local-directory
#
FALLBACK_IN_DIR=false
#
# When you're running Firefly III under a (self-signed) certificate,
# the data importer may have trouble verifying the TLS connection.
#
# You have a few options to make sure the data importer can connect
# to Firefly III:
# - 'true': will verify all certificates. The most secure option and the default.
# - 'file.pem': refer to a file (you must provide it) to your custom root or intermediate certificates.
# - 'false': will verify NO certificates. Not very secure.
VERIFY_TLS_SECURITY=true
#
# If you want, you can set a directory here where the data importer will look for import configurations.
# This is a separate setting from the /import directory that the auto-import uses.
# Setting this variable isn't necessary. The default value is "storage/configurations".
#
# This variable can be set from a file if you append it with _FILE
#
JSON_CONFIGURATION_DIR= # à voir plus tard
#
# Time out when connecting with Firefly III.
# π*10 seconds is usually fine.
#
CONNECTION_TIMEOUT=31.41
# The following variables can be useful when debugging the application
APP_ENV=local
APP_DEBUG=false
LOG_CHANNEL=stack
#
# If you turn this on, expect massive logs with lots of privacy sensitive data
#
LOG_RETURN_JSON=false
# Log level. You can set this from least severe to most severe:
# debug, info, notice, warning, error, critical, alert, emergency
# If you set it to debug your logs will grow large, and fast. If you set it to emergency probably
# nothing will get logged, ever.
LOG_LEVEL=debug
# TRUSTED_PROXIES is a useful variable when using Docker and/or a reverse proxy.
# Set it to ** and reverse proxies work just fine.
TRUSTED_PROXIES=**
#
# Time zone
#
TZ=Europe/Paris
#
# Email settings.
# The data importer can send you a message with all errors, warnings and messages
# after a successful import. This is disabled by default
#
ENABLE_MAIL_REPORT=false
#
# Force Firefly III URL to be secure?
#
#
EXPECT_SECURE_URL=false
#
# Use fake data instead of real data. I use this when developing.
#
FAKE_DATA=false
# If enabled, define which mailer you want to use.
# Options include: smtp, mailgun, postmark, sendmail, log, array
# Amazon SES is not supported.
# log = drop mails in the logs instead of sending them
# array = debug mailer that does nothing.
MAIL_MAILER=
# where to send the report?
# This variable can be set from a file if you append it with _FILE
MAIL_DESTINATION=noreply@example.com
# other mail settings
# These variables can be set from a file if you append it with _FILE
MAIL_FROM_ADDRESS=admin@crenam.space
MAIL_HOST=smtp.mail.ovh.net
MAIL_PORT=587
MAIL_USERNAME=admin@crenam.space
MAIL_PASSWORD=qjKKZZpuS3cYWtyFShgN
MAIL_ENCRYPTION=null
# Extra settings depending on your mail configuration above.
# These variables can be set from a file if you append it with _FILE
MAILGUN_DOMAIN=
MAILGUN_SECRET=
MAILGUN_ENDPOINT=
POSTMARK_TOKEN=
#
# You probably won't need to change these settings.
#
BROADCAST_DRIVER=log
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
IS_EXTERNAL=false
REDIS_HOST=redis
REDIS_PASSWORD=null
REDIS_PORT=6379
# always use quotes
REDIS_DB="0"
REDIS_CACHE_DB="1"
#
# Use ASSET_URL when your data importer webpages are served from a URL with a subfolder path
# This pre-appends the subfolder path in front of URLs for browser-side assets such as CSS Files.
# Example: If your webserver (i.e. NGINX) is configured to serve the data importer webpages from
# http://localhost/ff3di, set ASSET_URL = /ff3di
# and it will pre-append that value to any requests for browser-side assets
# 1) Make sure you REMOVE any trailing slash from the end of the URL.
#
ASSET_URL=
# The only tracker supported is Matomo.
# This is used on the public instance over at https://data-importer.firefly-iii.org
TRACKER_SITE_ID=
TRACKER_URL=
APP_NAME=DataImporter
#
# The APP_URL environment variable is NOT used anywhere.
# Don't bother setting it to fix your reverse proxy problems. It won't help.
# Don't open issues telling me it doesn't help because it's not supposed to.
# Laravel uses this to generate links on the command line, which is a feature the data importer does not use.
#
APP_URL=http://gaufre.home:8801
+46
View File
@@ -0,0 +1,46 @@
services:
app:
image: fireflyiii/core:latest
hostname: app
container_name: firefly_iii_core
restart: always
volumes:
- /srv/homelab/firefly/data:/var/www/html/storage/upload
env_file: .env
ports:
- "8800:8080"
cron:
#
# To make this work, set STATIC_CRON_TOKEN in your .env file or as an environment variable
# The STATIC_CRON_TOKEN must be *exactly* 32 characters long
# Use this URL for inspiration: https://www.random.org/strings/?num=1&len=32&digits=on&upperalpha=on&loweralpha=on&unique=on&format=html&rnd=new
#
image: alpine
restart: always
container_name: firefly_iii_cron
env_file: .env
command: ["sh", "-c", "apk add tzdata && \
(ln -s /usr/share/zoneinfo/$$TZ /etc/localtime || true) && \
echo \"0 3 * * * wget -qO- http://app:8080/api/v1/cron/$$STATIC_CRON_TOKEN;echo\" \
| crontab - && \
crond -f -L /dev/stdout"]
depends_on:
- app
redis:
image: redis:7-alpine
container_name: firefly_iii_redis
restart: always
importer:
image: fireflyiii/data-importer:latest
hostname: importer
restart: always
container_name: firefly_iii_importer
ports:
- '8801:8080'
depends_on:
- app
env_file: .importer.env
volumes:
- /mnt/freebox:/import
+53
View File
@@ -0,0 +1,53 @@
server {
if ($host = www.affine.crenam.space) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = affine.crenam.space) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name affine.crenam.space www.affine.crenam.space;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl http2;
server_name affine.crenam.space www.affine.crenam.space;
ssl_certificate /etc/letsencrypt/live/affine.crenam.space/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/affine.crenam.space/privkey.pem; # managed by Certbot
# Maximum allowed upload size.
client_max_body_size 100m;
# Set required headers.
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket config for the sync system.
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# to add to configs for sso auth
# include /etc/nginx/snippets/authelia-verify.conf;
location / {
# to add to configs for sso auth
# include /etc/nginx/snippets/authelia-authrequest.conf;
proxy_pass http://localhost:3010;
}
}
+34
View File
@@ -0,0 +1,34 @@
server {
if ($host = aliasvault.crenam.space) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name aliasvault.crenam.space;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name aliasvault.crenam.space;
client_max_body_size 100m;
location / {
proxy_pass http://192.168.1.15:8008;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;
}
ssl_certificate /etc/letsencrypt/live/aliasvault.crenam.space/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/aliasvault.crenam.space/privkey.pem; # managed by Certbot
}
+31
View File
@@ -0,0 +1,31 @@
server {
if ($host = auth.crenam.space) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name auth.crenam.space;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name auth.crenam.space;
ssl_certificate /etc/letsencrypt/live/auth.crenam.space/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/auth.crenam.space/privkey.pem; # managed by Certbot
set $upstream http://192.168.27.69:9091;
location / {
include /etc/nginx/snippets/proxy.conf;
proxy_pass $upstream;
proxy_cache_bypass $cookie_session;
proxy_no_cache $cookie_session;
}
}
+91
View File
@@ -0,0 +1,91 @@
##
# You should look at the following URL's in order to grasp a solid understanding
# of Nginx configuration files in order to fully unleash the power of Nginx.
# https://www.nginx.com/resources/wiki/start/
# https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/
# https://wiki.debian.org/Nginx/DirectoryStructure
#
# In most cases, administrators will remove this file from sites-enabled/ and
# leave it as reference inside of sites-available where it will continue to be
# updated by the nginx packaging team.
#
# This file will automatically load configuration files provided by other
# applications, such as Drupal or Wordpress. These applications will be made
# available underneath a path with that package name, such as /drupal8.
#
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
##
# Default server configuration
#
server {
listen 80 default_server;
listen [::]:80 default_server;
# SSL configuration
#
# listen 443 ssl default_server;
# listen [::]:443 ssl default_server;
#
# Note: You should disable gzip for SSL traffic.
# See: https://bugs.debian.org/773332
#
# Read up on ssl_ciphers to ensure a secure configuration.
# See: https://bugs.debian.org/765782
#
# Self signed certs generated by the ssl-cert package
# Don't use them in a production server!
#
# include snippets/snakeoil.conf;
root /var/www/html;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
# pass PHP scripts to FastCGI server
#
#location ~ \.php$ {
# include snippets/fastcgi-php.conf;
#
# # With php-fpm (or other unix sockets):
# fastcgi_pass unix:/run/php/php7.4-fpm.sock;
# # With php-cgi (or other tcp sockets):
# fastcgi_pass 127.0.0.1:9000;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# Virtual Host configuration for example.com
#
# You can move that to a different file under sites-available/ and symlink that
# to sites-enabled/ to enable it.
#
#server {
# listen 80;
# listen [::]:80;
#
# server_name example.com;
#
# root /var/www/example.com;
# index index.html;
#
# location / {
# try_files $uri $uri/ =404;
# }
#}
+53
View File
@@ -0,0 +1,53 @@
server {
if ($host = www.git.crenam.space) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = git.crenam.space) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name git.crenam.space www.git.crenam.space;
location / {
return 301 https://git.crenam.space$request_uri;
}
}
server {
listen 443 ssl http2;
server_name git.crenam.space www.git.crenam.space;
# ---------- Authelia ----------
# include /etc/nginx/snippets/authelia-verify.conf;
location / {
client_max_body_size 512M;
# include /etc/nginx/snippets/authelia-authrequest.conf;
# auth_request_set $auth_user $upstream_http_remote_user;
# proxy_set_header X-Webauth-user $auth_user;
proxy_pass http://192.168.1.15:3000;
proxy_http_version 1.1;
proxy_set_header Connection $http_connection;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
ssl_certificate /etc/letsencrypt/live/git.crenam.space/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/git.crenam.space/privkey.pem; # managed by Certbot
}
+36
View File
@@ -0,0 +1,36 @@
server {
if ($host = www.dashboard.crenam.space) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = dashboard.crenam.space) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name dashboard.crenam.space www.dashboard.crenam.space;
return 301 https://dashboard.crenam.space$request_uri;
}
server {
listen 443 ssl http2;
server_name dashboard.crenam.space www.dashboard.crenam.space;
location / {
proxy_pass http://192.168.1.15:7575;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
ssl_certificate /etc/letsencrypt/live/dashboard.crenam.space/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/dashboard.crenam.space/privkey.pem; # managed by Certbot
}
+81
View File
@@ -0,0 +1,81 @@
server {
listen 443 ssl http2;
access_log /var/log/nginx/ess.log;
error_log /var/log/nginx/ess.errors;
ssl_certificate /etc/letsencrypt/live/ess/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/ess/privkey.pem; # managed by Certbot
#TLSv1.2 is required for iOS support for now
ssl_dhparam /etc/nginx/dhparam.pem;
ssl_session_cache shared:le_nginx_SSL:10m;
ssl_session_timeout 1440m;
ssl_session_tickets off;
ssl_buffer_size 4k;
# ssl_stapling on;
# ssl_stapling_verify on;
add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload' always;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
server_name admin.element.crenam.space chat.element.crenam.space matrix.element.crenam.space account.element.crenam.space mrtc.element.crenam.space element.crenam.space;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
client_max_body_size 50M;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400s;
proxy_send_timeout 86400s;
proxy_buffering off;
}
}
server {
if ($host = element.crenam.space) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = admin.element.crenam.space) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = chat.element.crenam.space) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = mrtc.element.crenam.space) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = account.element.crenam.space) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = matrix.element.crenam.space) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name admin.element.crenam.space chat.element.crenam.space matrix.element.crenam.space account.element.crenam.space mrtc.element.crenam.space element.crenam.space;
return 301 https://$host$request_uri;
}
+35
View File
@@ -0,0 +1,35 @@
server {
listen 80;
server_name mealie.crenam.space;
if ($host = mealie.crenam.space) {
return 301 https://$host$request_uri;
} # managed by Certbot
}
server {
listen 443 ssl http2;
server_name mealie.crenam.space;
# En-têtes de sécurité
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
location / {
proxy_pass http://192.168.1.30:9925;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Désactiver le buffering pour WebSocket si besoin (Mealie ne semble pas en avoir besoin)
proxy_buffering off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
ssl_certificate /etc/letsencrypt/live/mealie.crenam.space/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/mealie.crenam.space/privkey.pem; # managed by Certbot
}
+36
View File
@@ -0,0 +1,36 @@
server {
if ($host = n8n.crenam.space) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name n8n.crenam.space;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name n8n.crenam.space;
location / {
proxy_pass http://192.168.1.30:5678; # IP de Gaufre sur le réseau local
client_max_body_size 20M;
proxy_set_header Host $host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
}
ssl_certificate /etc/letsencrypt/live/n8n.crenam.space/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/n8n.crenam.space/privkey.pem; # managed by Certbot
}
+67
View File
@@ -0,0 +1,67 @@
# /etc/nginx/sites-*/ntfy
#
# This config requires the use of the -L flag in curl to redirect to HTTPS, and it keeps nginx output buffering
# enabled. While recommended, I have had issues with that in the past.
server {
if ($host = ntfy.crenam.space) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name ntfy.crenam.space;
location / {
return 302 https://$http_host$request_uri$is_args$query_string;
proxy_pass http://192.168.1.15:810;
proxy_http_version 1.1;
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 3m;
proxy_send_timeout 3m;
proxy_read_timeout 3m;
client_max_body_size 0; # Stream request body to backend
}
}
server {
listen 443 ssl http2;
server_name ntfy.crenam.space;
# See https://ssl-config.mozilla.org/#server=nginx&version=1.18.0&config=intermediate&openssl=1.1.1k&hsts=false&ocsp=false&guideline=5.6
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
location / {
proxy_pass http://192.168.1.15:810;
proxy_http_version 1.1;
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 3m;
proxy_send_timeout 3m;
proxy_read_timeout 3m;
client_max_body_size 0; # Stream request body to backend
}
ssl_certificate /etc/letsencrypt/live/ntfy.crenam.space/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/ntfy.crenam.space/privkey.pem; # managed by Certbot
}
+108
View File
@@ -0,0 +1,108 @@
upstream openwebui {
# server 10.43.14.141:80;
server 51.210.13.240:3000;
keepalive 128;
keepalive_timeout 1800s;
keepalive_requests 10000;
}
server {
if ($host = llm.crenam.space) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
listen [::]:80;
server_name llm.crenam.space; # ou un autre sous-domaine
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name llm.crenam.space;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:ECDHE-RSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers off;
gzip on;
gzip_types text/plain text/css application/javascript image/svg+xml;
location /api/ {
proxy_pass http://openwebui;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# CRITICAL: Disable all buffering for streaming
gzip off;
proxy_buffering off;
proxy_request_buffering off;
proxy_cache off;
tcp_nodelay on;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-store" always;
# Extended timeouts for LLM completions
proxy_connect_timeout 1800;
proxy_send_timeout 1800;
proxy_read_timeout 1800;
}
# WebSocket connections need even longer timeouts
location ~ ^/(ws/|socket\.io/) {
proxy_pass http://openwebui;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
gzip off;
proxy_buffering off;
proxy_cache off;
# 24-hour timeout for persistent connections
proxy_connect_timeout 86400;
proxy_send_timeout 86400;
proxy_read_timeout 86400;
}
# Static assets - CAN buffer and cache
location /static/ {
proxy_pass http://openwebui;
proxy_buffering on;
proxy_cache_valid 200 7d;
add_header Cache-Control "public, max-age=604800, immutable";
}
# Default location
location / {
proxy_pass http://openwebui;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
ssl_certificate /etc/letsencrypt/live/llm.crenam.space/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/llm.crenam.space/privkey.pem; # managed by Certbot
}
+34
View File
@@ -0,0 +1,34 @@
server {
if ($host = paperless.crenam.space) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name paperless.crenam.space;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl http2;
server_name paperless.crenam.space;
proxy_redirect off;
proxy_buffering off;
# Authelia Remote User
include /etc/nginx/snippets/authelia-location.conf;
location / {
include /etc/nginx/snippets/proxy.conf;
include /etc/nginx/snippets/authelia-authrequest.conf;
proxy_pass http://192.168.1.15:8101;
}
ssl_certificate /etc/letsencrypt/live/paperless.crenam.space/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/paperless.crenam.space/privkey.pem; # managed by Certbot
}
+35
View File
@@ -0,0 +1,35 @@
server {
if ($host = www.radicale.crenam.space) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = radicale.crenam.space) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name radicale.crenam.space www.radicale.crenam.space;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name radicale.crenam.space;
client_max_body_size 512M;
location / {
proxy_pass http://192.168.1.20:5232;
proxy_set_header X-Script-Name /radicale;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_pass_header Authorization;
}
ssl_certificate /etc/letsencrypt/live/radicale.crenam.space/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/radicale.crenam.space/privkey.pem; # managed by Certbot
}
+73
View File
@@ -0,0 +1,73 @@
log_format seafileformat '$http_x_forwarded_for $remote_addr [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $upstream_response_time';
server {
if ($host = seafile.crenam.space) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name seafile.crenam.space;
location / {
return 301 https://$server_name$request_uri;
}
}
server {
listen 443 ssl http2;
server_name seafile.crenam.space;
include /etc/nginx/snippets/authelia-location.conf;
location / {
include /etc/nginx/snippets/proxy.conf;
include /etc/nginx/snippets/authelia-authrequest.conf;
proxy_pass http://192.168.1.30:80;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Connection "";
client_max_body_size 0;
}
location /sdoc-server/ {
include /etc/nginx/snippets/proxy.conf;
proxy_pass http://192.168.1.30:8888/;
client_max_body_size 100m;
}
location /socket.io {
include /etc/nginx/snippets/websocket.conf;
proxy_pass http://192.168.1.30:8888;
proxy_redirect off;
proxy_buffer_size 64k;
proxy_buffers 8 32k;
proxy_busy_buffers_size 64k;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
}
location /notification/ping {
proxy_pass http://192.168.1.30:8083/ping;
access_log /var/log/nginx/notification.access.log seafileformat;
error_log /var/log/nginx/notification.error.log;
}
location /notification {
include /etc/nginx/snippets/proxy.conf;
include /etc/nginx/snippets/websocket.conf;
proxy_pass http://192.168.1.30:8083;
access_log /var/log/nginx/notification.access.log seafileformat;
error_log /var/log/nginx/notification.error.log;
}
ssl_certificate /etc/letsencrypt/live/seafile.crenam.space/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/seafile.crenam.space/privkey.pem; # managed by Certbot
}
+38
View File
@@ -0,0 +1,38 @@
server {
if ($host = task.crenam.space) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name task.crenam.space;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name task.crenam.space;
# Protection générale avec Authelia
# include /etc/nginx/snippets/authelia-verify.conf;
location / {
# include /etc/nginx/snippets/authelia-authrequest.conf;
proxy_pass http://192.168.1.30:3456; # IP de Gaufre sur le réseau local
client_max_body_size 20M;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
}
ssl_certificate /etc/letsencrypt/live/task.crenam.space/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/task.crenam.space/privkey.pem; # managed by Certbot
}
+49
View File
@@ -0,0 +1,49 @@
##############################################################################
# Paperless-ngx settings #
###############################################################################
# See http://docs.paperless-ngx.com/configuration/ for all available options.
# The UID and GID of the user used to run paperless in the container. Set this
# to your UID and GID on the host so that you have write access to the
# consumption directory.
USERMAP_UID=999
USERMAP_GID=984
# See the documentation linked above for all options. A few commonly adjusted settings
# are provided below.
# This is required if you will be exposing Paperless-ngx on a public domain
# (if doing so please consider security measures such as reverse proxy)
PAPERLESS_URL=https://paperless.crenam.space
# Adjust this key if you plan to make paperless available publicly. It should
# be a very long sequence of random characters. You don't need to remember it.
PAPERLESS_SECRET_KEY=1c5e636bb450d4903c335af08cde34262e9cd6fdcb71d983b7f9240f4344b8dd
# Use this variable to set a timezone for the Paperless Docker containers. Defaults to UTC.
PAPERLESS_TIME_ZONE=Europe/Paris
# The default language to use for OCR. Set this to the language most of your
# documents are written in.
PAPERLESS_OCR_LANGUAGE=fra
# Additional languages to install for text recognition, separated by a whitespace.
# Note that this is different from PAPERLESS_OCR_LANGUAGE (default=eng), which defines
# the language used for OCR.
# The container installs English, German, Italian, Spanish and French by default.
# See https://packages.debian.org/search?keywords=tesseract-ocr-&searchon=names
# for available languages.
PAPERLESS_OCR_LANGUAGES=eng
# Database configurations
PAPERLESS_DBHOST=192.168.27.69
PAPERLESS_DBPORT=5432
PAPERLESS_DBNAME=paperless
PAPERLESS_DBUSER=paperless
PAPERLESS_DBPASS=9lPYFd04mNFF0XQYzq
# Authelia SSO configurations
PAPERLESS_ENABLE_HTTP_REMOTE_USER=true
PAPERLESS_HTTP_REMOTE_USER_HEADER_NAME=HTTP_REMOTE_USER
PAPERLESS_LOGOUT_REDIRECT_URL=https://auth.crenam.space/logout
+45
View File
@@ -0,0 +1,45 @@
#
# - Paperless is (re)started on system boot, if it was running before shutdown.
# - Docker volumes for storing data are managed by Docker.
# - Folders for importing and exporting files are created in the same directory
# as this file and mounted to the correct folders inside the container.
# - Paperless listens on port 8000.
#
# In addition to that, this Docker Compose file adds the following optional
# configurations:
#
# - Instead of SQLite (default), PostgreSQL is used as the database server.
#
# To install and update paperless with this file, do the following:
#
# - Copy this file as 'docker-compose.yml' and the files 'docker-compose.env'
# and '.env' into a folder.
# - Run 'docker compose pull'.
# - Run 'docker compose up -d'.
#
# For more extensive installation and update instructions, refer to the
# documentation.
services:
broker:
image: docker.io/library/redis:8
restart: unless-stopped
volumes:
- ./redisdata:/data
webserver:
image: ghcr.io/paperless-ngx/paperless-ngx:latest
restart: unless-stopped
depends_on:
- broker
ports:
- "8101:8000"
volumes:
- ./data:/usr/src/paperless/data
- ./media:/usr/src/paperless/media
- ./export:/usr/src/paperless/export
- /mnt/freebox/data/inbox:/usr/src/paperless/consume
env_file: docker-compose.env
environment:
PAPERLESS_REDIS: redis://broker:6379
# AUTHELIA ENV VARIABLES
PAPERLESS_ENABLE_HTTP_REMOTE_USER: true
PAPERLESS_HTTP_REMOTE_USER_HEADER_NAME: HTTP_REMOTE_USER
+223
View File
@@ -0,0 +1,223 @@
# prompt ia
## contexte relationnel
on se parle depuis plus d'un an maintenant. pas de flagornerie, pas de diplomatie, pas de fausse gentillesse, pas d'hypocrisie, uniquement un ton direct, honnête.
## mon profil
* développeuse backend en ESN avec 5 ans d'expérience sur des framework moderne Python (Django, FastAPI), j'ai repris le travail il y a 3 mois, après un burn-out de 5 mois.
* je ne suis pas en mission mais en intercontrat. je profite de ce temps pour réfléchir à ma carrière et pour travailler sur des projets personnels
* je cherche à avoir une indépendance numérique vis-à-vis des GAFAM
* j'apprends à self-host tout un tas de services différents
* j'ai une appétence pour les outils open-source, qui valorise la confidentialité et ceux qui ne sont sur les territoires européens soumis au RGPD
* j'utilise deepseek-v4, mistral-\*-latest sous Open Web UI principalement pour des tâches de productivité, du suivi d'avancement, de l'analyse textuelle
* j'utilise actuellement VSCodium. J'ai utilisé PyCharm pendant 6 ans.
* j'ai un profil pluriel
* je suis une artiste : je fais du dessin traditionnel et numérique (krita), je chante (chorale)
* je suis développeuse web
* je suis une gameuse (civ 6, oxygen not included, phasmophobia, ...) et apprend godot pour créer mon propre jeu
* j'ai une appétence pour la santé mentale et l'étude du comportement humain. Je suis de manière non officielle un DU en cyberpsychologie.
### matériel & hébergement
| Machine | Rôle | OS / Spécifications |
| -------------------------------- | ------------------------------------------------------ | ------------------------------------------------------------------------------------------------- |
| **Cortex** (VPS OVH) | Le Cerveau (proxy, auth, BDD, services critiques) | Ubuntu 24.04, 6 vCores, 12 Go RAM, 100 Go stockage |
| **Galerie** (VPS OVH) | La Vitrine (apps web légères) | Debian 13, 1 vCore, 2 Go RAM, 20 Go stockage |
| **Salon** (RP5) | Le Foyer numérique (monitoring, développement, DNS) | Debian 13, 8 Go RAM, 2 To stockage |
| **Gaufre** (HP EliteDesk 800 G1) | Le Garde-manger (productivité, médias, automatisation) | Ubuntu Server 24.04, 8 Go RAM, 256 Go SSD + 1 To externe, Intel HD Graphics 4600
Core i5-4570 |
| **Yakimo** (Chromebook CB3 413) | Le Coffre-fort (sécurité, identité, sauvegardes) | Debian 13, 4 Go RAM, 2 To (via freebox) |
| **Corbeau** | Machine utilisateur | PopOS Cosmic, Intel Core i7 10850H 2.70GHZ, Nvidia Quadro RTX 3000, 16Go RAM |
| **MachineDeGuerre** | Machine utilisateur | Fedora 44 KDE, CPU AMD Ryzen 5 3600 6 Core 3.60 GHz, AMD RX 7600 XT, RAM 16 Go |
###
### noms de domaine
* **crenam.space** (domaine racine)
### organisation du travail quotidien
* **Éviter la surcharge** : j'ai un historique de burn-out. On privilégie la régularité douce à lintensité.
* **Eat the frog** : faire la tâche la plus importante ou la plus pénible en début de créneau.
* **Flexibilité** : ce planning est une trame, pas une prison. On ladapte selon mon énergie et les urgences.
#### Rythme quotidien (jours de semaine)
##### Matin (\~9h-10h) « Un nouveau jour pour de nouvelles tâches »
1. **Check-up rapide** (5 min) :
* Regarder les notifications Matrix (problèmes signalés ?).
* Vérifier le statut des services critiques : `docker ps` ou un coup d’œil sur Homarr.
* Lire les éventuels e-mails ou alertes de backup.
2. **Eat the frog** (30-45 min) :
* Choisir une tâche du projet « QG numérique » (ex: installer un service, rédiger une doc, tester un backup).
* **Ne pas dépasser 1h** sur une tâche complexe. Fractionner.
3. **Tâches légères** (15-30 min) :
* Répondre à un message sur un forum dentraide (auto-hébergement, open source).
* Trier les notifications AFFiNE ou les tâches en attente.
4. **Pause** (10-15 min) : s’éloigner de l’écran, respirer.
##### Après-midi (\~14h-16h)
* Selon l’énergie : approfondir le projet en cours (par exemple, configurer Authelia pour un nouveau service, tester une restauration).
* Ou : tâches administratives (mise à jour de la doc AFFiNE, schéma réseau).
* **Ne pas travailler après 18h** (sauf urgence vitale).
##### Fin de journée (\~17h-18h) « Cest tout pour aujourdhui »
* **Bilan** (5 min) :
* Quaije accompli aujourdhui ?
* Questce qui est bloqué ?
* Questce que je ferai demain (une seule tâche prioritaire) ?
* Noter dans AFFiNE la tâche du lendemain (avec le contexte « À faire »).
#### Rythme hebdomadaire
##### Lundi : Planification + Backup
* Revue des tâches de la semaine (AFFiNE).
* Vérifier le rapport de backup du week-end (Borg).
* Lancer un backup manuel si un service critique a été modifié.
##### Mardi : Maintenance technique
* Mise à jour des conteneurs Docker (`docker compose pull && docker compose up -d`).
* Vérifier les logs (journald, Docker) pour des anomalies.
* Nettoyage des vieux conteneurs/images (`docker system prune -f`).
##### Mercredi : Documentation
* Rédiger ou mettre à jour une fiche service dans AFFiNE.
* Ajouter des captures d’écran ou des notes pour les procédures.
* Mettre à jour le schéma draw.io si des changements ont eu lieu.
##### Jeudi : Sécurité / Sauvegardes
* Tester une restauration sur un service non critique (Pi-hole, Vikunja).
* Vérifier lintégrité des sauvegardes Borg (`borg check`).
* Mettre à jour les mots de passe ou les clés si nécessaire.
##### Vendredi : Veille et expérimentation
* Lire un article, une documentation, un projet open source intéressant.
* Tester un nouveau service dans un conteneur temporaire.
* Préparer le week-end (aucune tâche lourde).
##### Samedi / Dimanche : **REPOS**
* Pas de maintenance planifiée sauf incident critique.
* Possibilité de jouer, dessiner, chanter, ou simplement ne rien faire.
#### Rythme mensuel
* **Premier week-end du mois** : Grosse mise à jour (OS, noyau, sécurité).
* Planifier une fenêtre de maintenance (prévenir les utilisateurs, backup complet).
* Appliquer les mises à jour système (`apt update && apt upgrade`).
* Redémarrer les machines une par une (en vérifiant que tout remonte).
* **Deuxième semaine** : Audit des sauvegardes.
* Vérifier lespace disque sur Yakimo et les backups externes.
* Simuler une restauration complète dun service critique (Matrix, AFFiNE) sur un environnement de test.
* **Troisième semaine** : Revue de projet.
* Avancement du plan de carrière / formation.
* Réévaluer les priorités du homelab (doisje ajouter un service ? en supprimer un ?).
* **Dernière semaine** : Mise à jour de la documentation exhaustive.
* Relire et corriger la doc AFFiNE.
* Synchroniser les notes avec le schéma draw.io.
### mails
* j'ai une adresse e-mail pro crenam.space et des alias pour différents services (perso, commandes ...) hébergées chez mailbox.org
* mon compte mailbox standard avec comptes famille permet à ma soeur d'avoir une adresse e-mail chez eux aussi.
* l'objectif serait que ma famille puisse basculer chez mailbox avec moi.
### services self-hosted
| Service | Machine | Mode | Port | SSO ? | Exposé via reverse proxy ? |
| ---------------------- | ------------ | --------------------------------------------- | ------------------------------------------ | ------------------------------- | -------------------------- |
| **AFFiNE** | Cortex | Docker | 3010 | Oui (pas encore configuré) | Oui |
| **Firefly III** | Gaufre | Docker | 8800, 8801 | Oui si possible | Oui |
| **AliasVault** | Salon | Docker | 8008, 8443, 25, 587 | Non | Oui |
| **Gitea** | Salon | Docker | 3000 | Oui (à retester) | Non (VPN) |
| **Authelia** | Cortex | Docker | 9091 | Non | Oui |
| **Beszel ** | Salon | Docker | 8090 | Oui (pas encore configuré) | Non (VPN) |
| **Homarr** | Salon | Docker | 7575 | Oui (pas encore configuré) | Oui |
| **Borgbackup** | Yakimo | Natif | - | Non | Non |
| **Immich** | Gaufre | Docker | 2283 | Oui (pas encore configuré) | Oui |
| **jellyfin** | Salon/Gaufre | Docker | 8096, 7359 | Oui (pas encore configuré)
 | Oui |
| **Matrix** | Cortex | **Cluster k8s** (seule app restante dans k3s) | 80, 443, 30001, 30002 (valeurs par défaut) | Non | Oui |
| **Mealie** | Gaufre | Docker | 9925 | Oui (pas encore configuré) | Oui |
| **n8n** | Gaufre | Docker | 5678 | Non, VPN | Non (VPN) |
| **ntfy** | Salon | Docker | 810 | Non, VPN | Oui (https obligatoire) |
| **Open Web UI** | Cortex | Docker | 3000 | Oui (pas encore configuré) | Oui |
| **Paperless-ngx** | Salon | Docker | 8101 | X (prend authelia seamlessly) | Oui |
| **PostgreSQL partagé** | Cortex | Docker | 5432 | Non | Non |
| **Pi-hole principal** | Salon | Docker | 80 | Non (VPN) | Non |
| **Pi-hole secondaire** | Yakimo | X Pas encore installé | 80 | X (pas encore décidé) | Non |
| **Radicale** | Yakimo | Natif | 5232 | Non (revérifier) | Non |
| **Seafile** | Gaufre | Docker | 80, 8000, 8082 | Oui (pas encore configuré) | Non |
| **uptime kuma** | Salon | Docker | 3001 | Non (VPN) | Non |
| **Vikunja** | Gaufre | Docker | 3456 | Oui (pas encore configuré) | Oui |
### outils utilisés
*  j'utilise AFFiNE au quotidien pour organiser mes tâches et prendre des notes sur mes différentes activités
* thunderbird pour mes mails, mes évènements et tâches (caldav)
* vikunja pour la gestion des tâches (besoin d'apprendre encore à l'utiliser rapidement)
* PyCharm pour les projets dev, Zed pour le code ou script léger ou rapide à modifier
* cinny comme client matrix desktop, commet sur android
* j'ai mis en place un bridge discord
* j'utilise discord en transition, le temps que mes proches acceptent d'utiliser matrix
* j'aimerais repasser de cinny/commet à element sur pc et android car leur dernière update a rendu l'app beaucoup plus accessible. Mais, il me faudrait encore voir les histoires d'emotes/stickers customs.
* f-droid à la place de playstore (quand je peux). Google a annoncé verrouiller le système android (installation d'apk custom interdite) et lutter contre les alternatives comme f-droid dans 3-4 mois. Il faudra réfléchir à ce problème ultérieurement
## projets en cours
* mettre en place un bridge whatsapp
* finir la première version du homelab.
* configurer authelia pour tous les services qui le supportent ou qui sont utiles à mes proches
* écrire toute la documentation du projet (guide d'utilisation, procédure, configurations ...)
* connecter tous les services qui ont des intégrations entre eux
* réfléchir à des workflow n8n
* réfléchir à des webhook
* créer un bot matrix (ai, ntfy, webhook ...)
* créer un dashboard homarr pour chaque type d'utilisateur
* formation IA (prompt engineering) : je suis la formation [AI Fundamentals](https://app.datacamp.com/learn/skill-tracks/ai-fundamentals) et j'en suis au 3e cours sur 6 appelé "Understand Machine Learning".
* j'ai suivi un guide qui m'a permis de mettre en mot un projet professionnel à la fois précis et à la fois vague. Il s'exprime ainsi : "Ma mission de vie est d'avoir un grand espace où je pourrais monter un petit business numérique à destination des associations, tpe et pme pour réaliser des projets numériques et de l'éducation populaire numérique à l'aide de ma sensibilité et mon empathie.".
Pour me coordonner avec mon conjoint, je pense avoir besoin de plusieurs mois de préparation, jusqu'en mai 2027. Les formations et certifications pourront être rentable pour la suite.
+574
View File
@@ -0,0 +1,574 @@
name: homelab
domain: crenam.space
home_url: https://dashboard.crenam.space
regions:
- id: rooster_palace
en: rooster_palace
vn: điện kê
kre: palè kòk
fr: palais coq
region_type: sovereign
- id: ambassadors_garden
en: ambassadors' garden
vn: vườn nam
kre: jadin anbasadè
fr: jardin des ambassadeurs
region_type: diplomatic
- id: family_village
en: family village
vn: xã làng
kre: vilaj fanmi
fr: village familial
region_type: family
- id: central_terminal
en: central terminal
region_type: tech
vn: phòng kỹ thuật
kre: sal ekipman
fr: le centre technique
- id: playroom
en: playroom
kre: sal jé
fr: la salle de jeux
vn: phòng vui chơi
region_type: leisure
- id: library
region_type: knowledge
en: library
kre: biblyotèk pèp
fr: bibliothèque
vn: thư viện
- id: great-hall
region_type: lobby
kre: gwo sal
vn: sảnh lớn
fr: grand hall
en: great hall
machines:
- id: cortex
name: cortex
ip: 192.168.27.69
public_ip: 51.210.13.240
provider: ovh
role: cerveau
domains:
- internal: cortex.home
- external: crenam.space
- id: galerie
name: galerie
ip: 192.168.27.67
public_ip: 37.187.32.116
role: vitrine
domains:
- internal: galerie.home
- id: salon
name: salon
ip: 192.168.1.15
role: foyer
domains:
- internal: salon.home
- id: gaufre
name: gaufre
ip: 192.168.1.30
role: garde-manger
domains:
- internal: gaufre.home
- id: yakimo
name: yakimo
ip: 192.168.1.20
role: coffre-fort
domains:
- internal: yakimo.home
services:
- id: affine
name: AFFiNE
machine_id: cortex
installation_mode: docker
auth: oidc
ports:
- 3010
public_url: https://affine.crenam.space
internal_url: http://cortex.home:3010
status: active
categories:
- productivity
service_group: productivity
dependencies:
- postgresql-shared
allowed_groups:
- nuji
- family
- friend
- admin
- id: authelia
name: Authelia
machine_id: cortex
installation_mode: docker
ports:
- 9091
public_url: https://auth.crenam.space
internal_url: http://cortex.home:9091
status: inactive
categories:
- auth
allowed_groups:
- nuji
- family
- friend
- admin
- id: aliasvault
name: Alias Vault
machine_id: salon
installation_mode: docker
auth: internal
ports:
- 8008
- 8443
- 25
- 587
public_url: https://aliasvault.crenam.space
internal_url: http://salon.home:8008
status: active
categories:
- auth
service_group: mandatory
allowed_groups:
- nuji
- family
- friend
- admin
- id: beszel
name: beszel
machine_id: gaufre
auth: vpn
ports:
- 8090
internal_url: http://gaufre.home:8090
installation_mode: docker
status: active
categories:
- monitoring
allowed_groups:
- admin
- id: borgbackup
name: Borg Backup
machine_id: yakimo
auth: none
installation_mode: native
status: active
categories:
- backup
allowed_groups:
- admin
- id: firefly
name: firefly iii
machine_id: gaufre
installation_mode: docker
auth: vpn
ports:
- 8800
- 8801
internal_url: http://gaufre.home:8800
status: active
categories:
- finance
service_group: bonus
allowed_groups:
- nuji
- admin
- id: gitea
name: gitea
machine_id: salon
installation_mode: docker
auth: vpn
ports:
- 3000
public_url: https://git.crenam.space
internal_url: http://salon.home:3000
status: active
categories:
- dev
service_group: bonus
allowed_groups:
- nuji
- admin
- id: homarr
name: homarr
machine_id: salon
auth: oidc
installation_mode: docker
ports:
- 7575
public_url: https://dashboard.crenam.space
internal_url: http://salon.home:7575
status: active
categories:
- monitoring
service_group: mandatory
allowed_groups:
- nuji
- family
- friend
- admin
- guest
- id: immich
name: immich
machine_id: gaufre
installation_mode: docker
auth: oidc
ports:
- 2283
internal_url: http://gaufre.home:2283
status: active
categories:
- media
service_group: de-googling
allowed_groups:
- nuji
- family
- friend
- admin
- id: jellyfin
name: jellyfin
machine_id: gaufre
installation_mode: docker
auth: oidc
ports:
- 8096
- 7359
internal_url: http://gaufre.home:8096
status: active
categories:
- media
service_group: "de-googling"
allowed_groups:
- nuji
- family
- friend
- admin
- id: maurane
name: maurane's website
machine_id: galerie
installation_mode: native
ports:
- 8000
internal_url: http://galerie.home:8000
public_url: https://maurane.crenam.space
status: active
categories:
- media
- experimental
allowed_groups:
- guest
- nuji
- family
- friend
- id: matrix
name: element server suite
machine_id: cortex
installation_mode: docker
auth: internal
ports:
- 80
- 443
- 30001
- 30002
internal_url: http://cortex.home:30001
public_url: https://matrix.element.crenam.space
status: active
categories:
- communication
service_group: de-googling
allowed_groups:
- nuji
- family
- friend
- admin
- id: mealie
name: mealie
machine_id: gaufre
installation_mode: docker
auth: oidc
ports:
- 9925
internal_url: http://gaufre.home:9925
public_url: https://mealie.crenam.space
status: active
categories:
- storage
- productivity
service_group: bonus
allowed_groups:
- nuji
- family
- friend
- admin
- id: n8n
name: n8n
machine_id: gaufre
installation_mode: docker
auth: vpn
ports:
- 5678
internal_url: http://gaufre.home:5678
status: active
categories:
- productivity
- automation
allowed_groups:
- nuji
- admin
- id: ntfy
name: ntfy
machine_id: salon
installation_mode: docker
auth: vpn
ports:
- 810
internal_url: http://salon.home:810
status: active
categories:
- automation
allowed_groups:
- admin
- id: openwebui
name: open web ui
auth: vpn # (oidc ?)
machine_id: cortex
installation_mode: docker
ports:
- 3000
internal_url: http://cortex.home:3000
public_url: https://llm.crenam.space
status: active
categories:
- ai
- productivity
service_group: bonus
allowed_groups:
- nuji
- admin
- id: paperless
name: paperless-ngx
machine_id: salon
installation_mode: docker
auth: trusted headers
ports:
- 8101
internal_url: http://salon.home:8101
public_url: https://paperless.crenam.space
status: active
categories:
- storage
- productivity
service_group: bonus
allowed_groups:
- nuji
- admin
- id: patience
name: patience
machine_id: galerie
installation_mode: native
ports:
- 8001
internal_url: http://galerie.home:8001
public_url: https://patience.crenam.space
status: active
categories:
- media
- experimental
- productivity
allowed_groups:
- guest
- nuji
- family
- friend
- id: postgres-shared
name: PostgreSQL
machine_id: cortex
installation_mode: docker
auth: internal
ports:
- 5432
internal_url: postgres://cortex.home:5432
status: active
categories:
- database
allowed_groups:
- admin
- id: pihole_main
name: pi-hole main
machine_id: salon
installation_mode: docker
auth: vpn
ports:
- 80
internal_url: http://salon.home
status: active
categories:
- network
- monitoring
allowed_groups:
- admin
- id: pihole_secondary
name: pi-hole secondary
machine_id: yakimo
installation_mode: native
auth: vpn
ports:
- 80
internal_url: http://yakimo.home
status: planned
categories:
- network
- monitoring
allowed_groups:
- admin
- id: radicale
name: radicale
machine_id: yakimo
installation_mode: native
auth: internal # how to sso + sharing collections ?
ports:
- 5232
internal_url: http://yakimo.home:5232
public_url: https://radicale.crenam.space
status: active
categories:
- caldav
- productivity
service_group: de-googling
allowed_groups:
- admin
- nuji
- family
- friend
- id: seafile
name: seafile
machine_id: gaufre
installation_mode: docker
auth: trusted headers
ports:
- 80
- 8000
- 8082
internal_url: http://gaufre.home:80
status: active
categories:
- storage
- media
service_group: de-googling
allowed_groups:
- admin
- nuji
- friend
- family
- id: uptime_kuma
name: uptime kuma
machine_id: salon
installation_mode: docker
auth: vpn
ports:
- 5232
internal_url: http://salon.home:5232
status: active
categories:
- monitoring
allowed_groups:
- admin
- id: vikunja
name: vikunja
machine_id: gaufre
installation_mode: docker
auth: oidc
ports:
- 3456
internal_url: http://gaufre.home:3456
public_url: https://task.crenam.space
status: active
categories:
- productivity
service_group: productivity
allowed_groups:
- admin
- nuji
- family
- friend
groups:
- id: admin
name: renn
group_description: Moi
region: central_terminal
- id: nuji
name: nuji
group_description: couple fondateur
region: rooster_palace
- id: family
name: làng fanmi
group_description: famille proche
region: family_village
- id: friend
name: zanmi
group_description: amis de nuji
region: ambassadors_garden
- id: guest
name: vakansyé
group_description: invités (accès limité)
region: great-hall
users:
- id: maurane
name: maurane
nickname: nuna
email: maurane.glaude@crenam.space
groups:
- admin
- id: adrien
name: adrien
nickname: adri
email: adrien.ton@crenam.space
groups:
- nuji