fix: seeder idempotent with firstOrCreate
Use firstOrCreate instead of create so db:seed can run safely on container restart without duplicate key violation.
This commit is contained in:
122
docs/03-DEPLOYMENT.md
Normal file
122
docs/03-DEPLOYMENT.md
Normal file
@@ -0,0 +1,122 @@
|
||||
# Deployment & Infrastructure
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- Docker ^19.*
|
||||
- Docker Compose
|
||||
- Make (optional, for Makefile commands)
|
||||
|
||||
## Environment Configuration
|
||||
|
||||
### Root `.env` (Docker-level)
|
||||
|
||||
Located at `/root/sides/tckdev/.env`:
|
||||
|
||||
```
|
||||
POSTGRES_DB="tckdev"
|
||||
POSTGRES_USER="tck"
|
||||
POSTGRES_PASSWORD="projectdev##1"
|
||||
PGADMIN_EMAIL="tck68000@gmail.com"
|
||||
PGADMIN_PASSWORD="projectdev##1"
|
||||
```
|
||||
|
||||
### Application `.env` (Laravel-level)
|
||||
|
||||
Located at `/root/sides/tckdev/src/.env`:
|
||||
|
||||
Key configuration:
|
||||
- `APP_URL=https://sides.tck.com.my`
|
||||
- `DB_CONNECTION=pgsql` → `DB_HOST=192.168.0.211` (direct IP, not Docker service name)
|
||||
- `SESSION_DRIVER=database`
|
||||
- `CACHE_STORE=database`
|
||||
- `QUEUE_CONNECTION=database`
|
||||
- `MAIL_MAILER=smtp` via Gmail SMTP (`sideskupang@gmail.com`)
|
||||
- Firebase FCM credentials at `storage/app/firebase/sides-b4abb-3604a7cf7584.json`
|
||||
|
||||
## Initial Setup
|
||||
|
||||
### From Scratch (New Project)
|
||||
|
||||
```bash
|
||||
make create-project
|
||||
```
|
||||
|
||||
This runs:
|
||||
1. Creates `src/` directory
|
||||
2. Builds Docker images
|
||||
3. Starts containers
|
||||
4. Runs `composer create-project laravel/laravel .`
|
||||
5. Generates application key
|
||||
6. Creates storage link
|
||||
7. Sets permissions
|
||||
8. Installs npm dependencies
|
||||
|
||||
### From Existing Code (Clone)
|
||||
|
||||
```bash
|
||||
make init
|
||||
```
|
||||
|
||||
This runs:
|
||||
1. Builds and starts containers
|
||||
2. `composer install`
|
||||
3. Copies `.env.example` to `.env`
|
||||
4. Generates application key
|
||||
5. Creates storage link
|
||||
6. Sets permissions
|
||||
7. `npm install`
|
||||
8. `php artisan migrate:fresh --seed`
|
||||
|
||||
## Makefile Commands Reference
|
||||
|
||||
| Command | Description |
|
||||
|---------|-------------|
|
||||
| `make up` | Start containers (detached) |
|
||||
| `make down` | Stop containers, remove orphans |
|
||||
| `make down-v` | Stop containers, remove volumes |
|
||||
| `make build` | Build Docker images |
|
||||
| `make remake` | Full destroy + reinit |
|
||||
| `make destroy` | Remove all containers, images, volumes |
|
||||
| `make stop` | Stop containers |
|
||||
| `make restart` | Down + up |
|
||||
| `make ps` | Show container status |
|
||||
| `make logs` | Show all container logs |
|
||||
| `make logs-watch` | Follow all logs |
|
||||
| `make log-app` | Show app container logs |
|
||||
| `make log-db` | Show database logs |
|
||||
| `make app` | Shell into app container |
|
||||
| `make web` | Shell into web container |
|
||||
| `make migrate` | Run migrations |
|
||||
| `make fresh` | Fresh migration with seed |
|
||||
| `make seed` | Run seeders |
|
||||
| `make tinker` | Open Laravel tinker |
|
||||
| `make test` | Run PHPUnit tests |
|
||||
| `make cache` | Optimize autoload + cache |
|
||||
| `make cache-clear` | Clear all caches |
|
||||
|
||||
## Access Points
|
||||
|
||||
| Service | URL |
|
||||
|---------|-----|
|
||||
| Application | http://localhost:80 |
|
||||
| pgAdmin | http://localhost:5050 |
|
||||
| Adminer | http://localhost:6060 |
|
||||
| PostgreSQL | localhost:5432 |
|
||||
|
||||
## Database Connection Discrepancy
|
||||
|
||||
**Important**: The `docker-compose.yml` defines a `postgres` service, but `src/.env` connects to `192.168.0.211` — an external PostgreSQL host, not the Docker container. This means:
|
||||
|
||||
- In **development/local**: The app may connect to an external database instead of the Docker postgres container
|
||||
- The Docker postgres service is still available at `postgres:5432` for inter-container communication
|
||||
- The Python autoscript also connects to `192.168.0.211` directly
|
||||
|
||||
To use the Docker PostgreSQL, change `DB_HOST=postgres` in `src/.env`.
|
||||
|
||||
## Production Notes
|
||||
|
||||
- `APP_DEBUG=true` is set in `.env` — should be `false` in production
|
||||
- `URL::forceScheme('https')` is enabled globally in `AppServiceProvider`
|
||||
- The app URL is `https://sides.tck.com.my`
|
||||
- Gmail SMTP is used for password reset emails
|
||||
- Firebase credentials JSON file is stored in `storage/app/firebase/`
|
||||
Reference in New Issue
Block a user