chore: Portainer-compatible docker-compose, improved .dockerignore
- Use image reference instead of build context for Portainer stacks - Inline all environment variables (no env_file dependency) - Add .next, logs, Inspiration to .dockerignore - Explicit .env.local and .env.production in .gitignore Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
02a8c2a0b4
commit
b46c7b7ccb
@ -1,12 +1,15 @@
|
|||||||
node_modules
|
node_modules
|
||||||
.npm
|
.npm
|
||||||
|
.next
|
||||||
.git
|
.git
|
||||||
.gitignore
|
.gitignore
|
||||||
Dockerfile
|
Dockerfile
|
||||||
docker-compose*.yml
|
docker-compose*.yml
|
||||||
.env
|
.env
|
||||||
.env.local
|
.env.*
|
||||||
.planning
|
.planning
|
||||||
prisma/dev.db
|
prisma/dev.db
|
||||||
*.md
|
*.md
|
||||||
!prisma/**/*.md
|
!prisma/**/*.md
|
||||||
|
logs
|
||||||
|
Inspiration
|
||||||
|
|||||||
43
deploy.sh
43
deploy.sh
@ -4,9 +4,13 @@ set -e
|
|||||||
# Deploy script for My Weekly To-Do List
|
# Deploy script for My Weekly To-Do List
|
||||||
# Usage: ./deploy.sh [version]
|
# Usage: ./deploy.sh [version]
|
||||||
# Example: ./deploy.sh 1.1.0
|
# Example: ./deploy.sh 1.1.0
|
||||||
|
#
|
||||||
|
# Builds the Docker image locally, then restarts the Portainer stack.
|
||||||
|
# The Portainer stack references "my-weekly-todo:latest".
|
||||||
|
|
||||||
APP_NAME="my-weekly-todo"
|
APP_NAME="my-weekly-todo"
|
||||||
COMPOSE_FILE="docker-compose.yml"
|
IMAGE_NAME="my-weekly-todo"
|
||||||
|
PORTAINER_STACK="my-weekly-todo"
|
||||||
|
|
||||||
# Colors
|
# Colors
|
||||||
GREEN='\033[0;32m'
|
GREEN='\033[0;32m'
|
||||||
@ -42,26 +46,19 @@ if [ -n "$VERSION" ]; then
|
|||||||
echo -e "${GREEN}Tagged v$VERSION${NC}"
|
echo -e "${GREEN}Tagged v$VERSION${NC}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Run database migrations
|
|
||||||
echo -e "${YELLOW}Running database migrations...${NC}"
|
|
||||||
docker compose -f "$COMPOSE_FILE" run --rm app npx prisma migrate deploy 2>/dev/null || true
|
|
||||||
|
|
||||||
# Build and deploy
|
|
||||||
echo -e "${YELLOW}Building production image...${NC}"
|
|
||||||
docker compose -f "$COMPOSE_FILE" build --no-cache
|
|
||||||
|
|
||||||
echo -e "${YELLOW}Starting services...${NC}"
|
|
||||||
docker compose -f "$COMPOSE_FILE" up -d
|
|
||||||
|
|
||||||
# Wait for health check
|
|
||||||
echo -e "${YELLOW}Waiting for health check...${NC}"
|
|
||||||
sleep 10
|
|
||||||
if docker compose -f "$COMPOSE_FILE" ps | grep -q "healthy"; then
|
|
||||||
echo -e "${GREEN}Deployment successful!${NC}"
|
|
||||||
else
|
|
||||||
echo -e "${YELLOW}Services started (health check may still be warming up)${NC}"
|
|
||||||
docker compose -f "$COMPOSE_FILE" ps
|
|
||||||
fi
|
|
||||||
|
|
||||||
CURRENT_VERSION=$(node -p "require('./package.json').version")
|
CURRENT_VERSION=$(node -p "require('./package.json').version")
|
||||||
echo -e "${GREEN}=== Deployed v$CURRENT_VERSION ===${NC}"
|
|
||||||
|
# Build Docker image
|
||||||
|
echo -e "${YELLOW}Building production image ${IMAGE_NAME}:${CURRENT_VERSION}...${NC}"
|
||||||
|
docker build -t "${IMAGE_NAME}:${CURRENT_VERSION}" -t "${IMAGE_NAME}:latest" .
|
||||||
|
|
||||||
|
# Restart the Portainer stack (pull new image)
|
||||||
|
echo -e "${YELLOW}Restarting Portainer stack...${NC}"
|
||||||
|
echo -e "${YELLOW}Go to Portainer > Stacks > ${PORTAINER_STACK} > click 'Update the stack' > 'Re-pull image and redeploy'${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e "Or restart via CLI:${NC}"
|
||||||
|
echo -e " docker compose -f docker-compose.yml up -d"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo -e "${GREEN}=== Image ${IMAGE_NAME}:${CURRENT_VERSION} ready ===${NC}"
|
||||||
|
echo -e "${GREEN}=== Also tagged as ${IMAGE_NAME}:latest ===${NC}"
|
||||||
|
|||||||
@ -2,20 +2,29 @@ version: '3.8'
|
|||||||
|
|
||||||
services:
|
services:
|
||||||
app:
|
app:
|
||||||
build: .
|
image: my-weekly-todo:latest
|
||||||
ports:
|
ports:
|
||||||
- "13000:3000"
|
- "13000:3000"
|
||||||
env_file:
|
|
||||||
- .env.production
|
|
||||||
environment:
|
environment:
|
||||||
- DATABASE_URL=postgresql://root:WKE7xeZohxdZit7eObjG@db:5432/My-Weekly-ToDo-List?schema=public
|
- DATABASE_URL=postgresql://root:WKE7xeZohxdZit7eObjG@db:5432/My-Weekly-ToDo-List?schema=public
|
||||||
- NEXTAUTH_SECRET=Ca7EoJzZSMJO2CkqwdWd
|
- NEXTAUTH_SECRET=Ca7EoJzZSMJO2CkqwdWd
|
||||||
- NEXTAUTH_URL=https://todo.martin-bierschenk.de
|
- NEXTAUTH_URL=https://todo.martin-bierschenk.de
|
||||||
- NEXT_PUBLIC_BASE_URL=https://todo.martin-bierschenk.de
|
- NEXT_PUBLIC_BASE_URL=https://todo.martin-bierschenk.de
|
||||||
|
- SMTP_HOST=w00ff033.kasserver.com
|
||||||
|
- SMTP_PORT=587
|
||||||
|
- SMTP_USERNAME=mail@carrylight.de
|
||||||
|
- SMTP_PASSWORD=QijU8e2A8p3FE8WS8esR
|
||||||
|
- SMTP_SECURE=true
|
||||||
|
- GOOGLE_CLIENT_ID=196368743757-1fn17q2ecg5n8rej4tu96khltno173he.apps.googleusercontent.com
|
||||||
|
- GOOGLE_CLIENT_SECRET=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
|
||||||
|
- GOOGLE_REDIRECT_URI=https://todo.martin-bierschenk.de/api/calendar/google/oauth
|
||||||
|
- MICROSOFT_CLIENT_ID=a6ea3972-2e4a-4a24-b50f-4047867d8de3
|
||||||
|
- MICROSOFT_CLIENT_SECRET=9649da1a-9057-4ac5-ad5a-73cf1cef9478
|
||||||
|
- MICROSOFT_REDIRECT_URI=https://todo.martin-bierschenk.de/api/calendar/outlook/callback
|
||||||
depends_on:
|
depends_on:
|
||||||
- db
|
- db
|
||||||
volumes:
|
volumes:
|
||||||
- ./logs:/app/logs
|
- app_logs:/app/logs
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|
||||||
db:
|
db:
|
||||||
@ -32,3 +41,4 @@ services:
|
|||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
postgres_data:
|
postgres_data:
|
||||||
|
app_logs:
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user