Files
soroush.asadi 96e73bf633
CI/CD / CI · dotnet build (push) Failing after 0s
CI/CD / Deploy · drsousan (push) Has been skipped
first commit
2026-05-31 00:42:08 +03:30

3.1 KiB

DrSousan — Deployment Guide

Mirrors (Nexus at 171.22.25.73)

Docker

Add to Docker Engine config (/etc/docker/daemon.json on Linux):

{
  "insecure-registries": ["171.22.25.73:8087", "171.22.25.73:8090"]
}

Restart Docker, then login:

docker login 171.22.25.73:8087 -u admin

NuGet (for local builds)

Add nexus source to NuGet.Config:

<add key="nexus" value="http://171.22.25.73:8081/repository/nuget-group/index.json" />

Update the Dockerfile to use Nexus mirrors

Replace the two FROM lines in DrSousan.Api/Dockerfile:

FROM 171.22.25.73:8090/dotnet/sdk:10.0 AS build
...
FROM 171.22.25.73:8090/dotnet/aspnet:10.0 AS runtime

First Deploy (server setup)

# 1. Copy project to server
scp -r . user@server:/opt/drsousan

# 2. SSH in
ssh user@server
cd /opt/drsousan

# 3. Create .env file
cp .env.example .env
nano .env          # fill in JWT_KEY, ADMIN_USERNAME, ADMIN_PASSWORD, HOST_PORT

# 4. Build and start
docker compose up -d --build

Check it's running:

docker compose ps
curl http://localhost:5000/healthz

Redeploy (update)

cd /opt/drsousan
git pull
docker compose up -d --build

That's it. SQLite data and uploads are on named volumes — they survive rebuilds.


.env file

HOST_PORT=5000
JWT_KEY=YourSecretKeyHere32CharsMinimum!!
JWT_ISSUER=DrSousanApi
JWT_AUDIENCE=DrSousanAdmin
ADMIN_USERNAME=admin
ADMIN_PASSWORD=YourStrongPassword

CI/CD (GitHub Actions)

Create .github/workflows/deploy.yml:

name: Deploy

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Build & push image
        run: |
          echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login 171.22.25.73:8087 -u admin --password-stdin
          docker build \
            --build-arg REGISTRY=171.22.25.73:8090 \
            -t 171.22.25.73:8087/drsousan/api:latest \
            ./DrSousan.Api
          docker push 171.22.25.73:8087/drsousan/api:latest

      - name: Deploy to server
        uses: appleboy/ssh-action@v1
        with:
          host: ${{ secrets.SERVER_HOST }}
          username: ${{ secrets.SERVER_USER }}
          key: ${{ secrets.SERVER_SSH_KEY }}
          script: |
            cd /opt/drsousan
            docker pull 171.22.25.73:8087/drsousan/api:latest
            docker compose up -d

GitHub Secrets to set:

Secret Value
REGISTRY_PASSWORD Nexus admin password
SERVER_HOST Server IP
SERVER_USER SSH user
SERVER_SSH_KEY Private SSH key

For the CI image pull to use Nexus, update docker-compose.yml to reference the pre-built image:

api:
  image: 171.22.25.73:8087/drsousan/api:latest
  # remove build: section when using CI

Useful commands

docker compose logs -f api       # live logs
docker compose restart api       # restart without rebuild
docker compose down              # stop (volumes preserved)
docker compose down -v           # stop + DELETE all data
docker exec -it drsousan_api sh  # shell into container