diff --git a/deploy/dev/.env.example b/deploy/dev/.env.example new file mode 100644 index 0000000..2f5e563 --- /dev/null +++ b/deploy/dev/.env.example @@ -0,0 +1,3 @@ +PORT=3000 +GRIST_MCP_TOKEN=your-token-here +CONFIG_PATH=/app/config.yaml diff --git a/deploy/dev/docker-compose.yml b/deploy/dev/docker-compose.yml new file mode 100644 index 0000000..1891e66 --- /dev/null +++ b/deploy/dev/docker-compose.yml @@ -0,0 +1,19 @@ +# Development environment - hot reload, persistent data +services: + grist-mcp: + build: + context: ../.. + dockerfile: Dockerfile + ports: + - "${PORT:-3000}:3000" + volumes: + - ../../src:/app/src:ro + - ../../config.yaml:/app/config.yaml:ro + env_file: + - .env + healthcheck: + test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:3000/health')"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 60s diff --git a/deploy/prod/.env.example b/deploy/prod/.env.example new file mode 100644 index 0000000..b83beb4 --- /dev/null +++ b/deploy/prod/.env.example @@ -0,0 +1,3 @@ +PORT=3000 +GRIST_MCP_TOKEN=your-production-token +CONFIG_PATH=/app/config.yaml diff --git a/deploy/prod/docker-compose.yml b/deploy/prod/docker-compose.yml new file mode 100644 index 0000000..aa86aff --- /dev/null +++ b/deploy/prod/docker-compose.yml @@ -0,0 +1,31 @@ +# Production environment - resource limits, logging, restart policy +services: + grist-mcp: + build: + context: ../.. + dockerfile: Dockerfile + ports: + - "${PORT:-3000}:3000" + volumes: + - ./config.yaml:/app/config.yaml:ro + env_file: + - .env + restart: unless-stopped + deploy: + resources: + limits: + memory: 512M + cpus: "1" + reservations: + memory: 128M + logging: + driver: "json-file" + options: + max-size: "50m" + max-file: "5" + healthcheck: + test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:3000/health')"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 60s diff --git a/docker-compose.test.yaml b/deploy/test/docker-compose.yml similarity index 53% rename from docker-compose.test.yaml rename to deploy/test/docker-compose.yml index 8ea247f..192b20a 100644 --- a/docker-compose.test.yaml +++ b/deploy/test/docker-compose.yml @@ -1,29 +1,36 @@ +# Test environment - ephemeral, branch-isolated services: grist-mcp: - build: . + build: + context: ../.. + dockerfile: Dockerfile + container_name: grist-mcp-test-${TEST_INSTANCE_ID:-default} ports: - - "3000:3000" + - "3000" # Dynamic port environment: - CONFIG_PATH=/app/config.yaml - GRIST_MCP_TOKEN=test-token - PORT=3000 volumes: - - ./tests/integration/config.test.yaml:/app/config.yaml:ro + - ../../tests/integration/config.test.yaml:/app/config.yaml:ro depends_on: mock-grist: - condition: service_started + condition: service_healthy networks: - test-net healthcheck: test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:3000/health')"] interval: 5s timeout: 5s - retries: 5 + retries: 10 + start_period: 10s mock-grist: - build: tests/integration/mock_grist + build: + context: ../../tests/integration/mock_grist + container_name: mock-grist-test-${TEST_INSTANCE_ID:-default} ports: - - "8484:8484" + - "8484" # Dynamic port environment: - PORT=8484 networks: @@ -32,8 +39,10 @@ services: test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8484/health')"] interval: 5s timeout: 5s - retries: 5 + retries: 10 + start_period: 10s networks: test-net: + name: grist-mcp-test-${TEST_INSTANCE_ID:-default} driver: bridge diff --git a/docker-compose.yaml b/docker-compose.yaml deleted file mode 100644 index 5abf08a..0000000 --- a/docker-compose.yaml +++ /dev/null @@ -1,10 +0,0 @@ -services: - grist-mcp: - build: . - ports: - - "${PORT:-3000}:3000" - volumes: - - ./config.yaml:/app/config.yaml:ro - env_file: - - .env - restart: unless-stopped