.
This commit is contained in:
parent
6381c0eb58
commit
a11de2770f
14
bot.py
14
bot.py
@ -11,9 +11,14 @@ import pathlib
|
||||
load_dotenv()
|
||||
TOKEN = os.getenv('DISCORD_TOKEN')
|
||||
|
||||
# Load settings (we won't overwrite your file)
|
||||
# Where to read settings from
|
||||
CONFIG_PATH = os.getenv('SHAI_CONFIG', '/config/settings.conf')
|
||||
|
||||
# Load settings
|
||||
config = ConfigParser()
|
||||
config.read('settings.conf')
|
||||
read_ok = config.read(CONFIG_PATH)
|
||||
if not read_ok:
|
||||
print(f"[Config] WARNING: could not read config at {CONFIG_PATH}; using in-image defaults where possible.")
|
||||
|
||||
# Intents (enable Members + Message Content in Dev Portal)
|
||||
intents = discord.Intents.default()
|
||||
@ -24,9 +29,12 @@ intents.reactions = True
|
||||
intents.emojis_and_stickers = True
|
||||
intents.voice_states = True
|
||||
|
||||
# Data file path (prefer INI, else env, else sensible default)
|
||||
data_file = config['DEFAULT'].get('data_file', os.getenv('SHAI_DATA', '/data/data.json'))
|
||||
|
||||
bot = commands.Bot(command_prefix='!', intents=intents)
|
||||
bot.config = config
|
||||
bot.data_manager = DataManager(config['DEFAULT']['data_file'])
|
||||
bot.data_manager = DataManager(data_file)
|
||||
|
||||
async def _guild_selfcheck(g: discord.Guild, cfg):
|
||||
problems = []
|
||||
|
@ -39,6 +39,8 @@ class DataManager:
|
||||
return default
|
||||
|
||||
def _safe_write(self, data: dict):
|
||||
# ensure parent dir exists
|
||||
os.makedirs(os.path.dirname(self.json_path) or ".", exist_ok=True)
|
||||
tmp = self.json_path + ".tmp"
|
||||
with open(tmp, 'w') as f:
|
||||
json.dump(data, f, indent=4)
|
||||
|
@ -1,20 +1,16 @@
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
shaiwatcher:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: dockerfile
|
||||
container_name: shaiwatcher
|
||||
build: .
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- DISCORD_TOKEN=${DISCORD_TOKEN}
|
||||
# optional: set timezone
|
||||
- TZ=UTC
|
||||
# optional – only if you want non-default locations
|
||||
# - SHAI_CONFIG=/config/settings.conf
|
||||
# - SHAI_DATA=/data/data.json
|
||||
volumes:
|
||||
# Persist your JSON data here
|
||||
- shaiwatcher_data:/app/data
|
||||
# use your repo’s settings.conf at runtime
|
||||
- ./settings.conf:/app/settings.conf:ro
|
||||
- ./config:/config # will contain settings.conf
|
||||
- shaiwatcher_data:/data # persistent data.json
|
||||
# if you deploy to a remote docker host via Portainer: no extra ports needed
|
||||
|
||||
volumes:
|
||||
shaiwatcher_data:
|
||||
|
30
docker-entrypoint.sh
Normal file
30
docker-entrypoint.sh
Normal file
@ -0,0 +1,30 @@
|
||||
#!/bin/sh
|
||||
set -e
|
||||
|
||||
# Defaults (can be overridden)
|
||||
: "${SHAI_CONFIG:=/config/settings.conf}"
|
||||
: "${SHAI_DATA:=/data/data.json}"
|
||||
|
||||
# Seed /config/settings.conf on first run if it doesn't exist
|
||||
if [ ! -f "$SHAI_CONFIG" ]; then
|
||||
mkdir -p "$(dirname "$SHAI_CONFIG")"
|
||||
if [ -f /app/example/settings.conf ]; then
|
||||
cp /app/example/settings.conf "$SHAI_CONFIG"
|
||||
echo "Seeded default settings to $SHAI_CONFIG"
|
||||
else
|
||||
# Fall back: generate minimal config so the app can boot
|
||||
cat > "$SHAI_CONFIG" <<EOF
|
||||
[DEFAULT]
|
||||
data_file = ${SHAI_DATA}
|
||||
EOF
|
||||
echo "Generated minimal $SHAI_CONFIG"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Ensure data directory exists
|
||||
mkdir -p "$(dirname "$SHAI_DATA")"
|
||||
|
||||
# Make path visible to the app (bot.py will still read the INI)
|
||||
export SHAI_CONFIG SHAI_DATA
|
||||
|
||||
exec "$@"
|
35
dockerfile
35
dockerfile
@ -1,23 +1,26 @@
|
||||
# Simple, small image
|
||||
FROM python:3.11-slim
|
||||
|
||||
ENV PYTHONUNBUFFERED=1 \
|
||||
PIP_NO_CACHE_DIR=1
|
||||
|
||||
# System deps (add git if you need it)
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
ca-certificates tzdata && \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
|
||||
WORKDIR /app
|
||||
ENV PYTHONDONTWRITEBYTECODE=1 \
|
||||
PYTHONUNBUFFERED=1
|
||||
|
||||
# Install deps first (better cache)
|
||||
# deps first
|
||||
COPY requirements.txt .
|
||||
RUN pip install -r requirements.txt
|
||||
RUN pip install --no-cache-dir -r requirements.txt
|
||||
|
||||
# Copy the app
|
||||
COPY . .
|
||||
# app code
|
||||
COPY . /app
|
||||
|
||||
# The bot reads settings.conf from /app/settings.conf
|
||||
# The data file should live in /app/data (mounted as a volume)
|
||||
CMD ["python", "-u", "bot.py"]
|
||||
# runtime dirs + seed default config path (actual seeding done in entrypoint)
|
||||
RUN mkdir -p /config /data
|
||||
|
||||
# runtime env defaults (can be overridden by compose/env)
|
||||
ENV SHAI_CONFIG=/config/settings.conf \
|
||||
SHAI_DATA=/data/data.json
|
||||
|
||||
# small, explicit entrypoint
|
||||
COPY docker-entrypoint.sh /usr/local/bin/entrypoint
|
||||
RUN chmod +x /usr/local/bin/entrypoint
|
||||
|
||||
ENTRYPOINT ["entrypoint"]
|
||||
CMD ["python","-u","/app/bot.py"]
|
||||
|
Loading…
Reference in New Issue
Block a user