feat(elixir): add docker deployment
This commit is contained in:
124
README.md
124
README.md
@@ -216,7 +216,129 @@ mix ecto.migrations
|
||||
|
||||
## Deployment
|
||||
|
||||
For production deployment:
|
||||
### 🐳 Docker Deployment (Recommended)
|
||||
|
||||
#### Prerequisites
|
||||
- Docker and Docker Compose installed
|
||||
- Git for cloning the repository
|
||||
|
||||
#### Quick Start
|
||||
|
||||
1. **Clone the repository:**
|
||||
```bash
|
||||
git clone <repository-url>
|
||||
cd components_elixir
|
||||
```
|
||||
|
||||
2. **Build and run with Docker Compose:**
|
||||
```bash
|
||||
docker compose up --build
|
||||
```
|
||||
|
||||
**⚠️ Build Time Notice**: The initial build can take 5-15 minutes because:
|
||||
- Tailwind CSS downloads ~500MB from GitHub (can be very slow)
|
||||
- ESBuild downloads additional build tools
|
||||
- Elixir compiles all dependencies
|
||||
- Network conditions may significantly affect download speeds
|
||||
|
||||
3. **Access the application:**
|
||||
- Open [http://localhost:4000](http://localhost:4000)
|
||||
- Default password: `changeme`
|
||||
|
||||
#### Docker Configuration Files
|
||||
|
||||
The project includes these Docker files:
|
||||
|
||||
- **`Dockerfile`** - Multi-stage build for production
|
||||
- **`docker-compose.yml`** - Local development/testing setup
|
||||
- **`.dockerignore`** - Excludes unnecessary files from build context
|
||||
|
||||
#### Customizing Docker Deployment
|
||||
|
||||
1. **Environment Variables**: Edit `docker-compose.yml` to customize:
|
||||
```yaml
|
||||
environment:
|
||||
DATABASE_URL: "ecto://postgres:postgres@db:5432/components_elixir_prod"
|
||||
SECRET_KEY_BASE: "your-secret-key-here" # Generate with: mix phx.gen.secret
|
||||
PHX_HOST: "localhost" # Change to your domain
|
||||
PHX_SERVER: "true"
|
||||
PORT: "4000"
|
||||
```
|
||||
|
||||
2. **Generate a secure secret key:**
|
||||
```bash
|
||||
# Run this locally to generate a new secret
|
||||
mix phx.gen.secret
|
||||
```
|
||||
|
||||
3. **Database Configuration**: The default setup includes:
|
||||
- PostgreSQL 15 container
|
||||
- Automatic database creation
|
||||
- Health checks to ensure proper startup order
|
||||
- Persistent data storage with Docker volumes
|
||||
|
||||
#### Production Docker Deployment
|
||||
|
||||
For production environments:
|
||||
|
||||
1. **Create a production docker-compose.yml:**
|
||||
```yaml
|
||||
services:
|
||||
db:
|
||||
image: postgres:15
|
||||
environment:
|
||||
POSTGRES_USER: components_user
|
||||
POSTGRES_PASSWORD: secure_db_password
|
||||
POSTGRES_DB: components_elixir_prod
|
||||
volumes:
|
||||
- postgres_data:/var/lib/postgresql/data
|
||||
restart: unless-stopped
|
||||
|
||||
app:
|
||||
build: .
|
||||
ports:
|
||||
- "80:4000"
|
||||
environment:
|
||||
DATABASE_URL: "ecto://components_user:secure_db_password@db:5432/components_elixir_prod"
|
||||
SECRET_KEY_BASE: "your-64-char-secret-key"
|
||||
PHX_HOST: "yourdomain.com"
|
||||
PHX_SERVER: "true"
|
||||
PORT: "4000"
|
||||
depends_on:
|
||||
db:
|
||||
condition: service_healthy
|
||||
restart: unless-stopped
|
||||
command: ["/bin/sh", "-c", "/app/bin/migrate && /app/bin/server"]
|
||||
|
||||
volumes:
|
||||
postgres_data:
|
||||
```
|
||||
|
||||
2. **Deploy to production:**
|
||||
```bash
|
||||
docker compose -f docker-compose.prod.yml up -d
|
||||
```
|
||||
|
||||
#### Docker Troubleshooting
|
||||
|
||||
**Build Issues:**
|
||||
- **Slow Tailwind download**: This is normal - GitHub releases can be slow
|
||||
- **Network timeouts**: Retry the build with `docker compose up --build`
|
||||
- **AprilTag compilation errors**: Ensure `apriltags.ps` file exists in project root
|
||||
|
||||
**Runtime Issues:**
|
||||
- **Database connection errors**: Wait for PostgreSQL health check to pass
|
||||
- **Permission errors**: Check file ownership and Docker user permissions
|
||||
- **Port conflicts**: Change the port mapping in docker-compose.yml
|
||||
|
||||
**Performance:**
|
||||
- **Slow startup**: First-time container startup includes database initialization
|
||||
- **Memory usage**: Elixir/Phoenix applications typically use 50-200MB RAM
|
||||
- **Storage**: PostgreSQL data persists in Docker volumes
|
||||
|
||||
### 🚀 Traditional Deployment
|
||||
|
||||
For production deployment without Docker:
|
||||
|
||||
1. **Set environment variables:**
|
||||
```bash
|
||||
|
||||
Reference in New Issue
Block a user