Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ A [Large Language Model (LLM)](https://en.wikipedia.org/wiki/Large_language_mode

- [Ollama + Open WebUI](examples/ollama-ui) - Get up and running with Llama 3, Mistral, Gemma, and other large language models using Ollama. Using an interactive, user-friendly WebUI via Open WebUI (formerly known as Ollama WebUI).
- [Serge](examples/serge) - A web interface for chatting with Alpaca through llama.cpp. Fully dockerized, with an easy to use API.
- [LynxPrompt](examples/lynxprompt) - Self-hosted platform for managing and sharing AI IDE configuration files (AGENTS.md, CLAUDE.md) with a web UI, CLI, and federation support.

### Virtual Private Network (VPN) & Remote Access

Expand Down Expand Up @@ -199,6 +200,7 @@ Tools and software for [software project management](https://en.wikipedia.org/wi
- [Watchtower](examples/watchtower) - A container-based solution for automating Docker container base image updates.
- [Unify Network Application](examples/unify-network-application) - The Unifi-network-application software is a powerful, enterprise wireless software engine ideal for high-density client deployments requiring low latency and high uptime performance.
- [UpSnap](examples/upsnap) - A simple wake on lan app written with SvelteKit, Go, PocketBase and nmap.
- [GenieACS](examples/genieacs) - Open-source TR-069 remote management platform for ISP customer-premises equipment (routers, ONTs, set-top boxes).

### Recipe Management

Expand Down Expand Up @@ -255,6 +257,7 @@ Digital [archiving](https://en.wikipedia.org/wiki/Archival_science) and [preserv
- [Shiori](examples/shiori) - Simple bookmark manager and website archiver built with Go.
- [Readeck](examples/readeck) - Readeck is a simple web application that lets you save the precious readable content of web pages you like and want to keep forever.
- [Linkwarden](examples/linkwarden) - Self-hosted collaborative bookmark manager to collect, organize, and preserve webpages, articles, and documents.
- [Telegram Archive](examples/telegram-archive) - Own your Telegram history with automated, incremental backups and a local web viewer that mirrors the Telegram UI.

### Document Management

Expand Down
9 changes: 9 additions & 0 deletions examples/genieacs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# References

- https://github.com/GeiserX/genieacs-container
- https://hub.docker.com/r/drumsergio/genieacs
- https://genieacs.com

# Notes

GenieACS is an open-source TR-069 remote management platform for ISP customer-premises equipment (routers, ONTs, set-top boxes). The web UI is available on port 3000. CWMP (port 7547) is where devices connect.
60 changes: 60 additions & 0 deletions examples/genieacs/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
services:

genieacs:
image: drumsergio/genieacs:1.2.16.0
container_name: genieacs
restart: unless-stopped
depends_on:
mongo:
condition: service_healthy
ports:
- 7547:7547
- 7557:7557
- 7567:7567
- 3000:3000
expose:
- 3000
volumes:
- ${DOCKER_VOLUME_STORAGE:-/mnt/docker-volumes}/genieacs/ext:/opt/genieacs/ext
environment:
GENIEACS_UI_JWT_SECRET: ${GENIEACS_UI_JWT_SECRET:-ChangeMe1234}
GENIEACS_MONGODB_CONNECTION_URL: mongodb://mongo/genieacs?authSource=admin
GENIEACS_CWMP_ACCESS_LOG_FILE: /var/log/genieacs/genieacs-cwmp-access.log
GENIEACS_NBI_ACCESS_LOG_FILE: /var/log/genieacs/genieacs-nbi-access.log
GENIEACS_FS_ACCESS_LOG_FILE: /var/log/genieacs/genieacs-fs-access.log
GENIEACS_UI_ACCESS_LOG_FILE: /var/log/genieacs/genieacs-ui-access.log
GENIEACS_DEBUG_FILE: /var/log/genieacs/genieacs-debug.yaml
GENIEACS_EXT_DIR: /opt/genieacs/ext
healthcheck:
test: ["CMD", "wget", "--spider", "--quiet", "http://localhost:3000"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
#networks:
# - proxy
#labels:
# - traefik.enable=true
# - traefik.docker.network=proxy
# - traefik.http.routers.genieacs.rule=Host(`acs.example.com`)
# - traefik.http.services.genieacs.loadbalancer.server.port=3000

mongo:
image: mongo:8.0
container_name: genieacs-mongo
restart: unless-stopped
expose:
- 27017
volumes:
- ${DOCKER_VOLUME_STORAGE:-/mnt/docker-volumes}/genieacs/mongodb:/data/db
- ${DOCKER_VOLUME_STORAGE:-/mnt/docker-volumes}/genieacs/mongodb-config:/data/configdb
healthcheck:
test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"]
interval: 10s
timeout: 5s
retries: 5
start_period: 40s

#networks:
# proxy:
# external: true
9 changes: 9 additions & 0 deletions examples/lynxprompt/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# References

- https://github.com/GeiserX/LynxPrompt
- https://hub.docker.com/r/drumsergio/lynxprompt
- https://lynxprompt.com

# Notes

LynxPrompt uses four separate PostgreSQL databases by design (app, users, blog, support) for data isolation. Generate a `NEXTAUTH_SECRET` with `openssl rand -base64 32`.
140 changes: 140 additions & 0 deletions examples/lynxprompt/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
services:

lynxprompt:
image: drumsergio/lynxprompt:latest
container_name: lynxprompt
restart: unless-stopped
depends_on:
postgres-app:
condition: service_healthy
postgres-users:
condition: service_healthy
postgres-blog:
condition: service_healthy
postgres-support:
condition: service_healthy
ports:
- 3000:3000
expose:
- 3000
volumes:
- ${DOCKER_VOLUME_STORAGE:-/mnt/docker-volumes}/lynxprompt/uploads:/data/uploads
environment:
# NextAuth (required — generate with: openssl rand -base64 32)
NEXTAUTH_URL: ${NEXTAUTH_URL:-http://localhost:3000}
NEXTAUTH_SECRET: ${NEXTAUTH_SECRET:?Generate with openssl rand -base64 32}
# Databases
DB_APP_HOST: postgres-app
DB_APP_USER: lynxprompt_app
DB_APP_PASSWORD: ${POSTGRES_APP_PASSWORD:-DatabasePassword1234}
DB_APP_NAME: lynxprompt_app
DB_USERS_HOST: postgres-users
DB_USERS_USER: lynxprompt_users
DB_USERS_PASSWORD: ${POSTGRES_USERS_PASSWORD:-DatabasePassword1234}
DB_USERS_NAME: lynxprompt_users
DB_BLOG_HOST: postgres-blog
DB_BLOG_USER: lynxprompt_blog
DB_BLOG_PASSWORD: ${POSTGRES_BLOG_PASSWORD:-DatabasePassword1234}
DB_BLOG_NAME: lynxprompt_blog
DB_SUPPORT_HOST: postgres-support
DB_SUPPORT_USER: lynxprompt_support
DB_SUPPORT_PASSWORD: ${POSTGRES_SUPPORT_PASSWORD:-DatabasePassword1234}
DB_SUPPORT_NAME: lynxprompt_support
# Feature flags (all optional)
ENABLE_EMAIL_AUTH: ${ENABLE_EMAIL_AUTH:-true}
ENABLE_PASSKEYS: ${ENABLE_PASSKEYS:-true}
ENABLE_USER_REGISTRATION: ${ENABLE_USER_REGISTRATION:-true}
# OAuth (optional)
#GITHUB_CLIENT_ID: ${GITHUB_CLIENT_ID:-}
#GITHUB_CLIENT_SECRET: ${GITHUB_CLIENT_SECRET:-}
#ENABLE_GITHUB_OAUTH: ${ENABLE_GITHUB_OAUTH:-false}
# AI features (optional — requires Anthropic API key)
#ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY:-}
#ENABLE_AI: ${ENABLE_AI:-false}
# Branding
APP_NAME: ${APP_NAME:-LynxPrompt}
APP_URL: ${APP_URL:-http://localhost:3000}
UPLOAD_DIR: /data/uploads/blog
#networks:
# - proxy
#labels:
# - traefik.enable=true
# - traefik.docker.network=proxy
# - traefik.http.routers.lynxprompt.rule=Host(`lynxprompt.example.com`)
# - traefik.http.services.lynxprompt.loadbalancer.server.port=3000

postgres-app:
image: postgres:18-alpine
container_name: lynxprompt-postgres-app
restart: unless-stopped
expose:
- 5432
volumes:
- ${DOCKER_VOLUME_STORAGE:-/mnt/docker-volumes}/lynxprompt/db-app:/var/lib/postgresql/data
environment:
POSTGRES_DB: lynxprompt_app
POSTGRES_USER: lynxprompt_app
POSTGRES_PASSWORD: ${POSTGRES_APP_PASSWORD:-DatabasePassword1234}
healthcheck:
test: ["CMD-SHELL", "pg_isready -U lynxprompt_app"]
interval: 10s
timeout: 5s
retries: 5

postgres-users:
image: postgres:18-alpine
container_name: lynxprompt-postgres-users
restart: unless-stopped
expose:
- 5432
volumes:
- ${DOCKER_VOLUME_STORAGE:-/mnt/docker-volumes}/lynxprompt/db-users:/var/lib/postgresql/data
environment:
POSTGRES_DB: lynxprompt_users
POSTGRES_USER: lynxprompt_users
POSTGRES_PASSWORD: ${POSTGRES_USERS_PASSWORD:-DatabasePassword1234}
healthcheck:
test: ["CMD-SHELL", "pg_isready -U lynxprompt_users"]
interval: 10s
timeout: 5s
retries: 5

postgres-blog:
image: postgres:18-alpine
container_name: lynxprompt-postgres-blog
restart: unless-stopped
expose:
- 5432
volumes:
- ${DOCKER_VOLUME_STORAGE:-/mnt/docker-volumes}/lynxprompt/db-blog:/var/lib/postgresql/data
environment:
POSTGRES_DB: lynxprompt_blog
POSTGRES_USER: lynxprompt_blog
POSTGRES_PASSWORD: ${POSTGRES_BLOG_PASSWORD:-DatabasePassword1234}
healthcheck:
test: ["CMD-SHELL", "pg_isready -U lynxprompt_blog"]
interval: 10s
timeout: 5s
retries: 5

postgres-support:
image: postgres:18-alpine
container_name: lynxprompt-postgres-support
restart: unless-stopped
expose:
- 5432
volumes:
- ${DOCKER_VOLUME_STORAGE:-/mnt/docker-volumes}/lynxprompt/db-support:/var/lib/postgresql/data
environment:
POSTGRES_DB: lynxprompt_support
POSTGRES_USER: lynxprompt_support
POSTGRES_PASSWORD: ${POSTGRES_SUPPORT_PASSWORD:-DatabasePassword1234}
healthcheck:
test: ["CMD-SHELL", "pg_isready -U lynxprompt_support"]
interval: 10s
timeout: 5s
retries: 5

#networks:
# proxy:
# external: true
5 changes: 5 additions & 0 deletions examples/telegram-archive/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# References

- https://github.com/GeiserX/Telegram-Archive
- https://hub.docker.com/r/drumsergio/telegram-archive
- https://hub.docker.com/r/drumsergio/telegram-archive-viewer
66 changes: 66 additions & 0 deletions examples/telegram-archive/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
services:

telegram-backup:
image: drumsergio/telegram-archive:latest
container_name: telegram-backup
restart: unless-stopped
command: ["python", "-m", "src", "schedule"]
expose:
- 8000
volumes:
- ${DOCKER_VOLUME_STORAGE:-/mnt/docker-volumes}/telegram-archive:/data
environment:
# Telegram Credentials (required — get from https://my.telegram.org)
TELEGRAM_API_ID: ${TELEGRAM_API_ID}
TELEGRAM_API_HASH: ${TELEGRAM_API_HASH}
TELEGRAM_PHONE: ${TELEGRAM_PHONE}
SESSION_NAME: ${SESSION_NAME:-telegram_backup}
# Backup schedule (cron format)
SCHEDULE: ${SCHEDULE:-0 */6 * * *}
# Backup settings
BACKUP_PATH: /data/backups
DOWNLOAD_MEDIA: ${DOWNLOAD_MEDIA:-true}
MAX_MEDIA_SIZE_MB: ${MAX_MEDIA_SIZE_MB:-100}
# Chat filtering (comma-separated types: private, groups, channels)
CHAT_TYPES: ${CHAT_TYPES:-private,groups,channels}
# Database
DB_TYPE: ${DB_TYPE:-sqlite}
DB_PATH: /data/backups/telegram_backup.db
#networks:
# - proxy
#labels:
# - traefik.enable=true
# - traefik.docker.network=proxy
# - traefik.http.routers.telegram-backup.rule=Host(`telegram.example.com`)
# - traefik.http.services.telegram-backup.loadbalancer.server.port=8000

telegram-viewer:
image: drumsergio/telegram-archive-viewer:latest
container_name: telegram-viewer
restart: unless-stopped
ports:
- 8000:8000
expose:
- 8000
volumes:
- ${DOCKER_VOLUME_STORAGE:-/mnt/docker-volumes}/telegram-archive:/data
environment:
BACKUP_PATH: /data/backups
# Authentication (recommended)
VIEWER_USERNAME: ${VIEWER_USERNAME:-admin}
VIEWER_PASSWORD: ${VIEWER_PASSWORD:-ChangeMe1234}
VIEWER_TIMEZONE: ${VIEWER_TIMEZONE:-Europe/Berlin}
# Database — must match backup service
DB_TYPE: ${DB_TYPE:-sqlite}
DB_PATH: /data/backups/telegram_backup.db
#networks:
# - proxy
#labels:
# - traefik.enable=true
# - traefik.docker.network=proxy
# - traefik.http.routers.telegram-viewer.rule=Host(`telegram.example.com`)
# - traefik.http.services.telegram-viewer.loadbalancer.server.port=8000

#networks:
# proxy:
# external: true