1
Fork 0
mirror of https://github.com/Steffo99/greed.git synced 2024-12-04 11:24:19 +00:00

Add Docker support (#168, #102)

Co-authored-by: bpro <iserver12345@gmail.com>
This commit is contained in:
Steffo 2022-03-28 16:09:57 +02:00 committed by GitHub
parent 5f59447240
commit 317f32900a
Signed by: github
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 180 additions and 18 deletions

44
.github/workflows/docker-image.yml vendored Normal file
View file

@ -0,0 +1,44 @@
name: "Build Docker image"
on:
release:
types:
- published
defaults:
run:
shell: bash
jobs:
build-docker:
name: "🐳 Build and publish Docker image"
runs-on: ubuntu-latest
steps:
- name: "Checkout repository"
uses: actions/checkout@v2
- name: "❓ Find the release semantic version"
id: semver
uses: Steffo99/actions-semver@v0.1.0
- name: "🔨 Setup Buildx"
uses: docker/setup-buildx-action@v1
- name: "🔑 Login to GitHub Containers"
uses: docker/login-action@v1
with:
registry: ghcr.io
username: RYGhub
password: ${{ secrets.GITHUB_TOKEN }}
- name: "🏗 Build and push the Docker image"
uses: docker/build-push-action@v2
with:
tags: >-
ghcr.io/Steffo99/greed:${{ steps.semver.outputs.full }},
ghcr.io/Steffo99/greed:${{ steps.semver.outputs.patch }},
ghcr.io/Steffo99/greed:${{ steps.semver.outputs.minor }},
ghcr.io/Steffo99/greed:${{ steps.semver.outputs.major }},
ghcr.io/Steffo99/greed:latest
push: true

1
.gitignore vendored
View file

@ -105,3 +105,4 @@ config/config.ini
config/config.toml config/config.toml
*.sqlite *.sqlite
*.sqlite-journal *.sqlite-journal
data/

20
Dockerfile Normal file
View file

@ -0,0 +1,20 @@
FROM python:3.10 AS labels
LABEL maintainer="Stefano Pigozzi <me@steffo.eu>"
LABEL description="A customizable, multilanguage Telegram shop bot"
FROM labels AS dependencies
COPY requirements.txt ./requirements.txt
RUN pip install --no-cache-dir -r requirements.txt
FROM dependencies AS greed
COPY . /usr/src/greed
WORKDIR /usr/src/greed
FROM greed AS entry
ENTRYPOINT ["python", "-OO"]
CMD ["core.py"]
FROM entry AS environment
ENV PYTHONUNBUFFERED=1
ENV CONFIG_PATH="/etc/greed/config.toml"
ENV DB_ENGINE="sqlite:////var/lib/greed/database.sqlite"

106
README.md
View file

@ -16,7 +16,91 @@ Use the special credit card number `4242 4242 4242 4242` to add unlimited credit
![](https://i.imgur.com/9plMzO6.png) ![](https://i.imgur.com/9plMzO6.png)
## Installation ## Installation via Docker
This installation procedure assumes you are on a system with `docker` installed, with a supported CPU architecture.
### Requirements
* [Docker Engine](https://docs.docker.com/get-docker/)
* An Internet connection
* A Telegram bot token (obtainable at [@Botfather](https://t.me/Botfather))
* A payment provider token (obtainable by [connecting a provider with your bot](https://t.me/Botfather))
### Steps
1. Run a container using the project's Docker image:
```console
# docker run --volume "$(pwd)/config:/etc/greed" --volume "$(pwd)/strings:/usr/src/greed/strings" --volume "$(pwd)/data:/var/lib/greed" ghcr.io/steffo99/greed
```
2. Edit the configuration file `config.toml` that was created in the `strings` directory, adding your bot and payment tokens to it:
```console
# nano config/config.toml
```
(Press **Ctrl+X** and then two times **Enter** to save and quit `nano`.)
3. _Optional:_ customize the files in the `strings` folder for custom messages.
4. Start the bot:
```console
python -OO core.py
```
5. Open Telegram, and send a `/start` command to your bot to be automatically promoted to 💼 Manager.
6. Stop the bot by pressing **Ctrl+C**.
### Running the bot
After the installation, to run the bot, you'll need to:
1. Run its Docker container from the same directory you installed it from:
```console
# docker run --volume "$(pwd)/config:/etc/greed" --volume "$(pwd)/strings:/usr/src/greed/strings" --volume "$(pwd)/data:/var/lib/greed" ghcr.io/steffo99/greed
```
### Keep the bot running
If you want to keep the bot open even after you closed your terminal window, you'll need to pass the appropriate arguments to the docker command:
1. Set the Docker container to always restart and to detach on successful start:
```console
# docker run --detach --restart always --volume "$(pwd)/config:/etc/greed" --volume "$(pwd)/strings:/usr/src/greed/strings" --volume "$(pwd)/data:/var/lib/greed" ghcr.io/steffo99/greed
```
### Updating
To update the bot, run the following commands:
1. Find the ID of the Docker container of the bot:
```console
# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
abcdefabcdef ghcr.io/steffo99/greed "python -OO core.py" 6 seconds ago Up Less than a second relaxed_hypatia
```
2. Stop the Docker container of the bot:
```console
# docker container stop abcdefabcdef
```
3. Remove the Docker container of the bot:
```console
# docker container rm abcdefabcdef
```
4. Pull the latest Docker image of the bot:
```console
# docker pull ghcr.io/steffo99/greed:latest
```
5. Restart the bot with the newly downloaded image:
```console
# docker run --detach --restart always --volume "$(pwd)/config:/etc/greed" --volume "$(pwd)/strings:/usr/src/greed/strings" --volume "$(pwd)/data:/var/lib/greed" ghcr.io/steffo99/greed
```
## Installation from source
This installation procedure assumes you are on a Linux system, using `bash` and have `python3.8` installed. This installation procedure assumes you are on a Linux system, using `bash` and have `python3.8` installed.
@ -33,42 +117,42 @@ Consider renting a VPS to host the bot on; a cheap one should do, as greed is pr
### Steps ### Steps
1. Download the project files by running: 1. Download the project files by running:
```bash ```console
git clone https://github.com/Steffo99/greed.git git clone https://github.com/Steffo99/greed.git
``` ```
2. Enter the newly created folder: 2. Enter the newly created folder:
```bash ```console
cd greed cd greed
``` ```
3. Create a new virtualenv: 3. Create a new virtualenv:
```bash ```console
python3.8 -m venv venv python3.8 -m venv venv
``` ```
4. Activate the virtualenv: 4. Activate the virtualenv:
```bash ```console
source venv/bin/activate source venv/bin/activate
``` ```
5. Install the project requirements: 5. Install the project requirements:
```bash ```console
pip install -r requirements.txt pip install -r requirements.txt
``` ```
6. _Optional:_ For colored console output, install [coloredlogs](https://pypi.org/project/coloredlogs/): 6. _Optional:_ For colored console output, install [coloredlogs](https://pypi.org/project/coloredlogs/):
```bash ```console
pip install coloredlogs pip install coloredlogs
``` ```
7. Generate the configuration file: 7. Generate the configuration file:
```bash ```console
python -OO core.py python -OO core.py
``` ```
8. Edit the configuration file, adding your bot and payment tokens to it: 8. Edit the configuration file `config.toml`, adding your bot and payment tokens to it:
```bash ```console
nano config/config.toml nano config/config.toml
``` ```
(Press **Ctrl+X** and then two times **Enter** to save and quit `nano`.) (Press **Ctrl+X** and then two times **Enter** to save and quit `nano`.)
@ -76,7 +160,7 @@ Consider renting a VPS to host the bot on; a cheap one should do, as greed is pr
9. _Optional:_ customize the files in the `strings` folder for custom messages. 9. _Optional:_ customize the files in the `strings` folder for custom messages.
10. Start the bot: 10. Start the bot:
```bash ```console
python -OO core.py python -OO core.py
``` ```

View file

@ -24,6 +24,7 @@ fallback_language = "en"
[Database] [Database]
# The database engine you want to use. # The database engine you want to use.
# Refer to http://docs.sqlalchemy.org/en/latest/core/engines.html for the possible settings. # Refer to http://docs.sqlalchemy.org/en/latest/core/engines.html for the possible settings.
# This value is ignored if you're running greed via Docker, or if the DB_ENGINE environment variable is set.
engine = "sqlite:///database.sqlite" engine = "sqlite:///database.sqlite"

24
core.py
View file

@ -33,26 +33,29 @@ def main():
log.fatal("config/template_config.toml does not exist!") log.fatal("config/template_config.toml does not exist!")
exit(254) exit(254)
# Check where the config path is located from the CONFIG_PATH environment variable
config_path = os.environ.get("CONFIG_PATH", "config/config.toml")
# If the config file does not exist, clone the template and exit # If the config file does not exist, clone the template and exit
if not os.path.isfile("config/config.toml"): if not os.path.isfile(config_path):
log.debug("config/config.toml does not exist.") log.debug("config/config.toml does not exist.")
with open("config/template_config.toml", encoding="utf8") as template_cfg_file, \ with open("config/template_config.toml", encoding="utf8") as template_cfg_file, \
open("config/config.toml", "w", encoding="utf8") as user_cfg_file: open(config_path, "w", encoding="utf8") as user_cfg_file:
# Copy the template file to the config file # Copy the template file to the config file
user_cfg_file.write(template_cfg_file.read()) user_cfg_file.write(template_cfg_file.read())
log.fatal("A config file has been created in config/config.toml." log.fatal("A config file has been created."
" Customize it, then restart greed!") " Customize it, then restart greed!")
exit(1) exit(1)
# Compare the template config with the user-made one # Compare the template config with the user-made one
with open("config/template_config.toml", encoding="utf8") as template_cfg_file, \ with open("config/template_config.toml", encoding="utf8") as template_cfg_file, \
open("config/config.toml", encoding="utf8") as user_cfg_file: open(config_path, encoding="utf8") as user_cfg_file:
template_cfg = nuconfig.NuConfig(template_cfg_file) template_cfg = nuconfig.NuConfig(template_cfg_file)
user_cfg = nuconfig.NuConfig(user_cfg_file) user_cfg = nuconfig.NuConfig(user_cfg_file)
if not template_cfg.cmplog(user_cfg): if not template_cfg.cmplog(user_cfg):
log.fatal("There were errors while parsing the config.toml file. Please fix them and restart greed!") log.fatal("There were errors while parsing the config file. Please fix them and restart greed!")
exit(2) exit(2)
else: else:
log.debug("Configuration parsed successfully!") log.debug("Configuration parsed successfully!")
@ -71,9 +74,18 @@ def main():
# Ignore most python-telegram-bot logs, as they are useless most of the time # Ignore most python-telegram-bot logs, as they are useless most of the time
logging.getLogger("telegram").setLevel("ERROR") logging.getLogger("telegram").setLevel("ERROR")
# Find the database URI
# Through environment variables first
if db_engine := os.environ.get("DB_ENGINE"):
log.debug("Sqlalchemy engine overridden by the DB_ENGINE envvar.")
# Then via the config file
else:
db_engine = user_cfg["Database"]["engine"]
log.debug("Using sqlalchemy engine set in the configuration file.")
# Create the database engine # Create the database engine
log.debug("Creating the sqlalchemy engine...") log.debug("Creating the sqlalchemy engine...")
engine = sqlalchemy.create_engine(user_cfg["Database"]["engine"]) engine = sqlalchemy.create_engine(db_engine)
log.debug("Binding metadata to the engine...") log.debug("Binding metadata to the engine...")
database.TableDeclarativeBase.metadata.bind = engine database.TableDeclarativeBase.metadata.bind = engine
log.debug("Creating all missing tables...") log.debug("Creating all missing tables...")