Some checks failed
CICD / Build and Publish CICD Base Image (push) Successful in 14s
CICD / Build and Push CICD Image (push) Successful in 53m41s
CICD / Build CICD Image Failure Postmortem (push) Has been skipped
CICD / Frontend Tests (push) Successful in 1m3s
CICD / Backend Doctests (push) Successful in 32s
CICD / Backend Tests (push) Successful in 13m58s
CICD / Pre-commit Checks (push) Successful in 14m6s
CICD / CICD Tests Complete (push) Successful in 9s
CICD / Source Lanes Failure Postmortem (push) Has been skipped
CICD / Build Backend Base Image (push) Successful in 34s
CICD / Build E2E Tester Image (push) Successful in 32s
CICD / Build Integration Tester Image (push) Successful in 1m8s
CICD / Build Backend Main Image (push) Successful in 1m48s
CICD / Build Frontend Base Image (push) Successful in 8m19s
CICD / Build and Publish Runtime Images (Legacy Disabled) (push) Has been skipped
CICD / Build Frontend Main Image (push) Successful in 26s
CICD / Runtime Images Failure Postmortem (push) Has been skipped
CICD / Production Images Complete (push) Successful in 8s
CICD / Runtime Black-Box Integration Tests (push) Successful in 1m56s
CICD / Integration Tests Failure Postmortem (push) Has been skipped
CICD / End-to-End Tests (push) Failing after 27m40s
CICD / E2E Tests Failure Postmortem (push) Successful in 13s
331 lines
7.7 KiB
Markdown
331 lines
7.7 KiB
Markdown
# Plex Playlist Project
|
|
|
|
A full-stack application for managing Plex playlists with a FastAPI backend
|
|
and Vue.js frontend.
|
|
|
|
## Architecture
|
|
|
|
- **Backend**: Python 3.14 + FastAPI + uv + ruff
|
|
- **Frontend**: TypeScript + Vue.js + Vite
|
|
- **Database**: PostgreSQL 16
|
|
- **Containerization**: Docker + Docker Compose
|
|
|
|
## Deployable Runtime Contract
|
|
|
|
Deployable image requirements are defined in:
|
|
|
|
- [docs/DEPLOYABLE_RUNTIME_CONTRACT.md](docs/DEPLOYABLE_RUNTIME_CONTRACT.md)
|
|
- [docs/adr/ADR003-deployable_runtime_image_contract.md](docs/adr/ADR003-deployable_runtime_image_contract.md)
|
|
|
|
These documents define backend/frontend runtime boundaries, startup and health
|
|
behavior expectations, environment contracts, and disallowed non-runtime
|
|
tooling classes in deployable artifacts.
|
|
|
|
## Development Setup
|
|
|
|
### Prerequisites
|
|
|
|
- Docker and Docker Compose
|
|
- Git
|
|
- pre-commit (for development)
|
|
|
|
### Code Quality Tools
|
|
|
|
This project uses comprehensive linting and formatting:
|
|
|
|
**Backend (Python):**
|
|
|
|
- `ruff` - Fast Python linter and formatter
|
|
- `pyright` - Type checking
|
|
- `pydoclint` - Docstring linting (Google style)
|
|
|
|
**Frontend (TypeScript/Vue):**
|
|
|
|
- `eslint` - Linting with Vue and TypeScript support
|
|
- `prettier` - Code formatting
|
|
- `vue-tsc` - Vue TypeScript checking
|
|
- `eslint-plugin-tsdoc` - TSDoc documentation linting
|
|
|
|
**Task Runner:**
|
|
|
|
- `poethepoet` - Unified task runner for development workflows
|
|
|
|
**General:**
|
|
|
|
- `pre-commit` - Git hooks for automated quality checks
|
|
- TOML formatting and validation
|
|
|
|
### Unified Development with Poe
|
|
|
|
This project uses **Poe the Poet** for streamlined development:
|
|
|
|
```bash
|
|
# Complete setup (installs deps, starts dev environment)
|
|
poe setup
|
|
|
|
# Code quality (format, lint, type-check all code)
|
|
poe ci-quick
|
|
|
|
# Run all tests
|
|
poe test-all
|
|
|
|
# See all available tasks
|
|
poe --help
|
|
```
|
|
|
|
### Manual Setup (Alternative)
|
|
|
|
```bash
|
|
pip install pre-commit
|
|
pre-commit install
|
|
```
|
|
|
|
### Quick Start
|
|
|
|
Clone the repository, then choose one of these startup paths.
|
|
|
|
#### Unified Development
|
|
|
|
```bash
|
|
# Complete setup and start development environment
|
|
poe setup
|
|
|
|
# Or manually:
|
|
cd backend
|
|
pip install -e .
|
|
poe dev-env-start
|
|
```
|
|
|
|
#### Traditional Setup
|
|
|
|
```bash
|
|
# Backend development
|
|
cd backend
|
|
pip install -e .
|
|
|
|
# Frontend development
|
|
cd frontend
|
|
npm install
|
|
npm run dev
|
|
```
|
|
|
|
#### Docker Development
|
|
|
|
```bash
|
|
# Using Poe (recommended)
|
|
poe docker-dev-up
|
|
|
|
# Or directly
|
|
docker compose -f compose.dev.yml up --build
|
|
```
|
|
|
|
#### Production Build
|
|
|
|
```bash
|
|
poe docker-prod-up
|
|
# Or: docker compose up --build
|
|
```
|
|
|
|
### Running in Production Mode
|
|
|
|
```bash
|
|
docker compose up --build -d
|
|
```
|
|
|
|
This will start:
|
|
|
|
- PostgreSQL database on port 5432
|
|
- FastAPI backend on port 8000
|
|
- Vue.js frontend on port 80
|
|
|
|
## Project Structure
|
|
|
|
```text
|
|
plex-playlist/
|
|
├── backend/ # FastAPI backend
|
|
├── frontend/ # Vue.js frontend
|
|
│ └── nginx.conf # Nginx configuration
|
|
├── Dockerfile.backend # Backend Docker image
|
|
├── Dockerfile.frontend # Frontend Docker image
|
|
├── compose.yml # Production Docker Compose
|
|
├── compose.dev.yml # Development Docker Compose override
|
|
└── README.md
|
|
```
|
|
|
|
## CI Operations
|
|
|
|
For Gitea Actions runner image mirror maintenance, use:
|
|
|
|
- `source scripts/gitea-actions/repair_runner_mirror.xsh`
|
|
- `source scripts/gitea-actions/check_runner_images.xsh` (checks ubuntu:22.04, GHCR act image, local mirror, and Renovate image)
|
|
- `source scripts/gitea-actions/collect_runner_diagnostics.xsh [since] [trace_id]`
|
|
|
|
For setup-stage failures with sparse logs, use:
|
|
|
|
- `source scripts/gitea-actions/runner-prechange-capture.xsh [tail_lines]`
|
|
- `source scripts/gitea-actions/diagnose_runner_startup.xsh`
|
|
|
|
For full troubleshooting context, see `docs/GITEA_ACTIONS_TROUBLESHOOTING.md`.
|
|
|
|
## Environment Variables
|
|
|
|
### Backend
|
|
|
|
- `DATABASE_URL`: PostgreSQL connection string
|
|
- `BACKEND_REQUIRED_PYTHON`: Runtime policy baseline (`3.14` default)
|
|
- `ENVIRONMENT`: `development` or `production`
|
|
- `RELOAD`: Enable uvicorn auto-reload (development only)
|
|
|
|
### Frontend
|
|
|
|
- No required runtime environment variables for production nginx serving
|
|
|
|
## Database
|
|
|
|
The PostgreSQL database is configured with:
|
|
|
|
- Database: `plex_playlist`
|
|
- User: `plex_user`
|
|
- Password: `plex_password`
|
|
|
|
## Development Workflow
|
|
|
|
1. Make changes to your code
|
|
2. The development containers will automatically reload:
|
|
- Backend: uvicorn with `--reload` flag
|
|
- Frontend: Vite dev server with hot module replacement
|
|
|
|
## API Documentation
|
|
|
|
When running, the FastAPI automatic documentation is available at:
|
|
|
|
- Development: <http://localhost:8001/docs>
|
|
- Production: <http://localhost:8000/docs>
|
|
|
|
---
|
|
|
|
## Manual Setup (if not using Docker)
|
|
|
|
## Backend Setup (FastAPI, Python 3.14, uv, ruff, pyright)
|
|
|
|
### 1. Create and activate the uv virtual environment
|
|
|
|
```sh
|
|
cd backend
|
|
uv venv .venv
|
|
source .venv/bin/activate
|
|
```
|
|
|
|
### 2. Install dependencies
|
|
|
|
```sh
|
|
uv sync --all-groups
|
|
```
|
|
|
|
### 3. Install dev tools
|
|
|
|
```sh
|
|
uv run poe format
|
|
uv run poe lint
|
|
uv run poe test
|
|
```
|
|
|
|
### 4. Project structure
|
|
|
|
- `src/backend/` - FastAPI application code
|
|
- `tests/` - Test suite
|
|
- `pyrightconfig.json` - Pyright type checking config
|
|
- `pyproject.toml` - Ruff, pytest, and task configuration
|
|
|
|
### 5. Run the development server
|
|
|
|
```sh
|
|
uv run uvicorn backend.main:app --reload --app-dir src
|
|
```
|
|
|
|
---
|
|
|
|
## Frontend Setup (Vue 3, Vite, TypeScript)
|
|
|
|
### 1. Create the project
|
|
|
|
```sh
|
|
cd frontend
|
|
npm create vite@latest . -- --template vue-ts
|
|
npm install
|
|
```
|
|
|
|
### 2. Recommended: Enable strictest TypeScript settings
|
|
|
|
Edit `tsconfig.json` and set:
|
|
|
|
```json
|
|
{
|
|
"compilerOptions": {
|
|
"strict": true,
|
|
"noImplicitAny": true,
|
|
"strictNullChecks": true,
|
|
"strictFunctionTypes": true,
|
|
"strictBindCallApply": true,
|
|
"noImplicitThis": true,
|
|
"alwaysStrict": true,
|
|
"noUnusedLocals": true,
|
|
"noUnusedParameters": true,
|
|
"noFallthroughCasesInSwitch": true
|
|
}
|
|
}
|
|
```
|
|
|
|
## 3. Run the frontend
|
|
|
|
```sh
|
|
npm run dev
|
|
```
|
|
|
|
---
|
|
|
|
## Documentation
|
|
|
|
### Development & Workflow
|
|
|
|
- **[Development Environment Setup](docs/DEVELOPMENT.md)**
|
|
- Comprehensive guide for setting up your development environment,
|
|
git workflow, pre-commit hooks, manual tool usage, and CI/CD pipeline
|
|
understanding
|
|
- **[Poe Task Reference](docs/POE_TASK_REFERENCE.md)**
|
|
- Complete guide to unified development tasks and workflows using
|
|
Poe the Poet
|
|
- **[Deployable Runtime Contract](docs/DEPLOYABLE_RUNTIME_CONTRACT.md)**
|
|
- Canonical backend/frontend deployable runtime image requirements
|
|
and exclusions
|
|
- **[ADR003: Deployable Runtime Image Contract Boundaries](docs/adr/ADR003-deployable_runtime_image_contract.md)**
|
|
- Architectural decision that locks deployable image boundary policy
|
|
|
|
### Architecture & CI/CD
|
|
|
|
- **[CI/CD Multi-stage Build](docs/CICD_MULTI_STAGE_BUILD.md)**
|
|
- Docker multi-stage build strategy, architecture decisions,
|
|
and performance optimizations
|
|
- **[CI/CD Troubleshooting Guide](docs/CICD_TROUBLESHOOTING_GUIDE.md)**
|
|
- Comprehensive troubleshooting, optimization decisions,
|
|
and performance monitoring for Docker builds and E2E testing
|
|
- **[CI/CD Success Summary](docs/CICD_SUCCESS_SUMMARY.md)**
|
|
- Complete validation results and performance metrics
|
|
for the optimized pipeline
|
|
|
|
### Dependency Management & Automation
|
|
|
|
- **[Renovate Bot Setup](docs/RENOVATE_SETUP_GUIDE.md)**
|
|
- Automated dependency updates with Renovate for Python,
|
|
Node.js, and Docker dependencies
|
|
|
|
### Operations & Troubleshooting
|
|
|
|
- **[Gitea Actions Troubleshooting](docs/GITEA_ACTIONS_TROUBLESHOOTING.md)**
|
|
- Solutions for CI/CD pipeline issues,
|
|
including the critical "jobs waiting forever" problem
|
|
- **[Secure Docker CI/CD](docs/SECURE_DOCKER_CICD.md)**
|
|
- Security considerations and setup for Docker-based CI/CD pipelines
|
|
|
|
See the `backend/` and `frontend/` folders for more details.
|