.
This commit is contained in:
parent
6381c0eb58
commit
a11de2770f
14
bot.py
14
bot.py
@ -11,9 +11,14 @@ import pathlib
|
|||||||
load_dotenv()
|
load_dotenv()
|
||||||
TOKEN = os.getenv('DISCORD_TOKEN')
|
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 = 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 (enable Members + Message Content in Dev Portal)
|
||||||
intents = discord.Intents.default()
|
intents = discord.Intents.default()
|
||||||
@ -24,9 +29,12 @@ intents.reactions = True
|
|||||||
intents.emojis_and_stickers = True
|
intents.emojis_and_stickers = True
|
||||||
intents.voice_states = 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 = commands.Bot(command_prefix='!', intents=intents)
|
||||||
bot.config = config
|
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):
|
async def _guild_selfcheck(g: discord.Guild, cfg):
|
||||||
problems = []
|
problems = []
|
||||||
|
@ -39,6 +39,8 @@ class DataManager:
|
|||||||
return default
|
return default
|
||||||
|
|
||||||
def _safe_write(self, data: dict):
|
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"
|
tmp = self.json_path + ".tmp"
|
||||||
with open(tmp, 'w') as f:
|
with open(tmp, 'w') as f:
|
||||||
json.dump(data, f, indent=4)
|
json.dump(data, f, indent=4)
|
||||||
|
@ -1,20 +1,16 @@
|
|||||||
version: "3.8"
|
|
||||||
|
|
||||||
services:
|
services:
|
||||||
shaiwatcher:
|
shaiwatcher:
|
||||||
build:
|
build: .
|
||||||
context: .
|
|
||||||
dockerfile: dockerfile
|
|
||||||
container_name: shaiwatcher
|
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
environment:
|
environment:
|
||||||
- DISCORD_TOKEN=${DISCORD_TOKEN}
|
- DISCORD_TOKEN=${DISCORD_TOKEN}
|
||||||
# optional: set timezone
|
# optional – only if you want non-default locations
|
||||||
- TZ=UTC
|
# - SHAI_CONFIG=/config/settings.conf
|
||||||
|
# - SHAI_DATA=/data/data.json
|
||||||
volumes:
|
volumes:
|
||||||
# Persist your JSON data here
|
- ./config:/config # will contain settings.conf
|
||||||
- shaiwatcher_data:/app/data
|
- shaiwatcher_data:/data # persistent data.json
|
||||||
# use your repo’s settings.conf at runtime
|
# if you deploy to a remote docker host via Portainer: no extra ports needed
|
||||||
- ./settings.conf:/app/settings.conf:ro
|
|
||||||
volumes:
|
volumes:
|
||||||
shaiwatcher_data:
|
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
|
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
|
WORKDIR /app
|
||||||
|
ENV PYTHONDONTWRITEBYTECODE=1 \
|
||||||
|
PYTHONUNBUFFERED=1
|
||||||
|
|
||||||
# Install deps first (better cache)
|
# deps first
|
||||||
COPY requirements.txt .
|
COPY requirements.txt .
|
||||||
RUN pip install -r requirements.txt
|
RUN pip install --no-cache-dir -r requirements.txt
|
||||||
|
|
||||||
# Copy the app
|
# app code
|
||||||
COPY . .
|
COPY . /app
|
||||||
|
|
||||||
# The bot reads settings.conf from /app/settings.conf
|
# runtime dirs + seed default config path (actual seeding done in entrypoint)
|
||||||
# The data file should live in /app/data (mounted as a volume)
|
RUN mkdir -p /config /data
|
||||||
CMD ["python", "-u", "bot.py"]
|
|
||||||
|
# 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