FC
This commit is contained in:
parent
28dac0c412
commit
47aa1a3484
71 changed files with 3317 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
.env
|
||||||
213
containers/Bastille/Bastille.md
Normal file
213
containers/Bastille/Bastille.md
Normal file
|
|
@ -0,0 +1,213 @@
|
||||||
|
# Bastille
|
||||||
|
|
||||||
|
This is my guide for getting Bastille BSD up-and-running.
|
||||||
|
|
||||||
|
First make sure that FreeBSD is up-to-date:
|
||||||
|
|
||||||
|
*NOTE* This takes a *long* time on a Raspberry PI. Only do this if you have a lot of time on your hands!
|
||||||
|
|
||||||
|
You may be smart to `tmux` first.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
tmux
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
freebsd-update fetch install
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
reboot
|
||||||
|
```
|
||||||
|
|
||||||
|
After reboot, check again:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
freebsd-update install
|
||||||
|
```
|
||||||
|
|
||||||
|
Verify your version:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
freebsd-version
|
||||||
|
```
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
First we need to make a backup of `pf.conf`, if you already setup pf before, otherwise you can skip this step.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
mv /etc/pf.conf /etc/pf.conf.backup
|
||||||
|
```
|
||||||
|
|
||||||
|
And then
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bastille setup
|
||||||
|
```
|
||||||
|
|
||||||
|
This will setup the loopback interface and create a `/etc/pf.conf`.
|
||||||
|
|
||||||
|
You need to manually add the following to `/etc/pf.conf`, at the bottom, in order to allow http, https and RDP:
|
||||||
|
|
||||||
|
```
|
||||||
|
pass in inet proto tcp from any to any port { 80, 443, 3389 } flags S/SA keep state
|
||||||
|
```
|
||||||
|
|
||||||
|
Then start it:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
service pf start
|
||||||
|
```
|
||||||
|
|
||||||
|
The `bastille setup` will try to configure the wrong config file and complain. We need to fix the zfs stuff manually.
|
||||||
|
|
||||||
|
And change, assuming you created a zpool named `data`.
|
||||||
|
|
||||||
|
For example (WATCH OUT, BELOW COMMAND IS DANGEROUS):
|
||||||
|
|
||||||
|
```sh
|
||||||
|
zpool create -f data /dev/ada0
|
||||||
|
```
|
||||||
|
|
||||||
|
Change bastille.conf
|
||||||
|
|
||||||
|
```sh
|
||||||
|
nvim /usr/local/etc/bastille/bastille.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
bastille_zfs_enable="YES"
|
||||||
|
bastille_zfs_zpool="data"
|
||||||
|
```
|
||||||
|
|
||||||
|
And just in case, run the setup again:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bastille setup zfs
|
||||||
|
```
|
||||||
|
|
||||||
|
## Start
|
||||||
|
|
||||||
|
Ok, now start Bastille:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
service bastille restart
|
||||||
|
```
|
||||||
|
|
||||||
|
Bootstrap:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bastille bootstrap 14.2-RELEASE update
|
||||||
|
```
|
||||||
|
|
||||||
|
## Create a container
|
||||||
|
|
||||||
|
Figure out your network card:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
ifconfig
|
||||||
|
```
|
||||||
|
|
||||||
|
You don't want the loopback but your real card that connects to the internet. The KVM virtual machine has `vtnet0` and the Raspberry PI has `genet0`, the Lenovo Thinkcentre has `em0`.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Lenovo Thinkcentre
|
||||||
|
bastille create alcatraz 14.2-RELEASE 192.168.1.201 em0
|
||||||
|
```
|
||||||
|
|
||||||
|
If you want to have exlusive packages in the jail and not share the host packages, do this:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bastille pkg alcatraz bootstrap
|
||||||
|
bastille pkg alcatraz update
|
||||||
|
```
|
||||||
|
|
||||||
|
Alternatively, you can mount the package cache:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Optional
|
||||||
|
bastille mount alcatraz /var/cache/pkg/ /var/cache/pkg/ nullfs rw 0 0
|
||||||
|
```
|
||||||
|
|
||||||
|
I like to install my favorites since I use them quite often:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bastille pkg alcatraz install -y tmux git neovim
|
||||||
|
```
|
||||||
|
|
||||||
|
Test it:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bastille pkg alcatraz install -y apache24
|
||||||
|
bastille sysrc alcatraz apache24_enable=YES
|
||||||
|
bastille service alcatraz apache24 start
|
||||||
|
```
|
||||||
|
|
||||||
|
Now go to the ip address with your browser on another machine:
|
||||||
|
|
||||||
|
http://192.168.1.201/
|
||||||
|
|
||||||
|
You should see "It works!"
|
||||||
|
|
||||||
|
Alternatively:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
curl http://192.168.1.201/
|
||||||
|
```
|
||||||
|
|
||||||
|
You should see:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<html><body><h1>It works!</h1></body></html>
|
||||||
|
```
|
||||||
|
|
||||||
|
Now destroy it:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bastille stop alcatraz
|
||||||
|
bastille destroy force alcatraz
|
||||||
|
```
|
||||||
|
|
||||||
|
# Using ports
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bastille create alcatraz 14.2-RELEASE 192.168.1.201 em0
|
||||||
|
bastille pkg alcatraz bootstrap
|
||||||
|
bastille pkg alcatraz update
|
||||||
|
bastille pkg alcatraz install -y git
|
||||||
|
bastille cmd alcatraz git clone --depth 1 https://git.FreeBSD.org/ports.git /usr/ports
|
||||||
|
```
|
||||||
|
|
||||||
|
and then go in the console:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bastille console alcatraz
|
||||||
|
```
|
||||||
|
|
||||||
|
within the console...
|
||||||
|
|
||||||
|
```sh
|
||||||
|
export BATCH=yes
|
||||||
|
cd /usr/ports/www/apache24/ && make install clean
|
||||||
|
exit
|
||||||
|
```
|
||||||
|
|
||||||
|
enable and start it ...
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bastille sysrc alcatraz apache24_enable=YES
|
||||||
|
bastille service alcatraz apache24 start
|
||||||
|
```
|
||||||
|
|
||||||
|
Test it:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
curl http://192.168.1.201/
|
||||||
|
```
|
||||||
|
|
||||||
|
Destroy it:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bastille destroy force alcatraz
|
||||||
|
```
|
||||||
42
containers/Bastille/Caddy.md
Normal file
42
containers/Bastille/Caddy.md
Normal file
|
|
@ -0,0 +1,42 @@
|
||||||
|
# Caddy
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bastille create caddy 14.2-RELEASE 192.168.1.200 genet0
|
||||||
|
bastille pkg caddy bootstrap
|
||||||
|
bastille pkg caddy update
|
||||||
|
bastille pkg caddy install -y caddy
|
||||||
|
```
|
||||||
|
|
||||||
|
After installing Caddy you see some instructions. To reshow them:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bastille pkg caddy info -D caddy
|
||||||
|
```
|
||||||
|
|
||||||
|
Edit the Caddyfile:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bastille pkg caddy install -y tmux neovim
|
||||||
|
bastille console caddy
|
||||||
|
tmux
|
||||||
|
nvim /usr/local/etc/caddy/Caddyfile
|
||||||
|
```
|
||||||
|
|
||||||
|
Start the service.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bastille service caddy caddy enable
|
||||||
|
bastille service caddy caddy start
|
||||||
|
```
|
||||||
|
|
||||||
|
See the logs:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bastille cmd caddy cat /var/log/caddy/caddy.log
|
||||||
|
```
|
||||||
|
|
||||||
|
To quickly look at the caddyfile:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bastille cmd caddy cat /usr/local/etc/caddy/Caddyfile
|
||||||
|
```
|
||||||
31
containers/Bastille/MariaDB.md
Normal file
31
containers/Bastille/MariaDB.md
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
# MariaDB
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bastille pkg alcatraz install -y mariadb114-server mariadb114-client
|
||||||
|
```
|
||||||
|
|
||||||
|
Repeat the message:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bastille pkg alcatraz info -D mariadb114-server
|
||||||
|
```
|
||||||
|
|
||||||
|
Enable and start
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bastille sysrc alcatraz mysql_enable=YES
|
||||||
|
bastille service alcatraz mysql-server start
|
||||||
|
```
|
||||||
|
|
||||||
|
Create nextcloud database and user
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bastille cmd alcatraz mysql
|
||||||
|
```
|
||||||
|
|
||||||
|
```sql
|
||||||
|
CREATE DATABASE nextcloud;
|
||||||
|
CREATE USER 'nextcloud'@'192.168.1.201' IDENTIFIED BY '1234sys!';
|
||||||
|
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'192.168.1.201';
|
||||||
|
FLUSH PRIVILEGES;
|
||||||
|
```
|
||||||
73
containers/Bastille/Nextcloud/Nextcloud.md
Normal file
73
containers/Bastille/Nextcloud/Nextcloud.md
Normal file
|
|
@ -0,0 +1,73 @@
|
||||||
|
# Nextcloud
|
||||||
|
|
||||||
|
My standard setup:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bastille create alcatraz 14.2-RELEASE 192.168.1.201 em0
|
||||||
|
bastille mount alcatraz /var/cache/pkg/ /var/cache/pkg/ nullfs rw 0 0
|
||||||
|
bastille pkg alcatraz install -y tmux git neovim sudo
|
||||||
|
```
|
||||||
|
|
||||||
|
## Trying it my way
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bastille pkg alcatraz install -y php83 nextcloud-php83 php83-pecl-APCu php83-extensions sd nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
Repeat the message:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bastille pkg alcatraz info -D www/nextcloud
|
||||||
|
```
|
||||||
|
|
||||||
|
Additional:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bastille cmd alcatraz cp /usr/local/etc/php.ini-production /usr/local/etc/php.ini
|
||||||
|
bastille cmd alcatraz sd 'memory_limit = 128M' 'memory_limit = -1' /usr/local/etc/php.ini
|
||||||
|
```
|
||||||
|
|
||||||
|
We need to go in and out of the console for this one:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bastille console alcatraz
|
||||||
|
echo 'apc.enable_cli = 1' >> /usr/local/etc/php.ini
|
||||||
|
exit
|
||||||
|
```
|
||||||
|
|
||||||
|
Follow the instructions for [MariaDB](../MariaDB.md).
|
||||||
|
|
||||||
|
Now run the installer
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bastille cmd alcatraz sudo -u www php /usr/local/www/nextcloud/occ maintenance:install \
|
||||||
|
--database='mysql' --database-host='127.0.0.1' --database-name='nextcloud' \
|
||||||
|
--database-user='nextcloud' --database-pass='1234sys!' \
|
||||||
|
--admin-user='admin' --admin-pass='1234sys!'
|
||||||
|
```
|
||||||
|
|
||||||
|
You should see:
|
||||||
|
|
||||||
|
```
|
||||||
|
[alcatraz]:
|
||||||
|
Nextcloud was successfully installed
|
||||||
|
[alcatraz]: 0
|
||||||
|
```
|
||||||
|
|
||||||
|
Edit nginx.conf for nextcloud.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bastille cmd alcatraz nvim /usr/local/etc/nginx/nginx.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
Use [this file](./nginx.conf).
|
||||||
|
|
||||||
|
It's based on: https://docs.nextcloud.com/server/stable/admin_manual/installation/nginx.html#nextcloud-in-the-webroot-of-nginx
|
||||||
|
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bastille service alcatraz php_fpm enable
|
||||||
|
bastille service alcatraz php_fpm start
|
||||||
|
bastille service alcatraz nginx enable
|
||||||
|
bastille service alcatraz nginx start
|
||||||
|
```
|
||||||
265
containers/Bastille/Nextcloud/nginx.conf
Normal file
265
containers/Bastille/Nextcloud/nginx.conf
Normal file
|
|
@ -0,0 +1,265 @@
|
||||||
|
#user nobody;
|
||||||
|
worker_processes 1;
|
||||||
|
|
||||||
|
# This default error log path is compiled-in to make sure configuration parsing
|
||||||
|
# errors are logged somewhere, especially during unattended boot when stderr
|
||||||
|
# isn't normally logged anywhere. This path will be touched on every nginx
|
||||||
|
# start regardless of error log location configured here. See
|
||||||
|
# https://trac.nginx.org/nginx/ticket/147 for more info.
|
||||||
|
#
|
||||||
|
#error_log /var/log/nginx/error.log;
|
||||||
|
#
|
||||||
|
|
||||||
|
#pid logs/nginx.pid;
|
||||||
|
|
||||||
|
events {
|
||||||
|
worker_connections 1024;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
http {
|
||||||
|
include mime.types;
|
||||||
|
default_type application/octet-stream;
|
||||||
|
|
||||||
|
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
|
||||||
|
# '$status $body_bytes_sent "$http_referer" '
|
||||||
|
# '"$http_user_agent" "$http_x_forwarded_for"';
|
||||||
|
|
||||||
|
#access_log logs/access.log main;
|
||||||
|
|
||||||
|
sendfile on;
|
||||||
|
#tcp_nopush on;
|
||||||
|
|
||||||
|
#keepalive_timeout 0;
|
||||||
|
keepalive_timeout 65;
|
||||||
|
|
||||||
|
#gzip on;
|
||||||
|
|
||||||
|
upstream php-handler {
|
||||||
|
server 127.0.0.1:9000;
|
||||||
|
#server unix:/var/run/php/php7.4-fpm.sock;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Set the `immutable` cache control options only for assets with a cache busting `v` argument
|
||||||
|
map $arg_v $asset_immutable {
|
||||||
|
"" "";
|
||||||
|
default ", immutable";
|
||||||
|
}
|
||||||
|
|
||||||
|
# server {
|
||||||
|
# listen 80;
|
||||||
|
# listen [::]:80;
|
||||||
|
# server_name cloud.example.com;
|
||||||
|
# # enforce https
|
||||||
|
# return 301 https://$server_name:443$request_uri;
|
||||||
|
# }
|
||||||
|
|
||||||
|
server {
|
||||||
|
#listen 80;
|
||||||
|
#listen [::]:80;
|
||||||
|
server_name 192.168.1.201;
|
||||||
|
|
||||||
|
# Path to the root of your installation
|
||||||
|
root /usr/local/www/nextcloud;
|
||||||
|
|
||||||
|
# Use Mozilla's guidelines for SSL/TLS settings
|
||||||
|
# https://mozilla.github.io/server-side-tls/ssl-config-generator/
|
||||||
|
#ssl_certificate /etc/ssl/nginx/cloud.example.com.crt;
|
||||||
|
#ssl_certificate_key /etc/ssl/nginx/cloud.example.com.key;
|
||||||
|
|
||||||
|
# Prevent nginx HTTP Server Detection
|
||||||
|
server_tokens off;
|
||||||
|
|
||||||
|
# HSTS settings
|
||||||
|
# WARNING: Only add the preload option once you read about
|
||||||
|
# the consequences in https://hstspreload.org/. This option
|
||||||
|
# will add the domain to a hardcoded list that is shipped
|
||||||
|
# in all major browsers and getting removed from this list
|
||||||
|
# could take several months.
|
||||||
|
#add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload" always;
|
||||||
|
|
||||||
|
# set max upload size and increase upload timeout:
|
||||||
|
client_max_body_size 512M;
|
||||||
|
client_body_timeout 300s;
|
||||||
|
fastcgi_buffers 64 4K;
|
||||||
|
|
||||||
|
# Enable gzip but do not remove ETag headers
|
||||||
|
gzip on;
|
||||||
|
gzip_vary on;
|
||||||
|
gzip_comp_level 4;
|
||||||
|
gzip_min_length 256;
|
||||||
|
gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
|
||||||
|
gzip_types application/atom+xml text/javascript application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/wasm application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
|
||||||
|
|
||||||
|
# Pagespeed is not supported by Nextcloud, so if your server is built
|
||||||
|
# with the `ngx_pagespeed` module, uncomment this line to disable it.
|
||||||
|
#pagespeed off;
|
||||||
|
|
||||||
|
# The settings allows you to optimize the HTTP2 bandwidth.
|
||||||
|
# See https://blog.cloudflare.com/delivering-http-2-upload-speed-improvements/
|
||||||
|
# for tuning hints
|
||||||
|
client_body_buffer_size 512k;
|
||||||
|
|
||||||
|
# HTTP response headers borrowed from Nextcloud `.htaccess`
|
||||||
|
add_header Referrer-Policy "no-referrer" always;
|
||||||
|
add_header X-Content-Type-Options "nosniff" always;
|
||||||
|
add_header X-Frame-Options "SAMEORIGIN" always;
|
||||||
|
add_header X-Permitted-Cross-Domain-Policies "none" always;
|
||||||
|
add_header X-Robots-Tag "noindex, nofollow" always;
|
||||||
|
add_header X-XSS-Protection "1; mode=block" always;
|
||||||
|
|
||||||
|
# Remove X-Powered-By, which is an information leak
|
||||||
|
fastcgi_hide_header X-Powered-By;
|
||||||
|
|
||||||
|
# Set .mjs and .wasm MIME types
|
||||||
|
# Either include it in the default mime.types list
|
||||||
|
# and include that list explicitly or add the file extension
|
||||||
|
# only for Nextcloud like below:
|
||||||
|
include mime.types;
|
||||||
|
types {
|
||||||
|
text/javascript mjs;
|
||||||
|
application/wasm wasm;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Specify how to handle directories -- specifying `/index.php$request_uri`
|
||||||
|
# here as the fallback means that Nginx always exhibits the desired behaviour
|
||||||
|
# when a client requests a path that corresponds to a directory that exists
|
||||||
|
# on the server. In particular, if that directory contains an index.php file,
|
||||||
|
# that file is correctly served; if it doesn't, then the request is passed to
|
||||||
|
# the front-end controller. This consistent behaviour means that we don't need
|
||||||
|
# to specify custom rules for certain paths (e.g. images and other assets,
|
||||||
|
# `/updater`, `/ocs-provider`), and thus
|
||||||
|
# `try_files $uri $uri/ /index.php$request_uri`
|
||||||
|
# always provides the desired behaviour.
|
||||||
|
index index.php index.html /index.php$request_uri;
|
||||||
|
|
||||||
|
# Rule borrowed from `.htaccess` to handle Microsoft DAV clients
|
||||||
|
location = / {
|
||||||
|
if ( $http_user_agent ~ ^DavClnt ) {
|
||||||
|
return 302 /remote.php/webdav/$is_args$args;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
location = /robots.txt {
|
||||||
|
allow all;
|
||||||
|
log_not_found off;
|
||||||
|
access_log off;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Make a regex exception for `/.well-known` so that clients can still
|
||||||
|
# access it despite the existence of the regex rule
|
||||||
|
# `location ~ /(\.|autotest|...)` which would otherwise handle requests
|
||||||
|
# for `/.well-known`.
|
||||||
|
location ^~ /.well-known {
|
||||||
|
# The rules in this block are an adaptation of the rules
|
||||||
|
# in `.htaccess` that concern `/.well-known`.
|
||||||
|
|
||||||
|
location = /.well-known/carddav { return 301 /remote.php/dav/; }
|
||||||
|
location = /.well-known/caldav { return 301 /remote.php/dav/; }
|
||||||
|
|
||||||
|
location /.well-known/acme-challenge { try_files $uri $uri/ =404; }
|
||||||
|
location /.well-known/pki-validation { try_files $uri $uri/ =404; }
|
||||||
|
|
||||||
|
# Let Nextcloud's API for `/.well-known` URIs handle all other
|
||||||
|
# requests by passing them to the front-end controller.
|
||||||
|
return 301 /index.php$request_uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Rules borrowed from `.htaccess` to hide certain paths from clients
|
||||||
|
location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/) { return 404; }
|
||||||
|
location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) { return 404; }
|
||||||
|
|
||||||
|
# Ensure this block, which passes PHP files to the PHP process, is above the blocks
|
||||||
|
# which handle static assets (as seen below). If this block is not declared first,
|
||||||
|
# then Nginx will encounter an infinite rewriting loop when it prepends `/index.php`
|
||||||
|
# to the URI, resulting in a HTTP 500 error response.
|
||||||
|
location ~ \.php(?:$|/) {
|
||||||
|
# Required for legacy support
|
||||||
|
rewrite ^/(?!index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|ocs-provider\/.+|.+\/richdocumentscode(_arm64)?\/proxy) /index.php$request_uri;
|
||||||
|
|
||||||
|
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
|
||||||
|
set $path_info $fastcgi_path_info;
|
||||||
|
|
||||||
|
try_files $fastcgi_script_name =404;
|
||||||
|
|
||||||
|
include fastcgi_params;
|
||||||
|
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||||
|
fastcgi_param PATH_INFO $path_info;
|
||||||
|
fastcgi_param HTTPS on;
|
||||||
|
|
||||||
|
fastcgi_param modHeadersAvailable true; # Avoid sending the security headers twice
|
||||||
|
fastcgi_param front_controller_active true; # Enable pretty urls
|
||||||
|
fastcgi_pass php-handler;
|
||||||
|
|
||||||
|
fastcgi_intercept_errors on;
|
||||||
|
fastcgi_request_buffering off;
|
||||||
|
|
||||||
|
fastcgi_max_temp_file_size 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Serve static files
|
||||||
|
location ~ \.(?:css|js|mjs|svg|gif|ico|jpg|png|webp|wasm|tflite|map|ogg|flac)$ {
|
||||||
|
try_files $uri /index.php$request_uri;
|
||||||
|
# HTTP response headers borrowed from Nextcloud `.htaccess`
|
||||||
|
add_header Cache-Control "public, max-age=15778463$asset_immutable";
|
||||||
|
add_header Referrer-Policy "no-referrer" always;
|
||||||
|
add_header X-Content-Type-Options "nosniff" always;
|
||||||
|
add_header X-Frame-Options "SAMEORIGIN" always;
|
||||||
|
add_header X-Permitted-Cross-Domain-Policies "none" always;
|
||||||
|
add_header X-Robots-Tag "noindex, nofollow" always;
|
||||||
|
add_header X-XSS-Protection "1; mode=block" always;
|
||||||
|
access_log off; # Optional: Don't log access to assets
|
||||||
|
}
|
||||||
|
|
||||||
|
location ~ \.(otf|woff2?)$ {
|
||||||
|
try_files $uri /index.php$request_uri;
|
||||||
|
expires 7d; # Cache-Control policy borrowed from `.htaccess`
|
||||||
|
access_log off; # Optional: Don't log access to assets
|
||||||
|
}
|
||||||
|
|
||||||
|
# Rule borrowed from `.htaccess`
|
||||||
|
location /remote {
|
||||||
|
return 301 /remote.php$request_uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ /index.php$request_uri;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# another virtual host using mix of IP-, name-, and port-based configuration
|
||||||
|
#
|
||||||
|
#server {
|
||||||
|
# listen 8000;
|
||||||
|
# listen somename:8080;
|
||||||
|
# server_name somename alias another.alias;
|
||||||
|
|
||||||
|
# location / {
|
||||||
|
# root html;
|
||||||
|
# index index.html index.htm;
|
||||||
|
# }
|
||||||
|
#}
|
||||||
|
|
||||||
|
|
||||||
|
# HTTPS server
|
||||||
|
#
|
||||||
|
#server {
|
||||||
|
# listen 443 ssl;
|
||||||
|
# server_name localhost;
|
||||||
|
|
||||||
|
# ssl_certificate cert.pem;
|
||||||
|
# ssl_certificate_key cert.key;
|
||||||
|
|
||||||
|
# ssl_session_cache shared:SSL:1m;
|
||||||
|
# ssl_session_timeout 5m;
|
||||||
|
|
||||||
|
# ssl_ciphers HIGH:!aNULL:!MD5;
|
||||||
|
# ssl_prefer_server_ciphers on;
|
||||||
|
|
||||||
|
# location / {
|
||||||
|
# root html;
|
||||||
|
# index index.html index.htm;
|
||||||
|
# }
|
||||||
|
#}
|
||||||
|
|
||||||
|
}
|
||||||
54
containers/Bastille/Postgres.md
Normal file
54
containers/Bastille/Postgres.md
Normal file
|
|
@ -0,0 +1,54 @@
|
||||||
|
# Postgres
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bastille create postgresql 14.2-RELEASE 192.168.1.203 em0
|
||||||
|
bastille config postgresql set allow.sysvipc=1
|
||||||
|
bastille restart postgresql
|
||||||
|
bastille pkg postgresql bootstrap
|
||||||
|
bastille pkg postgresql update
|
||||||
|
bastille pkg postgresql install -y postgresql15-server postgresql15-client
|
||||||
|
bastille service postgresql postgresql enable
|
||||||
|
bastille service postgresql postgresql initdb
|
||||||
|
bastille service postgresql postgresql start
|
||||||
|
```
|
||||||
|
|
||||||
|
You need to change `/var/db/postgres/data15/postgresql.conf`
|
||||||
|
|
||||||
|
```sh
|
||||||
|
nvim /var/db/postgres/data15/postgresql.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
To listen to the ip address:
|
||||||
|
|
||||||
|
```
|
||||||
|
listen_addresses = '192.168.1.203'
|
||||||
|
```
|
||||||
|
|
||||||
|
And restart.
|
||||||
|
|
||||||
|
We need to allow communications via the jails. Add this to pf.conf on the host:
|
||||||
|
|
||||||
|
```
|
||||||
|
pass in on $ext_if proto tcp from 192.168.1.202 to 192.168.1.203 port 5432
|
||||||
|
pass out on $ext_if proto tcp from 192.168.1.203 to 192.168.1.202 port 5432
|
||||||
|
```
|
||||||
|
|
||||||
|
Add a user, for example nextcloud:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
su - postgres
|
||||||
|
createuser nextcloud
|
||||||
|
createdb nextcloud -O admin
|
||||||
|
psql nextcloud
|
||||||
|
alter role nextcloud with encrypted password 'yourpassword';
|
||||||
|
grant all privileges on database nextcloud to nextcloud;
|
||||||
|
exit
|
||||||
|
exit
|
||||||
|
```
|
||||||
|
|
||||||
|
Add this to `/var/db/postgres/data15/pg_hba.conf`
|
||||||
|
|
||||||
|
```
|
||||||
|
host nextcloud nextcloud 0.0.0.0/0 scram-sha-256
|
||||||
|
host nextcloud nextcloud ::/0 scram-sha-256
|
||||||
|
```
|
||||||
10
containers/Bastille/nginx.md
Normal file
10
containers/Bastille/nginx.md
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
# nginx
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bastille create nginx 14.2-RELEASE 192.168.1.200 genet0
|
||||||
|
bastille pkg nginx bootstrap
|
||||||
|
bastille pkg nginx update
|
||||||
|
bastille pkg nginx install -y nginx
|
||||||
|
bastille service nginx nginx enable
|
||||||
|
bastille service nginx nginx start
|
||||||
|
```
|
||||||
13
containers/docker/audiobookshelf/compose.yaml
Normal file
13
containers/docker/audiobookshelf/compose.yaml
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
services:
|
||||||
|
audiobookshelf:
|
||||||
|
image: ghcr.io/advplyr/audiobookshelf:latest
|
||||||
|
# user: 1004:1004
|
||||||
|
ports:
|
||||||
|
- 13378:80
|
||||||
|
volumes:
|
||||||
|
- /home/audiobookshelf/audiobookshelf/audiobooks:/audiobooks
|
||||||
|
- /home/audiobookshelf/audiobookshelf/podcasts:/podcasts
|
||||||
|
- /home/audiobookshelf/audiobookshelf/config:/config
|
||||||
|
- /home/audiobookshelf/audiobookshelf/metadata:/metadata
|
||||||
|
environment:
|
||||||
|
- TZ=Europe/Amsterdam
|
||||||
9
containers/docker/httpd/compose.yaml
Normal file
9
containers/docker/httpd/compose.yaml
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
services:
|
||||||
|
|
||||||
|
httpd:
|
||||||
|
image: httpd
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- 8081:80
|
||||||
|
# volumes:
|
||||||
|
# - ./www:/usr/local/apache2/htdocs
|
||||||
8
containers/docker/httpd/www/index.html
Normal file
8
containers/docker/httpd/www/index.html
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Hello world!</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<p>Hello world!</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
84
containers/docker/immich/compose.yaml
Normal file
84
containers/docker/immich/compose.yaml
Normal file
|
|
@ -0,0 +1,84 @@
|
||||||
|
# You need to get the example .env file:
|
||||||
|
# wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env
|
||||||
|
|
||||||
|
name: immich
|
||||||
|
|
||||||
|
services:
|
||||||
|
immich-server:
|
||||||
|
container_name: immich_server
|
||||||
|
image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
|
||||||
|
extends:
|
||||||
|
file: hwaccel.transcoding.yml
|
||||||
|
service: quicksync # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
|
||||||
|
volumes:
|
||||||
|
# Do not edit the next line. If you want to change the media storage location on your system, edit the value of UPLOAD_LOCATION in the .env file
|
||||||
|
- ${UPLOAD_LOCATION}:/usr/src/app/upload
|
||||||
|
- /etc/localtime:/etc/localtime:ro
|
||||||
|
- /home/immich/external/:/external
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
ports:
|
||||||
|
- '2283:2283'
|
||||||
|
depends_on:
|
||||||
|
- redis
|
||||||
|
- database
|
||||||
|
restart: always
|
||||||
|
healthcheck:
|
||||||
|
disable: false
|
||||||
|
|
||||||
|
immich-machine-learning:
|
||||||
|
container_name: immich_machine_learning
|
||||||
|
# For hardware acceleration, add one of -[armnn, cuda, openvino] to the image tag.
|
||||||
|
# Example tag: ${IMMICH_VERSION:-release}-cuda
|
||||||
|
image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
|
||||||
|
# extends: # uncomment this section for hardware acceleration - see https://immich.app/docs/features/ml-hardware-acceleration
|
||||||
|
# file: hwaccel.ml.yml
|
||||||
|
# service: cpu # set to one of [armnn, cuda, openvino, openvino-wsl] for accelerated inference - use the `-wsl` version for WSL2 where applicable
|
||||||
|
volumes:
|
||||||
|
- model-cache:/cache
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
restart: always
|
||||||
|
healthcheck:
|
||||||
|
disable: false
|
||||||
|
|
||||||
|
redis:
|
||||||
|
container_name: immich_redis
|
||||||
|
image: docker.io/redis:6.2-alpine@sha256:eaba718fecd1196d88533de7ba49bf903ad33664a92debb24660a922ecd9cac8
|
||||||
|
healthcheck:
|
||||||
|
test: redis-cli ping || exit 1
|
||||||
|
restart: always
|
||||||
|
|
||||||
|
database:
|
||||||
|
container_name: immich_postgres
|
||||||
|
image: docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0
|
||||||
|
environment:
|
||||||
|
POSTGRES_PASSWORD: ${DB_PASSWORD}
|
||||||
|
POSTGRES_USER: ${DB_USERNAME}
|
||||||
|
POSTGRES_DB: ${DB_DATABASE_NAME}
|
||||||
|
POSTGRES_INITDB_ARGS: '--data-checksums'
|
||||||
|
volumes:
|
||||||
|
# Do not edit the next line. If you want to change the database storage location on your system, edit the value of DB_DATA_LOCATION in the .env file
|
||||||
|
- ${DB_DATA_LOCATION}:/var/lib/postgresql/data
|
||||||
|
healthcheck:
|
||||||
|
test: >-
|
||||||
|
pg_isready --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" || exit 1;
|
||||||
|
Chksum="$$(psql --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" --tuples-only --no-align
|
||||||
|
--command='SELECT COALESCE(SUM(checksum_failures), 0) FROM pg_stat_database')";
|
||||||
|
echo "checksum failure count is $$Chksum";
|
||||||
|
[ "$$Chksum" = '0' ] || exit 1
|
||||||
|
interval: 5m
|
||||||
|
start_interval: 30s
|
||||||
|
start_period: 5m
|
||||||
|
command: >-
|
||||||
|
postgres
|
||||||
|
-c shared_preload_libraries=vectors.so
|
||||||
|
-c 'search_path="$$user", public, vectors'
|
||||||
|
-c logging_collector=on
|
||||||
|
-c max_wal_size=2GB
|
||||||
|
-c shared_buffers=512MB
|
||||||
|
-c wal_compression=on
|
||||||
|
restart: always
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
model-cache:
|
||||||
54
containers/docker/immich/hwaccel.transcoding.yml
Normal file
54
containers/docker/immich/hwaccel.transcoding.yml
Normal file
|
|
@ -0,0 +1,54 @@
|
||||||
|
# Configurations for hardware-accelerated transcoding
|
||||||
|
|
||||||
|
# If using Unraid or another platform that doesn't allow multiple Compose files,
|
||||||
|
# you can inline the config for a backend by copying its contents
|
||||||
|
# into the immich-microservices service in the docker-compose.yml file.
|
||||||
|
|
||||||
|
# See https://immich.app/docs/features/hardware-transcoding for more info on using hardware transcoding.
|
||||||
|
|
||||||
|
services:
|
||||||
|
cpu: {}
|
||||||
|
|
||||||
|
nvenc:
|
||||||
|
deploy:
|
||||||
|
resources:
|
||||||
|
reservations:
|
||||||
|
devices:
|
||||||
|
- driver: nvidia
|
||||||
|
count: 1
|
||||||
|
capabilities:
|
||||||
|
- gpu
|
||||||
|
- compute
|
||||||
|
- video
|
||||||
|
|
||||||
|
quicksync:
|
||||||
|
devices:
|
||||||
|
- /dev/dri:/dev/dri
|
||||||
|
|
||||||
|
rkmpp:
|
||||||
|
security_opt: # enables full access to /sys and /proc, still far better than privileged: true
|
||||||
|
- systempaths=unconfined
|
||||||
|
- apparmor=unconfined
|
||||||
|
group_add:
|
||||||
|
- video
|
||||||
|
devices:
|
||||||
|
- /dev/rga:/dev/rga
|
||||||
|
- /dev/dri:/dev/dri
|
||||||
|
- /dev/dma_heap:/dev/dma_heap
|
||||||
|
- /dev/mpp_service:/dev/mpp_service
|
||||||
|
#- /dev/mali0:/dev/mali0 # only required to enable OpenCL-accelerated HDR -> SDR tonemapping
|
||||||
|
volumes:
|
||||||
|
#- /etc/OpenCL:/etc/OpenCL:ro # only required to enable OpenCL-accelerated HDR -> SDR tonemapping
|
||||||
|
#- /usr/lib/aarch64-linux-gnu/libmali.so.1:/usr/lib/aarch64-linux-gnu/libmali.so.1:ro # only required to enable OpenCL-accelerated HDR -> SDR tonemapping
|
||||||
|
|
||||||
|
vaapi:
|
||||||
|
devices:
|
||||||
|
- /dev/dri:/dev/dri
|
||||||
|
|
||||||
|
vaapi-wsl: # use this for VAAPI if you're running Immich in WSL2
|
||||||
|
devices:
|
||||||
|
- /dev/dri:/dev/dri
|
||||||
|
volumes:
|
||||||
|
- /usr/lib/wsl:/usr/lib/wsl
|
||||||
|
environment:
|
||||||
|
- LIBVA_DRIVER_NAME=d3d12
|
||||||
30
containers/docker/jellyfin/compose.yaml
Normal file
30
containers/docker/jellyfin/compose.yaml
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
services:
|
||||||
|
jellyfin:
|
||||||
|
image: jellyfin/jellyfin
|
||||||
|
container_name: jellyfin
|
||||||
|
user: 1003:1003
|
||||||
|
network_mode: 'host'
|
||||||
|
volumes:
|
||||||
|
- /home/jellyfin/jellyfin/config:/config
|
||||||
|
- /home/jellyfin/jellyfin/cache:/cache
|
||||||
|
- type: bind
|
||||||
|
source: /home/jellyfin/jellyfin/media
|
||||||
|
target: /media
|
||||||
|
# - type: bind
|
||||||
|
# source: /path/to/media2
|
||||||
|
# target: /media2
|
||||||
|
# read_only: true
|
||||||
|
# Optional - extra fonts to be used during transcoding with subtitle burn-in
|
||||||
|
# - type: bind
|
||||||
|
# source: /path/to/fonts
|
||||||
|
# target: /usr/local/share/fonts/custom
|
||||||
|
# read_only: true
|
||||||
|
restart: 'unless-stopped'
|
||||||
|
# Optional - alternative address used for autodiscovery
|
||||||
|
# environment:
|
||||||
|
# - JELLYFIN_PublishedServerUrl=http://example.com
|
||||||
|
# Optional - may be necessary for docker healthcheck to pass if running in host network mode
|
||||||
|
# extra_hosts:
|
||||||
|
# - 'host.docker.internal:host-gateway'
|
||||||
|
devices:
|
||||||
|
- "/dev/dri:/dev/dri" # Intel QSV
|
||||||
3
containers/docker/multitenant/.gitignore
vendored
Normal file
3
containers/docker/multitenant/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
infra/nginx-proxy-manager_data/
|
||||||
|
infra/portainer_data/
|
||||||
|
lemmy/volumes/
|
||||||
55
containers/docker/multitenant/README.md
Normal file
55
containers/docker/multitenant/README.md
Normal file
|
|
@ -0,0 +1,55 @@
|
||||||
|
# multitenant
|
||||||
|
|
||||||
|
## nginx-proxy-manager
|
||||||
|
|
||||||
|
```sh
|
||||||
|
docker network create infra
|
||||||
|
```
|
||||||
|
|
||||||
|
Admin: http://127.0.0.1:81/
|
||||||
|
|
||||||
|
```
|
||||||
|
admin@example.com
|
||||||
|
changeme
|
||||||
|
```
|
||||||
|
|
||||||
|
## Wordpress
|
||||||
|
|
||||||
|
We need to add domain names in our `/etc/hosts` file:
|
||||||
|
|
||||||
|
```
|
||||||
|
127.0.0.1 moni0.codecompost.nl
|
||||||
|
127.0.0.1 moni1.codecompost.nl
|
||||||
|
```
|
||||||
|
|
||||||
|
And pass a project name to the docker-compose command:
|
||||||
|
|
||||||
|
```
|
||||||
|
docker-compose -p moni0 up --build --force-recreate -d
|
||||||
|
```
|
||||||
|
|
||||||
|
This will prepend `moni0_` to the containers (and add a `_1` apparently)
|
||||||
|
|
||||||
|
```
|
||||||
|
Creating network "moni0_internal_network" with the default driver
|
||||||
|
Creating volume "moni0_wordpress" with default driver
|
||||||
|
Creating volume "moni0_db" with default driver
|
||||||
|
Creating moni0_db_1 ... done
|
||||||
|
Creating moni0_wordpress_1 ... done
|
||||||
|
```
|
||||||
|
|
||||||
|
In the Nginx Proxy Manager, we can add the proxy host:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
We can go ahead and start a second wordpress with:
|
||||||
|
|
||||||
|
```
|
||||||
|
docker-compose -p moni1 up --build --force-recreate -d
|
||||||
|
```
|
||||||
|
|
||||||
|
And then you can configure it like this:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Make sure that `moni1.codecompost.nl` is also in your hosts file, otherwise it won't work!
|
||||||
31
containers/docker/multitenant/infra/docker-compose.yml
Normal file
31
containers/docker/multitenant/infra/docker-compose.yml
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
version: '3.8'
|
||||||
|
services:
|
||||||
|
|
||||||
|
nginx-proxy-manager:
|
||||||
|
image: 'jc21/nginx-proxy-manager:latest'
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- '80:80'
|
||||||
|
- '81:81'
|
||||||
|
- '443:443'
|
||||||
|
volumes:
|
||||||
|
- ./nginx-proxy-manager_data/data:/data
|
||||||
|
- ./nginx-proxy-manager_data/letsencrypt:/etc/letsencrypt
|
||||||
|
networks:
|
||||||
|
- infra
|
||||||
|
|
||||||
|
# portainer:
|
||||||
|
# image: 'portainer/portainer-ce:latest'
|
||||||
|
# restart: always
|
||||||
|
# ports:
|
||||||
|
# - '8000:8000'
|
||||||
|
# - '9443:9443'
|
||||||
|
# volumes:
|
||||||
|
# - /var/run/docker.sock:/var/run/docker.sock
|
||||||
|
# - ./portainer_data:/data
|
||||||
|
# networks:
|
||||||
|
# - infra
|
||||||
|
|
||||||
|
networks:
|
||||||
|
infra:
|
||||||
|
external: true
|
||||||
12
containers/docker/multitenant/jellyfin/run_with_podman.sh
Executable file
12
containers/docker/multitenant/jellyfin/run_with_podman.sh
Executable file
|
|
@ -0,0 +1,12 @@
|
||||||
|
podman run \
|
||||||
|
--detach \
|
||||||
|
--label "io.containers.autoupdate=registry" \
|
||||||
|
--name jellyfin \
|
||||||
|
--publish 8096:8096/tcp \
|
||||||
|
--rm \
|
||||||
|
--user $(id -u):$(id -g) \
|
||||||
|
--userns keep-id \
|
||||||
|
--volume jellyfin-cache:/cache:Z \
|
||||||
|
--volume jellyfin-config:/config:Z \
|
||||||
|
--mount type=bind,source=/home/moni/media/,destination=/media,ro=true,relabel=private \
|
||||||
|
docker.io/jellyfin/jellyfin:latest
|
||||||
30
containers/docker/multitenant/lemmy/customPostgresql.conf
Normal file
30
containers/docker/multitenant/lemmy/customPostgresql.conf
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
# DB Version: 15
|
||||||
|
# OS Type: linux
|
||||||
|
# DB Type: web
|
||||||
|
# Total Memory (RAM): 8 GB
|
||||||
|
# CPUs num: 4
|
||||||
|
# Data Storage: ssd
|
||||||
|
|
||||||
|
max_connections = 200
|
||||||
|
shared_buffers = 2GB
|
||||||
|
effective_cache_size = 6GB
|
||||||
|
maintenance_work_mem = 512MB
|
||||||
|
checkpoint_completion_target = 0.9
|
||||||
|
checkpoint_timeout = 86400
|
||||||
|
wal_buffers = 16MB
|
||||||
|
default_statistics_target = 100
|
||||||
|
random_page_cost = 1.1
|
||||||
|
effective_io_concurrency = 200
|
||||||
|
work_mem = 5242kB
|
||||||
|
min_wal_size = 1GB
|
||||||
|
max_wal_size = 30GB
|
||||||
|
max_worker_processes = 4
|
||||||
|
max_parallel_workers_per_gather = 2
|
||||||
|
max_parallel_workers = 4
|
||||||
|
max_parallel_maintenance_workers = 2
|
||||||
|
|
||||||
|
# Other custom params
|
||||||
|
temp_file_size=1GB
|
||||||
|
synchronous_commit=off
|
||||||
|
# This one shouldn't be on regularly, because DB migrations often take a long time
|
||||||
|
# statement_timeout = 10000
|
||||||
114
containers/docker/multitenant/lemmy/docker-compose.yml
Normal file
114
containers/docker/multitenant/lemmy/docker-compose.yml
Normal file
|
|
@ -0,0 +1,114 @@
|
||||||
|
version: "3.7"
|
||||||
|
|
||||||
|
x-logging: &default-logging
|
||||||
|
driver: "json-file"
|
||||||
|
options:
|
||||||
|
max-size: "50m"
|
||||||
|
max-file: "4"
|
||||||
|
|
||||||
|
services:
|
||||||
|
proxy:
|
||||||
|
image: nginx:1-alpine
|
||||||
|
# ports:
|
||||||
|
# # actual and only port facing any connection from outside
|
||||||
|
# # Note, change the left number if port 1236 is already in use on your system
|
||||||
|
# # You could use port 80 if you won't use a reverse proxy
|
||||||
|
# - "1236:8536"
|
||||||
|
volumes:
|
||||||
|
- ./nginx_internal.conf:/etc/nginx/nginx.conf:ro,Z
|
||||||
|
restart: always
|
||||||
|
logging: *default-logging
|
||||||
|
depends_on:
|
||||||
|
- pictrs
|
||||||
|
- lemmy-ui
|
||||||
|
networks:
|
||||||
|
- lemmy-internal
|
||||||
|
- infra
|
||||||
|
|
||||||
|
lemmy:
|
||||||
|
image: dessalines/lemmy:latest
|
||||||
|
hostname: lemmy
|
||||||
|
restart: always
|
||||||
|
logging: *default-logging
|
||||||
|
environment:
|
||||||
|
- RUST_LOG="warn"
|
||||||
|
- LEMMY_CORS_ORIGIN=http://lemmy.codecompost.nl
|
||||||
|
volumes:
|
||||||
|
- ./lemmy.hjson:/config/config.hjson:Z
|
||||||
|
depends_on:
|
||||||
|
- postgres
|
||||||
|
- pictrs
|
||||||
|
networks:
|
||||||
|
- lemmy-internal
|
||||||
|
|
||||||
|
lemmy-ui:
|
||||||
|
image: dessalines/lemmy-ui:latest
|
||||||
|
environment:
|
||||||
|
- LEMMY_UI_LEMMY_INTERNAL_HOST=lemmy:8536
|
||||||
|
- LEMMY_UI_LEMMY_EXTERNAL_HOST=lemmy.codecompost.nl
|
||||||
|
- LEMMY_UI_HTTPS=true
|
||||||
|
volumes:
|
||||||
|
- ./volumes/lemmy-ui/extra_themes:/app/extra_themes
|
||||||
|
depends_on:
|
||||||
|
- lemmy
|
||||||
|
restart: always
|
||||||
|
logging: *default-logging
|
||||||
|
networks:
|
||||||
|
- lemmy-internal
|
||||||
|
|
||||||
|
pictrs:
|
||||||
|
image: asonix/pictrs:0.4.0-rc.7
|
||||||
|
# this needs to match the pictrs url in lemmy.hjson
|
||||||
|
hostname: pictrs
|
||||||
|
# we can set options to pictrs like this, here we set max. image size and forced format for conversion
|
||||||
|
# entrypoint: /sbin/tini -- /usr/local/bin/pict-rs -p /mnt -m 4 --image-format webp
|
||||||
|
environment:
|
||||||
|
- PICTRS_OPENTELEMETRY_URL=http://otel:4137
|
||||||
|
- PICTRS__API_KEY=JmT3cMDL252EJw
|
||||||
|
- RUST_LOG=debug
|
||||||
|
- RUST_BACKTRACE=full
|
||||||
|
- PICTRS__MEDIA__VIDEO_CODEC=vp9
|
||||||
|
- PICTRS__MEDIA__GIF__MAX_WIDTH=256
|
||||||
|
- PICTRS__MEDIA__GIF__MAX_HEIGHT=256
|
||||||
|
- PICTRS__MEDIA__GIF__MAX_AREA=65536
|
||||||
|
- PICTRS__MEDIA__GIF__MAX_FRAME_COUNT=400
|
||||||
|
user: 991:991
|
||||||
|
volumes:
|
||||||
|
- ./volumes/pictrs:/mnt:Z
|
||||||
|
restart: always
|
||||||
|
logging: *default-logging
|
||||||
|
deploy:
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
memory: 690m
|
||||||
|
networks:
|
||||||
|
- lemmy-internal
|
||||||
|
|
||||||
|
postgres:
|
||||||
|
image: postgres:15-alpine
|
||||||
|
hostname: postgres
|
||||||
|
environment:
|
||||||
|
- POSTGRES_USER=lemmy
|
||||||
|
- POSTGRES_PASSWORD=JmT3cMDL252EJw
|
||||||
|
- POSTGRES_DB=lemmy
|
||||||
|
volumes:
|
||||||
|
- ./volumes/postgres:/var/lib/postgresql/data:Z
|
||||||
|
- ./customPostgresql.conf:/etc/postgresql.conf
|
||||||
|
restart: always
|
||||||
|
logging: *default-logging
|
||||||
|
networks:
|
||||||
|
- lemmy-internal
|
||||||
|
|
||||||
|
postfix:
|
||||||
|
image: mwader/postfix-relay
|
||||||
|
environment:
|
||||||
|
- POSTFIX_myhostname=codecompost.nl
|
||||||
|
restart: "always"
|
||||||
|
logging: *default-logging
|
||||||
|
networks:
|
||||||
|
- lemmy-internal
|
||||||
|
|
||||||
|
networks:
|
||||||
|
lemmy-internal:
|
||||||
|
infra:
|
||||||
|
external: true
|
||||||
19
containers/docker/multitenant/lemmy/lemmy.hjson
Normal file
19
containers/docker/multitenant/lemmy/lemmy.hjson
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
# for more info about the config, check out the documentation
|
||||||
|
# https://join-lemmy.org/docs/en/administration/configuration.html
|
||||||
|
|
||||||
|
database: {
|
||||||
|
host: postgres
|
||||||
|
password: "JmT3cMDL252EJw"
|
||||||
|
}
|
||||||
|
hostname: "lemmy.codecompost.nl"
|
||||||
|
pictrs: {
|
||||||
|
url: "http://pictrs:8080/"
|
||||||
|
api_key: "JmT3cMDL252EJw"
|
||||||
|
}
|
||||||
|
email: {
|
||||||
|
smtp_server: "postfix:25"
|
||||||
|
smtp_from_address: "noreply@codecompost.nl"
|
||||||
|
tls_type: "none"
|
||||||
|
}
|
||||||
|
}
|
||||||
96
containers/docker/multitenant/lemmy/nginx_internal.conf
Normal file
96
containers/docker/multitenant/lemmy/nginx_internal.conf
Normal file
|
|
@ -0,0 +1,96 @@
|
||||||
|
worker_processes auto;
|
||||||
|
|
||||||
|
events {
|
||||||
|
worker_connections 1024;
|
||||||
|
}
|
||||||
|
|
||||||
|
http {
|
||||||
|
# We construct a string consistent of the "request method" and "http accept header"
|
||||||
|
# and then apply soem ~simply regexp matches to that combination to decide on the
|
||||||
|
# HTTP upstream we should proxy the request to.
|
||||||
|
#
|
||||||
|
# Example strings:
|
||||||
|
#
|
||||||
|
# "GET:application/activity+json"
|
||||||
|
# "GET:text/html"
|
||||||
|
# "POST:application/activity+json"
|
||||||
|
#
|
||||||
|
# You can see some basic match tests in this regex101 matching this configuration
|
||||||
|
# https://regex101.com/r/vwMJNc/1
|
||||||
|
#
|
||||||
|
# Learn more about nginx maps here http://nginx.org/en/docs/http/ngx_http_map_module.html
|
||||||
|
map "$request_method:$http_accept" $proxpass {
|
||||||
|
# If no explicit matches exists below, send traffic to lemmy-ui
|
||||||
|
default "http://lemmy-ui";
|
||||||
|
|
||||||
|
# GET/HEAD requests that accepts ActivityPub or Linked Data JSON should go to lemmy.
|
||||||
|
#
|
||||||
|
# These requests are used by Mastodon and other fediverse instances to look up profile information,
|
||||||
|
# discover site information and so on.
|
||||||
|
"~^(?:GET|HEAD):.*?application\/(?:activity|ld)\+json" "http://lemmy";
|
||||||
|
|
||||||
|
# All non-GET/HEAD requests should go to lemmy
|
||||||
|
#
|
||||||
|
# Rather than calling out POST, PUT, DELETE, PATCH, CONNECT and all the verbs manually
|
||||||
|
# we simply negate the GET|HEAD pattern from above and accept all possibly $http_accept values
|
||||||
|
"~^(?!(GET|HEAD)).*:" "http://lemmy";
|
||||||
|
}
|
||||||
|
|
||||||
|
upstream lemmy {
|
||||||
|
# this needs to map to the lemmy (server) docker service hostname
|
||||||
|
server "lemmy:8536";
|
||||||
|
}
|
||||||
|
|
||||||
|
upstream lemmy-ui {
|
||||||
|
# this needs to map to the lemmy-ui docker service hostname
|
||||||
|
server "lemmy-ui:1234";
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
# this is the port inside docker, not the public one yet
|
||||||
|
listen 1236;
|
||||||
|
listen 8536;
|
||||||
|
|
||||||
|
# change if needed, this is facing the public web
|
||||||
|
server_name localhost;
|
||||||
|
server_tokens off;
|
||||||
|
|
||||||
|
gzip on;
|
||||||
|
gzip_types text/css application/javascript image/svg+xml;
|
||||||
|
gzip_vary on;
|
||||||
|
|
||||||
|
# Upload limit, relevant for pictrs
|
||||||
|
client_max_body_size 20M;
|
||||||
|
|
||||||
|
add_header X-Frame-Options SAMEORIGIN;
|
||||||
|
add_header X-Content-Type-Options nosniff;
|
||||||
|
add_header X-XSS-Protection "1; mode=block";
|
||||||
|
|
||||||
|
# frontend general requests
|
||||||
|
location / {
|
||||||
|
proxy_pass $proxpass;
|
||||||
|
|
||||||
|
rewrite ^(.+)/+$ $1 permanent;
|
||||||
|
|
||||||
|
# Send actual client IP upstream
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
}
|
||||||
|
|
||||||
|
# backend
|
||||||
|
location ~ ^/(api|pictrs|feeds|nodeinfo|.well-known) {
|
||||||
|
proxy_pass "http://lemmy";
|
||||||
|
|
||||||
|
# proxy common stuff
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
|
||||||
|
# Send actual client IP upstream
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
28
containers/docker/multitenant/mastodon/.env.production
Normal file
28
containers/docker/multitenant/mastodon/.env.production
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
# Generated with mastodon:setup on 2023-07-06 02:48:24 UTC
|
||||||
|
|
||||||
|
# Some variables in this file will be interpreted differently whether you are
|
||||||
|
# using docker-compose or not.
|
||||||
|
|
||||||
|
LOCAL_DOMAIN=mastodon.codecompost.nl
|
||||||
|
SINGLE_USER_MODE=true
|
||||||
|
SECRET_KEY_BASE=2f845c9336267ad5ddf79ca900d3940990c0a8010c7c3a5321d5cda8e5b9ac32ebcc75ea67396977bb65c7c970f71d123312cd180c6a1e7b12e608eee3d63e27
|
||||||
|
OTP_SECRET=e8c4370e30704c85552fd48d766c859323ebd28aaaffa8a9943687b2ac925610eeba1bc9b3a472ae1b684862e7d02ea7d5b69a02624d395626b0cd9fef4aeb2c
|
||||||
|
VAPID_PRIVATE_KEY=fHCAaeeQ_HxQBKvw9jzVrTxO9mpoup46luhPmKZsRhI=
|
||||||
|
VAPID_PUBLIC_KEY=BKkmTVZwiL4hmqYt91AsWvB4DS38MnFygDumi9jCqjSw3IClXA5WhxCQnYSpGzOKvvrN-Lgy4Fm2Rx5CPhmelS0=
|
||||||
|
DB_HOST=moni-mastodon-db-1
|
||||||
|
DB_PORT=5432
|
||||||
|
DB_NAME=mastodon
|
||||||
|
DB_USER=mastodon
|
||||||
|
DB_PASS=mastodon
|
||||||
|
REDIS_HOST=moni-mastodon-redis-1
|
||||||
|
REDIS_PORT=6379
|
||||||
|
REDIS_PASSWORD=
|
||||||
|
SMTP_SERVER=smtp.mailgun.org
|
||||||
|
SMTP_PORT=587
|
||||||
|
SMTP_LOGIN=
|
||||||
|
SMTP_PASSWORD=
|
||||||
|
SMTP_AUTH_METHOD=plain
|
||||||
|
SMTP_OPENSSL_VERIFY_MODE=none
|
||||||
|
SMTP_ENABLE_STARTTLS=auto
|
||||||
|
SMTP_FROM_ADDRESS=Mastodon <notifications@mastodon.codecompost.nl>
|
||||||
|
LOCAL_HTTPS=false
|
||||||
137
containers/docker/multitenant/mastodon/docker-compose.yml
Normal file
137
containers/docker/multitenant/mastodon/docker-compose.yml
Normal file
|
|
@ -0,0 +1,137 @@
|
||||||
|
version: '3'
|
||||||
|
services:
|
||||||
|
db:
|
||||||
|
restart: always
|
||||||
|
image: postgres:14-alpine
|
||||||
|
shm_size: 256mb
|
||||||
|
networks:
|
||||||
|
- internal_network
|
||||||
|
healthcheck:
|
||||||
|
test: ['CMD', 'pg_isready', '-U', 'postgres']
|
||||||
|
volumes:
|
||||||
|
- postgres14:/var/lib/postgresql/data
|
||||||
|
environment:
|
||||||
|
- POSTGRES_USER=mastodon
|
||||||
|
- POSTGRES_PASSWORD=mastodon
|
||||||
|
|
||||||
|
redis:
|
||||||
|
restart: always
|
||||||
|
image: redis:7-alpine
|
||||||
|
networks:
|
||||||
|
- internal_network
|
||||||
|
healthcheck:
|
||||||
|
test: ['CMD', 'redis-cli', 'ping']
|
||||||
|
volumes:
|
||||||
|
- redis:/data
|
||||||
|
|
||||||
|
# es:
|
||||||
|
# restart: always
|
||||||
|
# image: docker.elastic.co/elasticsearch/elasticsearch:7.17.4
|
||||||
|
# environment:
|
||||||
|
# - "ES_JAVA_OPTS=-Xms512m -Xmx512m -Des.enforce.bootstrap.checks=true"
|
||||||
|
# - "xpack.license.self_generated.type=basic"
|
||||||
|
# - "xpack.security.enabled=false"
|
||||||
|
# - "xpack.watcher.enabled=false"
|
||||||
|
# - "xpack.graph.enabled=false"
|
||||||
|
# - "xpack.ml.enabled=false"
|
||||||
|
# - "bootstrap.memory_lock=true"
|
||||||
|
# - "cluster.name=es-mastodon"
|
||||||
|
# - "discovery.type=single-node"
|
||||||
|
# - "thread_pool.write.queue_size=1000"
|
||||||
|
# networks:
|
||||||
|
# - infra
|
||||||
|
# - internal_network
|
||||||
|
# healthcheck:
|
||||||
|
# test: ["CMD-SHELL", "curl --silent --fail localhost:9200/_cluster/health || exit 1"]
|
||||||
|
# volumes:
|
||||||
|
# - ./elasticsearch:/usr/share/elasticsearch/data
|
||||||
|
# ulimits:
|
||||||
|
# memlock:
|
||||||
|
# soft: -1
|
||||||
|
# hard: -1
|
||||||
|
# nofile:
|
||||||
|
# soft: 65536
|
||||||
|
# hard: 65536
|
||||||
|
# ports:
|
||||||
|
# - '127.0.0.1:9200:9200'
|
||||||
|
|
||||||
|
web:
|
||||||
|
image: ghcr.io/mastodon/mastodon
|
||||||
|
restart: always
|
||||||
|
env_file: .env.production
|
||||||
|
command: bash -c "rm -f /mastodon/tmp/pids/server.pid; bundle exec rails s -p 3000"
|
||||||
|
networks:
|
||||||
|
- infra
|
||||||
|
- internal_network
|
||||||
|
healthcheck:
|
||||||
|
# prettier-ignore
|
||||||
|
test: ['CMD-SHELL', 'wget -q --spider --proxy=off localhost:3000/health || exit 1']
|
||||||
|
# ports:
|
||||||
|
# - '127.0.0.1:3000:3000'
|
||||||
|
depends_on:
|
||||||
|
- db
|
||||||
|
- redis
|
||||||
|
# - es
|
||||||
|
volumes:
|
||||||
|
- public_system:/mastodon/public/system
|
||||||
|
|
||||||
|
streaming:
|
||||||
|
image: ghcr.io/mastodon/mastodon
|
||||||
|
restart: always
|
||||||
|
env_file: .env.production
|
||||||
|
command: node ./streaming
|
||||||
|
networks:
|
||||||
|
- infra
|
||||||
|
- internal_network
|
||||||
|
healthcheck:
|
||||||
|
# prettier-ignore
|
||||||
|
test: ['CMD-SHELL', 'wget -q --spider --proxy=off localhost:4000/api/v1/streaming/health || exit 1']
|
||||||
|
# ports:
|
||||||
|
# - '127.0.0.1:4000:4000'
|
||||||
|
depends_on:
|
||||||
|
- db
|
||||||
|
- redis
|
||||||
|
|
||||||
|
sidekiq:
|
||||||
|
image: ghcr.io/mastodon/mastodon
|
||||||
|
restart: always
|
||||||
|
env_file: .env.production
|
||||||
|
command: bundle exec sidekiq
|
||||||
|
depends_on:
|
||||||
|
- db
|
||||||
|
- redis
|
||||||
|
networks:
|
||||||
|
- infra
|
||||||
|
- internal_network
|
||||||
|
volumes:
|
||||||
|
- public_system:/mastodon/public/system
|
||||||
|
healthcheck:
|
||||||
|
test: ['CMD-SHELL', "ps aux | grep '[s]idekiq\ 6' || false"]
|
||||||
|
|
||||||
|
## Uncomment to enable federation with tor instances along with adding the following ENV variables
|
||||||
|
## http_proxy=http://privoxy:8118
|
||||||
|
## ALLOW_ACCESS_TO_HIDDEN_SERVICE=true
|
||||||
|
# tor:
|
||||||
|
# image: sirboops/tor
|
||||||
|
# networks:
|
||||||
|
# - infra
|
||||||
|
# - internal_network
|
||||||
|
#
|
||||||
|
# privoxy:
|
||||||
|
# image: sirboops/privoxy
|
||||||
|
# volumes:
|
||||||
|
# - ./priv-config:/opt/config
|
||||||
|
# networks:
|
||||||
|
# - infra
|
||||||
|
# - internal_network
|
||||||
|
|
||||||
|
networks:
|
||||||
|
infra:
|
||||||
|
external: true
|
||||||
|
internal_network:
|
||||||
|
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
postgres14:
|
||||||
|
redis:
|
||||||
|
public_system:
|
||||||
BIN
containers/docker/multitenant/moni0_proxy_host.png
Normal file
BIN
containers/docker/multitenant/moni0_proxy_host.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 45 KiB |
BIN
containers/docker/multitenant/moni1_proxy_host.png
Normal file
BIN
containers/docker/multitenant/moni1_proxy_host.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 45 KiB |
2
containers/docker/multitenant/nextcloud/REAME.md
Normal file
2
containers/docker/multitenant/nextcloud/REAME.md
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
https://github.com/nextcloud/all-in-one
|
||||||
|
|
||||||
17
containers/docker/multitenant/nextcloud/docker-compose.yml
Normal file
17
containers/docker/multitenant/nextcloud/docker-compose.yml
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
services:
|
||||||
|
nextcloud-aio-mastercontainer:
|
||||||
|
image: nextcloud/all-in-one:latest
|
||||||
|
init: true
|
||||||
|
restart: always
|
||||||
|
container_name: nextcloud-aio-mastercontainer # This line is not allowed to be changed as otherwise AIO will not work correctly
|
||||||
|
volumes:
|
||||||
|
- nextcloud_aio_mastercontainer:/mnt/docker-aio-config # This line is not allowed to be changed as otherwise the built-in backup solution will not work
|
||||||
|
- /var/run/docker.sock:/var/run/docker.sock:ro # May be changed on macOS, Windows or docker rootless. See the applicable documentation. If adjusting, don't forget to also set 'WATCHTOWER_DOCKER_SOCKET_PATH'!
|
||||||
|
ports:
|
||||||
|
- 80:80 # Can be removed when running behind a web server or reverse proxy (like Apache, Nginx, Cloudflare Tunnel and else). See https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md
|
||||||
|
- 8080:8080
|
||||||
|
- 8443:8443
|
||||||
|
|
||||||
|
volumes: # If you want to store the data on a different drive, see https://github.com/nextcloud/all-in-one#how-to-store-the-filesinstallation-on-a-separate-drive
|
||||||
|
nextcloud_aio_mastercontainer:
|
||||||
|
name: nextcloud_aio_mastercontainer # This line is not allowed to be changed as otherwise the built-in backup solution will not work
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
version: '2'
|
||||||
|
services:
|
||||||
|
moni8080:
|
||||||
|
image: httpd
|
||||||
|
networks:
|
||||||
|
- npm
|
||||||
|
volumes:
|
||||||
|
- /home/moni/sites/moni8080:/usr/local/apache2/htdocs/
|
||||||
|
|
||||||
|
networks:
|
||||||
|
npm:
|
||||||
|
external: true
|
||||||
8
containers/docker/multitenant/sites/moni8080/index.html
Normal file
8
containers/docker/multitenant/sites/moni8080/index.html
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
Moni 8080
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
This is MONI 8080
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
version: '2'
|
||||||
|
services:
|
||||||
|
moni8081:
|
||||||
|
image: httpd
|
||||||
|
networks:
|
||||||
|
- npm
|
||||||
|
volumes:
|
||||||
|
- /home/moni/sites/moni8081:/usr/local/apache2/htdocs/
|
||||||
|
|
||||||
|
networks:
|
||||||
|
npm:
|
||||||
|
external: true
|
||||||
8
containers/docker/multitenant/sites/moni8081/index.html
Normal file
8
containers/docker/multitenant/sites/moni8081/index.html
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
Moni 8081
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
This is MONI 8081
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
8
containers/docker/multitenant/sites/moni8082/index.html
Normal file
8
containers/docker/multitenant/sites/moni8082/index.html
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
Moni 8082
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
This is MONI 8082
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
7
containers/docker/multitenant/wordpress/Dockerfile
Normal file
7
containers/docker/multitenant/wordpress/Dockerfile
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
# Not the latest version to be able to test updates
|
||||||
|
FROM wordpress:6.0.0
|
||||||
|
WORKDIR /usr/src/wordpress
|
||||||
|
RUN set -eux; \
|
||||||
|
find /etc/apache2 -name '*.conf' -type f -exec sed -ri -e "s!/var/www/html!$PWD!g" -e "s!Directory /var/www/!Directory $PWD!g" '{}' +; \
|
||||||
|
cp -s wp-config-docker.php wp-config.php
|
||||||
|
RUN echo "define('FS_METHOD','direct');" >> wp-config.php
|
||||||
43
containers/docker/multitenant/wordpress/docker-compose.yml
Normal file
43
containers/docker/multitenant/wordpress/docker-compose.yml
Normal file
|
|
@ -0,0 +1,43 @@
|
||||||
|
version: '3.1'
|
||||||
|
|
||||||
|
services:
|
||||||
|
|
||||||
|
wordpress:
|
||||||
|
image: wordpress
|
||||||
|
restart: always
|
||||||
|
# ports:
|
||||||
|
# - 8080:80
|
||||||
|
depends_on:
|
||||||
|
- db
|
||||||
|
environment:
|
||||||
|
WORDPRESS_DB_HOST: db
|
||||||
|
WORDPRESS_DB_USER: exampleuser
|
||||||
|
WORDPRESS_DB_PASSWORD: examplepass
|
||||||
|
WORDPRESS_DB_NAME: exampledb
|
||||||
|
volumes:
|
||||||
|
- wordpress:/var/www/html
|
||||||
|
networks:
|
||||||
|
- infra
|
||||||
|
- internal_network
|
||||||
|
|
||||||
|
db:
|
||||||
|
image: mysql:5.7
|
||||||
|
restart: always
|
||||||
|
environment:
|
||||||
|
MYSQL_DATABASE: exampledb
|
||||||
|
MYSQL_USER: exampleuser
|
||||||
|
MYSQL_PASSWORD: examplepass
|
||||||
|
MYSQL_RANDOM_ROOT_PASSWORD: '1'
|
||||||
|
volumes:
|
||||||
|
- db:/var/lib/mysql
|
||||||
|
networks:
|
||||||
|
- internal_network
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
wordpress:
|
||||||
|
db:
|
||||||
|
|
||||||
|
networks:
|
||||||
|
infra:
|
||||||
|
external: true
|
||||||
|
internal_network:
|
||||||
40
containers/docker/nextcloud/README.md
Normal file
40
containers/docker/nextcloud/README.md
Normal file
|
|
@ -0,0 +1,40 @@
|
||||||
|
# Disabling SSL
|
||||||
|
|
||||||
|
```sh
|
||||||
|
docker exec -it nextcloud-aio-mastercontainer bash
|
||||||
|
```
|
||||||
|
|
||||||
|
in the container:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
vi /etc/apache2/sites-available/mastercontainer.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
Change the line to disable SSL:
|
||||||
|
|
||||||
|
```
|
||||||
|
SSLEngine off
|
||||||
|
```
|
||||||
|
|
||||||
|
Restart https *within the container*:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
killall httpd
|
||||||
|
/usr/sbin/httpd
|
||||||
|
```
|
||||||
|
|
||||||
|
You can exit after that.
|
||||||
|
|
||||||
|
# Run OCC command
|
||||||
|
|
||||||
|
```sh
|
||||||
|
docker exec -it --user www-data nextcloud-aio-nextcloud /var/www/html/occ
|
||||||
|
```
|
||||||
|
|
||||||
|
# Brute force protection
|
||||||
|
|
||||||
|
To add the Caddy Jails container that is running on `192.168.1.200` to the trusted proxies list:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
docker exec --user www-data -it nextcloud-aio-nextcloud php occ config:system:set trusted_proxies 2 --value="192.168.1.200"
|
||||||
|
```
|
||||||
67
containers/docker/nextcloud/compose.yaml
Normal file
67
containers/docker/nextcloud/compose.yaml
Normal file
|
|
@ -0,0 +1,67 @@
|
||||||
|
services:
|
||||||
|
nextcloud-aio-mastercontainer:
|
||||||
|
image: nextcloud/all-in-one:latest
|
||||||
|
init: true
|
||||||
|
restart: always
|
||||||
|
container_name: nextcloud-aio-mastercontainer # This line is not allowed to be changed as otherwise AIO will not work correctly
|
||||||
|
volumes:
|
||||||
|
- nextcloud_aio_mastercontainer:/mnt/docker-aio-config # This line is not allowed to be changed as otherwise the built-in backup solution will not work
|
||||||
|
- /var/run/docker.sock:/var/run/docker.sock:ro # May be changed on macOS, Windows or docker rootless. See the applicable documentation. If adjusting, don't forget to also set 'WATCHTOWER_DOCKER_SOCKET_PATH'!
|
||||||
|
ports:
|
||||||
|
# - 80:80 # Can be removed when running behind a web server or reverse proxy (like Apache, Nginx, Cloudflare Tunnel and else). See https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md
|
||||||
|
- 8080:8080
|
||||||
|
# - 8443:8443 # Can be removed when running behind a web server or reverse proxy (like Apache, Nginx, Cloudflare Tunnel and else). See https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md
|
||||||
|
environment: # Is needed when using any of the options below
|
||||||
|
# AIO_DISABLE_BACKUP_SECTION: false # Setting this to true allows to hide the backup section in the AIO interface. See https://github.com/nextcloud/all-in-one#how-to-disable-the-backup-section
|
||||||
|
APACHE_PORT: 11000 # Is needed when running behind a web server or reverse proxy (like Apache, Nginx, Cloudflare Tunnel and else). See https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md
|
||||||
|
APACHE_IP_BINDING: 0.0.0.0 # Should be set when running behind a web server or reverse proxy (like Apache, Nginx, Cloudflare Tunnel and else) that is running on the same host. See https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md
|
||||||
|
SKIP_DOMAIN_VALIDATION: true
|
||||||
|
ALLOW_INSECURE_ACCESS: true
|
||||||
|
# BORG_RETENTION_POLICY: --keep-within=7d --keep-weekly=4 --keep-monthly=6 # Allows to adjust borgs retention policy. See https://github.com/nextcloud/all-in-one#how-to-adjust-borgs-retention-policy
|
||||||
|
# COLLABORA_SECCOMP_DISABLED: false # Setting this to true allows to disable Collabora's Seccomp feature. See https://github.com/nextcloud/all-in-one#how-to-disable-collaboras-seccomp-feature
|
||||||
|
NEXTCLOUD_DATADIR: /home/nextcloud/nextcloud-data # Allows to set the host directory for Nextcloud's datadir. ⚠️⚠️⚠️ Warning: do not set or adjust this value after the initial Nextcloud installation is done! See https://github.com/nextcloud/all-in-one#how-to-change-the-default-location-of-nextclouds-datadir
|
||||||
|
# NEXTCLOUD_MOUNT: /mnt/ # Allows the Nextcloud container to access the chosen directory on the host. See https://github.com/nextcloud/all-in-one#how-to-allow-the-nextcloud-container-to-access-directories-on-the-host
|
||||||
|
# NEXTCLOUD_UPLOAD_LIMIT: 10G # Can be adjusted if you need more. See https://github.com/nextcloud/all-in-one#how-to-adjust-the-upload-limit-for-nextcloud
|
||||||
|
# NEXTCLOUD_MAX_TIME: 3600 # Can be adjusted if you need more. See https://github.com/nextcloud/all-in-one#how-to-adjust-the-max-execution-time-for-nextcloud
|
||||||
|
# NEXTCLOUD_MEMORY_LIMIT: 512M # Can be adjusted if you need more. See https://github.com/nextcloud/all-in-one#how-to-adjust-the-php-memory-limit-for-nextcloud
|
||||||
|
# NEXTCLOUD_TRUSTED_CACERTS_DIR: /path/to/my/cacerts # CA certificates in this directory will be trusted by the OS of the nexcloud container (Useful e.g. for LDAPS) See See https://github.com/nextcloud/all-in-one#how-to-trust-user-defined-certification-authorities-ca
|
||||||
|
# NEXTCLOUD_STARTUP_APPS: deck twofactor_totp tasks calendar contacts notes # Allows to modify the Nextcloud apps that are installed on starting AIO the first time. See https://github.com/nextcloud/all-in-one#how-to-change-the-nextcloud-apps-that-are-installed-on-the-first-startup
|
||||||
|
# NEXTCLOUD_ADDITIONAL_APKS: imagemagick # This allows to add additional packages to the Nextcloud container permanently. Default is imagemagick but can be overwritten by modifying this value. See https://github.com/nextcloud/all-in-one#how-to-add-os-packages-permanently-to-the-nextcloud-container
|
||||||
|
# NEXTCLOUD_ADDITIONAL_PHP_EXTENSIONS: imagick # This allows to add additional php extensions to the Nextcloud container permanently. Default is imagick but can be overwritten by modifying this value. See https://github.com/nextcloud/all-in-one#how-to-add-php-extensions-permanently-to-the-nextcloud-container
|
||||||
|
NEXTCLOUD_ENABLE_DRI_DEVICE: true # This allows to enable the /dev/dri device in the Nextcloud container. ⚠️⚠️⚠️ Warning: this only works if the '/dev/dri' device is present on the host! If it should not exist on your host, don't set this to true as otherwise the Nextcloud container will fail to start! See https://github.com/nextcloud/all-in-one#how-to-enable-hardware-transcoding-for-nextcloud
|
||||||
|
# NEXTCLOUD_KEEP_DISABLED_APPS: false # Setting this to true will keep Nextcloud apps that are disabled in the AIO interface and not uninstall them if they should be installed. See https://github.com/nextcloud/all-in-one#how-to-keep-disabled-apps
|
||||||
|
# TALK_PORT: 3478 # This allows to adjust the port that the talk container is using. See https://github.com/nextcloud/all-in-one#how-to-adjust-the-talk-port
|
||||||
|
# WATCHTOWER_DOCKER_SOCKET_PATH: /var/run/docker.sock # Needs to be specified if the docker socket on the host is not located in the default '/var/run/docker.sock'. Otherwise mastercontainer updates will fail. For macos it needs to be '/var/run/docker.sock'
|
||||||
|
# networks: # Is needed when you want to create the nextcloud-aio network with ipv6-support using this file, see the network config at the bottom of the file
|
||||||
|
# - nextcloud-aio # Is needed when you want to create the nextcloud-aio network with ipv6-support using this file, see the network config at the bottom of the file
|
||||||
|
# security_opt: ["label:disable"] # Is needed when using SELinux
|
||||||
|
|
||||||
|
# # Optional: Caddy reverse proxy. See https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md
|
||||||
|
# # You can find further examples here: https://github.com/nextcloud/all-in-one/discussions/588
|
||||||
|
# caddy:
|
||||||
|
# image: caddy:alpine
|
||||||
|
# restart: always
|
||||||
|
# container_name: caddy
|
||||||
|
# volumes:
|
||||||
|
# - ./Caddyfile:/etc/caddy/Caddyfile
|
||||||
|
# - ./certs:/certs
|
||||||
|
# - ./config:/config
|
||||||
|
# - ./data:/data
|
||||||
|
# - ./sites:/srv
|
||||||
|
# network_mode: "host"
|
||||||
|
|
||||||
|
volumes: # If you want to store the data on a different drive, see https://github.com/nextcloud/all-in-one#how-to-store-the-filesinstallation-on-a-separate-drive
|
||||||
|
nextcloud_aio_mastercontainer:
|
||||||
|
name: nextcloud_aio_mastercontainer # This line is not allowed to be changed as otherwise the built-in backup solution will not work
|
||||||
|
|
||||||
|
# # Optional: If you need ipv6, follow step 1 and 2 of https://github.com/nextcloud/all-in-one/blob/main/docker-ipv6-support.md first and then uncomment the below config in order to activate ipv6 for the internal nextcloud-aio network.
|
||||||
|
# # Please make sure to uncomment also the networking lines of the mastercontainer above in order to actually create the network with docker-compose
|
||||||
|
# networks:
|
||||||
|
# nextcloud-aio:
|
||||||
|
# name: nextcloud-aio # This line is not allowed to be changed as otherwise the created network will not be used by the other containers of AIO
|
||||||
|
# driver: bridge
|
||||||
|
# enable_ipv6: true
|
||||||
|
# ipam:
|
||||||
|
# driver: default
|
||||||
|
# config:
|
||||||
|
# - subnet: fd12:3456:789a:2::/64 # IPv6 subnet to use
|
||||||
13
containers/docker/nextcloud/restart.sh
Executable file
13
containers/docker/nextcloud/restart.sh
Executable file
|
|
@ -0,0 +1,13 @@
|
||||||
|
docker stop nextcloud-aio-apache && docker start nextcloud-aio-apache
|
||||||
|
docker stop nextcloud-aio-notify-push && docker start nextcloud-aio-notify-push
|
||||||
|
docker stop nextcloud-aio-nextcloud && docker start nextcloud-aio-nextcloud
|
||||||
|
# docker stop nextcloud-aio-docker-socket-proxy && docker start nextcloud-aio-docker-socket-proxy
|
||||||
|
docker stop nextcloud-aio-imaginary && docker start nextcloud-aio-imaginary
|
||||||
|
# docker stop nextcloud-aio-fulltextsearch && docker start nextcloud-aio-fulltextsearch
|
||||||
|
# docker stop nextcloud-aio-clamav && docker start nextcloud-aio-clamav
|
||||||
|
docker stop nextcloud-aio-redis && docker start nextcloud-aio-redis
|
||||||
|
docker stop nextcloud-aio-database && docker start nextcloud-aio-database
|
||||||
|
docker stop nextcloud-aio-talk && docker start nextcloud-aio-talk
|
||||||
|
docker stop nextcloud-aio-collabora && docker start nextcloud-aio-collabora
|
||||||
|
# docker stop nextcloud-aio-domaincheck # && docker start nextcloud-aio-domaincheck
|
||||||
|
# docker stop nextcloud-aio-mastercontainer && docker start nextcloud-aio-mastercontainer
|
||||||
13
containers/docker/nextcloud/stop.sh
Executable file
13
containers/docker/nextcloud/stop.sh
Executable file
|
|
@ -0,0 +1,13 @@
|
||||||
|
docker stop nextcloud-aio-apache
|
||||||
|
docker stop nextcloud-aio-notify-push
|
||||||
|
docker stop nextcloud-aio-nextcloud
|
||||||
|
# docker stop nextcloud-aio-docker-socket-proxy
|
||||||
|
docker stop nextcloud-aio-imaginary
|
||||||
|
# docker stop nextcloud-aio-fulltextsearch
|
||||||
|
# docker stop nextcloud-aio-clamav
|
||||||
|
docker stop nextcloud-aio-redis
|
||||||
|
docker stop nextcloud-aio-database
|
||||||
|
docker stop nextcloud-aio-talk
|
||||||
|
docker stop nextcloud-aio-collabora
|
||||||
|
# docker stop nextcloud-aio-domaincheck
|
||||||
|
# docker stop nextcloud-aio-mastercontainer
|
||||||
3
containers/docker/photoprism/README.md
Normal file
3
containers/docker/photoprism/README.md
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
```sh
|
||||||
|
docker compose exec photoprism photoprism --help
|
||||||
|
```
|
||||||
152
containers/docker/photoprism/docker-compose.yml
Normal file
152
containers/docker/photoprism/docker-compose.yml
Normal file
|
|
@ -0,0 +1,152 @@
|
||||||
|
# Example Docker Compose config file for PhotoPrism (Linux / AMD64)
|
||||||
|
#
|
||||||
|
# Note:
|
||||||
|
# - Running PhotoPrism on a server with less than 4 GB of swap space or setting a memory/swap limit can cause unexpected
|
||||||
|
# restarts ("crashes"), for example, when the indexer temporarily needs more memory to process large files.
|
||||||
|
# - If you install PhotoPrism on a public server outside your home network, please always run it behind a secure
|
||||||
|
# HTTPS reverse proxy such as Traefik or Caddy. Your files and passwords will otherwise be transmitted
|
||||||
|
# in clear text and can be intercepted by anyone, including your provider, hackers, and governments:
|
||||||
|
# https://docs.photoprism.app/getting-started/proxies/traefik/
|
||||||
|
#
|
||||||
|
# Setup Guides:
|
||||||
|
# - https://docs.photoprism.app/getting-started/docker-compose/
|
||||||
|
# - https://docs.photoprism.app/getting-started/raspberry-pi/
|
||||||
|
# - https://www.photoprism.app/kb/activation
|
||||||
|
#
|
||||||
|
# Troubleshooting Checklists:
|
||||||
|
# - https://docs.photoprism.app/getting-started/troubleshooting/
|
||||||
|
# - https://docs.photoprism.app/getting-started/troubleshooting/docker/
|
||||||
|
# - https://docs.photoprism.app/getting-started/troubleshooting/mariadb/
|
||||||
|
#
|
||||||
|
# CLI Commands:
|
||||||
|
# - https://docs.photoprism.app/getting-started/docker-compose/#command-line-interface
|
||||||
|
#
|
||||||
|
# All commands may have to be prefixed with "sudo" when not running as root.
|
||||||
|
# This will point the home directory shortcut ~ to /root in volume mounts.
|
||||||
|
|
||||||
|
services:
|
||||||
|
photoprism:
|
||||||
|
## Use photoprism/photoprism:preview for testing preview builds:
|
||||||
|
image: photoprism/photoprism:latest
|
||||||
|
## Don't enable automatic restarts until PhotoPrism has been properly configured and tested!
|
||||||
|
## If the service gets stuck in a restart loop, this points to a memory, filesystem, network, or database issue:
|
||||||
|
## https://docs.photoprism.app/getting-started/troubleshooting/#fatal-server-errors
|
||||||
|
# restart: unless-stopped
|
||||||
|
stop_grace_period: 10s
|
||||||
|
depends_on:
|
||||||
|
- mariadb
|
||||||
|
security_opt:
|
||||||
|
- seccomp:unconfined
|
||||||
|
- apparmor:unconfined
|
||||||
|
## Server port mapping in the format "Host:Container". To use a different port, change the host port on
|
||||||
|
## the left-hand side and keep the container port, e.g. "80:2342" (for HTTP) or "443:2342 (for HTTPS):
|
||||||
|
ports:
|
||||||
|
- "2342:2342"
|
||||||
|
## Before you start the service, please check the following config options (and change them as needed):
|
||||||
|
## https://docs.photoprism.app/getting-started/config-options/
|
||||||
|
environment:
|
||||||
|
PHOTOPRISM_ADMIN_USER: "admin" # admin login username
|
||||||
|
PHOTOPRISM_ADMIN_PASSWORD: "5bp3ptdBGM173t" # initial admin password (8-72 characters)
|
||||||
|
PHOTOPRISM_AUTH_MODE: "password" # authentication mode (public, password)
|
||||||
|
PHOTOPRISM_SITE_URL: "http://localhost:2342/" # server URL in the format "http(s)://domain.name(:port)/(path)"
|
||||||
|
PHOTOPRISM_DISABLE_TLS: "false" # disables HTTPS/TLS even if the site URL starts with https:// and a certificate is available
|
||||||
|
PHOTOPRISM_DEFAULT_TLS: "true" # defaults to a self-signed HTTPS/TLS certificate if no other certificate is available
|
||||||
|
PHOTOPRISM_ORIGINALS_LIMIT: 5000 # file size limit for originals in MB (increase for high-res video)
|
||||||
|
PHOTOPRISM_HTTP_COMPRESSION: "gzip" # improves transfer speed and bandwidth utilization (none or gzip)
|
||||||
|
PHOTOPRISM_LOG_LEVEL: "info" # log level: trace, debug, info, warning, error, fatal, or panic
|
||||||
|
PHOTOPRISM_READONLY: "false" # do not modify originals directory (reduced functionality)
|
||||||
|
PHOTOPRISM_EXPERIMENTAL: "false" # enables experimental features
|
||||||
|
PHOTOPRISM_DISABLE_CHOWN: "false" # disables updating storage permissions via chmod and chown on startup
|
||||||
|
PHOTOPRISM_DISABLE_WEBDAV: "false" # disables built-in WebDAV server
|
||||||
|
PHOTOPRISM_DISABLE_SETTINGS: "false" # disables settings UI and API
|
||||||
|
PHOTOPRISM_DISABLE_TENSORFLOW: "false" # disables all features depending on TensorFlow
|
||||||
|
PHOTOPRISM_DISABLE_FACES: "false" # disables face detection and recognition (requires TensorFlow)
|
||||||
|
PHOTOPRISM_DISABLE_CLASSIFICATION: "false" # disables image classification (requires TensorFlow)
|
||||||
|
PHOTOPRISM_DISABLE_VECTORS: "false" # disables vector graphics support
|
||||||
|
PHOTOPRISM_DISABLE_RAW: "false" # disables indexing and conversion of RAW images
|
||||||
|
PHOTOPRISM_RAW_PRESETS: "false" # enables applying user presets when converting RAW images (reduces performance)
|
||||||
|
PHOTOPRISM_SIDECAR_YAML: "true" # creates YAML sidecar files to back up picture metadata
|
||||||
|
PHOTOPRISM_BACKUP_ALBUMS: "true" # creates YAML files to back up album metadata
|
||||||
|
PHOTOPRISM_BACKUP_DATABASE: "true" # creates regular backups based on the configured schedule
|
||||||
|
PHOTOPRISM_BACKUP_SCHEDULE: "daily" # backup SCHEDULE in cron format (e.g. "0 12 * * *" for daily at noon) or at a random time (daily, weekly)
|
||||||
|
PHOTOPRISM_INDEX_SCHEDULE: "" # indexing SCHEDULE in cron format (e.g. "@every 3h" for every 3 hours; "" to disable)
|
||||||
|
PHOTOPRISM_AUTO_INDEX: 300 # delay before automatically indexing files in SECONDS when uploading via WebDAV (-1 to disable)
|
||||||
|
PHOTOPRISM_AUTO_IMPORT: -1 # delay before automatically importing files in SECONDS when uploading via WebDAV (-1 to disable)
|
||||||
|
PHOTOPRISM_DETECT_NSFW: "false" # automatically flags photos as private that MAY be offensive (requires TensorFlow)
|
||||||
|
PHOTOPRISM_UPLOAD_NSFW: "true" # allows uploads that MAY be offensive (no effect without TensorFlow)
|
||||||
|
# PHOTOPRISM_DATABASE_DRIVER: "sqlite" # SQLite is an embedded database that does not require a separate database server
|
||||||
|
PHOTOPRISM_DATABASE_DRIVER: "mysql" # MariaDB 10.5.12+ (MySQL successor) offers significantly better performance compared to SQLite
|
||||||
|
PHOTOPRISM_DATABASE_SERVER: "mariadb:3306" # MariaDB database server (hostname:port)
|
||||||
|
PHOTOPRISM_DATABASE_NAME: "photoprism" # MariaDB database schema name
|
||||||
|
PHOTOPRISM_DATABASE_USER: "photoprism" # MariaDB database user name
|
||||||
|
PHOTOPRISM_DATABASE_PASSWORD: "insecure" # MariaDB database user password
|
||||||
|
PHOTOPRISM_SITE_CAPTION: "AI-Powered Photos App"
|
||||||
|
PHOTOPRISM_SITE_DESCRIPTION: "" # meta site description
|
||||||
|
PHOTOPRISM_SITE_AUTHOR: "" # meta site author
|
||||||
|
## Video Transcoding (https://docs.photoprism.app/getting-started/advanced/transcoding/):
|
||||||
|
PHOTOPRISM_FFMPEG_ENCODER: "intel" # H.264/AVC encoder (software, intel, nvidia, apple, raspberry, or vaapi)
|
||||||
|
# PHOTOPRISM_FFMPEG_SIZE: "1920" # video size limit in pixels (720-7680) (default: 3840)
|
||||||
|
# PHOTOPRISM_FFMPEG_BITRATE: "32" # video bitrate limit in Mbit/s (default: 50)
|
||||||
|
## Run/install on first startup (options: update https gpu ffmpeg tensorflow davfs clitools clean):
|
||||||
|
# PHOTOPRISM_INIT: "https gpu tensorflow"
|
||||||
|
## Run as a non-root user after initialization (supported: 0, 33, 50-99, 500-600, and 900-1200):
|
||||||
|
# PHOTOPRISM_UID: 1000
|
||||||
|
# PHOTOPRISM_GID: 1000
|
||||||
|
# PHOTOPRISM_UMASK: 0000
|
||||||
|
## Start as non-root user before initialization (supported: 0, 33, 50-99, 500-600, and 900-1200):
|
||||||
|
# user: "1000:1000"
|
||||||
|
## Share hardware devices with FFmpeg and TensorFlow (optional):
|
||||||
|
devices:
|
||||||
|
- "/dev/dri:/dev/dri" # Intel QSV
|
||||||
|
# - "/dev/nvidia0:/dev/nvidia0" # Nvidia CUDA
|
||||||
|
# - "/dev/nvidiactl:/dev/nvidiactl"
|
||||||
|
# - "/dev/nvidia-modeset:/dev/nvidia-modeset"
|
||||||
|
# - "/dev/nvidia-nvswitchctl:/dev/nvidia-nvswitchctl"
|
||||||
|
# - "/dev/nvidia-uvm:/dev/nvidia-uvm"
|
||||||
|
# - "/dev/nvidia-uvm-tools:/dev/nvidia-uvm-tools"
|
||||||
|
# - "/dev/video11:/dev/video11" # Video4Linux Video Encode Device (h264_v4l2m2m)
|
||||||
|
working_dir: "/photoprism" # do not change or remove
|
||||||
|
## Storage Folders: "~" is a shortcut for your home directory, "." for the current directory
|
||||||
|
volumes:
|
||||||
|
# "/host/folder:/photoprism/folder" # Example
|
||||||
|
- "/home/photoprism/Pictures:/photoprism/originals" # Original media files (DO NOT REMOVE)
|
||||||
|
# - "/example/family:/photoprism/originals/family" # *Additional* media folders can be mounted like this
|
||||||
|
- "/home/photoprism/Import:/photoprism/import" # *Optional* base folder from which files can be imported to originals
|
||||||
|
- "/home/photoprism/storage:/photoprism/storage" # *Writable* storage folder for cache, database, and sidecar files (DO NOT REMOVE)
|
||||||
|
|
||||||
|
## MariaDB Database Server (recommended)
|
||||||
|
## see https://docs.photoprism.app/getting-started/faq/#should-i-use-sqlite-mariadb-or-mysql
|
||||||
|
mariadb:
|
||||||
|
image: mariadb:11
|
||||||
|
## If MariaDB gets stuck in a restart loop, this points to a memory or filesystem issue:
|
||||||
|
## https://docs.photoprism.app/getting-started/troubleshooting/#fatal-server-errors
|
||||||
|
restart: unless-stopped
|
||||||
|
stop_grace_period: 5s
|
||||||
|
security_opt: # see https://github.com/MariaDB/mariadb-docker/issues/434#issuecomment-1136151239
|
||||||
|
- seccomp:unconfined
|
||||||
|
- apparmor:unconfined
|
||||||
|
command: --innodb-buffer-pool-size=512M --transaction-isolation=READ-COMMITTED --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --max-connections=512 --innodb-rollback-on-timeout=OFF --innodb-lock-wait-timeout=120
|
||||||
|
## Never store database files on an unreliable device such as a USB flash drive, an SD card, or a shared network folder:
|
||||||
|
volumes:
|
||||||
|
- "/home/photoprism/database:/var/lib/mysql" # DO NOT REMOVE
|
||||||
|
environment:
|
||||||
|
MARIADB_AUTO_UPGRADE: "1"
|
||||||
|
MARIADB_INITDB_SKIP_TZINFO: "1"
|
||||||
|
MARIADB_DATABASE: "photoprism"
|
||||||
|
MARIADB_USER: "photoprism"
|
||||||
|
MARIADB_PASSWORD: "insecure"
|
||||||
|
MARIADB_ROOT_PASSWORD: "insecure"
|
||||||
|
|
||||||
|
## Watchtower upgrades services automatically (optional)
|
||||||
|
## see https://docs.photoprism.app/getting-started/updates/#watchtower
|
||||||
|
## activate via "COMPOSE_PROFILES=update docker compose up -d"
|
||||||
|
watchtower:
|
||||||
|
restart: unless-stopped
|
||||||
|
image: containrrr/watchtower
|
||||||
|
profiles: ["update"]
|
||||||
|
environment:
|
||||||
|
WATCHTOWER_CLEANUP: "true"
|
||||||
|
WATCHTOWER_POLL_INTERVAL: 7200 # checks for updates every two hours
|
||||||
|
volumes:
|
||||||
|
- "/var/run/docker.sock:/var/run/docker.sock"
|
||||||
|
- "~/.docker/config.json:/config.json" # optional, for authentication if you have a Docker Hub account
|
||||||
31
containers/docker/pinepods/compose.yaml
Normal file
31
containers/docker/pinepods/compose.yaml
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
name: pinepods
|
||||||
|
|
||||||
|
services:
|
||||||
|
db:
|
||||||
|
image: postgres:latest
|
||||||
|
env_file: '.env'
|
||||||
|
volumes:
|
||||||
|
- /home/pinepods/pinepods/pgdata:/var/lib/postgresql/data
|
||||||
|
# Exposing the postgres database port is dumb.
|
||||||
|
# ports:
|
||||||
|
# - "5432:5432"
|
||||||
|
restart: always
|
||||||
|
|
||||||
|
valkey:
|
||||||
|
image: valkey/valkey:8-alpine
|
||||||
|
# Exposing a nosql database is expecially dumb.
|
||||||
|
# ports:
|
||||||
|
# - "6379:6379"
|
||||||
|
|
||||||
|
pinepods:
|
||||||
|
image: madeofpendletonwool/pinepods:latest
|
||||||
|
ports:
|
||||||
|
- "8040:8040"
|
||||||
|
env_file: '.env'
|
||||||
|
volumes:
|
||||||
|
# Mount the download and backup locations on the server
|
||||||
|
- /home/pinepods/pinepods/downloads:/opt/pinepods/downloads
|
||||||
|
- /home/pinepods/pinepods/backups:/opt/pinepods/backups
|
||||||
|
depends_on:
|
||||||
|
- db
|
||||||
|
- valkey
|
||||||
42
containers/docker/qbittorrent/docker-compose.yml
Normal file
42
containers/docker/qbittorrent/docker-compose.yml
Normal file
|
|
@ -0,0 +1,42 @@
|
||||||
|
# https://github.com/nickkjolsing/dockerMullvadVPN
|
||||||
|
|
||||||
|
name: torrent
|
||||||
|
|
||||||
|
services:
|
||||||
|
openvpn-client:
|
||||||
|
image: ghcr.io/wfg/openvpn-client # Image on Docker. Shoutout to ghcr.io
|
||||||
|
container_name: openvpn-client
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN # Needs to be here
|
||||||
|
environment:
|
||||||
|
- KILL_SWITCH=on # Turns off internet access if the VPN connection drops
|
||||||
|
- SUBNETS=192.168.0.0/24,192.168.1.0/24
|
||||||
|
devices:
|
||||||
|
- /dev/net/tun
|
||||||
|
volumes:
|
||||||
|
- /home/jellyfin/mullvad_config_linux_nl_ams:/data/vpn
|
||||||
|
ports:
|
||||||
|
- 8082:8082
|
||||||
|
- 6881:6881
|
||||||
|
- 6881:6881/udp
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
qbittorrent:
|
||||||
|
image: lscr.io/linuxserver/qbittorrent:latest
|
||||||
|
container_name: qbittorrent
|
||||||
|
environment:
|
||||||
|
- PUID=1003
|
||||||
|
- PGID=1003
|
||||||
|
- TZ=Europe/Amsterdam
|
||||||
|
- WEBUI_PORT=8082
|
||||||
|
- TORRENTING_PORT=6881
|
||||||
|
volumes:
|
||||||
|
- /home/jellyfin/qbitorrent/appdata:/config
|
||||||
|
- /home/jellyfin/qbitorrent/downloads:/downloads #optional
|
||||||
|
- /home/jellyfin/jellyfin/media:/media
|
||||||
|
# ports:
|
||||||
|
# - 8082:8082
|
||||||
|
# - 6881:6881
|
||||||
|
# - 6881:6881/udp
|
||||||
|
network_mode: container:openvpn-client # This uses the port setting of the openvpn
|
||||||
|
restart: unless-stopped
|
||||||
24
containers/docker/webtop/compose.yaml
Normal file
24
containers/docker/webtop/compose.yaml
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
services:
|
||||||
|
webtop:
|
||||||
|
image: lscr.io/linuxserver/webtop:fedora-xfce
|
||||||
|
container_name: webtop
|
||||||
|
security_opt:
|
||||||
|
- seccomp:unconfined #optional
|
||||||
|
environment:
|
||||||
|
- PUID=1000
|
||||||
|
- PGID=1000
|
||||||
|
- TZ=Europe/Amsterdam
|
||||||
|
- SUBFOLDER=/ #optional
|
||||||
|
- TITLE=Webtop #optional
|
||||||
|
- CUSTOM_USER=moni
|
||||||
|
- PASSWORD=Pd5oBZ3vN31wCkj8
|
||||||
|
volumes:
|
||||||
|
- /home/moni/webtop/data:/config
|
||||||
|
- /var/run/docker.sock:/var/run/docker.sock #optional
|
||||||
|
ports:
|
||||||
|
- 3000:3000
|
||||||
|
- 3001:3001
|
||||||
|
devices:
|
||||||
|
- /dev/dri:/dev/dri #optional
|
||||||
|
shm_size: "1gb" #optional
|
||||||
|
restart: unless-stopped
|
||||||
18
containers/docker/windows/compose.yaml
Normal file
18
containers/docker/windows/compose.yaml
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
services:
|
||||||
|
windows:
|
||||||
|
image: dockurr/windows
|
||||||
|
container_name: windows
|
||||||
|
environment:
|
||||||
|
VERSION: "11"
|
||||||
|
devices:
|
||||||
|
- /dev/kvm
|
||||||
|
- /dev/net/tun
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
ports:
|
||||||
|
- 8006:8006
|
||||||
|
- 3389:3389/tcp
|
||||||
|
- 3389:3389/udp
|
||||||
|
stop_grace_period: 2m
|
||||||
|
volumes:
|
||||||
|
- /var/win:/storage
|
||||||
31
containers/docker/wordpress/docker-compose.yml
Normal file
31
containers/docker/wordpress/docker-compose.yml
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
version: '3.1'
|
||||||
|
|
||||||
|
services:
|
||||||
|
|
||||||
|
wordpress:
|
||||||
|
image: wordpress
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- 8080:80
|
||||||
|
environment:
|
||||||
|
WORDPRESS_DB_HOST: db
|
||||||
|
WORDPRESS_DB_USER: exampleuser
|
||||||
|
WORDPRESS_DB_PASSWORD: examplepass
|
||||||
|
WORDPRESS_DB_NAME: exampledb
|
||||||
|
volumes:
|
||||||
|
- wordpress:/var/www/html
|
||||||
|
|
||||||
|
db:
|
||||||
|
image: mysql:8.0
|
||||||
|
restart: always
|
||||||
|
environment:
|
||||||
|
MYSQL_DATABASE: exampledb
|
||||||
|
MYSQL_USER: exampleuser
|
||||||
|
MYSQL_PASSWORD: examplepass
|
||||||
|
MYSQL_RANDOM_ROOT_PASSWORD: '1'
|
||||||
|
volumes:
|
||||||
|
- db:/var/lib/mysql
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
wordpress:
|
||||||
|
db:
|
||||||
86
homeservers/Backup.md
Normal file
86
homeservers/Backup.md
Normal file
|
|
@ -0,0 +1,86 @@
|
||||||
|
# Syncthing
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sudo systemctl restart syncthing@photoprism.service
|
||||||
|
```
|
||||||
|
|
||||||
|
Admin interface: http://192.168.1.10:8384/
|
||||||
|
|
||||||
|
I have a user called `photoprism` and the password is in Bitwarden
|
||||||
|
|
||||||
|
# Borg Backup to Hetzner Storage Box
|
||||||
|
|
||||||
|
For backup I use [Borg](https://borgbackup.readthedocs.io/). I followed the steps described in this community article:
|
||||||
|
|
||||||
|
* [Install and Configure BorgBackup](https://community.hetzner.com/tutorials/install-and-configure-borgbackup)
|
||||||
|
|
||||||
|
We have two backups in the storage box:
|
||||||
|
|
||||||
|
* `/./borgbackup/photoprism`
|
||||||
|
* `/./borgbackup/nextcloud`
|
||||||
|
|
||||||
|
## Photoprism backup
|
||||||
|
|
||||||
|
This is what I did for Photoprism
|
||||||
|
|
||||||
|
The init script (which is only done once, be careful it will overwrite!):
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# (As root)
|
||||||
|
export BORG_RSH='ssh -i /root/.ssh/id_ed25519'
|
||||||
|
export BORG_PASSPHRASE="<I GENERATED A PASSPHRASE>"
|
||||||
|
borg init --encryption=repokey ssh://u388089@u388089.your-storagebox.de:23/./borgbackup/photoprism
|
||||||
|
```
|
||||||
|
|
||||||
|
It outputs a key which I put in Bitwarden (you need it to decrypt the backup).
|
||||||
|
|
||||||
|
To make a manual backup:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
export BORG_RSH='ssh -i /root/.ssh/id_ed25519'
|
||||||
|
export BORG_PASSPHRASE="<SEE BITWARDEN>"
|
||||||
|
borg create --stats ssh://u388089@u388089.your-storagebox.de:23/./borgbackup/photoprism::2024_11_24 /home/photoprism/Import/ /home/photoprism/Pictures/
|
||||||
|
```
|
||||||
|
|
||||||
|
The above can be found in Bitwarden, look for "Hetzner Borg Backup Script for Photoprism"
|
||||||
|
|
||||||
|
I also created a bash script in `/usr/local/bin/photoprism_backup.sh` (as mentioned in the article).
|
||||||
|
|
||||||
|
You can find it here in this repo:
|
||||||
|
|
||||||
|
* [photoprism_backup.sh](./scripts/photoprism_backup.sh)
|
||||||
|
|
||||||
|
## Nextcloud backup
|
||||||
|
|
||||||
|
Ok, this is confusing but Nextcloud uses Borgbackup internally. Go to the [aio interface](http://192.168.1.10:8080/) and you'll notice there are backups to:
|
||||||
|
|
||||||
|
```
|
||||||
|
/root/nextcloudbackup
|
||||||
|
```
|
||||||
|
|
||||||
|
So nextcloud keeps making backups to this directory. Not ideal (TODO: I gotta find a solution for this).
|
||||||
|
|
||||||
|
But I can rclone the data:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
rclone sync -v /root/nextcloudbackup/ hetzner:/cloned_borgbackup/nextcloud
|
||||||
|
```
|
||||||
|
|
||||||
|
For this I also created a script and placed it in `/usr/local/bin`
|
||||||
|
|
||||||
|
[nextcloud_backup.sh](./scripts/nextcloud_backup.sh)
|
||||||
|
|
||||||
|
# Automatic backup
|
||||||
|
|
||||||
|
* [cloud_backup.service](./scripts/cloud_backup.service)
|
||||||
|
* [cloud_backup.timer](./scripts/cloud_backup.timer)
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cp -v cloud_backup.service /etc/systemd/system/
|
||||||
|
cp -v cloud_backup.timer /etc/systemd/system/
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
systemctl enable cloud_backup.service
|
||||||
|
systemctl enable cloud_backup.timer
|
||||||
|
```
|
||||||
15
homeservers/Immich.md
Normal file
15
homeservers/Immich.md
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
Compose file:
|
||||||
|
|
||||||
|
[compose.yaml](../containers/docker/immich/compose.yaml)
|
||||||
|
|
||||||
|
For immich I added a dedicated user:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sudo useradd immich
|
||||||
|
```
|
||||||
|
|
||||||
|
This creates a `/home/immich` directory. We neet to run `cat /etc/passwd` to get the id of the user.
|
||||||
|
|
||||||
|
Unfortunately, I have not been able to use the user id for the containers, so everything is written as root. I'm still using `/home/immich`, but all the files are written there as root.
|
||||||
|
|
||||||
|
Eventually I might use podman but I don't know enough about it yet to get comfortable with it.
|
||||||
21
homeservers/Jellyfin.md
Normal file
21
homeservers/Jellyfin.md
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
# Jellyfin
|
||||||
|
|
||||||
|
Compose file:
|
||||||
|
|
||||||
|
* [compose.yaml](../containers/docker/jellyfin/compose.yaml)
|
||||||
|
|
||||||
|
I made a user names `jellyfin` and put its uid:guid in the compose file. All the files are in the home directory of that user `/home/jellyfin`.
|
||||||
|
|
||||||
|
The user also has the authorized_keys so I can do this:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
ssh jellyfin@192.168.1.10
|
||||||
|
```
|
||||||
|
|
||||||
|
and proceed to add the directories for the media files:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd jellyfin/media/tvshows/
|
||||||
|
mkdir "Show I Want To Watch (2020)"
|
||||||
|
mkdir "Season 01"
|
||||||
|
```
|
||||||
22
homeservers/Nextcloud.md
Normal file
22
homeservers/Nextcloud.md
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
# Nextcloud
|
||||||
|
|
||||||
|
I have a dedicated user:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sudo useradd nextcloud
|
||||||
|
```
|
||||||
|
|
||||||
|
I'm running the Nextcloud All-In-One container. In order to make it easy I have a [stop](../containers/docker/nextcloud/stop.sh) and [restart](../containers/docker/nextcloud/stop.sh) script.
|
||||||
|
|
||||||
|
Nextcloud runs on
|
||||||
|
|
||||||
|
* https://nextcloud.allisonandmoni.online/
|
||||||
|
|
||||||
|
When you first start it up, you need to first disable the SSL from within the container:
|
||||||
|
|
||||||
|
* [Ugly hack README](../containers/docker/nextcloud/README.md)
|
||||||
|
|
||||||
|
And then go to:
|
||||||
|
|
||||||
|
* http://192.168.1.11:8080
|
||||||
|
|
||||||
43
homeservers/PhotoPrism.md
Normal file
43
homeservers/PhotoPrism.md
Normal file
|
|
@ -0,0 +1,43 @@
|
||||||
|
# Photoprism
|
||||||
|
|
||||||
|
What we are really running on this machine is Photoprism using this [docker-compose](../containers/docker/photoprism/docker-compose.yml) file, like this:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd ~/projects/stuff/containers/docker/photoprism
|
||||||
|
docker compose up --detach
|
||||||
|
```
|
||||||
|
|
||||||
|
To stop it:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
docker compose down
|
||||||
|
```
|
||||||
|
|
||||||
|
To update it:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
docker compose pull
|
||||||
|
```
|
||||||
|
|
||||||
|
Photoprism is running on: https://photos.allisonandmoni.online/
|
||||||
|
|
||||||
|
I have set up a Systemd service and timer to automatically run the import once an hour. They can be found:
|
||||||
|
|
||||||
|
* [photoprism_import.service](./scripts/photoprism_import.service)
|
||||||
|
* [photoprism_import_timer.service](./scripts/photoprism_import_timer.service)
|
||||||
|
|
||||||
|
To install:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cp -v photoprism_import.service /etc/systemd/system/
|
||||||
|
cp -v photoprism_import.timer /etc/systemd/system/
|
||||||
|
```
|
||||||
|
|
||||||
|
Enable:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
systemctl enable photoprism_import.service
|
||||||
|
systemctl enable photoprism_import.timer
|
||||||
|
```
|
||||||
|
|
||||||
|
In the `compose.yaml` file you'll notice I have the files stored in `/home/photoprism`. That's because I thought I could run it with podman as a dedicated user. I abandoned that idea and am now running it in Docker instead. The directories `/home/photoprism/Pictures` and `/home/photoprism/Import` are all owned by `root`
|
||||||
43
homeservers/README.md
Normal file
43
homeservers/README.md
Normal file
|
|
@ -0,0 +1,43 @@
|
||||||
|
# General
|
||||||
|
|
||||||
|
This file describes the setup of the servers I have running at home, with some instructions.
|
||||||
|
|
||||||
|
At the moment I'm running:
|
||||||
|
|
||||||
|
* Raspberry PI4 8GB: `ssh moni@192.168.1.108`
|
||||||
|
* Lenovo Thinkcentre M900, i5-6500T: `ssh moni@192.168.1.10`, 8GB RAM, 500G SSD
|
||||||
|
* Lenovo Thinkcentre M900, i5-6500T: `ssh moni@192.168.1.11`, 16GB RAM, 126G NVME + 1TB SSD
|
||||||
|
|
||||||
|
For Raspberry PI, see [RPI](./RPI.md). That is where the routing happens.
|
||||||
|
For Lenovo Thinkcenter, see below. That is where all the action happens.
|
||||||
|
|
||||||
|
# Lenovo Thinkcentre M900, i5-6500T
|
||||||
|
|
||||||
|
I have two Lenovo Thinkcentres, one with 8GB of ram and 500GB. The other with 16GB of ram and an NVME of 128GB and an SSD of 1GB.
|
||||||
|
|
||||||
|
The idea is to have one in production for all my servers running on `allisonandmoni.online` domain and the other is to play with.
|
||||||
|
|
||||||
|
Right now my OS of choice is AlmaLinux, but that can change with my mood.
|
||||||
|
|
||||||
|
On my production machine I am running Docker.
|
||||||
|
|
||||||
|
You don't need to be root to use it:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
docker ps -a
|
||||||
|
```
|
||||||
|
|
||||||
|
Right now I'm running the following containers:
|
||||||
|
|
||||||
|
* [PhotoPrism](./PhotoPrism.md), reachable by https://photos.allisonandmoni.online
|
||||||
|
* [JellyFin](./Jellyfin.md), reachable by https://jellyfin.allisonandmoni.online/
|
||||||
|
* [Nextcloud](./Nextcloud.md), reachable by https://nextcloud.allisonandmoni.online/
|
||||||
|
* [qBittorrent](./qBittorrent.md), reachable by https://qbittorrent.allisonandmoni.online/
|
||||||
|
* [Immich](./Immich.md), reachable by https://photos2.allisonandmoni.online
|
||||||
|
|
||||||
|
# Backup and restore
|
||||||
|
|
||||||
|
I have backup and restore scripts and instructions. See here:
|
||||||
|
|
||||||
|
* [Backup](./Backup.md)
|
||||||
|
* [Restore](./Restore.md)
|
||||||
53
homeservers/RPI.md
Normal file
53
homeservers/RPI.md
Normal file
|
|
@ -0,0 +1,53 @@
|
||||||
|
# Raspberry PI
|
||||||
|
|
||||||
|
On the Raspberry PI I am running FreeBSD with Bastille which currently has 1 jail:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sudo bastille list
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
ID IP Address Hostname Path
|
||||||
|
1 192.168.1.200 caddy /usr/local/bastille/jails/caddy/root
|
||||||
|
```
|
||||||
|
|
||||||
|
The ip address 192.168.1.200 is chosen deliberately. On my router (192.168.1.1) I have the following port mappings:
|
||||||
|
|
||||||
|
* 32222 to 192.168.1.108:22 (ssh) - Maps to the Raspberry PI 8 for external access
|
||||||
|
* 80 to 192.168.1.200:80 (http) - Maps to the Caddy jail
|
||||||
|
* 443 to 192.168.1.200:443 (https) - Maps to the Caddy jail
|
||||||
|
* 3478 to 192.168.1.10 (Nextcloud talk) - This is a direct connection to the Lenovo machine.
|
||||||
|
|
||||||
|
To view the Caddy setup in the Caddy jail, run this:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sudo -i
|
||||||
|
bastille console caddy
|
||||||
|
cat /usr/local/etc/caddy/Caddyfile
|
||||||
|
```
|
||||||
|
|
||||||
|
Result:
|
||||||
|
|
||||||
|
```
|
||||||
|
www.allisonandmoni.online {
|
||||||
|
reverse_proxy 192.168.1.10:8081
|
||||||
|
}
|
||||||
|
|
||||||
|
photos.allisonandmoni.online {
|
||||||
|
reverse_proxy 192.168.1.10:2342
|
||||||
|
}
|
||||||
|
|
||||||
|
nextcloud.allisonandmoni.online {
|
||||||
|
reverse_proxy 192.168.1.10:11000
|
||||||
|
}
|
||||||
|
|
||||||
|
jellyfin.allisonandmoni.online {
|
||||||
|
reverse_proxy 192.168.1.10:8096
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
As you can see I have setup reverse proxies for www, photos and nextcloud for allisonandmoni.online.
|
||||||
|
|
||||||
|
The instructions for the caddy setup on my RPI4 can be found in this file:
|
||||||
|
|
||||||
|
* [Caddy on FreeBSD](../os/FreeBSD/Bastille.md#caddy)
|
||||||
62
homeservers/Restore.md
Normal file
62
homeservers/Restore.md
Normal file
|
|
@ -0,0 +1,62 @@
|
||||||
|
# Restore
|
||||||
|
|
||||||
|
## Borg backup
|
||||||
|
|
||||||
|
First we need to install Borg Backup:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
dnf install -y borgbackup
|
||||||
|
```
|
||||||
|
|
||||||
|
## Hetzner Storage Box
|
||||||
|
|
||||||
|
So I have a Hetzner Storage Box which is reachable by:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
ssh -p23 u388089@u388089.your-storagebox.de
|
||||||
|
```
|
||||||
|
|
||||||
|
There are two subdirectories:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
/borgbackup # This is an actual borg backup of PhotoPrism with history and everything
|
||||||
|
/cloned_borgbackup # This is a rclone of a borg backup of nextcloud that happens on my local machine.
|
||||||
|
```
|
||||||
|
|
||||||
|
First, we're going to talk about restoring PhotoPrism
|
||||||
|
|
||||||
|
## Restore Photoprism
|
||||||
|
|
||||||
|
List:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
export BORG_PASSPHRASE=''
|
||||||
|
borg list ssh://u388089@u388089.your-storagebox.de:23/./borgbackup/photoprism
|
||||||
|
```
|
||||||
|
|
||||||
|
(Optional, to see what you have) Mount a snapshot:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
borg mount ssh://u388089@u388089.your-storagebox.de:23/./borgbackup/photoprism::2025-01-14_04:00 /home/moni/borg_restore/
|
||||||
|
```
|
||||||
|
|
||||||
|
Unmount it:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
borg umount /home/moni/borg_restore/
|
||||||
|
```
|
||||||
|
|
||||||
|
Restore a backup
|
||||||
|
|
||||||
|
You might want to tmux first:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
tmux
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
borg --progress --verbose extract ssh://u388089@u388089.your-storagebox.de:23/./borgbackup/photoprism::2025-01-14_04:00 /home/photoprism/Pictures
|
||||||
|
```
|
||||||
|
|
||||||
|
Giving a local target directory is not supported. The restore will be in a subdirectory. So if you're in `/home/moni` it will restore to `/home/moni/home/photoprism/Pictures`. You can't change this behavior.
|
||||||
|
|
||||||
11
homeservers/qBittorrent.md
Normal file
11
homeservers/qBittorrent.md
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
# qBittorrent
|
||||||
|
|
||||||
|
Compose file:
|
||||||
|
|
||||||
|
* [compose.yaml](../containers/docker/qbittorrent/docker-compose.yml)
|
||||||
|
|
||||||
|
qBittorrent uses the same user as jellyfin which writes everything to `/home/jellyfin`
|
||||||
|
|
||||||
|
I also put the `jellyfin` uid:guid into the qbitorrent container. The files are downloaded to the `bittorrent/downloads` subdirtory of `jellyfin` home.
|
||||||
|
|
||||||
|
When I want to watch something I can copy it from the downloads directory to the media directory of jellyfin.
|
||||||
8
homeservers/scripts/cloud_backup.service
Normal file
8
homeservers/scripts/cloud_backup.service
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
[Unit]
|
||||||
|
Description=Run Cloud Backup
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
ExecStart=/bin/bash /usr/local/bin/cloud_backup.sh
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
3
homeservers/scripts/cloud_backup.sh
Normal file
3
homeservers/scripts/cloud_backup.sh
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
#!/bin/bash
|
||||||
|
/bin/bash /usr/local/bin/photoprism_backup.sh
|
||||||
|
/bin/bash /usr/local/bin/nextcloud_backup.sh
|
||||||
9
homeservers/scripts/cloud_backup.timer
Normal file
9
homeservers/scripts/cloud_backup.timer
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
[Unit]
|
||||||
|
Description=Run PCloud Backup timer
|
||||||
|
|
||||||
|
[Timer]
|
||||||
|
OnCalendar=0/4:00:00
|
||||||
|
Unit=cloud_backup.service
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=timers.target
|
||||||
1
homeservers/scripts/nextcloud_backup.sh
Normal file
1
homeservers/scripts/nextcloud_backup.sh
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
rclone sync /root/nextcloudbackup/ hetzner:/cloned_borgbackup/nextcloud --log-file /var/log/nextcloud_backup.log --log-level INFO
|
||||||
59
homeservers/scripts/photoprism_backup.sh
Normal file
59
homeservers/scripts/photoprism_backup.sh
Normal file
|
|
@ -0,0 +1,59 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
##
|
||||||
|
## Set environment variables
|
||||||
|
##
|
||||||
|
|
||||||
|
## if you don't use the standard SSH key,
|
||||||
|
## you have to specify the path to the key like this
|
||||||
|
export BORG_RSH='ssh -i /root/.ssh/id_ed25519'
|
||||||
|
|
||||||
|
## You can save your borg passphrase in an environment
|
||||||
|
## variable, so you don't need to type it in when using borg
|
||||||
|
export BORG_PASSPHRASE=''
|
||||||
|
|
||||||
|
##
|
||||||
|
## Set some variables
|
||||||
|
##
|
||||||
|
|
||||||
|
LOG='/var/log/photoprism_backup.log'
|
||||||
|
export BACKUP_USER='u388089'
|
||||||
|
export REPOSITORY_DIR='photoprism'
|
||||||
|
|
||||||
|
## Tip: If using with a Backup Space you have to use
|
||||||
|
## 'your-storagebox.de' instead of 'your-backup.de'
|
||||||
|
|
||||||
|
export REPOSITORY="ssh://${BACKUP_USER}@${BACKUP_USER}.your-storagebox.de:23/./borgbackup/${REPOSITORY_DIR}"
|
||||||
|
|
||||||
|
##
|
||||||
|
## Output to a logfile
|
||||||
|
##
|
||||||
|
|
||||||
|
exec > >(tee -i ${LOG})
|
||||||
|
exec 2>&1
|
||||||
|
|
||||||
|
echo "###### Backup started: $(date) ######"
|
||||||
|
|
||||||
|
##
|
||||||
|
## At this place you could perform different tasks
|
||||||
|
## that will take place before the backup, e.g.
|
||||||
|
##
|
||||||
|
## - Create a list of installed software
|
||||||
|
## - Create a database dump
|
||||||
|
##
|
||||||
|
|
||||||
|
##
|
||||||
|
## Transfer the files into the repository.
|
||||||
|
## In this example the folders root, etc,
|
||||||
|
## var/www and home will be saved.
|
||||||
|
## In addition you find a list of excludes that should not
|
||||||
|
## be in a backup and are excluded by default.
|
||||||
|
##
|
||||||
|
|
||||||
|
echo "Transfer files ..."
|
||||||
|
borg create -v --stats \
|
||||||
|
$REPOSITORY::'{now:%Y-%m-%d_%H:%M}' \
|
||||||
|
/home/photoprism/Import/ \
|
||||||
|
/home/photoprism/Pictures/
|
||||||
|
|
||||||
|
echo "###### Backup ended: $(date) ######"
|
||||||
8
homeservers/scripts/photoprism_import.service
Normal file
8
homeservers/scripts/photoprism_import.service
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
[Unit]
|
||||||
|
Description=Run Photoprism Import
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
ExecStart=docker exec photoprism-photoprism-1 photoprism import
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
9
homeservers/scripts/photoprism_import.timer
Normal file
9
homeservers/scripts/photoprism_import.timer
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
[Unit]
|
||||||
|
Description=Run Photoprism Import script hourly
|
||||||
|
|
||||||
|
[Timer]
|
||||||
|
OnCalendar=hourly
|
||||||
|
Unit=photoprism_import.service
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=timers.target
|
||||||
179
laptops/Clevo_Laptop.md
Normal file
179
laptops/Clevo_Laptop.md
Normal file
|
|
@ -0,0 +1,179 @@
|
||||||
|
Clevo laptop which is sold by Tuxedo computers.
|
||||||
|
|
||||||
|
# General
|
||||||
|
|
||||||
|
Set the hostname:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
hostnamectl set-hostname moni-fedora # Fedora
|
||||||
|
hostnamectl set-hostname moni-opensuse # openSUSE
|
||||||
|
```
|
||||||
|
|
||||||
|
Install my favorite packages
|
||||||
|
|
||||||
|
```sh
|
||||||
|
zypper install tmux htop neovim git ncdu podman # openSUSE
|
||||||
|
dnf install tmux htop neovim git ncdu podman # Fedora
|
||||||
|
```
|
||||||
|
|
||||||
|
# Suspend when laptop lid closed
|
||||||
|
|
||||||
|
On openSUSE:
|
||||||
|
|
||||||
|
On Fedora:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
nvim /usr/lib/systemd/logind.conf # Fedora & openSUSE
|
||||||
|
nvim /etc/systemd/logind.conf # Ubuntu
|
||||||
|
```
|
||||||
|
|
||||||
|
Uncomment the lines:
|
||||||
|
|
||||||
|
```conf
|
||||||
|
HandleLidSwitch=suspend
|
||||||
|
HandleLidSwitchExternalPower=suspend
|
||||||
|
HandleLidSwitchDocked=ignore
|
||||||
|
LidSwitchIgnoreInhibited=yes
|
||||||
|
```
|
||||||
|
|
||||||
|
You need to reboot before it takes effect.
|
||||||
|
|
||||||
|
# Wake on suspend
|
||||||
|
|
||||||
|
There is a bug in Linux kernel 6. This article explains this:
|
||||||
|
|
||||||
|
https://bugzilla.redhat.com/show_bug.cgi?id=2162013
|
||||||
|
|
||||||
|
Somehow the touchpad keeps waking up the laptop.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cat /proc/acpi/wakeup
|
||||||
|
```
|
||||||
|
|
||||||
|
Should return:
|
||||||
|
|
||||||
|
```
|
||||||
|
Device S-state Status Sysfs node
|
||||||
|
GPP0 S0 *disabled
|
||||||
|
GPP1 S0 *disabled
|
||||||
|
GP17 S0 *enabled pci:0000:00:08.1
|
||||||
|
```
|
||||||
|
|
||||||
|
## Temporarily disable
|
||||||
|
|
||||||
|
To temporarily disable it do this:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
echo disabled > /sys/bus/i2c/devices/i2c-FTCS1000:00/power/wakeup
|
||||||
|
```
|
||||||
|
|
||||||
|
## Persistent settings
|
||||||
|
|
||||||
|
As root:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
nvim /etc/systemd/system/disable-wakeup.service
|
||||||
|
```
|
||||||
|
|
||||||
|
Contents:
|
||||||
|
|
||||||
|
```
|
||||||
|
[Unit]
|
||||||
|
Description=Disable wakeup triggers
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
ExecStart=/bin/sh -c "echo disabled > /sys/bus/i2c/devices/i2c-FTCS1000\:00/power/wakeup ; echo GP17 > /proc/acpi/wakeup"
|
||||||
|
ExecStop=/bin/sh -c "echo disabled > /sys/bus/i2c/devices/i2c-FTCS1000\:00/power/wakeup ; echo GP17 > /proc/acpi/wakeup"
|
||||||
|
RemainAfterExit=yes
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
```
|
||||||
|
|
||||||
|
Then simply enable and start it:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
systemctl enable disable-wakeup.service
|
||||||
|
systemctl start disable-wakeup.service
|
||||||
|
```
|
||||||
|
|
||||||
|
Reboot the laptop and check to see if the systemd unit works:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
systemctl status disable-wakeup.service
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cat /proc/acpi/wakeup
|
||||||
|
cat /sys/bus/i2c/devices/i2c-FTCS1000\:00/power/wakeup
|
||||||
|
```
|
||||||
|
|
||||||
|
Test it by suspending the laptop. You can also use:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
systemctl suspend -i
|
||||||
|
```
|
||||||
|
|
||||||
|
# Tuxedo control center
|
||||||
|
|
||||||
|
Instructions: https://www.tuxedocomputers.com/en/Add-TUXEDO-software-package-sources.tuxedo
|
||||||
|
|
||||||
|
## On openSUSE
|
||||||
|
|
||||||
|
See instructions on page and then:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
zypper refresh && zypper install tuxedo-control-center
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## On Fedora
|
||||||
|
|
||||||
|
```sh
|
||||||
|
nvim /etc/yum.repos.d/tuxedo.repo
|
||||||
|
```
|
||||||
|
|
||||||
|
Contents:
|
||||||
|
|
||||||
|
```
|
||||||
|
[tuxedo]
|
||||||
|
name=tuxedo
|
||||||
|
baseurl=https://rpm.tuxedocomputers.com/fedora/40/x86_64/base
|
||||||
|
enabled=1
|
||||||
|
gpgcheck=1
|
||||||
|
gpgkey=https://rpm.tuxedocomputers.com/fedora/40/0x54840598.pub.asc
|
||||||
|
skip_if_unavailable=False
|
||||||
|
```
|
||||||
|
|
||||||
|
Get the key:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
wget https://rpm.tuxedocomputers.com/fedora/40/0x54840598.pub.asc
|
||||||
|
```
|
||||||
|
|
||||||
|
And install it:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
rpm --import ./0x54840598.pub.asc
|
||||||
|
```
|
||||||
|
|
||||||
|
Now install the control center:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
dnf update
|
||||||
|
dnf install tuxedo-control-center
|
||||||
|
```
|
||||||
|
|
||||||
|
You need to reboot before it takes effect.
|
||||||
|
|
||||||
|
# Virtualization
|
||||||
|
|
||||||
|
```sh
|
||||||
|
dnf install @virtualization
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
systemctl enable libvirtd
|
||||||
|
systemctl start libvirtd
|
||||||
|
```
|
||||||
88
laptops/Ideapad_510.md
Normal file
88
laptops/Ideapad_510.md
Normal file
|
|
@ -0,0 +1,88 @@
|
||||||
|
# Lenovo ideapad 510
|
||||||
|
|
||||||
|
## Prevent suspend when lid closed
|
||||||
|
|
||||||
|
Add a new file:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
nvim /etc/systemd/logind.conf.d/no-suspend-on-lid.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
Add this:
|
||||||
|
|
||||||
|
```
|
||||||
|
[Login]
|
||||||
|
HandleLidSwitch=ignore
|
||||||
|
HandleLidSwitchExternalPower=ignore
|
||||||
|
HandleLidSwitchDocked=ignore
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
systemctl restart systemd-logind
|
||||||
|
```
|
||||||
|
|
||||||
|
## Wake-on-lan
|
||||||
|
|
||||||
|
See my network interfaces:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
ip link show
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
|
||||||
|
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
|
||||||
|
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
|
||||||
|
link/ether 54:e1:ad:9d:a8:74 brd ff:ff:ff:ff:ff:ff
|
||||||
|
3: wlp2s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DORMANT group default qlen 1000
|
||||||
|
link/ether 52:37:c4:2c:79:38 brd ff:ff:ff:ff:ff:ff permaddr 3c:f8:62:b3:7f:81
|
||||||
|
```
|
||||||
|
|
||||||
|
Enable for the ethernet
|
||||||
|
|
||||||
|
```sh
|
||||||
|
ethtool -s enp1s0 wol g
|
||||||
|
```
|
||||||
|
|
||||||
|
Make it pemanent. Create a systemd unit:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
nvim /etc/systemd/system/wol.service
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
[Unit]
|
||||||
|
Description=Wake-on-LAN
|
||||||
|
Requires=network.target
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
ExecStart=/usr/sbin/ethtool -s enp1s0 wol g
|
||||||
|
Type=oneshot
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
systemctl enable wol.service
|
||||||
|
```
|
||||||
|
|
||||||
|
Check it:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
systemctl start wol.service
|
||||||
|
systemctl status wol.service
|
||||||
|
```
|
||||||
|
|
||||||
|
Suspend the laptop:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
systemctl suspend
|
||||||
|
```
|
||||||
|
|
||||||
|
Wake it up again from another machine:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
wakeonlan 54:e1:ad:9d:a8:74
|
||||||
|
```
|
||||||
2
laptops/Laptops.md
Normal file
2
laptops/Laptops.md
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
* [Clevo Laptop](Clevo_Laptop.md)
|
||||||
|
* [Lenovo ideapad 510](Ideapad_510.md)
|
||||||
90
os/AlmaLinux/AlmaLinux.md
Normal file
90
os/AlmaLinux/AlmaLinux.md
Normal file
|
|
@ -0,0 +1,90 @@
|
||||||
|
# General
|
||||||
|
|
||||||
|
Remove the web console and all the other stuff around it:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
dnf -y remove cockpit*
|
||||||
|
firewall-cmd --permanent --remove-service=cockpit
|
||||||
|
firewall-cmd --reload
|
||||||
|
firewall-cmd --list-all
|
||||||
|
```
|
||||||
|
|
||||||
|
Update
|
||||||
|
|
||||||
|
```sh
|
||||||
|
dnf update
|
||||||
|
```
|
||||||
|
|
||||||
|
Set hostname
|
||||||
|
|
||||||
|
```sh
|
||||||
|
hostnamectl set-hostname moni-alma
|
||||||
|
```
|
||||||
|
|
||||||
|
Set up EPEL, follow the instructions:
|
||||||
|
|
||||||
|
* https://docs.fedoraproject.org/en-US/epel/getting-started/
|
||||||
|
|
||||||
|
And then install my favorites:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
dnf install -y tmux htop ncdu neovim git
|
||||||
|
```
|
||||||
|
|
||||||
|
Install docker:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
dnf -y install dnf-plugins-core
|
||||||
|
dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
|
||||||
|
dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
||||||
|
systemctl enable --now docker
|
||||||
|
```
|
||||||
|
|
||||||
|
Add the `moni` to the docker group:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
usermod -aG docker moni
|
||||||
|
```
|
||||||
|
|
||||||
|
You need to log out and log back in and then test it:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# run without sudo
|
||||||
|
docker run -it --rm -p 8080:80 httpd:2.4
|
||||||
|
```
|
||||||
|
|
||||||
|
It will run in the foreground because we didn't pass `-d`.
|
||||||
|
|
||||||
|
Open your browser to:
|
||||||
|
|
||||||
|
* http://192.168.1.11:8080
|
||||||
|
* or http://192.168.1.10:8080 for the 8GB server
|
||||||
|
|
||||||
|
You can stop the container with CTRL+C. It should clean itself up (`--rm`).
|
||||||
|
|
||||||
|
Cleanup:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
docker image prune --all --force
|
||||||
|
```
|
||||||
|
|
||||||
|
# SSH
|
||||||
|
|
||||||
|
```sh
|
||||||
|
nvim /etc/ssh/sshd_config
|
||||||
|
```
|
||||||
|
|
||||||
|
Uncomment/change these settings:
|
||||||
|
|
||||||
|
```conf
|
||||||
|
PermitRootLogin no
|
||||||
|
# PubkeyAuthentication yes <-- This is the detault, so you don't need to change this
|
||||||
|
PasswordAuthentication no
|
||||||
|
KbdInteractiveAuthentication no
|
||||||
|
```
|
||||||
|
|
||||||
|
Reload:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sudo systemctl reload sshd
|
||||||
|
```
|
||||||
280
os/FreeBSD/FreeBSD_on_Clevo_Laptop.md
Normal file
280
os/FreeBSD/FreeBSD_on_Clevo_Laptop.md
Normal file
|
|
@ -0,0 +1,280 @@
|
||||||
|
# Setup
|
||||||
|
|
||||||
|
Install my favorite packages
|
||||||
|
|
||||||
|
```sh
|
||||||
|
pkg install bash sudo tmux htop neovim git bastille
|
||||||
|
```
|
||||||
|
|
||||||
|
Add "wheel" to the suoers file:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
visudo
|
||||||
|
```
|
||||||
|
|
||||||
|
Change shell
|
||||||
|
|
||||||
|
```sh
|
||||||
|
chsh -s /usr/local/bin/bash
|
||||||
|
```
|
||||||
|
|
||||||
|
Do a system update:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
freebsd-update fetch install
|
||||||
|
```
|
||||||
|
|
||||||
|
# Wifi
|
||||||
|
|
||||||
|
Find out what network cards we have:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
pciconf -lv | grep -A1 -B3 network
|
||||||
|
```
|
||||||
|
|
||||||
|
On my Clevo laptop it looks like this:
|
||||||
|
|
||||||
|
```
|
||||||
|
re0@pci0:2:0:0: class=0x020000 rev=0x15 hdr=0x00 vendor=0x10ec device=0x8168 subvendor=0x1558 subdevice=0xa600
|
||||||
|
vendor = 'Realtek Semiconductor Co., Ltd.'
|
||||||
|
device = 'RTL8111/8168/8211/8411 PCI Express Gigabit Ethernet Controller'
|
||||||
|
class = network
|
||||||
|
subclass = ethernet
|
||||||
|
iwlwifi0@pci0:3:0:0: class=0x028000 rev=0x1a hdr=0x00 vendor=0x8086 device=0x2723 subvendor=0x8086 subdevice=0x0084
|
||||||
|
vendor = 'Intel Corporation'
|
||||||
|
device = 'Wi-Fi 6 AX200'
|
||||||
|
class = network
|
||||||
|
nvme0@pci0:4:0:0: class=0x010802 rev=0x00 hdr=0x00 vendor=0x144d device=0xa809 subvendor=0x144d subdevice=0xa801
|
||||||
|
```
|
||||||
|
|
||||||
|
So we have an Intel Wifi.
|
||||||
|
|
||||||
|
We're going to configure the wireless card iwlwifi0 to the interface wlan0:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
ifconfig wlan0 create wlandev iwlwifi0
|
||||||
|
```
|
||||||
|
|
||||||
|
To make the change persist across reboots:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sysrc wlans_iwlwifi0="wlan0"
|
||||||
|
```
|
||||||
|
|
||||||
|
We need to set the regulatory domain:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
ifconfig wlan0 regdomain ETSI country NL
|
||||||
|
```
|
||||||
|
|
||||||
|
To scan the networks. I had to run the command twice to see the list:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
ifconfig wlan0 up list scan
|
||||||
|
```
|
||||||
|
|
||||||
|
I see my networks:
|
||||||
|
|
||||||
|
```
|
||||||
|
SSID/MESH ID BSSID CHAN RATE S:N INT CAPS
|
||||||
|
TMNL-3EF981_24G d8:0d:17:b9:b2:f0 11 54M -37:-96 100 EPS HTCAP WME ATH RSN WPS
|
||||||
|
TMNL-3EF981 98:0d:67:3e:f9:81 11 54M -72:-96 100 EP APCHANREP RSN WPS BSSLOAD HTCAP VHTCAP VHTOPMODE WME
|
||||||
|
TMNL-3EF981_5G d8:0d:17:b9:b2:f1 64 54M -42:-96 100 EP HTCAP VHTCAP VHTOPMODE VHTPWRENV WME ATH RSN WPS
|
||||||
|
```
|
||||||
|
|
||||||
|
I want to connect to `TMNL-3EF981_5G`. We need to edit the `/etc/wpa_supplicant.conf` file:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
nvim /etc/wpa_supplicant.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
The contents. The password need to be set in psk.
|
||||||
|
|
||||||
|
```
|
||||||
|
country=NL
|
||||||
|
network={
|
||||||
|
ssid="TMNL-3EF981_5G"
|
||||||
|
psk="3J6YJHNRG8W7KMMF"
|
||||||
|
priority=5
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
To set it to use DHCP:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sysrc ifconfig_wlan0="WPA SYNCDHCP"
|
||||||
|
```
|
||||||
|
|
||||||
|
For some reason, we need to add the country code in the rc.conf:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sysrc create_args_wlan0="country NL"
|
||||||
|
```
|
||||||
|
|
||||||
|
Now bring it up!
|
||||||
|
|
||||||
|
```sh
|
||||||
|
service netif restart
|
||||||
|
```
|
||||||
|
|
||||||
|
Restart the laptop to see if it persists.
|
||||||
|
|
||||||
|
For some reason, it won't work (no suprise, wifi is awful in FreeBSD).
|
||||||
|
|
||||||
|
This worked for me after boot
|
||||||
|
|
||||||
|
```sh
|
||||||
|
ifconfig wlan0 down
|
||||||
|
ifconfig wlan0 ssid "TMNL-3EF981_5G"
|
||||||
|
ifconfig wlan0 regdomain etsi2 country NL
|
||||||
|
service netif restart
|
||||||
|
```
|
||||||
|
|
||||||
|
# X11
|
||||||
|
|
||||||
|
https://docs.freebsd.org/en/books/handbook/x11/
|
||||||
|
|
||||||
|
Don't forget to start `tmux`:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
tmux
|
||||||
|
```
|
||||||
|
|
||||||
|
Add `moni` to the `video` group:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
pw groupmod video -m moni
|
||||||
|
```
|
||||||
|
|
||||||
|
And then install, but don't forget to read the messages when the install is complete! Scroll up with tmux
|
||||||
|
|
||||||
|
```sh
|
||||||
|
pkg install xorg
|
||||||
|
```
|
||||||
|
|
||||||
|
This will improve mnuse and touchscreen support:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sysctl kern.evdev.rcpt_mask=6
|
||||||
|
```
|
||||||
|
|
||||||
|
And add this to `/etc/sysctl.conf` to persist it:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kern.evdev.rcpt_mask=6
|
||||||
|
```
|
||||||
|
|
||||||
|
# Amd
|
||||||
|
|
||||||
|
```sh
|
||||||
|
pkg install drm-kmod
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sysrc kld_list+=amdgpu
|
||||||
|
```
|
||||||
|
|
||||||
|
# Kde
|
||||||
|
|
||||||
|
```sh
|
||||||
|
pkg install kde5
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sysrc dbus_enable="YES"
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sysctl net.local.stream.recvspace=65536
|
||||||
|
sysctl net.local.stream.sendspace=65536
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
pkg install sddm
|
||||||
|
sysrc sddm_enable="YES"
|
||||||
|
```
|
||||||
|
|
||||||
|
# Fonts
|
||||||
|
|
||||||
|
```sh
|
||||||
|
pkg install urwfonts
|
||||||
|
```
|
||||||
|
|
||||||
|
But you're not done yet, you need to add a conf file:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
nvim /usr/local/etc/X11/xorg.conf.d/90-fonts.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
With the following:
|
||||||
|
|
||||||
|
```
|
||||||
|
Section "Files"
|
||||||
|
FontPath "/usr/local/share/fonts/urwfonts/"
|
||||||
|
EndSection
|
||||||
|
```
|
||||||
|
|
||||||
|
# CPU
|
||||||
|
|
||||||
|
Too see your CPU 0
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sysctl dev.cpu.0
|
||||||
|
```
|
||||||
|
|
||||||
|
If you don't see a temperature:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kldload amdtemp
|
||||||
|
```
|
||||||
|
|
||||||
|
Add it to startup:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sysrc kld_list+=amdtemp
|
||||||
|
```
|
||||||
|
|
||||||
|
# Linux compatibility
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sysrc linux_enable="YES"
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
service linux start
|
||||||
|
```
|
||||||
|
|
||||||
|
# Final configs
|
||||||
|
|
||||||
|
My `/etc/rc.conf`
|
||||||
|
|
||||||
|
```
|
||||||
|
hostname="moni-freebsd"
|
||||||
|
ifconfig_re0="DHCP"
|
||||||
|
sshd_enable="YES"
|
||||||
|
moused_enable="YES"
|
||||||
|
# Set dumpdev to "AUTO" to enable crash dumps, "NO" to disable
|
||||||
|
dumpdev="AUTO"
|
||||||
|
kld_list="amdgpu amdtemp"
|
||||||
|
dbus_enable="YES"
|
||||||
|
sddm_enable="YES"
|
||||||
|
linux_enable="YES"
|
||||||
|
create_args_wlan0="country NL"
|
||||||
|
wlans_iwlwifi0="wlan0"
|
||||||
|
ifconfig_wlan0="WPA SYNCDHCP"
|
||||||
|
```
|
||||||
|
|
||||||
|
My `/etc/sysctl.conf`:
|
||||||
|
|
||||||
|
```
|
||||||
|
#
|
||||||
|
# This file is read when going to multi-user and its contents piped thru
|
||||||
|
# ``sysctl'' to adjust kernel values. ``man 5 sysctl.conf'' for details.
|
||||||
|
#
|
||||||
|
|
||||||
|
# Uncomment this to prevent users from seeing information about processes that
|
||||||
|
# are being run under another UID.
|
||||||
|
#security.bsd.see_other_uids=0
|
||||||
|
|
||||||
|
kern.evdev.rcpt_mask=6
|
||||||
|
```
|
||||||
111
os/FreeBSD/FreeBSD_on_Lenovo_Thinkcentre.md
Normal file
111
os/FreeBSD/FreeBSD_on_Lenovo_Thinkcentre.md
Normal file
|
|
@ -0,0 +1,111 @@
|
||||||
|
# Setup
|
||||||
|
|
||||||
|
First time:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
su -
|
||||||
|
```
|
||||||
|
|
||||||
|
Do a system update:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
freebsd-update fetch install
|
||||||
|
```
|
||||||
|
|
||||||
|
Update
|
||||||
|
|
||||||
|
```sh
|
||||||
|
pkg update
|
||||||
|
```
|
||||||
|
|
||||||
|
Install my favorite packages
|
||||||
|
|
||||||
|
```sh
|
||||||
|
pkg install -y bash sudo tmux htop neovim git ncdu bastille tailscale aria2
|
||||||
|
```
|
||||||
|
|
||||||
|
Add "wheel" to the suoers file:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
visudo
|
||||||
|
```
|
||||||
|
|
||||||
|
Change shell
|
||||||
|
|
||||||
|
```sh
|
||||||
|
chsh -s /usr/local/bin/bash
|
||||||
|
```
|
||||||
|
|
||||||
|
Tailscale
|
||||||
|
|
||||||
|
```sh
|
||||||
|
service tailscaled enable
|
||||||
|
service tailscaled start
|
||||||
|
tailscale up
|
||||||
|
```
|
||||||
|
|
||||||
|
# SSH
|
||||||
|
|
||||||
|
```sh
|
||||||
|
nvim /etc/ssh/sshd_config
|
||||||
|
```
|
||||||
|
|
||||||
|
Change this setting:
|
||||||
|
|
||||||
|
```
|
||||||
|
KbdInteractiveAuthentication no
|
||||||
|
```
|
||||||
|
|
||||||
|
That should be it. The config file should have these settings, including the commented lines shown as below:
|
||||||
|
|
||||||
|
```
|
||||||
|
#PermitRootLogin no
|
||||||
|
#PubkeyAuthentication yes
|
||||||
|
#PasswordAuthentication no
|
||||||
|
KbdInteractiveAuthentication no
|
||||||
|
#UsePAM yes
|
||||||
|
```
|
||||||
|
|
||||||
|
Test the setting
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sshd -t
|
||||||
|
```
|
||||||
|
|
||||||
|
Reload:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
service sshd reload
|
||||||
|
```
|
||||||
|
|
||||||
|
# PF
|
||||||
|
|
||||||
|
Note, if you're using Bastille, the `/etc/pf.conf` file is going to look different. See [Bastille](../../containers/Bastille/Bastille.md).
|
||||||
|
|
||||||
|
Now we need to get the filewall going.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
nvim /etc/pf.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
Contents:
|
||||||
|
|
||||||
|
```
|
||||||
|
ext_if="em0"
|
||||||
|
block in all
|
||||||
|
pass in on $ext_if proto tcp to ($ext_if) port ssh
|
||||||
|
pass in on $ext_if proto tcp to ($ext_if) port 80
|
||||||
|
pass in on $ext_if proto tcp to ($ext_if) port 443
|
||||||
|
pass out all keep state
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sysrc pf_enable=yes
|
||||||
|
service pf start
|
||||||
|
```
|
||||||
|
|
||||||
|
If you get the error 'no host key files found` then
|
||||||
|
|
||||||
|
```sh
|
||||||
|
ssh-keygen -A
|
||||||
|
```
|
||||||
94
os/FreeBSD/FreeBSD_on_RPI.md
Normal file
94
os/FreeBSD/FreeBSD_on_RPI.md
Normal file
|
|
@ -0,0 +1,94 @@
|
||||||
|
# General
|
||||||
|
|
||||||
|
Default username passwords are:
|
||||||
|
|
||||||
|
```
|
||||||
|
freebsd
|
||||||
|
freebsd
|
||||||
|
```
|
||||||
|
|
||||||
|
and
|
||||||
|
|
||||||
|
```
|
||||||
|
root
|
||||||
|
root
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
ssh freebsd@192.168.1.108
|
||||||
|
```
|
||||||
|
|
||||||
|
Setup ntpd
|
||||||
|
|
||||||
|
You need to make sure that your date is close to the real time
|
||||||
|
|
||||||
|
```sh
|
||||||
|
date 202406211441
|
||||||
|
```
|
||||||
|
|
||||||
|
Set the timezone
|
||||||
|
|
||||||
|
```sh
|
||||||
|
tzsetup
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sysrc ntpd_enable=YES
|
||||||
|
```
|
||||||
|
|
||||||
|
Set the time:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
ntpdate -v -b in.pool.ntp.org
|
||||||
|
```
|
||||||
|
|
||||||
|
Start the service
|
||||||
|
|
||||||
|
```sh
|
||||||
|
service ntpd start
|
||||||
|
```
|
||||||
|
|
||||||
|
Update the system
|
||||||
|
|
||||||
|
```sh
|
||||||
|
pkg update
|
||||||
|
```
|
||||||
|
|
||||||
|
Install my favorite packages
|
||||||
|
|
||||||
|
```sh
|
||||||
|
pkg install bash sudo tmux htop neovim git bastille
|
||||||
|
```
|
||||||
|
|
||||||
|
Add "wheel" to the suoers file:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
visudo
|
||||||
|
```
|
||||||
|
|
||||||
|
Change shell
|
||||||
|
|
||||||
|
```sh
|
||||||
|
chsh -s /usr/local/bin/bash
|
||||||
|
```
|
||||||
|
|
||||||
|
Add a user
|
||||||
|
|
||||||
|
```sh
|
||||||
|
adduser
|
||||||
|
```
|
||||||
|
|
||||||
|
Change the hostname
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sysrc hostname="rp4-8"
|
||||||
|
```
|
||||||
|
|
||||||
|
Delete the freebsd user that comes with the standard installation:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
rmuser freebsd
|
||||||
|
```
|
||||||
|
|
||||||
|
* [SSH instructions](FreeBSD_on_Lenovo_Thinkcentre.md#ssh)
|
||||||
|
* [PF instructions](FreeBSD_on_Lenovo_Thinkcentre.md#pf). Be careful, the network interface on the PI is called `genet0` not `em0`.
|
||||||
53
os/FreeBSD/Storage.md
Normal file
53
os/FreeBSD/Storage.md
Normal file
|
|
@ -0,0 +1,53 @@
|
||||||
|
# Storage
|
||||||
|
|
||||||
|
First we need to know what drives we have:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
geom disk list
|
||||||
|
```
|
||||||
|
|
||||||
|
Show the partitions:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
gpart show
|
||||||
|
```
|
||||||
|
|
||||||
|
In FreeBSD the partitions are named with suffix `pX`, for example `p1`, `p2`, etc.
|
||||||
|
|
||||||
|
To mount the first partition of the external harddrive:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# directory needs to exist
|
||||||
|
mkdir /mnt/usb
|
||||||
|
|
||||||
|
# mount the first partition p1
|
||||||
|
mount -t /dev/da0p1 /mnt/usb
|
||||||
|
```
|
||||||
|
|
||||||
|
# ZFS
|
||||||
|
|
||||||
|
The handbook is actually quite comprehensive:
|
||||||
|
|
||||||
|
* https://docs.freebsd.org/en/books/handbook/zfs/
|
||||||
|
|
||||||
|
In order for ZFS to work, we need to enable it. On the Raspberry PI it is not enabled by default.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
service zfs enable
|
||||||
|
service zfs start
|
||||||
|
```
|
||||||
|
|
||||||
|
You need empty space, either an empty partition or drive.
|
||||||
|
|
||||||
|
# Mounting different filesystems (for example, a USB SDD)
|
||||||
|
|
||||||
|
For ext4, see: https://docs.freebsd.org/en/books/handbook/filesystems/index.html#filesystems-linux
|
||||||
|
|
||||||
|
For NTFS, see: https://docs.freebsd.org/en/books/handbook/disks/#using-ntfs
|
||||||
|
|
||||||
|
Take into account that NTFS uses "Slices", not "Partitions" so mounting the external NTFS harddrive on the Raspberry PI looks like this:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
ntfs-3g /dev/da0s1 /mnt/usb
|
||||||
|
```
|
||||||
|
|
||||||
4
ssh.md
Normal file
4
ssh.md
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
```sh
|
||||||
|
eval `ssh-agent -s` && ssh-add -k
|
||||||
|
ssh -t -A moni@143.179.250.91 -p 32222 ssh moni@192.168.1.10
|
||||||
|
```
|
||||||
Loading…
Add table
Reference in a new issue