はじめに
自宅サーバーをいじることはとても楽しいですが情報源が限られているため探すのに時間がかかるため一覧表形式で書きました。
Forgejo&Drone
まずそれぞれの機能についてです。ForgejoはGitHubの代替ソフトウェアでありGitHubと変わりなく使用ができます。そしてDroneはCI/CDのためのプラットフォームであり本番環境に自動的に切り替える時などに使うものです。今回この2つを連携することによって.drone.ymlを入れた状態でコミットするだけで実際にサイトに反映されたりできる様にしました。この連携はできると軽量でかつ高性能で便利ですが連携が初心者としてはとても難しく時間がかかるため参考として以下にymlのファイルをあげておきます。
そしてDRONE_RPC_SECRETなどはアクセスなどをするために統一しておきましょう
Client_id等について
ForgejoのURL/user/settings/applicationsにアクセスします。

そしてそこにわかりやすいアプリケーション名とリダイレクトURI(DroneのURL/login)を入力して「アプリケーションの作成」のボタンを押すと

この様にクライアントIDとクライアントシークレットが作られるためそれを以下のコードに入れましょう
Forgejo.yml
networks:
forgejo:
external: false
services:
server:
image: codeberg.org/forgejo/forgejo:13
container_name: forgejo
# DB情報
environment:
- USER_UID=1000
- USER_GID=1000
- FORGEJO__database__DB_TYPE=postgres
- FORGEJO__database__HOST=db:5432
- FORGEJO__database__NAME=forgejo
- FORGEJO__database__USER=forgejo
- FORGEJO__database__PASSWD=forgejo
- FORGEJO__server__ROOT_URL=実際のURL入力
restart: always
networks:
- forgejo
volumes:
- ./forgejo:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "3000:3000" #実際にアクセスするためのポート番号
- "222:22"
depends_on:
- db
db:
image: postgres:14
restart: always
environment:
- POSTGRES_USER=forgejo
- POSTGRES_PASSWORD=forgejo
- POSTGRES_DB=forgejo
networks:
- forgejo
volumes:
- ./postgres:/var/lib/postgresql/data
drone.yml
services:
drone-server:
image: drone/drone:2
container_name: drone-drone-server-1
ports:
- 8090:80 #実際に使用するポート番号
volumes:
- ./data:/data
restart: always
environment:
- DRONE_SERVER_PROTO=https
- DRONE_SERVER_HOST=DroneのURL
- DRONE_GITEA_SERVER=ForgejoのURL
- DRONE_GITEA_CLIENT_ID=a199ea5f-0e0d-4cb5-a617-f311e3172c12
- DRONE_GITEA_CLIENT_SECRET=gto_2h3hpzeftbu7ylr7xd7uw7lcieh7kz42rfai6d6vf7ty44qi33iq
- DRONE_RPC_SECRET=Forgejo
- DRONE_USER_CREATE=username:ユーザー名,admin:true #管理者権限の設定
networks:
- drone-network
networks:
drone-network:
name: drone-network # ネットワーク名を固定
drone_runner.yml
services:
drone-runner:
image: drone/drone-runner-docker:latest
container_name: drone-runner
volumes:
- /var/run/docker.sock:/var/run/docker.sock
restart: always
environment:
- DRONE_RPC_HOST=drone-drone-server-1
- DRONE_RPC_PROTO=http
- DRONE_RPC_SECRET=Forgejo
- DRONE_RUNNER_CAPACITY=2
- DRONE_RUNNER_NETWORKS=drone-network
networks:
- drone-network
networks:
drone-network:
external: true
注意点
以下の様にTrustedを管理者権限を持っている方がONにしないと反応しません

左下のアカウントマークの上にあるもので管理者権限を別の人につけることができます。
AdGuard Home&Nginx Proxy Manager
まずそれぞれの機能です。AdGuard HomeはDNS単位でのトラッカーや広告ブロック、DNS書き換えを行うものです。そしてNginx Proxy Managerはリバースプロキシ(インターネット上のクライアントからのリクエストを代理で受け取り、バックエンドのWebサーバーへ転送する仕組み)の機能を持っています。この2つを組み合わせることでdns.devlinkhub.netでAdGuard Homeにアクセスができる様にしたりできます。
AdGuardHome.yml
services:
adguardhome:
image: adguard/adguardhome:latest
container_name: adguardhome
restart: unless-stopped
volumes:
- adguard-work:/opt/adguardhome/work
- adguard-conf:/opt/adguardhome/conf
ports:
# --- ここが最重要:mode: host を指定してIPを透過させる ---
- target: 53
published: 53
protocol: udp
mode: host
- target: 53
published: 53
protocol: tcp
mode: host
# 管理画面などは Forgejo と被らないよう 4000:3000 のまま
- "4000:3000/tcp"
- "853:853/tcp"
- "853:853/udp"
volumes:
adguard-work:
adguard-conf:
そして起動してセットアップを済ませると以下の様な画面になるのでまずフィルターのDNSブロック機能をクリックしてAdGuard DNS filterじゃない方をオフにしてください。オフにしないと広告が表示されなくなります。AdGuard DNS filterはトラッカー等をブロックしてくれるためこれは好みでON/OFFしてください。
そしてDNS書き換えはフィルターの中のDNS書き換えにありDNS書き換え情報を追加するから
書き換え先のドメインとipaddres(Tailscaleであればipv4)を入力します。そして保存します。

NginxProxyManager.yml
version: "3"
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80' # Public HTTP Port
- '443:443' # Public HTTPS Port
- '81:81' # Admin Web Port
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
これもセットアップを済ませたらプロキシホスト→プロキシホストを選択をクリックして書き換え先のドメイン、元々のipaddresとポートを入力します。

両方のセットアップが完了したらいける様になっているはずです。
SSL化
先ほどの設定画面のSSLから以下の様に設定してDNSプロバイダを選択します。今回はcloudflareを使います。

cloudflareのURL/api-tokensのサイトを開き

以下の様に設定して作成するとAPI トークンが取得できるためこれを
Cloudflare API token
dns_cloudflare_api_token=ここ
に入力します。そして保存するとSSL化されます。
まとめ
様々なセルフホストアプリを入れてみましたがやはりセルフホストはとてもよい選択肢だと実感しました。