name: Build and deploy on: push: branches: - master workflow_dispatch: jobs: build: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Node.js 24 via nvm run: | curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" nvm install 24 nvm use 24 node -v npm -v echo "PATH=$PATH" >> $GITHUB_ENV - name: Login to registry run: echo "${{ secrets.TOKEN }}" | docker login ${{ secrets.GIT_HOST }} -u ${{ secrets.USERNAME }} --password-stdin - name: Build frontend bundle working-directory: frontend env: CI: "true" run: | npm ci npm run build - name: Archive frontend dist run: | tar -czf frontend-dist.tar.gz -C frontend/dist . - name: Upload frontend artifact uses: actions/upload-artifact@v3 with: name: frontend-dist path: frontend-dist.tar.gz retention-days: 7 - name: Build and push app run: | docker build -t ${{ secrets.GIT_HOST }}/${{ gitea.repository }}:app -f app/Dockerfile . docker push ${{ secrets.GIT_HOST }}/${{ gitea.repository }}:app - name: Build and push migrations image run: | docker build -t ${{ secrets.GIT_HOST }}/${{ gitea.repository }}:migrations -f migrations/Dockerfile . docker push ${{ secrets.GIT_HOST }}/${{ gitea.repository }}:migrations deploy: runs-on: ubuntu-latest needs: build steps: - name: Checkout uses: actions/checkout@v4 - name: Install SSH key uses: webfactory/ssh-agent@v0.9.0 with: ssh-private-key: ${{ secrets.DEPLOY_SSH_KEY }} - name: Add host to known_hosts run: ssh-keyscan -H ${{ secrets.LXC_HOST }} >> ~/.ssh/known_hosts - name: Create remote deployment directory run: ssh ${{ secrets.LXC_USER }}@${{ secrets.LXC_HOST }} "mkdir -p /srv/app" - name: Download frontend artifact uses: actions/download-artifact@v3 with: name: frontend-dist path: artifacts - name: Upload frontend dist to server run: | mkdir -p artifacts/extracted tar -xzf artifacts/frontend-dist.tar.gz -C artifacts/extracted ssh ${{ secrets.LXC_USER }}@${{ secrets.LXC_HOST }} "mkdir -p /srv/app/frontend/dist && rm -rf /srv/app/frontend/dist/*" scp -r artifacts/extracted/* ${{ secrets.LXC_USER }}@${{ secrets.LXC_HOST }}:/srv/app/frontend/dist/ - name: Deploy docker-compose-ci.yml run: scp docker-compose-ci.yml ${{ secrets.LXC_USER }}@${{ secrets.LXC_HOST }}:/srv/app/docker-compose.yml - name: Restart services run: | ssh ${{ secrets.LXC_USER }}@${{ secrets.LXC_HOST }} << 'EOF' echo "${{ secrets.TOKEN }}" | docker login ${{ secrets.GIT_HOST }} -u ${{ secrets.USERNAME }} --password-stdin docker pull ${{ secrets.GIT_HOST }}/${{ gitea.repository }}:app docker pull ${{ secrets.GIT_HOST }}/${{ gitea.repository }}:migrations cd /srv/app docker compose up -d --force-recreate docker image prune -f EOF