From 20b93df9b0cb38217dc1849aa337a73530f4bd93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20F=C3=B6rtsch?= Date: Thu, 5 Mar 2026 07:22:33 +0100 Subject: [PATCH] =?UTF-8?q?normalize=20project=20structure:=20rename=20app?= =?UTF-8?q?/=20=E2=86=92=20src/,=20add=20.mise.toml,=20.env.example,=20CLA?= =?UTF-8?q?UDE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.6 --- .mise.toml | 2 + CLAUDE.md | 44 +++++++++++++++++++ backend/.env.example | 1 + backend/.gitignore | 1 + backend/deploy.sh | 2 +- backend/{app => src}/__init__.py | 0 backend/{app => src}/config.py | 0 backend/{app => src}/main.py | 2 +- backend/{app => src}/models.py | 0 backend/{app => src}/routers/__init__.py | 0 backend/{app => src}/routers/stickersets.py | 4 +- backend/{app => src}/services/__init__.py | 0 .../{app => src}/services/sticker_service.py | 4 +- 13 files changed, 54 insertions(+), 6 deletions(-) create mode 100644 .mise.toml create mode 100644 CLAUDE.md create mode 100644 backend/.env.example rename backend/{app => src}/__init__.py (100%) rename backend/{app => src}/config.py (100%) rename backend/{app => src}/main.py (90%) rename backend/{app => src}/models.py (100%) rename backend/{app => src}/routers/__init__.py (100%) rename backend/{app => src}/routers/stickersets.py (92%) rename backend/{app => src}/services/__init__.py (100%) rename backend/{app => src}/services/sticker_service.py (98%) diff --git a/.mise.toml b/.mise.toml new file mode 100644 index 0000000..f8ef006 --- /dev/null +++ b/.mise.toml @@ -0,0 +1,2 @@ +[tools] +python = "3.14.2" diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..2c129ba --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,44 @@ +# sticker-cloner — Telegram Sticker Cloner + +Telegram bot that clones sticker packs. Built with Python (FastAPI + uvicorn). + +## Stack + +- **Backend:** Python 3.14, FastAPI, uvicorn, tstickers, Pillow +- **Bot:** python-telegram-bot + +## Project Structure + +``` +backend/ +├── src/ ← FastAPI application +├── requirements.txt +├── deploy.sh +└── .env.example +``` + +## Local Development + +```bash +cd backend +python -m venv .venv +source .venv/bin/activate +pip install -r requirements.txt +uvicorn src.main:app --reload --port 8080 +``` + +## Deployment + +```bash +cd backend +./deploy.sh +``` + +Deploys to Uberspace (`serve.uber.space`): +- Backend → `~/services/sticker-cloner/` (systemd: `sticker-cloner.service`, port 8080) +- Route: `/sticker-cloner/*` → port 8080 (prefix removed) + +## Environment Variables + +See `.env.example`: +- `BOT_TOKEN` — Telegram bot API token diff --git a/backend/.env.example b/backend/.env.example new file mode 100644 index 0000000..bfb6be5 --- /dev/null +++ b/backend/.env.example @@ -0,0 +1 @@ +BOT_TOKEN= diff --git a/backend/.gitignore b/backend/.gitignore index 6eecaf3..248c801 100644 --- a/backend/.gitignore +++ b/backend/.gitignore @@ -8,3 +8,4 @@ __pycache__/ .idea/ .cache/ .vscode/ +.mise.local.toml diff --git a/backend/deploy.sh b/backend/deploy.sh index cdbf08a..4ddee86 100755 --- a/backend/deploy.sh +++ b/backend/deploy.sh @@ -44,7 +44,7 @@ Description=sticker-cloner backend [Service] WorkingDirectory=${REMOTE_APP_DIR} -ExecStart=${REMOTE_APP_DIR}/.venv/bin/uvicorn app.main:app --host 0.0.0.0 --port ${PORT} --root-path ${URL_PATH} +ExecStart=${REMOTE_APP_DIR}/.venv/bin/uvicorn src.main:app --host 0.0.0.0 --port ${PORT} --root-path ${URL_PATH} Restart=always [Install] diff --git a/backend/app/__init__.py b/backend/src/__init__.py similarity index 100% rename from backend/app/__init__.py rename to backend/src/__init__.py diff --git a/backend/app/config.py b/backend/src/config.py similarity index 100% rename from backend/app/config.py rename to backend/src/config.py diff --git a/backend/app/main.py b/backend/src/main.py similarity index 90% rename from backend/app/main.py rename to backend/src/main.py index 2168d9c..211144d 100644 --- a/backend/app/main.py +++ b/backend/src/main.py @@ -1,7 +1,7 @@ from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware -from app.routers import stickersets +from src.routers import stickersets app = FastAPI(title="StickerCloner API") diff --git a/backend/app/models.py b/backend/src/models.py similarity index 100% rename from backend/app/models.py rename to backend/src/models.py diff --git a/backend/app/routers/__init__.py b/backend/src/routers/__init__.py similarity index 100% rename from backend/app/routers/__init__.py rename to backend/src/routers/__init__.py diff --git a/backend/app/routers/stickersets.py b/backend/src/routers/stickersets.py similarity index 92% rename from backend/app/routers/stickersets.py rename to backend/src/routers/stickersets.py index 50c4c35..92de515 100644 --- a/backend/app/routers/stickersets.py +++ b/backend/src/routers/stickersets.py @@ -1,8 +1,8 @@ from fastapi import APIRouter, HTTPException from fastapi.responses import FileResponse -from app.models import StickerSetResponse -from app.services import sticker_service +from src.models import StickerSetResponse +from src.services import sticker_service router = APIRouter(prefix="/api/stickersets") diff --git a/backend/app/services/__init__.py b/backend/src/services/__init__.py similarity index 100% rename from backend/app/services/__init__.py rename to backend/src/services/__init__.py diff --git a/backend/app/services/sticker_service.py b/backend/src/services/sticker_service.py similarity index 98% rename from backend/app/services/sticker_service.py rename to backend/src/services/sticker_service.py index 7f57aeb..ed51a0c 100644 --- a/backend/app/services/sticker_service.py +++ b/backend/src/services/sticker_service.py @@ -3,8 +3,8 @@ from pathlib import Path from tstickers.convert import Backend from tstickers.manager import StickerManager -from app.config import settings -from app.models import StickerResponse, StickerSetResponse +from src.config import settings +from src.models import StickerResponse, StickerSetResponse _manager: StickerManager | None = None