diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml new file mode 100644 index 0000000..f0ac9e3 --- /dev/null +++ b/.gitea/workflows/deploy.yml @@ -0,0 +1,57 @@ +name: Deploy App + +on: + push: + branches: + - master + +jobs: + build-and-deploy: + runs-on: docker + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Log in to Gitea Registry + run: | + echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login git.oskarmikael.com -u ${{ secrets.REGISTRY_USER }} --password-stdin + + - name: Build and Push Docker image + run: | + IMAGE=git.oskarmikael.com/oskarb/scheduler:latest + docker buildx build \ + -f Dockerfile \ + --platform linux/amd64 \ + -t $IMAGE \ + --push . + + - name: Run migrations + run: | + docker-compose -f docker-compose.prod.yml run --rm app php artisan migrate --force + + - name: Install Composer Dependencies + run: | + docker-compose -f docker-compose.prod.yml run --rm composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist + + - name: Install Node Dependencies + run: | + docker-compose -f docker-compose.prod.yml run --rm app npm install + + - name: Build assets + run: | + docker-compose -f docker-compose.prod.yml run --rm app npm run build + + - name: Deploy to LXC + uses: appleboy/ssh-action@v0.1.9 + with: + host: ${{ secrets.PROD_HOST }} + username: ${{ secrets.PROD_USER }} + key: ${{ secrets.PROD_SSH_KEY }} + port: 22 + script: | + cd /var/www/scheduler + docker-compose -f docker-compose.prod.yml pull + docker-compose -f docker-compose.prod.yml up -d diff --git a/Dockerfile.prod b/Dockerfile.prod new file mode 100644 index 0000000..3394bae --- /dev/null +++ b/Dockerfile.prod @@ -0,0 +1,37 @@ +FROM php:8.4-fpm + +# Set working dir +WORKDIR /var/www/html + +# Install system deps +RUN apt-get update && apt-get install -y \ + git curl libpng-dev libonig-dev libxml2-dev zip unzip \ + && docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd + +# Install Composer +COPY --from=composer:2 /usr/bin/composer /usr/bin/composer + +# Copy app code +COPY . . + +# Install PHP deps (no dev) +RUN composer install --no-dev --optimize-autoloader --no-interaction + +# Node build (optional if you need assets) +FROM node:20 AS frontend +WORKDIR /app +COPY package*.json ./ +RUN npm ci +COPY . . +RUN npm run build + +# Copy built assets into PHP image +FROM php:8.4-fpm +WORKDIR /var/www/html +COPY --from=0 /var/www/html . +COPY --from=frontend /app/public ./public + +# Fix permissions for Laravel +RUN chown -R www-data:www-data storage bootstrap/cache + +CMD ["php-fpm"] diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml new file mode 100644 index 0000000..4e89c43 --- /dev/null +++ b/docker-compose.prod.yml @@ -0,0 +1,28 @@ +version: '3.9' +services: + app: + image: git.oskarmikael.com/oskarb/scheduler:latest + env_file: + - .env + volumes: + - storage:/var/www/html/storage + - bootstrap_cache:/var/www/html/bootstrap/cache + + nginx: + image: nginx:1.27 + volumes: + - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro + ports: + - '${APP_PORT:-80}:80' + depends_on: + - app + networks: + - laravel + +networks: + laravel: + driver: bridge + +volumes: + storage: + bootstrap_cache: