summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjoshua <joshua@joshuayun.com>2023-12-29 23:18:01 -0500
committerjoshua <joshua@joshuayun.com>2023-12-29 23:18:01 -0500
commitbe0a9dfcbd5ea62eca32f3cebb104ae39855a4f2 (patch)
tree05e8c68e2adb022e7b6d3b0ecf3799aaf1f795ec
parent801b59c05ac3c12e74a5f77c0d5d6f898ef55912 (diff)
downloadwiki-be0a9dfcbd5ea62eca32f3cebb104ae39855a4f2.tar.gz
updated wiki on how to make server
-rw-r--r--docs/about.md3
-rw-r--r--docs/server/cgit.md141
-rw-r--r--docs/server/ddns.md49
-rw-r--r--docs/server/server.md130
-rw-r--r--mkdocs.yml9
-rw-r--r--site/404.html129
-rw-r--r--site/about/index.html432
-rw-r--r--site/index.html143
-rw-r--r--site/search/search_index.json2
-rw-r--r--site/server/cgit/index.html776
-rw-r--r--site/server/ddns/index.html612
-rw-r--r--site/server/server/index.html726
-rw-r--r--site/sitemap.xml25
-rw-r--r--site/sitemap.xml.gzbin127 -> 235 bytes
14 files changed, 3169 insertions, 8 deletions
diff --git a/docs/about.md b/docs/about.md
new file mode 100644
index 0000000..41d281e
--- /dev/null
+++ b/docs/about.md
@@ -0,0 +1,3 @@
+# About this wiki
+
+This is where I will be putting my stuff on how to configure things as well as some other personal references.
diff --git a/docs/server/cgit.md b/docs/server/cgit.md
new file mode 100644
index 0000000..72db5ed
--- /dev/null
+++ b/docs/server/cgit.md
@@ -0,0 +1,141 @@
+# Cgit with gitolite and caddy
+
+## Setup
+
+Install dependencies.
+
+ # apt install cgit python-is-python3 python3-pygments python3-markdown docutils-common groff perl
+
+Make a git user.
+
+ sudo adduser --system --shell /bin/bash --group --disabled-password --home /home/git git
+
+Allow ssh passwordless login.
+
+ usermod -p '*' username
+
+## Gitolite
+
+Install the [gitolite](https://gitolite.com/gitolite/install.html) package from the repository directly.
+
+### Configuration with cgit
+
+Configuration of gitolite is done by modifying `$HOME/.gitolite.rc`.
+
+To work correctly with cgit, gitweb and cgit configuration options need to work with gitolite.
+
+Change:
+
+ GIT_CONFIG_KEYS => '',
+
+To:
+
+ GIT_CONFIG_KEYS => '.*',
+
+To have permissions work correctly,
+
+Change:
+
+ UMASK => 0077,
+
+To:
+
+ UMASK => 0027,
+
+In the `ENABLE` field, add gitweb and cgit to the list.
+
+### Usage
+
+Detailed usage of gitolite can be found [here](https://gitolite.com/gitolite/basic-admin.html)
+
+### Repository ignore
+
+After cgit is configured, cgit can be told to ignore a repo with this syntax.
+
+ repo gitolite-admin
+ config cgit.ignore=1
+
+### Adding Hooks to gitolite
+
+This [page](https://gitolite.com/gitolite/cookbook#adding-other-non-update-hooks) details how to add hooks to your repositories.
+
+Example hook that updates a website every git push. Make sure this directory is owned by git.
+
+ #!/bin/sh
+ GIT_WORK_TREE=/desired/website/directory git checkout -f
+
+
+## Cgit
+
+### Running cgit with caddy
+
+Install the [fcgiwrap](https://packages.debian.org/bookworm/fcgiwrap) package.
+
+Create a systemd service that wraps cgit with FastCGI.
+
+ # systemctl edit --full --force cgit.service
+
+<!-- tsk -->
+
+ [Unit]
+ Description=CGI web interface to the Git SCM
+ After=network.target
+
+ [Service]
+ Type=exec
+ ExecStart=fcgiwrap -f -p "/usr/lib/cgit/cgit.cgi" -s tcp:127.0.0.1:8999
+
+ [Install]
+ WantedBy=multi-user.target
+
+<!-- tsk -->
+
+ # systemctl start cgit
+
+Add cgit configuration to caddy.
+
+ git.joshuayun.com {
+ handle_path /cgit-css/* {
+ root * /usr/share/cgit/
+ file_server
+ }
+
+ handle {
+ reverse_proxy localhost:8999 {
+ transport fastcgi {
+ env DOCUMENT_ROOT /usr/lib/cgit/
+ env SCRIPT_FILENAME /usr/lib/cgit/cgit.cgi
+ }
+ }
+ }
+ }
+
+
+## Cgit configuration
+
+More detailed documentation can be found on the cgitrc(5) [manual](https://linux.die.net/man/5/cgitrc).
+
+enable-git-config is used to allow for gitweb.* configurations in gitolite, e.g. description, owner.
+
+
+ enable-git-config=1
+
+project-list sets where cgit looks for projects, this list is the one updated by gitolite
+
+ project-list=/home/git/projects.list
+
+scan-path sets where the actual git repositories live
+
+ scan-path=/home/git/repositories
+
+## References
+
+[SixFoisNeuf](https://www.sixfoisneuf.fr/posts/setting-up-cgit-with-caddy2/) Used this blog to run cgit using fcgiwrap rather than a caddy plugin. The entire cgit with caddy section was using his work.
+
+[Mateja Maric](https://matejamaric.com/blog/git-server/) Used this blog to help configure cgitrc, gitolite.rc
+
+[Luke Hsiao](https://luke.hsiao.dev/blog/cgit-caddy-gitolite/) Used the git user creation command from this blog.
+
+[Omar Polo (yumh)](https://www.omarpolo.com/post/cgit-gitolite.html) Used this blog to help configure cgitrc for hidden repos.
+
+[Bryan Brattlof](https://bryanbrattlof.com/cgit-nginx-gitolite-a-personal-git-server/) Not much used here, kept as reference.
diff --git a/docs/server/ddns.md b/docs/server/ddns.md
new file mode 100644
index 0000000..f81f5d7
--- /dev/null
+++ b/docs/server/ddns.md
@@ -0,0 +1,49 @@
+# DDNS Setup
+
+## Porkbun API
+
+Follow this [porkbun](https://kb.porkbun.com/article/190-getting-started-with-the-porkbun-api) guide on enabling the api for your domain.
+
+## ddns-updater
+
+[ddns-updater](https://github.com/qdm12/ddns-updater) is the program used to update Porkbun's A record of your domain.
+
+### Docker install
+
+Install the [docker](https://docs.docker.com/engine/install/debian/) package from official docker repositories.
+
+### Setup
+
+Create a directory with config.json inside, and make sure that its owner has a uid of 1000.
+
+ mkdir data
+ touch data/config.json
+ # Owned by user ID of Docker container (1000)
+ chown -R 1000 data
+ # all access (for creating json database file data/updates.json)
+ chmod 700 data
+ # read access only
+ chmod 400 data/config.json
+
+Configuration for porkbun in config.json
+
+ {
+ "settings": [
+ {
+ "provider": "porkbun",
+ "domain": "domain.com",
+ "host": "@",
+ "api_key": "PORKBUN SECRET KEY",
+ "secret_api_key": "PORKBUN API KEY",
+ "ip_version": "ipv4"
+ }
+ ]
+ }
+
+Optional `"ttl"` paramter specifing A record TTL not included.
+
+### Usage
+ docker run -d -p 8000:8000/tcp -v "$(pwd)"/data:/updater/data qmcgaw/ddns-updater
+
+This will start a docker container that will start updating the DNS records.
+Status updates can be seen in a web server by going to localhost:8000.
diff --git a/docs/server/server.md b/docs/server/server.md
new file mode 100644
index 0000000..a5381f4
--- /dev/null
+++ b/docs/server/server.md
@@ -0,0 +1,130 @@
+# Homelab Server Setup
+
+This page describes how I setup my personal webserver
+
+I'm hosting a website, wiki, caldav using Radicale, git using cgit and Gitolite, and webdav support
+
+## Linux Distribution Used
+
+Debian 12 Bookworm.
+
+Update the system.
+
+ # apt update
+ # apt upgrade
+
+## SSH
+
+Generate ssh keys
+
+ ssh-keygen -t [keytype]
+
+Add ssh keys to `~/.ssh/authorized_keys`
+
+ ssh-copy-id -i /path/to/pubkey [user@]machine
+
+### Optional security enhancements
+
+Change the port in `/etc/sshd_config` to a nonstandard port to harden security.
+
+ Port 1234
+
+Disable password login in `/etc/sshd_config/`
+
+ PubkeyAuthentication yes
+ ChallengeResponseAuthentication no
+ PasswordAuthentication no
+ KbdInteractiveAuthentication no
+ UsePAM no
+
+Disable XForwarding
+
+ X11Forwarding no
+
+Disable remote root login
+
+ PermitRootLogin no
+
+## DDNS
+
+Setup [Dyanmic DNS (ddns) with Porkbun and ddns-updater](ddns.md).
+
+## Caddy
+
+Install the [Caddy](https://caddyserver.com/docs/install#debian-ubuntu-raspbian) package from Caddy directly.
+
+## Cgit & gitolite
+
+Setup [cgit with gitolite and caddy](cgit.md).
+
+## Radicale
+
+Install the [Radicale](https://packages.debian.org/bookworm/radicale) package.
+
+Start the Radicale service.
+
+ systemctl enable radicale.service
+ systemctl start radicale.service
+
+Generate secure passwords using htpasswd.
+
+ # Create a new htpasswd file with the user "user1"
+ $ htpasswd -c /path/to/users user1
+ New password:
+ Re-type new password:
+ # Add another user
+ $ htpasswd /path/to/users user2
+ New password:
+ Re-type new password:
+
+Edit configuration to add users
+
+ [auth]
+ type = htpasswd
+ htpasswd_filename = /path/to/users
+ # encryption method used in the htpasswd file
+ htpasswd_encryption = md5
+
+Add configuration to caddy.
+
+ caldav.joshuayun.com {
+ handle_path /* {
+ reverse_proxy localhost:5232 {
+ header_up X-Script-Name /radicale
+ }
+ }
+ handle_path /radicale/* {
+ reverse_proxy localhost:5232 {
+ header_up X-Script-Name /radicale
+ }
+ }
+ }
+
+
+## Webdav
+
+Add the Webdav module to Caddy.
+
+ sudo caddy add-package github.com/mholt/caddy-webdav
+ sudo systemctl restart caddy
+
+Add Webdav to the Caddy configuration
+
+Example configuration with protected file browsing, see the [github](https://github.com/mholt/caddy-webdav) for more configurations.
+
+
+ webdav.joshuayun.com {
+ @get method GET
+ root * WEBDAV_PATH
+ route {
+ basicauth {
+ joshua CADDY_HASH
+ }
+ file_server @get browse
+ webdav
+ }
+ }
+
+To generate the hash:
+
+ caddy hash-password
diff --git a/mkdocs.yml b/mkdocs.yml
index b24745e..c5965d9 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -1,3 +1,12 @@
site_name: Joshua's Wiki
+site_url: https://wiki.joshuayun.com
+nav:
+ - Home: index.md
+ - Server:
+ - Server Setup: server/server.md
+ - Cgit with gitolite: server/cgit.md
+ - DDNS: server/ddns.md
+ - About: about.md
+
theme:
name: material
diff --git a/site/404.html b/site/404.html
index 6e0b376..adcf30e 100644
--- a/site/404.html
+++ b/site/404.html
@@ -186,7 +186,134 @@
<span class="md-ellipsis">
- Welcome to MkDocs
+ Home
+ </span>
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+
+
+
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" >
+
+
+ <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
+
+
+ <span class="md-ellipsis">
+ Server
+ </span>
+
+
+ <span class="md-nav__icon md-icon"></span>
+ </label>
+
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
+ <label class="md-nav__title" for="__nav_2">
+ <span class="md-nav__icon md-icon"></span>
+ Server
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="/server/server/" class="md-nav__link">
+
+
+ <span class="md-ellipsis">
+ Server Setup
+ </span>
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="/server/cgit/" class="md-nav__link">
+
+
+ <span class="md-ellipsis">
+ Cgit with gitolite
+ </span>
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="/server/ddns/" class="md-nav__link">
+
+
+ <span class="md-ellipsis">
+ DDNS
+ </span>
+
+
+ </a>
+ </li>
+
+
+
+
+ </ul>
+ </nav>
+
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="/about/" class="md-nav__link">
+
+
+ <span class="md-ellipsis">
+ About
</span>
diff --git a/site/about/index.html b/site/about/index.html
new file mode 100644
index 0000000..6285255
--- /dev/null
+++ b/site/about/index.html
@@ -0,0 +1,432 @@
+
+<!doctype html>
+<html lang="en" class="no-js">
+ <head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
+
+
+
+ <link rel="canonical" href="https://wiki.joshuayun.com/about/">
+
+
+ <link rel="prev" href="../server/ddns/">
+
+
+
+ <link rel="icon" href="../assets/images/favicon.png">
+ <meta name="generator" content="mkdocs-1.5.3, mkdocs-material-9.5.1">
+
+
+
+ <title>About - Joshua's Wiki</title>
+
+
+
+ <link rel="stylesheet" href="../assets/stylesheets/main.45e1311d.min.css">
+
+
+
+
+
+
+
+
+
+
+
+
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
+ <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
+
+
+
+ <script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
+
+
+
+
+
+
+ </head>
+
+
+ <body dir="ltr">
+
+
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
+ <label class="md-overlay" for="__drawer"></label>
+ <div data-md-component="skip">
+
+
+ <a href="#about-this-wiki" class="md-skip">
+ Skip to content
+ </a>
+
+ </div>
+ <div data-md-component="announce">
+
+ </div>
+
+
+
+
+
+
+<header class="md-header md-header--shadow" data-md-component="header">
+ <nav class="md-header__inner md-grid" aria-label="Header">
+ <a href=".." title="Joshua&#39;s Wiki" class="md-header__button md-logo" aria-label="Joshua's Wiki" data-md-component="logo">
+
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z"/></svg>
+
+ </a>
+ <label class="md-header__button md-icon" for="__drawer">
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
+ </label>
+ <div class="md-header__title" data-md-component="header-title">
+ <div class="md-header__ellipsis">
+ <div class="md-header__topic">
+ <span class="md-ellipsis">
+ Joshua's Wiki
+ </span>
+ </div>
+ <div class="md-header__topic" data-md-component="header-topic">
+ <span class="md-ellipsis">
+
+ About
+
+ </span>
+ </div>
+ </div>
+ </div>
+
+
+ <script>var media,input,key,value,palette=__md_get("__palette");if(palette&&palette.color){"(prefers-color-scheme)"===palette.color.media&&(media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']"),palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent"));for([key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
+
+
+
+ <label class="md-header__button md-icon" for="__search">
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
+ </label>
+ <div class="md-search" data-md-component="search" role="dialog">
+ <label class="md-search__overlay" for="__search"></label>
+ <div class="md-search__inner" role="search">
+ <form class="md-search__form" name="search">
+ <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
+ <label class="md-search__icon md-icon" for="__search">
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
+ </label>
+ <nav class="md-search__options" aria-label="Search">
+
+ <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
+ </button>
+ </nav>
+
+ </form>
+ <div class="md-search__output">
+ <div class="md-search__scrollwrap" data-md-scrollfix>
+ <div class="md-search-result" data-md-component="search-result">
+ <div class="md-search-result__meta">
+ Initializing search
+ </div>
+ <ol class="md-search-result__list" role="presentation"></ol>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+
+ </nav>
+
+</header>
+
+ <div class="md-container" data-md-component="container">
+
+
+
+
+
+
+ <main class="md-main" data-md-component="main">
+ <div class="md-main__inner md-grid">
+
+
+
+ <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+
+
+
+<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
+ <label class="md-nav__title" for="__drawer">
+ <a href=".." title="Joshua&#39;s Wiki" class="md-nav__button md-logo" aria-label="Joshua's Wiki" data-md-component="logo">
+
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z"/></svg>
+
+ </a>
+ Joshua's Wiki
+ </label>
+
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href=".." class="md-nav__link">
+
+
+ <span class="md-ellipsis">
+ Home
+ </span>
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+
+
+
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" >
+
+
+ <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
+
+
+ <span class="md-ellipsis">
+ Server
+ </span>
+
+
+ <span class="md-nav__icon md-icon"></span>
+ </label>
+
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
+ <label class="md-nav__title" for="__nav_2">
+ <span class="md-nav__icon md-icon"></span>
+ Server
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../server/server/" class="md-nav__link">
+
+
+ <span class="md-ellipsis">
+ Server Setup
+ </span>
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../server/cgit/" class="md-nav__link">
+
+
+ <span class="md-ellipsis">
+ Cgit with gitolite
+ </span>
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../server/ddns/" class="md-nav__link">
+
+
+ <span class="md-ellipsis">
+ DDNS
+ </span>
+
+
+ </a>
+ </li>
+
+
+
+
+ </ul>
+ </nav>
+
+ </li>
+
+
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active">
+
+ <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
+
+
+
+
+
+ <a href="./" class="md-nav__link md-nav__link--active">
+
+
+ <span class="md-ellipsis">
+ About
+ </span>
+
+
+ </a>
+
+ </li>
+
+
+
+ </ul>
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+
+<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
+
+
+
+
+
+
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+
+ <div class="md-content" data-md-component="content">
+ <article class="md-content__inner md-typeset">
+
+
+
+
+<h1 id="about-this-wiki">About this wiki</h1>
+<p>This is where I will be putting my stuff on how to configure things as well as some other personal references.</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ </article>
+ </div>
+
+
+<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
+ </div>
+
+ </main>
+
+ <footer class="md-footer">
+
+ <div class="md-footer-meta md-typeset">
+ <div class="md-footer-meta__inner md-grid">
+ <div class="md-copyright">
+
+
+ Made with
+ <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
+ Material for MkDocs
+ </a>
+
+</div>
+
+ </div>
+ </div>
+</footer>
+
+ </div>
+ <div class="md-dialog" data-md-component="dialog">
+ <div class="md-dialog__inner md-typeset"></div>
+ </div>
+
+
+ <script id="__config" type="application/json">{"base": "..", "features": [], "search": "../assets/javascripts/workers/search.f886a092.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script>
+
+
+ <script src="../assets/javascripts/bundle.d7c377c4.min.js"></script>
+
+
+ </body>
+</html> \ No newline at end of file
diff --git a/site/index.html b/site/index.html
index de49d5d..0fb25df 100644
--- a/site/index.html
+++ b/site/index.html
@@ -8,9 +8,13 @@
+ <link rel="canonical" href="https://wiki.joshuayun.com/">
+ <link rel="next" href="server/server/">
+
+
<link rel="icon" href="assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.5.3, mkdocs-material-9.5.1">
@@ -58,7 +62,7 @@
<div data-md-component="skip">
- <a href="#welcome-to-mkdocs" class="md-skip">
+ <a href="#welcome-to-joshuas-wiki" class="md-skip">
Skip to content
</a>
@@ -94,7 +98,7 @@
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
- Welcome to MkDocs
+ Home
</span>
</div>
@@ -200,7 +204,7 @@
<span class="md-ellipsis">
- Welcome to MkDocs
+ Home
</span>
@@ -211,7 +215,7 @@
<span class="md-ellipsis">
- Welcome to MkDocs
+ Home
</span>
@@ -258,6 +262,133 @@
+
+
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+
+
+
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" >
+
+
+ <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
+
+
+ <span class="md-ellipsis">
+ Server
+ </span>
+
+
+ <span class="md-nav__icon md-icon"></span>
+ </label>
+
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
+ <label class="md-nav__title" for="__nav_2">
+ <span class="md-nav__icon md-icon"></span>
+ Server
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="server/server/" class="md-nav__link">
+
+
+ <span class="md-ellipsis">
+ Server Setup
+ </span>
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="server/cgit/" class="md-nav__link">
+
+
+ <span class="md-ellipsis">
+ Cgit with gitolite
+ </span>
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="server/ddns/" class="md-nav__link">
+
+
+ <span class="md-ellipsis">
+ DDNS
+ </span>
+
+
+ </a>
+ </li>
+
+
+
+
+ </ul>
+ </nav>
+
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="about/" class="md-nav__link">
+
+
+ <span class="md-ellipsis">
+ About
+ </span>
+
+
+ </a>
+ </li>
+
+
+
</ul>
</nav>
</div>
@@ -317,8 +448,8 @@
-<h1 id="welcome-to-mkdocs">Welcome to MkDocs</h1>
-<p>For full documentation visit <a href="https://www.mkdocs.org">mkdocs.org</a>.</p>
+<h1 id="welcome-to-joshuas-wiki">Welcome to Joshua's Wiki</h1>
+<p>This is where I will be putting my stuff on how to configure things</p>
<h2 id="commands">Commands</h2>
<ul>
<li><code>mkdocs new [dir-name]</code> - Create a new project.</li>
diff --git a/site/search/search_index.json b/site/search/search_index.json
index 70b42dd..14ce2a2 100644
--- a/site/search/search_index.json
+++ b/site/search/search_index.json
@@ -1 +1 @@
-{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Welcome to MkDocs","text":"<p>For full documentation visit mkdocs.org.</p>"},{"location":"#commands","title":"Commands","text":"<ul> <li><code>mkdocs new [dir-name]</code> - Create a new project.</li> <li><code>mkdocs serve</code> - Start the live-reloading docs server.</li> <li><code>mkdocs build</code> - Build the documentation site.</li> <li><code>mkdocs -h</code> - Print help message and exit.</li> </ul>"},{"location":"#project-layout","title":"Project layout","text":"<pre><code>mkdocs.yml # The configuration file.\ndocs/\n index.md # The documentation homepage.\n ... # Other markdown pages, images and other files.\n</code></pre>"}]} \ No newline at end of file
+{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Welcome to Joshua's Wiki","text":"<p>This is where I will be putting my stuff on how to configure things</p>"},{"location":"#commands","title":"Commands","text":"<ul> <li><code>mkdocs new [dir-name]</code> - Create a new project.</li> <li><code>mkdocs serve</code> - Start the live-reloading docs server.</li> <li><code>mkdocs build</code> - Build the documentation site.</li> <li><code>mkdocs -h</code> - Print help message and exit.</li> </ul>"},{"location":"#project-layout","title":"Project layout","text":"<pre><code>mkdocs.yml # The configuration file.\ndocs/\n index.md # The documentation homepage.\n ... # Other markdown pages, images and other files.\n</code></pre>"},{"location":"about/","title":"About this wiki","text":"<p>This is where I will be putting my stuff on how to configure things as well as some other personal references.</p>"},{"location":"server/cgit/","title":"Cgit with gitolite and caddy","text":""},{"location":"server/cgit/#setup","title":"Setup","text":"<p>Install dependencies.</p> <pre><code># apt install cgit python-is-python3 python3-pygments python3-markdown docutils-common groff perl\n</code></pre> <p>Make a git user.</p> <pre><code>sudo adduser --system --shell /bin/bash --group --disabled-password --home /home/git git\n</code></pre> <p>Allow ssh passwordless login.</p> <pre><code>usermod -p '*' username\n</code></pre>"},{"location":"server/cgit/#gitolite","title":"Gitolite","text":"<p>Install the gitolite package from the repository directly.</p>"},{"location":"server/cgit/#configuration-with-cgit","title":"Configuration with cgit","text":"<p>Configuration of gitolite is done by modifying <code>$HOME/.gitolite.rc</code>.</p> <p>To work correctly with cgit, gitweb and cgit configuration options need to work with gitolite.</p> <p>Change:</p> <pre><code>GIT_CONFIG_KEYS =&gt; '',\n</code></pre> <p>To:</p> <pre><code>GIT_CONFIG_KEYS =&gt; '.*',\n</code></pre> <p>To have permissions work correctly,</p> <p>Change:</p> <pre><code>UMASK =&gt; 0077,\n</code></pre> <p>To:</p> <pre><code>UMASK =&gt; 0027,\n</code></pre> <p>In the <code>ENABLE</code> field, add gitweb and cgit to the list.</p>"},{"location":"server/cgit/#usage","title":"Usage","text":"<p>Detailed usage of gitolite can be found here</p>"},{"location":"server/cgit/#repository-ignore","title":"Repository ignore","text":"<p>After cgit is configured, cgit can be told to ignore a repo with this syntax.</p> <pre><code>repo gitolite-admin\n config cgit.ignore=1\n</code></pre>"},{"location":"server/cgit/#adding-hooks-to-gitolite","title":"Adding Hooks to gitolite","text":"<p>This page details how to add hooks to your repositories.</p> <p>Example hook that updates a website every git push. Make sure this directory is owned by git.</p> <pre><code>#!/bin/sh\nGIT_WORK_TREE=/desired/website/directory git checkout -f\n</code></pre>"},{"location":"server/cgit/#cgit","title":"Cgit","text":""},{"location":"server/cgit/#running-cgit-with-caddy","title":"Running cgit with caddy","text":"<p>Install the fcgiwrap package.</p> <p>Create a systemd service that wraps cgit with FastCGI.</p> <pre><code># systemctl edit --full --force cgit.service\n</code></pre> <pre><code>[Unit]\nDescription=CGI web interface to the Git SCM\nAfter=network.target\n\n[Service]\nType=exec\nExecStart=fcgiwrap -f -p \"/usr/lib/cgit/cgit.cgi\" -s tcp:127.0.0.1:8999\n\n[Install]\nWantedBy=multi-user.target\n</code></pre> <pre><code># systemctl start cgit\n</code></pre> <p>Add cgit configuration to caddy.</p> <pre><code>git.joshuayun.com {\n handle_path /cgit-css/* {\n root * /usr/share/cgit/\n file_server\n }\n\n handle {\n reverse_proxy localhost:8999 {\n transport fastcgi {\n env DOCUMENT_ROOT /usr/lib/cgit/\n env SCRIPT_FILENAME /usr/lib/cgit/cgit.cgi\n }\n }\n }\n}\n</code></pre>"},{"location":"server/cgit/#cgit-configuration","title":"Cgit configuration","text":"<p>More detailed documentation can be found on the cgitrc(5) manual.</p> <p>enable-git-config is used to allow for gitweb.* configurations in gitolite, e.g. description, owner.</p> <pre><code>enable-git-config=1\n</code></pre> <p>project-list sets where cgit looks for projects, this list is the one updated by gitolite</p> <pre><code>project-list=/home/git/projects.list\n</code></pre> <p>scan-path sets where the actual git repositories live</p> <pre><code>scan-path=/home/git/repositories\n</code></pre>"},{"location":"server/cgit/#references","title":"References","text":"<p>SixFoisNeuf Used this blog to run cgit using fcgiwrap rather than a caddy plugin. The entire cgit with caddy section was using his work.</p> <p>Mateja Maric Used this blog to help configure cgitrc, gitolite.rc</p> <p>Luke Hsiao Used the git user creation command from this blog.</p> <p>Omar Polo (yumh) Used this blog to help configure cgitrc for hidden repos.</p> <p>Bryan Brattlof Not much used here, kept as reference.</p>"},{"location":"server/ddns/","title":"DDNS Setup","text":""},{"location":"server/ddns/#porkbun-api","title":"Porkbun API","text":"<p>Follow this porkbun guide on enabling the api for your domain.</p>"},{"location":"server/ddns/#ddns-updater","title":"ddns-updater","text":"<p>ddns-updater is the program used to update Porkbun's A record of your domain.</p>"},{"location":"server/ddns/#docker-install","title":"Docker install","text":"<p>Install the docker package from official docker repositories.</p>"},{"location":"server/ddns/#setup","title":"Setup","text":"<p>Create a directory with config.json inside, and make sure that its owner has a uid of 1000.</p> <pre><code>mkdir data\ntouch data/config.json\n# Owned by user ID of Docker container (1000)\nchown -R 1000 data\n# all access (for creating json database file data/updates.json)\nchmod 700 data\n# read access only\nchmod 400 data/config.json\n</code></pre> <p>Configuration for porkbun in config.json</p> <pre><code>{\n \"settings\": [\n {\n \"provider\": \"porkbun\",\n \"domain\": \"domain.com\",\n \"host\": \"@\",\n \"api_key\": \"PORKBUN SECRET KEY\",\n \"secret_api_key\": \"PORKBUN API KEY\",\n \"ip_version\": \"ipv4\"\n }\n ]\n}\n</code></pre> <p>Optional <code>\"ttl\"</code> paramter specifing A record TTL not included.</p>"},{"location":"server/ddns/#usage","title":"Usage","text":"<pre><code>docker run -d -p 8000:8000/tcp -v \"$(pwd)\"/data:/updater/data qmcgaw/ddns-updater\n</code></pre> <p>This will start a docker container that will start updating the DNS records. Status updates can be seen in a web server by going to localhost:8000.</p>"},{"location":"server/server/","title":"Homelab Server Setup","text":"<p>This page describes how I setup my personal webserver</p> <p>I'm hosting a website, wiki, caldav using Radicale, git using cgit and Gitolite, and webdav support</p>"},{"location":"server/server/#linux-distribution-used","title":"Linux Distribution Used","text":"<p>Debian 12 Bookworm.</p> <p>Update the system.</p> <pre><code># apt update\n# apt upgrade\n</code></pre>"},{"location":"server/server/#ssh","title":"SSH","text":"<p>Generate ssh keys</p> <pre><code>ssh-keygen -t [keytype]\n</code></pre> <p>Add ssh keys to <code>~/.ssh/authorized_keys</code></p> <pre><code>ssh-copy-id -i /path/to/pubkey [user@]machine\n</code></pre>"},{"location":"server/server/#optional-security-enhancements","title":"Optional security enhancements","text":"<p>Change the port in <code>/etc/sshd_config</code> to a nonstandard port to harden security.</p> <pre><code>Port 1234\n</code></pre> <p>Disable password login in <code>/etc/sshd_config/</code></p> <pre><code>PubkeyAuthentication yes\nChallengeResponseAuthentication no\nPasswordAuthentication no\nKbdInteractiveAuthentication no\nUsePAM no\n</code></pre> <p>Disable XForwarding</p> <pre><code>X11Forwarding no\n</code></pre> <p>Disable remote root login</p> <pre><code>PermitRootLogin no\n</code></pre>"},{"location":"server/server/#ddns","title":"DDNS","text":"<p>Setup Dyanmic DNS (ddns) with Porkbun and ddns-updater.</p>"},{"location":"server/server/#caddy","title":"Caddy","text":"<p>Install the Caddy package from Caddy directly.</p>"},{"location":"server/server/#cgit-gitolite","title":"Cgit &amp; gitolite","text":"<p>Setup cgit with gitolite and caddy.</p>"},{"location":"server/server/#radicale","title":"Radicale","text":"<p>Install the Radicale package.</p> <p>Start the Radicale service.</p> <pre><code>systemctl enable radicale.service\nsystemctl start radicale.service\n</code></pre> <p>Generate secure passwords using htpasswd.</p> <pre><code># Create a new htpasswd file with the user \"user1\"\n$ htpasswd -c /path/to/users user1\nNew password:\nRe-type new password:\n# Add another user\n$ htpasswd /path/to/users user2\nNew password:\nRe-type new password:\n</code></pre> <p>Edit configuration to add users</p> <pre><code>[auth]\ntype = htpasswd\nhtpasswd_filename = /path/to/users\n# encryption method used in the htpasswd file\nhtpasswd_encryption = md5\n</code></pre> <p>Add configuration to caddy.</p> <pre><code>caldav.joshuayun.com {\n handle_path /* {\n reverse_proxy localhost:5232 {\n header_up X-Script-Name /radicale\n }\n }\n handle_path /radicale/* {\n reverse_proxy localhost:5232 {\n header_up X-Script-Name /radicale\n }\n }\n}\n</code></pre>"},{"location":"server/server/#webdav","title":"Webdav","text":"<p>Add the Webdav module to Caddy.</p> <pre><code>sudo caddy add-package github.com/mholt/caddy-webdav\nsudo systemctl restart caddy\n</code></pre> <p>Add Webdav to the Caddy configuration</p> <p>Example configuration with protected file browsing, see the github for more configurations.</p> <pre><code>webdav.joshuayun.com {\n @get method GET\n root * WEBDAV_PATH\n route {\n basicauth {\n joshua CADDY_HASH\n }\n file_server @get browse\n webdav\n }\n}\n</code></pre> <p>To generate the hash:</p> <pre><code>caddy hash-password\n</code></pre>"}]} \ No newline at end of file
diff --git a/site/server/cgit/index.html b/site/server/cgit/index.html
new file mode 100644
index 0000000..a01b653
--- /dev/null
+++ b/site/server/cgit/index.html
@@ -0,0 +1,776 @@
+
+<!doctype html>
+<html lang="en" class="no-js">
+ <head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
+
+
+
+ <link rel="canonical" href="https://wiki.joshuayun.com/server/cgit/">
+
+
+ <link rel="prev" href="../server/">
+
+
+ <link rel="next" href="../ddns/">
+
+
+ <link rel="icon" href="../../assets/images/favicon.png">
+ <meta name="generator" content="mkdocs-1.5.3, mkdocs-material-9.5.1">
+
+
+
+ <title>Cgit with gitolite - Joshua's Wiki</title>
+
+
+
+ <link rel="stylesheet" href="../../assets/stylesheets/main.45e1311d.min.css">
+
+
+
+
+
+
+
+
+
+
+
+
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
+ <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
+
+
+
+ <script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
+
+
+
+
+
+
+ </head>
+
+
+ <body dir="ltr">
+
+
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
+ <label class="md-overlay" for="__drawer"></label>
+ <div data-md-component="skip">
+
+
+ <a href="#cgit-with-gitolite-and-caddy" class="md-skip">
+ Skip to content
+ </a>
+
+ </div>
+ <div data-md-component="announce">
+
+ </div>
+
+
+
+
+
+
+<header class="md-header md-header--shadow" data-md-component="header">
+ <nav class="md-header__inner md-grid" aria-label="Header">
+ <a href="../.." title="Joshua&#39;s Wiki" class="md-header__button md-logo" aria-label="Joshua's Wiki" data-md-component="logo">
+
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z"/></svg>
+
+ </a>
+ <label class="md-header__button md-icon" for="__drawer">
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
+ </label>
+ <div class="md-header__title" data-md-component="header-title">
+ <div class="md-header__ellipsis">
+ <div class="md-header__topic">
+ <span class="md-ellipsis">
+ Joshua's Wiki
+ </span>
+ </div>
+ <div class="md-header__topic" data-md-component="header-topic">
+ <span class="md-ellipsis">
+
+ Cgit with gitolite
+
+ </span>
+ </div>
+ </div>
+ </div>
+
+
+ <script>var media,input,key,value,palette=__md_get("__palette");if(palette&&palette.color){"(prefers-color-scheme)"===palette.color.media&&(media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']"),palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent"));for([key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
+
+
+
+ <label class="md-header__button md-icon" for="__search">
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
+ </label>
+ <div class="md-search" data-md-component="search" role="dialog">
+ <label class="md-search__overlay" for="__search"></label>
+ <div class="md-search__inner" role="search">
+ <form class="md-search__form" name="search">
+ <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
+ <label class="md-search__icon md-icon" for="__search">
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
+ </label>
+ <nav class="md-search__options" aria-label="Search">
+
+ <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
+ </button>
+ </nav>
+
+ </form>
+ <div class="md-search__output">
+ <div class="md-search__scrollwrap" data-md-scrollfix>
+ <div class="md-search-result" data-md-component="search-result">
+ <div class="md-search-result__meta">
+ Initializing search
+ </div>
+ <ol class="md-search-result__list" role="presentation"></ol>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+
+ </nav>
+
+</header>
+
+ <div class="md-container" data-md-component="container">
+
+
+
+
+
+
+ <main class="md-main" data-md-component="main">
+ <div class="md-main__inner md-grid">
+
+
+
+ <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+
+
+
+<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
+ <label class="md-nav__title" for="__drawer">
+ <a href="../.." title="Joshua&#39;s Wiki" class="md-nav__button md-logo" aria-label="Joshua's Wiki" data-md-component="logo">
+
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z"/></svg>
+
+ </a>
+ Joshua's Wiki
+ </label>
+
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../.." class="md-nav__link">
+
+
+ <span class="md-ellipsis">
+ Home
+ </span>
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active md-nav__item--nested">
+
+
+
+
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" checked>
+
+
+ <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
+
+
+ <span class="md-ellipsis">
+ Server
+ </span>
+
+
+ <span class="md-nav__icon md-icon"></span>
+ </label>
+
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="true">
+ <label class="md-nav__title" for="__nav_2">
+ <span class="md-nav__icon md-icon"></span>
+ Server
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../server/" class="md-nav__link">
+
+
+ <span class="md-ellipsis">
+ Server Setup
+ </span>
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active">
+
+ <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
+
+
+
+
+
+ <label class="md-nav__link md-nav__link--active" for="__toc">
+
+
+ <span class="md-ellipsis">
+ Cgit with gitolite
+ </span>
+
+
+ <span class="md-nav__icon md-icon"></span>
+ </label>
+
+ <a href="./" class="md-nav__link md-nav__link--active">
+
+
+ <span class="md-ellipsis">
+ Cgit with gitolite
+ </span>
+
+
+ </a>
+
+
+
+<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
+
+
+
+
+
+
+ <label class="md-nav__title" for="__toc">
+ <span class="md-nav__icon md-icon"></span>
+ Table of contents
+ </label>
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#setup" class="md-nav__link">
+ <span class="md-ellipsis">
+ Setup
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#gitolite" class="md-nav__link">
+ <span class="md-ellipsis">
+ Gitolite
+ </span>
+ </a>
+
+ <nav class="md-nav" aria-label="Gitolite">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#configuration-with-cgit" class="md-nav__link">
+ <span class="md-ellipsis">
+ Configuration with cgit
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#usage" class="md-nav__link">
+ <span class="md-ellipsis">
+ Usage
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#repository-ignore" class="md-nav__link">
+ <span class="md-ellipsis">
+ Repository ignore
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#adding-hooks-to-gitolite" class="md-nav__link">
+ <span class="md-ellipsis">
+ Adding Hooks to gitolite
+ </span>
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#cgit" class="md-nav__link">
+ <span class="md-ellipsis">
+ Cgit
+ </span>
+ </a>
+
+ <nav class="md-nav" aria-label="Cgit">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#running-cgit-with-caddy" class="md-nav__link">
+ <span class="md-ellipsis">
+ Running cgit with caddy
+ </span>
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#cgit-configuration" class="md-nav__link">
+ <span class="md-ellipsis">
+ Cgit configuration
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#references" class="md-nav__link">
+ <span class="md-ellipsis">
+ References
+ </span>
+ </a>
+
+</li>
+
+ </ul>
+
+</nav>
+
+ </li>
+
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../ddns/" class="md-nav__link">
+
+
+ <span class="md-ellipsis">
+ DDNS
+ </span>
+
+
+ </a>
+ </li>
+
+
+
+
+ </ul>
+ </nav>
+
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../about/" class="md-nav__link">
+
+
+ <span class="md-ellipsis">
+ About
+ </span>
+
+
+ </a>
+ </li>
+
+
+
+ </ul>
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+
+<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
+
+
+
+
+
+
+ <label class="md-nav__title" for="__toc">
+ <span class="md-nav__icon md-icon"></span>
+ Table of contents
+ </label>
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#setup" class="md-nav__link">
+ <span class="md-ellipsis">
+ Setup
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#gitolite" class="md-nav__link">
+ <span class="md-ellipsis">
+ Gitolite
+ </span>
+ </a>
+
+ <nav class="md-nav" aria-label="Gitolite">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#configuration-with-cgit" class="md-nav__link">
+ <span class="md-ellipsis">
+ Configuration with cgit
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#usage" class="md-nav__link">
+ <span class="md-ellipsis">
+ Usage
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#repository-ignore" class="md-nav__link">
+ <span class="md-ellipsis">
+ Repository ignore
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#adding-hooks-to-gitolite" class="md-nav__link">
+ <span class="md-ellipsis">
+ Adding Hooks to gitolite
+ </span>
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#cgit" class="md-nav__link">
+ <span class="md-ellipsis">
+ Cgit
+ </span>
+ </a>
+
+ <nav class="md-nav" aria-label="Cgit">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#running-cgit-with-caddy" class="md-nav__link">
+ <span class="md-ellipsis">
+ Running cgit with caddy
+ </span>
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#cgit-configuration" class="md-nav__link">
+ <span class="md-ellipsis">
+ Cgit configuration
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#references" class="md-nav__link">
+ <span class="md-ellipsis">
+ References
+ </span>
+ </a>
+
+</li>
+
+ </ul>
+
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+
+ <div class="md-content" data-md-component="content">
+ <article class="md-content__inner md-typeset">
+
+
+
+
+<h1 id="cgit-with-gitolite-and-caddy">Cgit with gitolite and caddy</h1>
+<h2 id="setup">Setup</h2>
+<p>Install dependencies.</p>
+<pre><code># apt install cgit python-is-python3 python3-pygments python3-markdown docutils-common groff perl
+</code></pre>
+<p>Make a git user.</p>
+<pre><code>sudo adduser --system --shell /bin/bash --group --disabled-password --home /home/git git
+</code></pre>
+<p>Allow ssh passwordless login.</p>
+<pre><code>usermod -p '*' username
+</code></pre>
+<h2 id="gitolite">Gitolite</h2>
+<p>Install the <a href="https://gitolite.com/gitolite/install.html">gitolite</a> package from the repository directly.</p>
+<h3 id="configuration-with-cgit">Configuration with cgit</h3>
+<p>Configuration of gitolite is done by modifying <code>$HOME/.gitolite.rc</code>.</p>
+<p>To work correctly with cgit, gitweb and cgit configuration options need to work with gitolite.</p>
+<p>Change:</p>
+<pre><code>GIT_CONFIG_KEYS =&gt; '',
+</code></pre>
+<p>To:</p>
+<pre><code>GIT_CONFIG_KEYS =&gt; '.*',
+</code></pre>
+<p>To have permissions work correctly,</p>
+<p>Change:</p>
+<pre><code>UMASK =&gt; 0077,
+</code></pre>
+<p>To:</p>
+<pre><code>UMASK =&gt; 0027,
+</code></pre>
+<p>In the <code>ENABLE</code> field, add gitweb and cgit to the list.</p>
+<h3 id="usage">Usage</h3>
+<p>Detailed usage of gitolite can be found <a href="https://gitolite.com/gitolite/basic-admin.html">here</a></p>
+<h3 id="repository-ignore">Repository ignore</h3>
+<p>After cgit is configured, cgit can be told to ignore a repo with this syntax.</p>
+<pre><code>repo gitolite-admin
+ config cgit.ignore=1
+</code></pre>
+<h3 id="adding-hooks-to-gitolite">Adding Hooks to gitolite</h3>
+<p>This <a href="https://gitolite.com/gitolite/cookbook#adding-other-non-update-hooks">page</a> details how to add hooks to your repositories.</p>
+<p>Example hook that updates a website every git push. Make sure this directory is owned by git.</p>
+<pre><code>#!/bin/sh
+GIT_WORK_TREE=/desired/website/directory git checkout -f
+</code></pre>
+<h2 id="cgit">Cgit</h2>
+<h3 id="running-cgit-with-caddy">Running cgit with caddy</h3>
+<p>Install the <a href="https://packages.debian.org/bookworm/fcgiwrap">fcgiwrap</a> package.</p>
+<p>Create a systemd service that wraps cgit with FastCGI.</p>
+<pre><code># systemctl edit --full --force cgit.service
+</code></pre>
+<!-- tsk -->
+
+<pre><code>[Unit]
+Description=CGI web interface to the Git SCM
+After=network.target
+
+[Service]
+Type=exec
+ExecStart=fcgiwrap -f -p "/usr/lib/cgit/cgit.cgi" -s tcp:127.0.0.1:8999
+
+[Install]
+WantedBy=multi-user.target
+</code></pre>
+<!-- tsk -->
+
+<pre><code># systemctl start cgit
+</code></pre>
+<p>Add cgit configuration to caddy.</p>
+<pre><code>git.joshuayun.com {
+ handle_path /cgit-css/* {
+ root * /usr/share/cgit/
+ file_server
+ }
+
+ handle {
+ reverse_proxy localhost:8999 {
+ transport fastcgi {
+ env DOCUMENT_ROOT /usr/lib/cgit/
+ env SCRIPT_FILENAME /usr/lib/cgit/cgit.cgi
+ }
+ }
+ }
+}
+</code></pre>
+<h2 id="cgit-configuration">Cgit configuration</h2>
+<p>More detailed documentation can be found on the cgitrc(5) <a href="https://linux.die.net/man/5/cgitrc">manual</a>.</p>
+<p>enable-git-config is used to allow for gitweb.* configurations in gitolite, e.g. description, owner.</p>
+<pre><code>enable-git-config=1
+</code></pre>
+<p>project-list sets where cgit looks for projects, this list is the one updated by gitolite</p>
+<pre><code>project-list=/home/git/projects.list
+</code></pre>
+<p>scan-path sets where the actual git repositories live</p>
+<pre><code>scan-path=/home/git/repositories
+</code></pre>
+<h2 id="references">References</h2>
+<p><a href="https://www.sixfoisneuf.fr/posts/setting-up-cgit-with-caddy2/">SixFoisNeuf</a> Used this blog to run cgit using fcgiwrap rather than a caddy plugin. The entire cgit with caddy section was using his work.</p>
+<p><a href="https://matejamaric.com/blog/git-server/">Mateja Maric</a> Used this blog to help configure cgitrc, gitolite.rc</p>
+<p><a href="https://luke.hsiao.dev/blog/cgit-caddy-gitolite/">Luke Hsiao</a> Used the git user creation command from this blog.</p>
+<p><a href="https://www.omarpolo.com/post/cgit-gitolite.html">Omar Polo (yumh)</a> Used this blog to help configure cgitrc for hidden repos.</p>
+<p><a href="https://bryanbrattlof.com/cgit-nginx-gitolite-a-personal-git-server/">Bryan Brattlof</a> Not much used here, kept as reference.</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ </article>
+ </div>
+
+
+<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
+ </div>
+
+ </main>
+
+ <footer class="md-footer">
+
+ <div class="md-footer-meta md-typeset">
+ <div class="md-footer-meta__inner md-grid">
+ <div class="md-copyright">
+
+
+ Made with
+ <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
+ Material for MkDocs
+ </a>
+
+</div>
+
+ </div>
+ </div>
+</footer>
+
+ </div>
+ <div class="md-dialog" data-md-component="dialog">
+ <div class="md-dialog__inner md-typeset"></div>
+ </div>
+
+
+ <script id="__config" type="application/json">{"base": "../..", "features": [], "search": "../../assets/javascripts/workers/search.f886a092.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script>
+
+
+ <script src="../../assets/javascripts/bundle.d7c377c4.min.js"></script>
+
+
+ </body>
+</html> \ No newline at end of file
diff --git a/site/server/ddns/index.html b/site/server/ddns/index.html
new file mode 100644
index 0000000..a81e917
--- /dev/null
+++ b/site/server/ddns/index.html
@@ -0,0 +1,612 @@
+
+<!doctype html>
+<html lang="en" class="no-js">
+ <head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
+
+
+
+ <link rel="canonical" href="https://wiki.joshuayun.com/server/ddns/">
+
+
+ <link rel="prev" href="../cgit/">
+
+
+ <link rel="next" href="../../about/">
+
+
+ <link rel="icon" href="../../assets/images/favicon.png">
+ <meta name="generator" content="mkdocs-1.5.3, mkdocs-material-9.5.1">
+
+
+
+ <title>DDNS - Joshua's Wiki</title>
+
+
+
+ <link rel="stylesheet" href="../../assets/stylesheets/main.45e1311d.min.css">
+
+
+
+
+
+
+
+
+
+
+
+
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
+ <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
+
+
+
+ <script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
+
+
+
+
+
+
+ </head>
+
+
+ <body dir="ltr">
+
+
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
+ <label class="md-overlay" for="__drawer"></label>
+ <div data-md-component="skip">
+
+
+ <a href="#ddns-setup" class="md-skip">
+ Skip to content
+ </a>
+
+ </div>
+ <div data-md-component="announce">
+
+ </div>
+
+
+
+
+
+
+<header class="md-header md-header--shadow" data-md-component="header">
+ <nav class="md-header__inner md-grid" aria-label="Header">
+ <a href="../.." title="Joshua&#39;s Wiki" class="md-header__button md-logo" aria-label="Joshua's Wiki" data-md-component="logo">
+
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z"/></svg>
+
+ </a>
+ <label class="md-header__button md-icon" for="__drawer">
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
+ </label>
+ <div class="md-header__title" data-md-component="header-title">
+ <div class="md-header__ellipsis">
+ <div class="md-header__topic">
+ <span class="md-ellipsis">
+ Joshua's Wiki
+ </span>
+ </div>
+ <div class="md-header__topic" data-md-component="header-topic">
+ <span class="md-ellipsis">
+
+ DDNS
+
+ </span>
+ </div>
+ </div>
+ </div>
+
+
+ <script>var media,input,key,value,palette=__md_get("__palette");if(palette&&palette.color){"(prefers-color-scheme)"===palette.color.media&&(media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']"),palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent"));for([key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
+
+
+
+ <label class="md-header__button md-icon" for="__search">
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
+ </label>
+ <div class="md-search" data-md-component="search" role="dialog">
+ <label class="md-search__overlay" for="__search"></label>
+ <div class="md-search__inner" role="search">
+ <form class="md-search__form" name="search">
+ <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
+ <label class="md-search__icon md-icon" for="__search">
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
+ </label>
+ <nav class="md-search__options" aria-label="Search">
+
+ <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
+ </button>
+ </nav>
+
+ </form>
+ <div class="md-search__output">
+ <div class="md-search__scrollwrap" data-md-scrollfix>
+ <div class="md-search-result" data-md-component="search-result">
+ <div class="md-search-result__meta">
+ Initializing search
+ </div>
+ <ol class="md-search-result__list" role="presentation"></ol>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+
+ </nav>
+
+</header>
+
+ <div class="md-container" data-md-component="container">
+
+
+
+
+
+
+ <main class="md-main" data-md-component="main">
+ <div class="md-main__inner md-grid">
+
+
+
+ <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+
+
+
+<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
+ <label class="md-nav__title" for="__drawer">
+ <a href="../.." title="Joshua&#39;s Wiki" class="md-nav__button md-logo" aria-label="Joshua's Wiki" data-md-component="logo">
+
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z"/></svg>
+
+ </a>
+ Joshua's Wiki
+ </label>
+
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../.." class="md-nav__link">
+
+
+ <span class="md-ellipsis">
+ Home
+ </span>
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active md-nav__item--nested">
+
+
+
+
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" checked>
+
+
+ <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
+
+
+ <span class="md-ellipsis">
+ Server
+ </span>
+
+
+ <span class="md-nav__icon md-icon"></span>
+ </label>
+
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="true">
+ <label class="md-nav__title" for="__nav_2">
+ <span class="md-nav__icon md-icon"></span>
+ Server
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../server/" class="md-nav__link">
+
+
+ <span class="md-ellipsis">
+ Server Setup
+ </span>
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../cgit/" class="md-nav__link">
+
+
+ <span class="md-ellipsis">
+ Cgit with gitolite
+ </span>
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active">
+
+ <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
+
+
+
+
+
+ <label class="md-nav__link md-nav__link--active" for="__toc">
+
+
+ <span class="md-ellipsis">
+ DDNS
+ </span>
+
+
+ <span class="md-nav__icon md-icon"></span>
+ </label>
+
+ <a href="./" class="md-nav__link md-nav__link--active">
+
+
+ <span class="md-ellipsis">
+ DDNS
+ </span>
+
+
+ </a>
+
+
+
+<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
+
+
+
+
+
+
+ <label class="md-nav__title" for="__toc">
+ <span class="md-nav__icon md-icon"></span>
+ Table of contents
+ </label>
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#porkbun-api" class="md-nav__link">
+ <span class="md-ellipsis">
+ Porkbun API
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#ddns-updater" class="md-nav__link">
+ <span class="md-ellipsis">
+ ddns-updater
+ </span>
+ </a>
+
+ <nav class="md-nav" aria-label="ddns-updater">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#docker-install" class="md-nav__link">
+ <span class="md-ellipsis">
+ Docker install
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#setup" class="md-nav__link">
+ <span class="md-ellipsis">
+ Setup
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#usage" class="md-nav__link">
+ <span class="md-ellipsis">
+ Usage
+ </span>
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ </ul>
+
+</nav>
+
+ </li>
+
+
+
+
+ </ul>
+ </nav>
+
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../about/" class="md-nav__link">
+
+
+ <span class="md-ellipsis">
+ About
+ </span>
+
+
+ </a>
+ </li>
+
+
+
+ </ul>
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+
+<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
+
+
+
+
+
+
+ <label class="md-nav__title" for="__toc">
+ <span class="md-nav__icon md-icon"></span>
+ Table of contents
+ </label>
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#porkbun-api" class="md-nav__link">
+ <span class="md-ellipsis">
+ Porkbun API
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#ddns-updater" class="md-nav__link">
+ <span class="md-ellipsis">
+ ddns-updater
+ </span>
+ </a>
+
+ <nav class="md-nav" aria-label="ddns-updater">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#docker-install" class="md-nav__link">
+ <span class="md-ellipsis">
+ Docker install
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#setup" class="md-nav__link">
+ <span class="md-ellipsis">
+ Setup
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#usage" class="md-nav__link">
+ <span class="md-ellipsis">
+ Usage
+ </span>
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ </ul>
+
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+
+ <div class="md-content" data-md-component="content">
+ <article class="md-content__inner md-typeset">
+
+
+
+
+<h1 id="ddns-setup">DDNS Setup</h1>
+<h2 id="porkbun-api">Porkbun API</h2>
+<p>Follow this <a href="https://kb.porkbun.com/article/190-getting-started-with-the-porkbun-api">porkbun</a> guide on enabling the api for your domain.</p>
+<h2 id="ddns-updater">ddns-updater</h2>
+<p><a href="https://github.com/qdm12/ddns-updater">ddns-updater</a> is the program used to update Porkbun's A record of your domain.</p>
+<h3 id="docker-install">Docker install</h3>
+<p>Install the <a href="https://docs.docker.com/engine/install/debian/">docker</a> package from official docker repositories.</p>
+<h3 id="setup">Setup</h3>
+<p>Create a directory with config.json inside, and make sure that its owner has a uid of 1000.</p>
+<pre><code>mkdir data
+touch data/config.json
+# Owned by user ID of Docker container (1000)
+chown -R 1000 data
+# all access (for creating json database file data/updates.json)
+chmod 700 data
+# read access only
+chmod 400 data/config.json
+</code></pre>
+<p>Configuration for porkbun in config.json</p>
+<pre><code>{
+ "settings": [
+ {
+ "provider": "porkbun",
+ "domain": "domain.com",
+ "host": "@",
+ "api_key": "PORKBUN SECRET KEY",
+ "secret_api_key": "PORKBUN API KEY",
+ "ip_version": "ipv4"
+ }
+ ]
+}
+</code></pre>
+<p>Optional <code>"ttl"</code> paramter specifing A record TTL not included.</p>
+<h3 id="usage">Usage</h3>
+<pre><code>docker run -d -p 8000:8000/tcp -v "$(pwd)"/data:/updater/data qmcgaw/ddns-updater
+</code></pre>
+<p>This will start a docker container that will start updating the DNS records.
+Status updates can be seen in a web server by going to localhost:8000.</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ </article>
+ </div>
+
+
+<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
+ </div>
+
+ </main>
+
+ <footer class="md-footer">
+
+ <div class="md-footer-meta md-typeset">
+ <div class="md-footer-meta__inner md-grid">
+ <div class="md-copyright">
+
+
+ Made with
+ <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
+ Material for MkDocs
+ </a>
+
+</div>
+
+ </div>
+ </div>
+</footer>
+
+ </div>
+ <div class="md-dialog" data-md-component="dialog">
+ <div class="md-dialog__inner md-typeset"></div>
+ </div>
+
+
+ <script id="__config" type="application/json">{"base": "../..", "features": [], "search": "../../assets/javascripts/workers/search.f886a092.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script>
+
+
+ <script src="../../assets/javascripts/bundle.d7c377c4.min.js"></script>
+
+
+ </body>
+</html> \ No newline at end of file
diff --git a/site/server/server/index.html b/site/server/server/index.html
new file mode 100644
index 0000000..b6ecf70
--- /dev/null
+++ b/site/server/server/index.html
@@ -0,0 +1,726 @@
+
+<!doctype html>
+<html lang="en" class="no-js">
+ <head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
+
+
+
+ <link rel="canonical" href="https://wiki.joshuayun.com/server/server/">
+
+
+ <link rel="prev" href="../..">
+
+
+ <link rel="next" href="../cgit/">
+
+
+ <link rel="icon" href="../../assets/images/favicon.png">
+ <meta name="generator" content="mkdocs-1.5.3, mkdocs-material-9.5.1">
+
+
+
+ <title>Server Setup - Joshua's Wiki</title>
+
+
+
+ <link rel="stylesheet" href="../../assets/stylesheets/main.45e1311d.min.css">
+
+
+
+
+
+
+
+
+
+
+
+
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
+ <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
+
+
+
+ <script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
+
+
+
+
+
+
+ </head>
+
+
+ <body dir="ltr">
+
+
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
+ <label class="md-overlay" for="__drawer"></label>
+ <div data-md-component="skip">
+
+
+ <a href="#homelab-server-setup" class="md-skip">
+ Skip to content
+ </a>
+
+ </div>
+ <div data-md-component="announce">
+
+ </div>
+
+
+
+
+
+
+<header class="md-header md-header--shadow" data-md-component="header">
+ <nav class="md-header__inner md-grid" aria-label="Header">
+ <a href="../.." title="Joshua&#39;s Wiki" class="md-header__button md-logo" aria-label="Joshua's Wiki" data-md-component="logo">
+
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z"/></svg>
+
+ </a>
+ <label class="md-header__button md-icon" for="__drawer">
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
+ </label>
+ <div class="md-header__title" data-md-component="header-title">
+ <div class="md-header__ellipsis">
+ <div class="md-header__topic">
+ <span class="md-ellipsis">
+ Joshua's Wiki
+ </span>
+ </div>
+ <div class="md-header__topic" data-md-component="header-topic">
+ <span class="md-ellipsis">
+
+ Server Setup
+
+ </span>
+ </div>
+ </div>
+ </div>
+
+
+ <script>var media,input,key,value,palette=__md_get("__palette");if(palette&&palette.color){"(prefers-color-scheme)"===palette.color.media&&(media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']"),palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent"));for([key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
+
+
+
+ <label class="md-header__button md-icon" for="__search">
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
+ </label>
+ <div class="md-search" data-md-component="search" role="dialog">
+ <label class="md-search__overlay" for="__search"></label>
+ <div class="md-search__inner" role="search">
+ <form class="md-search__form" name="search">
+ <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
+ <label class="md-search__icon md-icon" for="__search">
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
+ </label>
+ <nav class="md-search__options" aria-label="Search">
+
+ <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
+ </button>
+ </nav>
+
+ </form>
+ <div class="md-search__output">
+ <div class="md-search__scrollwrap" data-md-scrollfix>
+ <div class="md-search-result" data-md-component="search-result">
+ <div class="md-search-result__meta">
+ Initializing search
+ </div>
+ <ol class="md-search-result__list" role="presentation"></ol>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+
+ </nav>
+
+</header>
+
+ <div class="md-container" data-md-component="container">
+
+
+
+
+
+
+ <main class="md-main" data-md-component="main">
+ <div class="md-main__inner md-grid">
+
+
+
+ <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+
+
+
+<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
+ <label class="md-nav__title" for="__drawer">
+ <a href="../.." title="Joshua&#39;s Wiki" class="md-nav__button md-logo" aria-label="Joshua's Wiki" data-md-component="logo">
+
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z"/></svg>
+
+ </a>
+ Joshua's Wiki
+ </label>
+
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../.." class="md-nav__link">
+
+
+ <span class="md-ellipsis">
+ Home
+ </span>
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active md-nav__item--nested">
+
+
+
+
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" checked>
+
+
+ <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
+
+
+ <span class="md-ellipsis">
+ Server
+ </span>
+
+
+ <span class="md-nav__icon md-icon"></span>
+ </label>
+
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="true">
+ <label class="md-nav__title" for="__nav_2">
+ <span class="md-nav__icon md-icon"></span>
+ Server
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active">
+
+ <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
+
+
+
+
+
+ <label class="md-nav__link md-nav__link--active" for="__toc">
+
+
+ <span class="md-ellipsis">
+ Server Setup
+ </span>
+
+
+ <span class="md-nav__icon md-icon"></span>
+ </label>
+
+ <a href="./" class="md-nav__link md-nav__link--active">
+
+
+ <span class="md-ellipsis">
+ Server Setup
+ </span>
+
+
+ </a>
+
+
+
+<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
+
+
+
+
+
+
+ <label class="md-nav__title" for="__toc">
+ <span class="md-nav__icon md-icon"></span>
+ Table of contents
+ </label>
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#linux-distribution-used" class="md-nav__link">
+ <span class="md-ellipsis">
+ Linux Distribution Used
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#ssh" class="md-nav__link">
+ <span class="md-ellipsis">
+ SSH
+ </span>
+ </a>
+
+ <nav class="md-nav" aria-label="SSH">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#optional-security-enhancements" class="md-nav__link">
+ <span class="md-ellipsis">
+ Optional security enhancements
+ </span>
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#ddns" class="md-nav__link">
+ <span class="md-ellipsis">
+ DDNS
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#caddy" class="md-nav__link">
+ <span class="md-ellipsis">
+ Caddy
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#cgit-gitolite" class="md-nav__link">
+ <span class="md-ellipsis">
+ Cgit &amp; gitolite
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#radicale" class="md-nav__link">
+ <span class="md-ellipsis">
+ Radicale
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#webdav" class="md-nav__link">
+ <span class="md-ellipsis">
+ Webdav
+ </span>
+ </a>
+
+</li>
+
+ </ul>
+
+</nav>
+
+ </li>
+
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../cgit/" class="md-nav__link">
+
+
+ <span class="md-ellipsis">
+ Cgit with gitolite
+ </span>
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../ddns/" class="md-nav__link">
+
+
+ <span class="md-ellipsis">
+ DDNS
+ </span>
+
+
+ </a>
+ </li>
+
+
+
+
+ </ul>
+ </nav>
+
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../about/" class="md-nav__link">
+
+
+ <span class="md-ellipsis">
+ About
+ </span>
+
+
+ </a>
+ </li>
+
+
+
+ </ul>
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+
+<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
+
+
+
+
+
+
+ <label class="md-nav__title" for="__toc">
+ <span class="md-nav__icon md-icon"></span>
+ Table of contents
+ </label>
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#linux-distribution-used" class="md-nav__link">
+ <span class="md-ellipsis">
+ Linux Distribution Used
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#ssh" class="md-nav__link">
+ <span class="md-ellipsis">
+ SSH
+ </span>
+ </a>
+
+ <nav class="md-nav" aria-label="SSH">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#optional-security-enhancements" class="md-nav__link">
+ <span class="md-ellipsis">
+ Optional security enhancements
+ </span>
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#ddns" class="md-nav__link">
+ <span class="md-ellipsis">
+ DDNS
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#caddy" class="md-nav__link">
+ <span class="md-ellipsis">
+ Caddy
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#cgit-gitolite" class="md-nav__link">
+ <span class="md-ellipsis">
+ Cgit &amp; gitolite
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#radicale" class="md-nav__link">
+ <span class="md-ellipsis">
+ Radicale
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#webdav" class="md-nav__link">
+ <span class="md-ellipsis">
+ Webdav
+ </span>
+ </a>
+
+</li>
+
+ </ul>
+
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+
+ <div class="md-content" data-md-component="content">
+ <article class="md-content__inner md-typeset">
+
+
+
+
+<h1 id="homelab-server-setup">Homelab Server Setup</h1>
+<p>This page describes how I setup my personal webserver</p>
+<p>I'm hosting a website, wiki, caldav using Radicale, git using cgit and Gitolite, and webdav support</p>
+<h2 id="linux-distribution-used">Linux Distribution Used</h2>
+<p>Debian 12 Bookworm.</p>
+<p>Update the system.</p>
+<pre><code># apt update
+# apt upgrade
+</code></pre>
+<h2 id="ssh">SSH</h2>
+<p>Generate ssh keys</p>
+<pre><code>ssh-keygen -t [keytype]
+</code></pre>
+<p>Add ssh keys to <code>~/.ssh/authorized_keys</code></p>
+<pre><code>ssh-copy-id -i /path/to/pubkey [user@]machine
+</code></pre>
+<h3 id="optional-security-enhancements">Optional security enhancements</h3>
+<p>Change the port in <code>/etc/sshd_config</code> to a nonstandard port to harden security.</p>
+<pre><code>Port 1234
+</code></pre>
+<p>Disable password login in <code>/etc/sshd_config/</code></p>
+<pre><code>PubkeyAuthentication yes
+ChallengeResponseAuthentication no
+PasswordAuthentication no
+KbdInteractiveAuthentication no
+UsePAM no
+</code></pre>
+<p>Disable XForwarding</p>
+<pre><code>X11Forwarding no
+</code></pre>
+<p>Disable remote root login</p>
+<pre><code>PermitRootLogin no
+</code></pre>
+<h2 id="ddns">DDNS</h2>
+<p>Setup <a href="../ddns/">Dyanmic DNS (ddns) with Porkbun and ddns-updater</a>.</p>
+<h2 id="caddy">Caddy</h2>
+<p>Install the <a href="https://caddyserver.com/docs/install#debian-ubuntu-raspbian">Caddy</a> package from Caddy directly.</p>
+<h2 id="cgit-gitolite">Cgit &amp; gitolite</h2>
+<p>Setup <a href="../cgit/">cgit with gitolite and caddy</a>.</p>
+<h2 id="radicale">Radicale</h2>
+<p>Install the <a href="https://packages.debian.org/bookworm/radicale">Radicale</a> package.</p>
+<p>Start the Radicale service.</p>
+<pre><code>systemctl enable radicale.service
+systemctl start radicale.service
+</code></pre>
+<p>Generate secure passwords using htpasswd.</p>
+<pre><code># Create a new htpasswd file with the user "user1"
+$ htpasswd -c /path/to/users user1
+New password:
+Re-type new password:
+# Add another user
+$ htpasswd /path/to/users user2
+New password:
+Re-type new password:
+</code></pre>
+<p>Edit configuration to add users</p>
+<pre><code>[auth]
+type = htpasswd
+htpasswd_filename = /path/to/users
+# encryption method used in the htpasswd file
+htpasswd_encryption = md5
+</code></pre>
+<p>Add configuration to caddy.</p>
+<pre><code>caldav.joshuayun.com {
+ handle_path /* {
+ reverse_proxy localhost:5232 {
+ header_up X-Script-Name /radicale
+ }
+ }
+ handle_path /radicale/* {
+ reverse_proxy localhost:5232 {
+ header_up X-Script-Name /radicale
+ }
+ }
+}
+</code></pre>
+<h2 id="webdav">Webdav</h2>
+<p>Add the Webdav module to Caddy.</p>
+<pre><code>sudo caddy add-package github.com/mholt/caddy-webdav
+sudo systemctl restart caddy
+</code></pre>
+<p>Add Webdav to the Caddy configuration</p>
+<p>Example configuration with protected file browsing, see the <a href="https://github.com/mholt/caddy-webdav">github</a> for more configurations.</p>
+<pre><code>webdav.joshuayun.com {
+ @get method GET
+ root * WEBDAV_PATH
+ route {
+ basicauth {
+ joshua CADDY_HASH
+ }
+ file_server @get browse
+ webdav
+ }
+}
+</code></pre>
+<p>To generate the hash:</p>
+<pre><code>caddy hash-password
+</code></pre>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ </article>
+ </div>
+
+
+<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
+ </div>
+
+ </main>
+
+ <footer class="md-footer">
+
+ <div class="md-footer-meta md-typeset">
+ <div class="md-footer-meta__inner md-grid">
+ <div class="md-copyright">
+
+
+ Made with
+ <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
+ Material for MkDocs
+ </a>
+
+</div>
+
+ </div>
+ </div>
+</footer>
+
+ </div>
+ <div class="md-dialog" data-md-component="dialog">
+ <div class="md-dialog__inner md-typeset"></div>
+ </div>
+
+
+ <script id="__config" type="application/json">{"base": "../..", "features": [], "search": "../../assets/javascripts/workers/search.f886a092.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script>
+
+
+ <script src="../../assets/javascripts/bundle.d7c377c4.min.js"></script>
+
+
+ </body>
+</html> \ No newline at end of file
diff --git a/site/sitemap.xml b/site/sitemap.xml
index 0f8724e..305a0dd 100644
--- a/site/sitemap.xml
+++ b/site/sitemap.xml
@@ -1,3 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
+ <url>
+ <loc>https://wiki.joshuayun.com/</loc>
+ <lastmod>2023-12-30</lastmod>
+ <changefreq>daily</changefreq>
+ </url>
+ <url>
+ <loc>https://wiki.joshuayun.com/about/</loc>
+ <lastmod>2023-12-30</lastmod>
+ <changefreq>daily</changefreq>
+ </url>
+ <url>
+ <loc>https://wiki.joshuayun.com/server/cgit/</loc>
+ <lastmod>2023-12-30</lastmod>
+ <changefreq>daily</changefreq>
+ </url>
+ <url>
+ <loc>https://wiki.joshuayun.com/server/ddns/</loc>
+ <lastmod>2023-12-30</lastmod>
+ <changefreq>daily</changefreq>
+ </url>
+ <url>
+ <loc>https://wiki.joshuayun.com/server/server/</loc>
+ <lastmod>2023-12-30</lastmod>
+ <changefreq>daily</changefreq>
+ </url>
</urlset> \ No newline at end of file
diff --git a/site/sitemap.xml.gz b/site/sitemap.xml.gz
index 87b3ac1..f7f13a5 100644
--- a/site/sitemap.xml.gz
+++ b/site/sitemap.xml.gz
Binary files differ