15 Commits

Author SHA1 Message Date
Peter Wood
e25bc33867 udpated to remove tar.gz and *.db files. removed stirling files since I changed to bentopdf 2025-12-01 07:31:05 -08:00
Peter Wood
c49df33972 stop tracking dockge/data directory 2025-12-01 07:28:17 -08:00
Peter Wood
43e2dfe9cc updated pangolin version 2025-12-01 07:25:03 -08:00
Peter Wood
d183005140 Merge branch 'master' of https://github.com/acedanger/docker 2025-12-01 10:18:18 -05:00
Peter Wood
8988f05c85 updated external flag on volumes after the migration from original racknerd VPS 2025-12-01 10:17:56 -05:00
Peter Wood
babf61b697 added TS_AUTHKEY environment variable 2025-12-01 04:17:53 -08:00
Peter Wood
75d48204ba removed docmost 2025-11-30 16:06:48 -08:00
Peter Wood
255b977aad Add restore script for Gitea, DB, and Runner data 2025-11-30 04:52:13 -08:00
Peter Wood
ce5f3af384 network_mode usage is discontinued in favor of network 2025-11-11 12:12:37 -05:00
Peter Wood
9f6d4744d8 Merge branch 'master' of https://github.com/acedanger/docker 2025-11-10 21:34:54 -05:00
Peter Wood
b3632c0333 Add runner configuration and update docker-compose for Gitea runner 2025-11-10 21:34:49 -05:00
Peter Wood
f9073a07a5 Update .gitignore, README, and Traefik configuration; add new services and environment variables 2025-11-10 19:24:57 -05:00
Peter Wood
b3ee10a119 Merge branch 'master' of https://github.com/acedanger/docker 2025-11-10 06:38:04 -05:00
Peter Wood
6b3089135f Update Chrome and Meilisearch images in docker-compose 2025-11-10 06:28:33 -05:00
Peter Wood
f4ab567706 Add healthcheck and labels to Gitea services in docker-compose; add runner for CICD 2025-11-10 06:27:39 -05:00
23 changed files with 301 additions and 64 deletions

27
.gitignore vendored
View File

@@ -1,4 +1,8 @@
# ignore environment files
.env
# whatever the hell this file is
core core
cloudflare/tailscale/ cloudflare/tailscale/
@@ -17,19 +21,28 @@ nginxproxymanager/mysql
opengist/opengist-database opengist/opengist-database
papra/app-data/ papra/app-data/
# stirling # beszel
pdf/stirling/latest/data/ beszel/beszel_data/*
pdf/stirling/latest/logs/ beszel/beszel_data/auxiliary.db
pdf/stirling/latest/config/db/backup/
pdf/stirling/latest/config/*.db
# pangolin # pangolin
pangolin/config/db/db.sqlite pangolin/config/db/db.sqlite
pangolin/config/db/backups/db*.sqlite
pangolin/config/letsencrypt/acme.json pangolin/config/letsencrypt/acme.json
pangolin/config/key pangolin/config/key
pangolin/config/config.yml.bak pangolin/config/config.yml.bak
pangolin/installer pangolin/installer
pangolin/config/traefik-dashboard/positions/.position
pangolin/config/traefik-dashboard/geoip/*.mmdb
pangolin/config/traefik-dashboard/dashboard/*.db-wal
pangolin/config/traefik/logs/access.log
pangolin/config/traefik-dashboard/dashboard/*.db
pangolin/config/traefik-dashboard/dashboard/*.db-shm
# ignore environment files dockge/data/
.env
gitea/app.ini
gitea/database.sql
gitea/*.tar.gz
golinks/golink.db

View File

@@ -3,16 +3,26 @@
## Useful aliases ## Useful aliases
These are defined in <https://github.com/acedanger/shell>
`dcdn`=`docker compose down` `dcdn`=`docker compose down`
`dcupd`=`docker compose up -d` `dcupd`=`docker compose up -d`
`dcpull`=`docker compose pull` `dcpull`=`docker compose pull`
`dsta`=`docker stop $(docker ps -q)` `dsta`=`docker stop $(docker ps -q)`
`dclf`=`docker compose logs -f` `dclf`=`docker compose logs -f`
`dxcit`=`docker container exec -it` `dxcit`=`docker container exec -it`
`lzd`=`lazydocker` `lzd`=`lazydocker`
## Putting it all together ## Putting it all together
Shut it down, pull the latest images, and start it up again: Shut it down, pull the latest images, start it up in the background, and follow the logs:
`dcdn; dcpull; dcupd` ```bash
dcdn && dcpull && dcupd && dclf
```

View File

@@ -1,3 +0,0 @@
{
"type": "sqlite"
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,7 +0,0 @@
# openssl rand -base64 18
POSTGRES_PASSWORD=
POSTGRES_URL=postgresql://docmost:password@db:5432/docmost?schema=public
# Application Configuration
# openssl rand -base64 33
APP_SECRET=

View File

@@ -1,35 +0,0 @@
services:
docmost:
image: docmost/docmost:latest
depends_on:
- db
- redis
environment:
APP_URL: http://localhost:3000
APP_SECRET: ${APP_SECRET}
DATABASE_URL: ${POSTGRES_URL}
REDIS_URL: redis://redis:6379
ports:
- 9380:3000
restart: unless-stopped
volumes:
- docmost:/app/data/storage
db:
image: postgres:16-alpine
environment:
POSTGRES_DB: docmost
POSTGRES_USER: docmost
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
restart: unless-stopped
volumes:
- db_data:/var/lib/postgresql/data
redis:
image: redis:7.2-alpine
restart: unless-stopped
volumes:
- redis_data:/data
volumes:
docmost: null
db_data: null
redis_data: null
networks: {}

View File

@@ -22,6 +22,19 @@ services:
- ${GITEA_SSH_PORT:-2229}:22 - ${GITEA_SSH_PORT:-2229}:22
depends_on: depends_on:
- db - db
labels:
- diun.enable=true
healthcheck:
test:
- CMD
- curl
- -f
- http://localhost
interval: 10s
retries: 3
start_period: 30s
timeout: 10s
db: db:
image: docker.io/library/postgres:14 image: docker.io/library/postgres:14
restart: always restart: always
@@ -33,11 +46,39 @@ services:
- gitea - gitea
volumes: volumes:
- postgres:/var/lib/postgresql/data - postgres:/var/lib/postgresql/data
runner:
image: gitea/act_runner:latest
container_name: gitea-runner
restart: always
networks:
- gitea
volumes:
- runner:/data
- /var/run/docker.sock:/var/run/docker.sock
- ./runner-config.yaml:/data/config.yaml:ro
environment:
- GITEA_INSTANCE_URL=http://server:3000
- GITEA_RUNNER_REGISTRATION_TOKEN=${GITEA_RUNNER_REGISTRATION_TOKEN}
- GITEA_RUNNER_NAME=docker-runner
- CONFIG_FILE=/data/config.yaml
command: >
sh -c "
if [ ! -f /data/.runner ]; then
act_runner register --no-interactive --instance http://server:3000 --token $${GITEA_RUNNER_REGISTRATION_TOKEN} --name docker-runner;
fi;
act_runner --config /data/config.yaml daemon
"
depends_on:
- server
labels:
- diun.enable=true
networks: networks:
gitea: gitea:
external: false external: false
volumes: volumes:
gitea: gitea:
driver: local
postgres: postgres:
driver: local runner:

24
gitea/restore.sh Executable file
View File

@@ -0,0 +1,24 @@
#!/bin/bash
# RESTORE SCRIPT
echo "WARNING: This will overwrite your current Gitea/DB/Runner data."
read -p "Are you sure? (y/N): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then exit 1; fi
docker compose down
echo "Restoring Database Volume..."
docker compose up -d db
echo "Waiting for DB to initialize..."
sleep 15
cat database.sql | docker compose exec -T db psql -U ${POSTGRES_USER:-gitea} -d ${POSTGRES_DB:-gitea}
echo "Restoring Gitea Files..."
docker run --rm --volumes-from gitea -v $(pwd):/backup alpine tar xzf /backup/gitea_data.tar.gz -C /data
echo "Restoring Runner Files..."
docker run --rm --volumes-from gitea-runner -v $(pwd):/backup alpine tar xzf /backup/runner_data.tar.gz -C /data
echo "Restarting stack..."
docker compose up -d
echo "Restore Complete."

15
gitea/runner-config.yaml Normal file
View File

@@ -0,0 +1,15 @@
log:
level: info
runner:
capacity: 1
timeout: 3h
container:
# Use the gitea network so job containers can resolve the 'server' hostname
network: gitea_gitea
privileged: false
options: ""
workdir_parent: ""
valid_volumes: []
docker_host: ""

View File

@@ -3,6 +3,8 @@ services:
container_name: golink container_name: golink
restart: unless-stopped restart: unless-stopped
image: ghcr.io/tailscale/golink:main image: ghcr.io/tailscale/golink:main
environment:
- TS_AUTHKEY:${TS_AUTHKEY}
volumes: volumes:
- golinks_data:/home/nonroot - golinks_data:/home/nonroot
labels: labels:

View File

@@ -21,7 +21,7 @@ services:
labels: labels:
- diun.enable=true - diun.enable=true
chrome: chrome:
image: gcr.io/zenika-hub/alpine-chrome:123 image: gcr.io/zenika-hub/alpine-chrome:124
restart: unless-stopped restart: unless-stopped
labels: labels:
- diun.enable=true - diun.enable=true
@@ -33,7 +33,7 @@ services:
- --remote-debugging-port=9222 - --remote-debugging-port=9222
- --hide-scrollbars - --hide-scrollbars
meilisearch: meilisearch:
image: getmeili/meilisearch:v1.11.1 image: getmeili/meilisearch:v1.13.3
restart: unless-stopped restart: unless-stopped
environment: environment:
MEILI_NO_ANALYTICS: true MEILI_NO_ANALYTICS: true

View File

@@ -0,0 +1,76 @@
app:
dashboard_url: https://pangolin.acedanger.com
log_level: info
save_logs: false
domains:
domain1:
base_domain: acedanger.com
cert_resolver: letsencrypt
domain2:
base_domain: peterwood.rocks
cert_resolver: letsencrypt
domain3:
base_domain: peterwood.dad
cert_resolver: letsencrypt
domain4:
base_domain: ptrwd.com
cert_resolver: letsencrypt
domain5:
base_domain: margotwood.xyz
cert_resolver: letsencrypt
server:
external_port: 3000
internal_port: 3001
next_port: 3002
internal_hostname: pangolin
session_cookie_name: p_session_token
resource_access_token_param: p_token
resource_access_token_headers:
id: P-Access-Token-Id
token: P-Access-Token
resource_session_request_param: p_session_request
secret: EkiOH3KRHNzde3euT1yTaYIKXchPmHqz
cors:
origins:
- https://pangolin.acedanger.com
methods:
- GET
- POST
- PUT
- DELETE
- PATCH
headers:
- X-CSRF-Token
- Content-Type
credentials: false
traefik:
cert_resolver: letsencrypt
http_entrypoint: web
https_entrypoint: websecure
gerbil:
start_port: 51820
base_endpoint: pangolin.acedanger.com
use_subdomain: false
block_size: 24
site_block_size: 30
subnet_group: 100.89.137.0/20
rate_limits:
global:
window_minutes: 1
max_requests: 500
email:
smtp_host: smtp.fastmail.com
smtp_port: 465
smtp_user: peter@peterwood.dev
smtp_pass: 7v5x943m4g58384q
no_reply: no-reply@peterwood.dev
users:
server_admin:
email: peter@peterwood.dev
password: 23!hA1F^RCjT28
flags:
require_email_verification: true
disable_signup_without_invite: true
disable_user_create_org: false
allow_raw_resources: true
allow_base_domain_resources: true

View File

@@ -0,0 +1 @@
Database and Contents Copyright (c) 2025 MaxMind, Inc.

View File

@@ -0,0 +1,3 @@
Use of this MaxMind product is governed by MaxMind's GeoLite2 End User License Agreement, which can be viewed at https://www.maxmind.com/en/geolite2/eula.
This database incorporates GeoNames [https://www.geonames.org] geographical data, which is made available under the Creative Commons Attribution 4.0 License. To view a copy of this license, visit https://creativecommons.org/licenses/by/4.0/.

View File

@@ -0,0 +1 @@
Latitude and longitude are not precise and should not be used to identify a particular street address or household.

View File

@@ -41,13 +41,44 @@ http:
tls: tls:
certResolver: letsencrypt certResolver: letsencrypt
# Traefik Log Dashboard router
traefik-dashboard-redirect:
rule: "Host(`traefik-logs.acedanger.com`)"
service: traefik-dashboard-service
entryPoints:
- web
middlewares:
- redirect-to-https
traefik-dashboard-router:
rule: "Host(`traefik-logs.acedanger.com`)"
service: traefik-dashboard-service
entryPoints:
- websecure
tls:
certResolver: letsencrypt
services: services:
next-service: next-service:
loadBalancer: loadBalancer:
servers: servers:
- url: "http://pangolin:3002" # Next.js server - url: "http://pangolin:3002" # Next.js server
api-service: api-service:
loadBalancer: loadBalancer:
servers: servers:
- url: "http://pangolin:3000" # API/WebSocket server - url: "http://pangolin:3000" # API/WebSocket server
traefik-dashboard-service:
loadBalancer:
servers:
- url: "http://traefik-dashboard:3000"
tcp:
serversTransports:
pp-transport-v1:
proxyProtocol:
version: 1
pp-transport-v2:
proxyProtocol:
version: 2

View File

@@ -19,6 +19,20 @@ log:
level: "INFO" level: "INFO"
format: "common" format: "common"
accessLog:
filePath: "/var/log/traefik/access.log"
format: "json"
bufferingSize: 100
fields:
defaultMode: "keep"
names:
ClientUsername: "drop"
headers:
defaultMode: "keep"
names:
Authorization: "drop"
Cookie: "drop"
certificatesResolvers: certificatesResolvers:
letsencrypt: letsencrypt:
acme: acme:

View File

@@ -1,7 +1,7 @@
name: pangolin name: pangolin
services: services:
pangolin: pangolin:
image: fosrl/pangolin:1.10.3 image: fosrl/pangolin:1.12.2
container_name: pangolin container_name: pangolin
restart: unless-stopped restart: unless-stopped
labels: labels:
@@ -18,7 +18,7 @@ services:
timeout: 10s timeout: 10s
retries: 15 retries: 15
gerbil: gerbil:
image: fosrl/gerbil:1.2.1 image: fosrl/gerbil:latest
container_name: gerbil container_name: gerbil
restart: unless-stopped restart: unless-stopped
labels: labels:
@@ -41,7 +41,7 @@ services:
- 21820:21820/udp # port for ACCEPT_CLIENTS env variable - 21820:21820/udp # port for ACCEPT_CLIENTS env variable
- 443:443 # Port for traefik because of the network_mode - 443:443 # Port for traefik because of the network_mode
- 80:80 # Port for traefik because of the network_mode - 80:80 # Port for traefik because of the network_mode
- 2229:2229 # port for gitea, served from europa; git.ptrwd.com # - 2229:2229 # port for gitea, served from a; git.ptrwd.com
- 5432:5432 # port for postgres, served from io - 5432:5432 # port for postgres, served from io
traefik: traefik:
image: traefik:v3 image: traefik:v3
@@ -59,6 +59,53 @@ services:
- ./config/traefik:/etc/traefik:ro # Volume to store the Traefik configuration - ./config/traefik:/etc/traefik:ro # Volume to store the Traefik configuration
- ./config/letsencrypt:/letsencrypt # Volume to store the Let's Encrypt certificates - ./config/letsencrypt:/letsencrypt # Volume to store the Let's Encrypt certificates
- ./config/traefik/logs:/var/log/traefik # Volume to store Traefik logs - ./config/traefik/logs:/var/log/traefik # Volume to store Traefik logs
traefik-agent:
image: hhftechnology/traefik-log-dashboard-agent:dev-dashboard
container_name: traefik-log-dashboard-agent
restart: unless-stopped
labels:
- diun.enable=true
ports:
- 5000:5000
volumes:
- ./config/traefik/logs:/logs:ro
- ./config/traefik-dashboard/geoip:/geoip:ro
- ./config/traefik-dashboard/positions:/data
environment:
- TRAEFIK_LOG_DASHBOARD_ACCESS_PATH=/logs/access.log
- TRAEFIK_LOG_DASHBOARD_ERROR_PATH=/logs/access.log
- TRAEFIK_LOG_DASHBOARD_AUTH_TOKEN=${TRAEFIK_DASHBOARD_AUTH_TOKEN}
- TRAEFIK_LOG_DASHBOARD_SYSTEM_MONITORING=true
- TRAEFIK_LOG_DASHBOARD_GEOIP_ENABLED=true
- TRAEFIK_LOG_DASHBOARD_GEOIP_CITY_DB=/geoip/GeoLite2-City.mmdb
- TRAEFIK_LOG_DASHBOARD_GEOIP_COUNTRY_DB=/geoip/GeoLite2-Country.mmdb
- TRAEFIK_LOG_DASHBOARD_LOG_FORMAT=json
- PORT=5000
healthcheck:
test: [ "CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:5000/api/logs/status" ]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
traefik-dashboard:
image: hhftechnology/traefik-log-dashboard:dev-dashboard
container_name: traefik-log-dashboard
restart: unless-stopped
labels:
- diun.enable=true
ports:
- 3005:3000
volumes:
- ./config/traefik-dashboard/dashboard:/app/data
environment:
- AGENT_API_URL=http://traefik-agent:5000
- AGENT_API_TOKEN=${TRAEFIK_DASHBOARD_AUTH_TOKEN}
- AGENT_NAME=Pangolin Traefik Agent
- NODE_ENV=production
- PORT=3000
depends_on:
traefik-agent:
condition: service_healthy
networks: networks:
default: default:
driver: bridge driver: bridge

View File

@@ -7,6 +7,7 @@ services:
environment: environment:
- DATA_DIR=/data - DATA_DIR=/data
- TS_AUTHKEY=${TS_AUTHKEY} - TS_AUTHKEY=${TS_AUTHKEY}
- TSNET_FORCE_LOGIN=1
restart: always restart: always
labels: labels:
- diun.enable=true - diun.enable=true

View File

@@ -19,3 +19,4 @@ services:
volumes: volumes:
vaultwarden_data: vaultwarden_data:
name: vaultwarden_data name: vaultwarden_data
external: true

View File

@@ -27,5 +27,7 @@ services:
labels: labels:
- diun.enable=true - diun.enable=true
volumes: volumes:
db-data: null db-data:
name: wiki_db-data
external: true
networks: {} networks: {}