/memer

Meme slideshow for browser powered with Telegram bot.

Primary LanguagePythonMIT LicenseMIT

Memer

Telegram bot which you can send meme pictures to. All collected memes are gathered into the database and broadcast as a slideshow on a web page, thanks to the built-in web server.

Thus, you can easily and cheerfully exchange pictures in a single feed. Initially, I created this project for my office, where colleagues can anonymously drop their memes (or any other pictures) to the bot, and then everyone can watch a slideshow of memes on the office TV. Bot support voting for content - thumbs up/down and for deleting meme (need 3 votes from different people).

Features

  • Gather your shiny memes in one place;
  • Browser-based meme slideshow for any big screen (tv-compatibility);
  • Telegram bot inside: as easy as drop any meme right in chat, also vote and report features;

Deploy

How to start

  • Needs https certificate support for telegram bot webhook functionality.
  1. Starts for the first time, then shutdown. Go to data volume and edit config.json:

-- "param":"bot_api_key","value":"place_your_telegram_bot_API_TOKEN_here"

-- "param":"web_host","value":"your_domain_here.com"

-- "param":"web_port","value":"80"

-- "param":"app_site_header","value":"Frontend header here"

-- "param":"app_site_title","value":"Your site title (top left corner)"

-- "param":"app_site_botname","value":"@your_telegram_bot"

  1. Starts again. Now telegram bot should work. Try it with /start command.
  2. Upload few memes via telegram bot (just drop memes in chat like any photo). Restart app.
  3. Should fully works now.

Docker-compose example

version: "3.3"

services:

  traefik:
    image: "traefik:v2.0.0-rc3"
    container_name: "traefik"
    command:
      #- "--log.level=DEBUG"
      - "--global.sendAnonymousUsage=false"
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.mytlschallenge.acme.tlschallenge=true"
      #- "--certificatesresolvers.mytlschallenge.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"
      - "--certificatesresolvers.mytlschallenge.acme.email=postmaster@mydomain.com"
      - "--certificatesresolvers.mytlschallenge.acme.storage=/letsencrypt/acme.json"
    ports:
      - "443:443"
      - "8080:8080"
    volumes:
      - "./letsencrypt:/letsencrypt"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"

  memer:
    image: "ghcr.io/nickosh/memer/memer:latest"
    container_name: "memer"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.memer.rule=Host(`mydomain.com`)"
      - "traefik.http.routers.memer.entrypoints=websecure"
      - "traefik.http.routers.memer.tls.certresolver=mytlschallenge"
    ports:
      - "80:80"
    volumes:
      - "/opt/memer/data:/memer/data"
      - "/opt/memer/imgs:/memer/imgs"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"