Pactown SaaS Platform - Executable Markdown platform for building and running applications with LLM integration, automated Podman Quadlet deployment, and multi-tenant isolation.
Project description
View
Generate
Download
App
Pactown - Executable Markdown SaaS Platform
AI Cost Tracking
- 🤖 LLM usage: $2.9123 (210 commits)
- 👤 Human dev: ~$11892 (118.9h @ $100/h, 30min dedup)
Generated on 2026-05-20 using openrouter/qwen/qwen3-coder-next
Deploy URL: [app]{sep}[username].DOMAIN (domyślnie sep = -, np. 3-tom-sapletta-com.pactown.com)
Platforma SaaS umożliwiająca użytkownikom tworzenie i uruchamianie aplikacji poprzez edytor Markdown z integracją LLM (OpenRouter) i płatnościami.
Quick Start
# 1. Sklonuj repo
git clone https://github.com/wronai/pactown-com.git
cd pactown-com
# 2. Skonfiguruj środowisko
make config
# 3. Zainstaluj na serwerze VPS (Podman + Quadlet)
make install
# 4. Zainicjalizuj Traefik i środowisko
make quadlet-init
# 5. Uruchom wszystkie serwisy
make up
# 6. Sprawdź status
make status
Wymagania Serwera
- VPS: 8GB RAM, 8 vCPU (np. Hetzner CX31 ~€17/msc)
- OS: Ubuntu 22.04/24.04 lub Fedora 39+
- Domena: pactown.com z wildcard DNS (
*.pactown.com) - Porty: 80, 443
Dlaczego Podman Quadlet zamiast Docker Swarm?
| Cecha | Docker Swarm | Podman Quadlet |
|---|---|---|
| Daemonless | ❌ Wymaga dockerd | ✅ Bez demona |
| Rootless | ⚠️ Eksperymentalny | ✅ Natywny |
| Systemd integration | ❌ Osobne zarządzanie | ✅ Natywne |
| Security isolation | ⚠️ Shared daemon | ✅ Per-user namespaces |
| Auto-restart | ✅ | ✅ Via systemd |
| Memory footprint | ~100MB daemon | ~0MB (on-demand) |
| Multi-tenant | ⚠️ Labels | ✅ User namespaces |
Pactown wykorzystuje wewnętrzny moduł pactown.deploy.quadlet z pełnym wsparciem dla:
- Sanityzacji nazw, zmiennych, ścieżek (security)
- Generowania Traefik jako Quadlet
- Izolacji tenantów przez user namespaces
- Walidacji volume mounts
Architektura
┌─────────────────────────────────────────────────────────────────┐
│ pactown.com (Traefik Quadlet) │
├─────────────────────────────────────────────────────────────────┤
│ *.pactown.com → Wildcard SSL (Let's Encrypt) │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │
│ │ Web │ │ API │ │ Editor │ │ User Apps │ │
│ │ :3000 │ │ :8000 │ │ :3001 │ │ :10000-20000 │ │
│ │ Next.js │ │ FastAPI │ │ TipTap │ │ markpact │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────────┘ │
│ │ │ │ │ │
│ [Quadlet] [Quadlet] [Quadlet] [Quadlet] │
│ │ │ │ │ │
│ ▼ ▼ ▼ ▼ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ systemd user services (rootless containers) │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ PostgreSQL + Redis (Quadlet) │ │
│ └──────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
Ważne elementy implementacji:
- [Auth (sesja)]
access_tokenjako httpOnly cookie (token nie jest przekazywany w URL i nie jest trzymany wlocalStorage). - [Runner status realtime] Dashboard korzysta z SSE (
GET /runner/status/stream) zamiast polling. - [Admin auth]
admin_tokenjako httpOnly cookie.
Struktura Projektu
pactown-com/
├── Makefile # Wszystkie komendy (make quadlet-*)
├── scripts/ # Skrypty wywoływane przez Makefile
│ ├── config.sh # Interaktywna konfiguracja
│ ├── install.sh # Instalacja Podman
│ ├── up.sh # Uruchamianie serwisów
│ ├── dev.sh # Tryb development
│ ├── test.sh # Runner testów
│ └── diag-remote.sh # Diagnostyka produkcji
├── quadlet/ # Pliki jednostek Quadlet
├── .env.example # Template konfiguracji
├── backend/
│ ├── app/
│ │ ├── main.py # FastAPI app
│ │ ├── routers/auth.py # OAuth2 (Google, GitHub)
│ │ ├── config.py # Pydantic Settings
│ │ └── ...
│ └── tests/
├── frontend/
│ ├── src/
│ ├── e2e/ # Testy Playwright
│ │ └── oauth.spec.ts # Testy OAuth
│ └── package.json
├── infra/scripts/ # Skrypty infrastruktury
│ ├── diagnostics.sh # Pełna diagnostyka
│ └── init-quadlet.sh # Inicjalizacja Quadlet
└── docs/ # Dokumentacja
Komendy Makefile
| Komenda | Opis |
|---|---|
make config |
Interaktywna konfiguracja .env |
make install |
Instalacja Podman + zależności |
make dev |
Tryb development (docker-compose) |
make build |
Zbuduj obrazy localhost/pactown-api:latest i localhost/pactown-web:latest |
make pull |
Pobierz obrazy z registry i otaguj jako localhost/* |
make up |
Uruchom produkcję (Quadlet) |
make down |
Zatrzymaj serwisy |
make restart |
Restart wszystkich serwisów |
make status |
Status serwisów |
make logs |
Logi serwisów |
make diag |
Diagnostyka systemu |
make diag-remote |
Diagnostyka produkcji (DNS, SSL) |
make test |
Testy API + frontend |
make test-oauth |
Testy OAuth (Playwright) |
make deploy |
Deploy produkcyjny |
Dokumentacja (repo)
docs/README.md(menu):./docs/README.md- CLI + mapowanie API→shell (curl/make):
./docs/CLI_API.md - Produkcja (VPS): przykłady komend
make/pactowncom:./docs/CLI_API.md#produkcja-vps
Pactown Guard (pactown-guard)
pactown-guard to transparentny guard do diagnostyki VPS: uruchamiasz go ręcznie i dostajesz interaktywny shell.
Szybkie użycie (z repo)
python3 infra/scripts/pactown_guard.py --prod
Po uruchomieniu zobaczysz podsumowanie i prompt:
pactown-guard>
Komendy w shellu
helpPokaż dostępne komendy.diagUruchom ponownie diagnostykę (infra/scripts/diagnostics.sh --json).suggestPokaż propozycje bezpiecznych akcji (bez wykonywania zmian).applyZastosuj proponowane akcje, ale zawsze pyta o potwierdzenie dla każdej z nich.restart <service>Restart pojedynczej usługisystemd --user(tylko z allowlisty; z potwierdzeniem).logs <service>Podejrzyj logijournalctl --user -u <service>.triageOtwórz sesjętmuxz logami (domyślniepactown-triage).exit/quitWyjście.
Instalacja komendy pactown-guard (w PATH)
Po make install instalacja jest robiona automatycznie w trybie editable (pip --user -e .).
Jeśli chcesz to zrobić ręcznie:
pactown-guard install
Aktualizacja pactown-guard
Najprościej:
pactown-guard update
Domyślnie (gdy jesteś w repo) zrobi git pull + reinstalację -e.
Jeśli uruchamiasz poza repo, wykona update z PyPI.
Opcjonalny systemd timer (niezalecane jako domyślne)
Guard jest projektowany jako narzędzie manualne. Jeśli chcesz uruchamiać go okresowo:
make guard-init
make guard-enable-timer
make guard-status
Wyłączenie timera:
make guard-disable
Publikacja paczki (PyPI)
make publish
Wymaga ustawionych poświadczeń (np. TWINE_USERNAME, TWINE_PASSWORD).
Funkcjonalności (v0.1.8)
1. Social Login
- Google OAuth2 → docs/AUTH.md
- GitHub OAuth2 → docs/AUTH.md
- Auth0 (OIDC broker)
- Clerk (opcjonalny)
- Facebook OAuth2 (opcjonalnie)
2. Markdown Editor (TipTap)
- WYSIWYG editing
- Code blocks z syntax highlighting
-
markpact:*codeblocks - Live preview
3. LLM Integration (OpenRouter)
- Generowanie projektów z opisu
- Auto-fix błędów runtime
- Chat z kontekstem projektu
- Wybór modelu LLM
- Darmowe modele (nemotron)
4. Płatności
- Stripe (karty, BLIK via P24)
- Tpay (natywne polskie płatności)
5. User Services
- Dynamiczne tworzenie subdomen
- Konfigurowalny separator subdomen (
SUBDOMAIN_SEPARATOR:-lub.) - Izolacja kontenerów
- Health checks
- SSE real-time runner status
6. Desktop & Mobile Builds
- Electron (AppImage, exe, dmg)
- Tauri, PyInstaller, PyQt
- Capacitor (Android/iOS)
- React Native, Flutter, Kivy
- Build artifacts z retencją (max 3 per scope)
- Download artefaktów z UI
7. Infrastructure as Code (IaC)
-
pactown.sandbox.yaml— specyfikacja runtime -
Dockerfile— gotowy do produkcji -
docker-compose.yaml— single-service compose - Web Preview mode (headless servers)
8. Marketplace / Examples
- DB-backed examples (seed z marketplace.ts)
- 20+ przykładów z kategoriami i tagami
- Build z przykładu online
- Publiczne API: GET /public/examples
9. Internationalization (i18n)
- 7 języków: PL, EN, DE, FR, ES, UK, RU
- Automatyczne wykrywanie locale
- Przełącznik języka w UI
10. Program Poleceń (Referrals)
- Unikalne linki polecające
- Punkty za polecenia
- Wypłata od 100 PLN
11. Diagnostyka / zgłaszanie problemów
- Dashboard: synchronizacja stanu UI z parametrami URL
- Dashboard: ślad działań użytkownika jako token
trace+trace_id - Dashboard: „Zgłoś problem” (modal) ze zrzutem ekranu
- Backend:
POST /users/me/issue-report
Changelog / Roadmap
Konfiguracja DNS
# Dodaj rekordy DNS dla pactown.com:
A @ → <IP_SERWERA>
A * → <IP_SERWERA>
AAAA @ → <IPv6_SERWERA> (opcjonalnie)
AAAA * → <IPv6_SERWERA> (opcjonalnie)
Dokumentacja
| Dokument | Opis |
|---|---|
| docs/AUTH.md | Konfiguracja OAuth (Google, GitHub, Clerk) |
| docs/IMPLEMENTATION.md | Szczegóły implementacji (cookies auth, SSE runner status, proxy, admin/public pages, cache env) |
| docs/CONFIGURATION.md | Pełna konfiguracja .env |
| docs/DEV_SETUP.md | Setup środowiska dev |
| docs/SECURITY.md | Bezpieczeństwo i best practices |
| docs/SERVICE_PROVIDER.md | Wymagania dla providera usług / hostingu (pod skalowanie runnerów) |
| docs/IAC.md | Infrastructure as Code |
Licencja
2026 Softreck. Wszelkie prawa zastrzeżone.
Ostatnia aktualizacja: Luty 2026
License
Licensed under Apache-2.0.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pactown_guard-0.1.9.tar.gz.
File metadata
- Download URL: pactown_guard-0.1.9.tar.gz
- Upload date:
- Size: 2.3 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f2a6acf0d27eafc0046589b282735d2efa0d9599a0c4c621d47fe151858fe284
|
|
| MD5 |
1e83d2985ea80f5ca9d918de749bde11
|
|
| BLAKE2b-256 |
9228ee7124a337d7c9bf854e3c55235815ffa25924810ac33c6590422d0bed3b
|
File details
Details for the file pactown_guard-0.1.9-py3-none-any.whl.
File metadata
- Download URL: pactown_guard-0.1.9-py3-none-any.whl
- Upload date:
- Size: 2.7 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
45132216e4b2dec295ea31270de3950b74d7b0ddb2f7ed7bec3286942a7f4bd6
|
|
| MD5 |
cdbeb920d82e56b8a84d25b1814b25d3
|
|
| BLAKE2b-256 |
0d915c6332bd190364cba638606f287c0745f96b4eda2ab8d7ec9603bcaf3908
|