chore: 部署、启动参数模板
parent
c3d2ab56a9
commit
30f477550a
@ -0,0 +1,19 @@
|
||||
.git
|
||||
.gitignore
|
||||
.venv
|
||||
__pycache__
|
||||
*.py[cod]
|
||||
.pytest_cache
|
||||
.mypy_cache
|
||||
.ruff_cache
|
||||
*.egg-info
|
||||
build
|
||||
dist
|
||||
runtime
|
||||
logs
|
||||
.env
|
||||
.env.*
|
||||
!.env.example
|
||||
*.db
|
||||
*.sqlite
|
||||
*.sqlite3
|
||||
@ -0,0 +1,13 @@
|
||||
APP_ENV=prod
|
||||
APP_PORT=8000
|
||||
|
||||
MYSQL_HOST=host.docker.internal
|
||||
MYSQL_PORT=3306
|
||||
MYSQL_ROOT_PASSWORD=root-password
|
||||
MYSQL_DATABASE=app
|
||||
MYSQL_USER=app
|
||||
MYSQL_PASSWORD=change-me
|
||||
|
||||
SECRET_KEY=change-me
|
||||
JWT_SECRET_KEY=change-me
|
||||
LOG_FILE_ENABLED=true
|
||||
@ -0,0 +1,26 @@
|
||||
{
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "{{ project_name }}: FastAPI",
|
||||
"type": "debugpy",
|
||||
"request": "launch",
|
||||
"module": "uvicorn",
|
||||
"args": [
|
||||
"main:app",
|
||||
"--reload",
|
||||
"--host",
|
||||
"127.0.0.1",
|
||||
"--port",
|
||||
"8000"
|
||||
],
|
||||
"cwd": "${workspaceFolder}",
|
||||
"env": {
|
||||
"APP_ENV": "dev",
|
||||
"APP_ENV_DIR": "${workspaceFolder}"
|
||||
},
|
||||
"jinja": true,
|
||||
"justMyCode": true
|
||||
}
|
||||
]
|
||||
}
|
||||
@ -0,0 +1,24 @@
|
||||
FROM python:3.11-slim
|
||||
|
||||
ENV PYTHONDONTWRITEBYTECODE=1 \
|
||||
PYTHONUNBUFFERED=1 \
|
||||
UV_LINK_MODE=copy \
|
||||
UV_COMPILE_BYTECODE=1
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends curl git \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
COPY . .
|
||||
RUN pip install --no-cache-dir uv \
|
||||
&& if [ -f uv.lock ]; then \
|
||||
uv sync --frozen --no-dev; \
|
||||
else \
|
||||
uv sync --no-dev; \
|
||||
fi
|
||||
|
||||
EXPOSE 8000
|
||||
|
||||
CMD ["uv", "run", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
|
||||
@ -1 +1,3 @@
|
||||
"""{{ project_name }} package."""
|
||||
from .app_factory import create_app
|
||||
|
||||
__all__ = ["create_app"]
|
||||
|
||||
@ -0,0 +1,27 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import os
|
||||
|
||||
from iti import create_app as create_framework_app
|
||||
{% if include_system %}
|
||||
from iti_system import create_system_module
|
||||
{% endif %}
|
||||
from config import config
|
||||
from app.modules.example.module import ExampleModule
|
||||
|
||||
|
||||
def create_app(config_name: str | None = None, config_overrides: dict | None = None):
|
||||
config_name = config_name or os.getenv("APP_ENV", "dev")
|
||||
modules = [ExampleModule()]
|
||||
{% if include_system %}
|
||||
modules.append(create_system_module())
|
||||
{% endif %}
|
||||
app = create_framework_app(
|
||||
config_name=config_name,
|
||||
config_mapping=config,
|
||||
modules=modules,
|
||||
)
|
||||
if config_overrides:
|
||||
for key, value in config_overrides.items():
|
||||
setattr(app.state.config, key.lower(), value)
|
||||
return app
|
||||
@ -0,0 +1,31 @@
|
||||
services:
|
||||
app:
|
||||
environment:
|
||||
MYSQL_HOST: db
|
||||
MYSQL_PORT: 3306
|
||||
depends_on:
|
||||
db:
|
||||
condition: service_healthy
|
||||
|
||||
db:
|
||||
image: mysql:8.4
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root-password}
|
||||
MYSQL_DATABASE: ${MYSQL_DATABASE:-app}
|
||||
MYSQL_USER: ${MYSQL_USER:-app}
|
||||
MYSQL_PASSWORD: ${MYSQL_PASSWORD:-change-me}
|
||||
command:
|
||||
- --character-set-server=utf8mb4
|
||||
- --collation-server=utf8mb4_unicode_ci
|
||||
ports:
|
||||
- "${MYSQL_PORT:-3306}:3306"
|
||||
volumes:
|
||||
- mysql-data:/var/lib/mysql
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "mysqladmin ping -h 127.0.0.1 -u$${MYSQL_USER} -p$${MYSQL_PASSWORD} --silent"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 10
|
||||
|
||||
volumes:
|
||||
mysql-data:
|
||||
@ -0,0 +1,26 @@
|
||||
services:
|
||||
app:
|
||||
build:
|
||||
context: .
|
||||
image: {{ project_slug | replace('_', '-') }}:local
|
||||
environment:
|
||||
APP_ENV: ${APP_ENV:-prod}
|
||||
SECRET_KEY: ${SECRET_KEY:-change-me}
|
||||
JWT_SECRET_KEY: ${JWT_SECRET_KEY:-change-me}
|
||||
MYSQL_HOST: ${MYSQL_HOST:-host.docker.internal}
|
||||
MYSQL_PORT: ${MYSQL_PORT:-3306}
|
||||
MYSQL_DATABASE: ${MYSQL_DATABASE:-app}
|
||||
MYSQL_USER: ${MYSQL_USER:-app}
|
||||
MYSQL_PASSWORD: ${MYSQL_PASSWORD:-change-me}
|
||||
LOG_FILE_ENABLED: ${LOG_FILE_ENABLED:-true}
|
||||
extra_hosts:
|
||||
- "host.docker.internal:host-gateway"
|
||||
ports:
|
||||
- "${APP_PORT:-8000}:8000"
|
||||
volumes:
|
||||
- ./runtime:/app/runtime
|
||||
command: >
|
||||
sh -c "{% if include_system %}uv run iti-system migrations sync --target migrations/versions &&
|
||||
{% endif %}uv run alembic -c migrations/alembic.ini upgrade head &&
|
||||
{% if include_system %}PYTHONPATH=. uv run iti-system seed system app:create_app &&
|
||||
{% endif %}uv run uvicorn main:app --host 0.0.0.0 --port 8000"
|
||||
@ -1,22 +1,4 @@
|
||||
import os
|
||||
from app import create_app
|
||||
|
||||
from iti import create_app
|
||||
{% if include_system %}from iti_system import create_system_module
|
||||
|
||||
{% endif -%}
|
||||
from config import config
|
||||
from app.modules.example.module import ExampleModule
|
||||
|
||||
|
||||
modules = [
|
||||
ExampleModule(),
|
||||
{% if include_system %} create_system_module(),
|
||||
{% endif -%}
|
||||
]
|
||||
|
||||
|
||||
app = create_app(
|
||||
config_name=os.getenv("APP_ENV", os.getenv("ITI_ENV", "dev")),
|
||||
config_mapping=config,
|
||||
modules=modules,
|
||||
)
|
||||
app = create_app()
|
||||
|
||||
Loading…
Reference in New Issue