Add project scaffolding and documentation

Add .env.example with configuration for database, Redis, security, SMTP, workers, and plugins. Add .gitignore for Python, Node.js, Next.js, Docker volumes, and IDE files. Add MIT License. Update README.md with feature overview, quick start guide, architecture description, plugin system documentation, security details, backup/restore instructions, and developer setup. Add Alembic configuration files and placeholder directories for API, web, worker, and plugin components
This commit is contained in:
2026-06-21 09:31:47 +02:00
parent cfeeccbf53
commit d694c8b8e3
197 changed files with 8583 additions and 56 deletions
+48
View File
@@ -0,0 +1,48 @@
import asyncio
import uuid
from datetime import datetime, timezone
from apps.api.src.database import AsyncSessionLocal
from apps.api.src.models.background_job import BackgroundJob
from apps.api.src.plugins import loader
from apps.api.src.services import plugin_service
from apps.worker.src.celery_app import celery_app
@celery_app.task(bind=True, max_retries=3)
def run_plugin_sync(self, instance_id: str) -> dict:
try:
result = asyncio.run(_async_run_plugin_sync(instance_id))
return result
except Exception as exc:
raise self.retry(exc=exc, countdown=60)
async def _async_run_plugin_sync(instance_id: str) -> dict:
async with AsyncSessionLocal() as db:
try:
instance_uuid = uuid.UUID(instance_id)
result = await loader.run_healthcheck(db, instance_uuid)
# Update sync timestamp
instance = await plugin_service.get_instance(db, instance_uuid)
if instance:
instance.last_sync_at = datetime.now(timezone.utc) # type: ignore
await db.commit()
# Record job
job = BackgroundJob(
task_name="plugin_sync",
status="completed" if result.get("status") == "ok" else "failed",
payload={"instance_id": instance_id},
result=result,
plugin_id=instance.plugin_id if instance else None,
instance_id=instance_uuid,
scheduled_at=datetime.now(timezone.utc), # type: ignore
)
db.add(job)
await db.commit()
return result
except Exception as e:
await db.rollback()
raise e