diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..5c16d8e --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,66 @@ +name: Deploy +on: + workflow_dispatch: + push: + branches: + - main + paths: + - 'src/**' +jobs: + build: + name: Build Docker Image + runs-on: ubuntu-latest + outputs: + version: ${{ steps.version.outputs.version }} + steps: + - name: Checkout repository + uses: actions/checkout@v4 + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_PASSWORD }} + - name: Create version tag + id: version + run: echo "version=$(date +%Y.%m.%d.%H%M%S)" >> $GITHUB_OUTPUT + - name: Build Docker image + run: | + TAG=${{ secrets.DOCKERHUB_USERNAME }}/steves-bot:${{ steps.version.outputs.version }} + docker build -t $TAG . + docker push $TAG + deploy: + name: Deploy Docker Image + runs-on: ubuntu-latest + needs: build + steps: + - name: Run image on server + uses: appleboy/ssh-action@v1 + with: + host: ${{ secrets.SSH_HOST }} + username: ${{ secrets.SSH_USERNAME }} + key: ${{ secrets.SSH_KEY }} + script: | + cd steves-bot + + echo 'Logging__LogLevel__Default=Debug>> .env + echo 'Logging__LogLevel__Microsoft=Debug' >> .env + echo 'Logging__LogLevel__Microsoft.Hosting.Lifetime=Debug' >> .env + echo 'DiscordClientOptions__ApiUrl=${{ vars.DISCORD_API_URL }}' >> .env + echo 'DiscordClientOptions__AppToken=${{ secrets.DISCORD_APP_TOKEN }}' >> .env + echo 'DiscordClientOptions__Intents=${{ vars.DISCORD_INTENTS }}' >> .env + echo 'SeqOptions__ServerUrl=${{ secrets.SEQ_SERVER_URL }}' >> .env + echo 'SeqOptions__ApiKeyHeader=${{ vars.SEQ_API_KEY_HEADER }}' >> .env + echo 'SeqOptions__ApiKey=${{ secrets.SEQ_API_KEY }}' >> .env + echo 'DOTNET_ENVIRONMENT=Production' >> .env + + docker stop steves-bot + docker rm steves-bot + docker pull ${{ secrets.DOCKERHUB_USERNAME }}/steves-bot:${{ needs.build.outputs.version }} + docker run \ + --name steves-bot \ + --restart always \ + --env-file .env \ + -d \ + ${{ secrets.DOCKERHUB_USERNAME }}/steves-bot:${{ needs.build.outputs.version }} + + rm .env \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 14ab469..ab8fcff 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,6 +2,7 @@ "editor.formatOnSave": true, "dotnet.defaultSolution": "./src/StevesBot.sln", "cSpell.words": [ + "DOCKERHUB", "Reconnectable", "Steves", "stevesbot", diff --git a/src/StevesBot.Worker/.dockerignore b/src/StevesBot.Worker/.dockerignore new file mode 100644 index 0000000..512cd18 --- /dev/null +++ b/src/StevesBot.Worker/.dockerignore @@ -0,0 +1,13 @@ +**/.dockerignore +**/.env +**/.project +**/.settings +**/.vs +**/.vscode +**/*.*proj.user +**/logs +**/bin +**/Dockerfile* +**/obj +.env* +**/appsettings*.json \ No newline at end of file diff --git a/src/StevesBot.Worker/Dockerfile b/src/StevesBot.Worker/Dockerfile new file mode 100644 index 0000000..1f99d8a --- /dev/null +++ b/src/StevesBot.Worker/Dockerfile @@ -0,0 +1,13 @@ +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS base +WORKDIR /app +COPY *.csproj ./ +RUN dotnet restore +COPY . . + +FROM base AS publish-stage +RUN dotnet publish -c Release -o dist + +FROM mcr.microsoft.com/dotnet/runtime:9.0 +WORKDIR /app +COPY --from=publish-stage /app/dist ./ +ENTRYPOINT ["dotnet", "StevesBot.Worker.dll"] \ No newline at end of file