From 6d71e835a0206178ae58bc195e95095a77486292 Mon Sep 17 00:00:00 2001 From: GeiserX <9169332+GeiserX@users.noreply.github.com> Date: Fri, 3 Apr 2026 23:48:37 +0200 Subject: [PATCH] Add Telegram Archive, GenieACS, and LynxPrompt examples Three new self-hosted compose examples: - Telegram Archive: automated Telegram backup with web viewer (SQLite/PostgreSQL) - GenieACS: TR-069 ACS for remote ISP device management with MongoDB - LynxPrompt: AI IDE config management platform with multi-database architecture --- README.md | 3 + examples/genieacs/README.md | 9 ++ examples/genieacs/docker-compose.yml | 60 ++++++++ examples/lynxprompt/README.md | 9 ++ examples/lynxprompt/docker-compose.yml | 140 +++++++++++++++++++ examples/telegram-archive/README.md | 5 + examples/telegram-archive/docker-compose.yml | 66 +++++++++ 7 files changed, 292 insertions(+) create mode 100644 examples/genieacs/README.md create mode 100644 examples/genieacs/docker-compose.yml create mode 100644 examples/lynxprompt/README.md create mode 100644 examples/lynxprompt/docker-compose.yml create mode 100644 examples/telegram-archive/README.md create mode 100644 examples/telegram-archive/docker-compose.yml diff --git a/README.md b/README.md index 4e6db9d5f..233a9f1a4 100644 --- a/README.md +++ b/README.md @@ -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 @@ -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 @@ -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 diff --git a/examples/genieacs/README.md b/examples/genieacs/README.md new file mode 100644 index 000000000..0d8e10314 --- /dev/null +++ b/examples/genieacs/README.md @@ -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. diff --git a/examples/genieacs/docker-compose.yml b/examples/genieacs/docker-compose.yml new file mode 100644 index 000000000..cf6916dc3 --- /dev/null +++ b/examples/genieacs/docker-compose.yml @@ -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 diff --git a/examples/lynxprompt/README.md b/examples/lynxprompt/README.md new file mode 100644 index 000000000..4c4fe66d7 --- /dev/null +++ b/examples/lynxprompt/README.md @@ -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`. diff --git a/examples/lynxprompt/docker-compose.yml b/examples/lynxprompt/docker-compose.yml new file mode 100644 index 000000000..cfa780634 --- /dev/null +++ b/examples/lynxprompt/docker-compose.yml @@ -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 diff --git a/examples/telegram-archive/README.md b/examples/telegram-archive/README.md new file mode 100644 index 000000000..806687040 --- /dev/null +++ b/examples/telegram-archive/README.md @@ -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 diff --git a/examples/telegram-archive/docker-compose.yml b/examples/telegram-archive/docker-compose.yml new file mode 100644 index 000000000..2d85bae9e --- /dev/null +++ b/examples/telegram-archive/docker-compose.yml @@ -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