openapi: 3.0.3 info: title: Containr API description: | Self-hosted PaaS on Proxmox - Railway-like platform for container orchestration and deployment. ## Overview Containr provides a comprehensive platform for deploying, managing, and scaling containerized applications on Proxmox infrastructure. This API allows you to manage projects, services, deployments, databases, and more through a RESTful interface. ## Authentication The API uses JWT-based authentication. Include your JWT token in the Authorization header: ``` Authorization: Bearer ``` ## Base URL ``` https://your-containr-domain.com/api/v1 ``` version: 1.0.0 contact: name: Containr Documentation url: https://github.com/your-org/containr license: name: MIT url: https://opensource.org/licenses/MIT servers: - url: http://localhost:8080/api/v1 description: Development server - url: https://your-containr-domain.com/api/v1 description: Production server paths: # Health Check /health: get: tags: - Health summary: Health check endpoint description: Returns the current status of the API service responses: '200': description: Service is healthy content: application/json: schema: $ref: '#/components/schemas/HealthResponse' # Authentication /auth/login: post: tags: - Authentication summary: User login description: Authenticate user and return JWT token requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/LoginRequest' responses: '200': description: Login successful content: application/json: schema: $ref: '#/components/schemas/LoginResponse' '401': description: Invalid credentials content: application/json: schema: $ref: '#/components/schemas/Error' /auth/register: post: tags: - Authentication summary: User registration description: Register a new user account requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/RegisterRequest' responses: '201': description: Registration successful content: application/json: schema: $ref: '#/components/schemas/User' '400': description: Invalid input content: application/json: schema: $ref: '#/components/schemas/Error' # User Management /user/profile: get: tags: - User summary: Get user profile description: Retrieve current user's profile information security: - bearerAuth: [] responses: '200': description: Profile retrieved successfully content: application/json: schema: $ref: '#/components/schemas/User' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Error' put: tags: - User summary: Update user profile description: Update current user's profile information security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateUserRequest' responses: '200': description: Profile updated successfully content: application/json: schema: $ref: '#/components/schemas/User' '400': description: Invalid input content: application/json: schema: $ref: '#/components/schemas/Error' # Projects /projects: get: tags: - Projects summary: List projects description: Retrieve all projects accessible to the current user security: - bearerAuth: [] parameters: - name: page in: query description: Page number for pagination schema: type: integer default: 1 - name: limit in: query description: Number of items per page schema: type: integer default: 20 - name: search in: query description: Search term to filter projects schema: type: string responses: '200': description: Projects retrieved successfully content: application/json: schema: $ref: '#/components/schemas/ProjectsResponse' post: tags: - Projects summary: Create project description: Create a new project security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateProjectRequest' responses: '201': description: Project created successfully content: application/json: schema: $ref: '#/components/schemas/Project' '400': description: Invalid input content: application/json: schema: $ref: '#/components/schemas/Error' /projects/{id}: get: tags: - Projects summary: Get project description: Retrieve a specific project by ID security: - bearerAuth: [] parameters: - name: id in: path required: true description: Project ID schema: type: string responses: '200': description: Project retrieved successfully content: application/json: schema: $ref: '#/components/schemas/Project' '404': description: Project not found content: application/json: schema: $ref: '#/components/schemas/Error' put: tags: - Projects summary: Update project description: Update a specific project security: - bearerAuth: [] parameters: - name: id in: path required: true description: Project ID schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateProjectRequest' responses: '200': description: Project updated successfully content: application/json: schema: $ref: '#/components/schemas/Project' '404': description: Project not found content: application/json: schema: $ref: '#/components/schemas/Error' delete: tags: - Projects summary: Delete project description: Delete a specific project security: - bearerAuth: [] parameters: - name: id in: path required: true description: Project ID schema: type: string responses: '204': description: Project deleted successfully '404': description: Project not found content: application/json: schema: $ref: '#/components/schemas/Error' # Services /projects/{project_id}/services: get: tags: - Services summary: List project services description: Retrieve all services in a project security: - bearerAuth: [] parameters: - name: project_id in: path required: true description: Project ID schema: type: string responses: '200': description: Services retrieved successfully content: application/json: schema: type: array items: $ref: '#/components/schemas/Service' post: tags: - Services summary: Create service description: Create a new service in a project security: - bearerAuth: [] parameters: - name: project_id in: path required: true description: Project ID schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateServiceRequest' responses: '201': description: Service created successfully content: application/json: schema: $ref: '#/components/schemas/Service' /services/{id}: get: tags: - Services summary: Get service description: Retrieve a specific service security: - bearerAuth: [] parameters: - name: id in: path required: true description: Service ID schema: type: string responses: '200': description: Service retrieved successfully content: application/json: schema: $ref: '#/components/schemas/Service' put: tags: - Services summary: Update service description: Update a specific service security: - bearerAuth: [] parameters: - name: id in: path required: true description: Service ID schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateServiceRequest' responses: '200': description: Service updated successfully content: application/json: schema: $ref: '#/components/schemas/Service' delete: tags: - Services summary: Delete service description: Delete a specific service security: - bearerAuth: [] parameters: - name: id in: path required: true description: Service ID schema: type: string responses: '204': description: Service deleted successfully # Builds /builds: get: tags: - Builds summary: List builds description: Retrieve all builds security: - bearerAuth: [] parameters: - name: service_id in: query description: Filter by service ID schema: type: string - name: status in: query description: Filter by build status schema: type: string enum: [pending, running, success, failed, cancelled] responses: '200': description: Builds retrieved successfully content: application/json: schema: type: array items: $ref: '#/components/schemas/Build' post: tags: - Builds summary: Start build description: Start a new build security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/StartBuildRequest' responses: '201': description: Build started successfully content: application/json: schema: $ref: '#/components/schemas/Build' /builds/{id}: get: tags: - Builds summary: Get build status description: Retrieve build status and details security: - bearerAuth: [] parameters: - name: id in: path required: true description: Build ID schema: type: string responses: '200': description: Build status retrieved successfully content: application/json: schema: $ref: '#/components/schemas/Build' /builds/{id}/logs: get: tags: - Builds summary: Get build logs description: Retrieve build logs security: - bearerAuth: [] parameters: - name: id in: path required: true description: Build ID schema: type: string responses: '200': description: Build logs retrieved successfully content: text/plain: schema: type: string # Databases /databases: get: tags: - Databases summary: List databases description: Retrieve all databases security: - bearerAuth: [] responses: '200': description: Databases retrieved successfully content: application/json: schema: type: array items: $ref: '#/components/schemas/Database' post: tags: - Databases summary: Create database description: Create a new database security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateDatabaseRequest' responses: '201': description: Database created successfully content: application/json: schema: $ref: '#/components/schemas/Database' /databases/{id}: get: tags: - Databases summary: Get database description: Retrieve a specific database security: - bearerAuth: [] parameters: - name: id in: path required: true description: Database ID schema: type: string responses: '200': description: Database retrieved successfully content: application/json: schema: $ref: '#/components/schemas/Database' # Git Integration /git/providers: get: tags: - Git summary: List Git providers description: Retrieve available Git providers security: - bearerAuth: [] responses: '200': description: Git providers retrieved successfully content: application/json: schema: type: array items: $ref: '#/components/schemas/GitProvider' post: tags: - Git summary: Add Git provider description: Add a new Git provider security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateGitProviderRequest' responses: '201': description: Git provider added successfully content: application/json: schema: $ref: '#/components/schemas/GitProvider' /git/providers/{providerId}/repositories: get: tags: - Git summary: List repositories description: Retrieve repositories from a Git provider security: - bearerAuth: [] parameters: - name: providerId in: path required: true description: Git provider ID schema: type: string responses: '200': description: Repositories retrieved successfully content: application/json: schema: type: array items: $ref: '#/components/schemas/GitRepository' components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT schemas: Error: type: object properties: error: type: string description: Error message code: type: string description: Error code details: type: object description: Additional error details HealthResponse: type: object properties: status: type: string example: ok service: type: string example: containr-api version: type: string example: 1.0.0 LoginRequest: type: object required: - email - password properties: email: type: string format: email description: User email address password: type: string format: password description: User password LoginResponse: type: object properties: token: type: string description: JWT access token user: $ref: '#/components/schemas/User' RegisterRequest: type: object required: - email - password - name properties: email: type: string format: email description: User email address password: type: string format: password description: User password name: type: string description: User display name User: type: object properties: id: type: string description: User ID email: type: string format: email description: User email name: type: string description: User display name created_at: type: string format: date-time description: Account creation timestamp updated_at: type: string format: date-time description: Last update timestamp UpdateUserRequest: type: object properties: name: type: string description: User display name email: type: string format: email description: User email address Project: type: object properties: id: type: string description: Project ID name: type: string description: Project name description: type: string description: Project description owner_id: type: string description: Project owner ID created_at: type: string format: date-time description: Project creation timestamp updated_at: type: string format: date-time description: Last update timestamp services_count: type: integer description: Number of services in the project CreateProjectRequest: type: object required: - name properties: name: type: string description: Project name description: type: string description: Project description UpdateProjectRequest: type: object properties: name: type: string description: Project name description: type: string description: Project description ProjectsResponse: type: object properties: projects: type: array items: $ref: '#/components/schemas/Project' pagination: $ref: '#/components/schemas/Pagination' Pagination: type: object properties: page: type: integer description: Current page number limit: type: integer description: Items per page total: type: integer description: Total number of items total_pages: type: integer description: Total number of pages Service: type: object properties: id: type: string description: Service ID project_id: type: string description: Project ID name: type: string description: Service name type: type: string enum: [web, worker, database, cron] description: Service type status: type: string enum: [running, stopped, building, failed] description: Service status source: $ref: '#/components/schemas/ServiceSource' build_config: $ref: '#/components/schemas/BuildConfig' resources: $ref: '#/components/schemas/ResourceConfig' created_at: type: string format: date-time description: Service creation timestamp updated_at: type: string format: date-time description: Last update timestamp CreateServiceRequest: type: object required: - name - type properties: name: type: string description: Service name type: type: string enum: [web, worker, database, cron] description: Service type source: $ref: '#/components/schemas/ServiceSource' build_config: $ref: '#/components/schemas/BuildConfig' resources: $ref: '#/components/schemas/ResourceConfig' UpdateServiceRequest: type: object properties: name: type: string description: Service name build_config: $ref: '#/components/schemas/BuildConfig' resources: $ref: '#/components/schemas/ResourceConfig' ServiceSource: type: object properties: type: type: string enum: [git, dockerfile, image] description: Source type repository: type: string description: Git repository URL branch: type: string description: Git branch root_directory: type: string description: Root directory for build dockerfile: type: string description: Dockerfile path image: type: string description: Docker image name BuildConfig: type: object properties: builder_type: type: string enum: [nixpacks, dockerfile, image] description: Build system type build_command: type: string description: Custom build command start_command: type: string description: Custom start command environment_variables: type: object additionalProperties: type: string description: Build environment variables ResourceConfig: type: object properties: cpu: type: string description: CPU allocation memory: type: string description: Memory allocation storage: type: string description: Storage allocation Build: type: object properties: id: type: string description: Build ID service_id: type: string description: Service ID status: type: string enum: [pending, running, success, failed, cancelled] description: Build status started_at: type: string format: date-time description: Build start time finished_at: type: string format: date-time description: Build finish time logs: type: string description: Build logs error: type: string description: Build error message StartBuildRequest: type: object required: - service_id properties: service_id: type: string description: Service ID to build commit_sha: type: string description: Git commit SHA branch: type: string description: Git branch Database: type: object properties: id: type: string description: Database ID project_id: type: string description: Project ID name: type: string description: Database name type: type: string enum: [postgresql, redis, mysql] description: Database type status: type: string enum: [running, stopped, provisioning, failed] description: Database status connection_url: type: string description: Database connection URL version: type: string description: Database version size: type: string description: Database size created_at: type: string format: date-time description: Database creation timestamp updated_at: type: string format: date-time description: Last update timestamp CreateDatabaseRequest: type: object required: - name - type properties: name: type: string description: Database name type: type: string enum: [postgresql, redis, mysql] description: Database type version: type: string description: Database version size: type: string description: Database size GitProvider: type: object properties: id: type: string description: Provider ID type: type: string enum: [github, gitlab, bitbucket] description: Provider type name: type: string description: Provider display name access_token: type: string description: Encrypted access token created_at: type: string format: date-time description: Provider creation timestamp CreateGitProviderRequest: type: object required: - type - access_token properties: type: type: string enum: [github, gitlab, bitbucket] description: Provider type name: type: string description: Provider display name access_token: type: string description: Access token GitRepository: type: object properties: id: type: string description: Repository ID name: type: string description: Repository name full_name: type: string description: Repository full name description: type: string description: Repository description private: type: boolean description: Whether repository is private default_branch: type: string description: Default branch clone_url: type: string description: Clone URL web_url: type: string description: Web URL tags: - name: Health description: Health check endpoints - name: Authentication description: User authentication and authorization - name: User description: User profile management - name: Projects description: Project management - name: Services description: Service management - name: Builds description: Build management - name: Databases description: Database management - name: Git description: Git integration