From dc2046cc1ab104856ee530aae0d8f943e11e97e1 Mon Sep 17 00:00:00 2001 From: k1nq Date: Sat, 29 Nov 2025 12:19:44 +0500 Subject: [PATCH] feat: add CI/CD workflow for building and deploying application with Docker --- .gitea/workflows/build.yml | 46 +++++++++++++++++++ docker-compose.yml => docker-compose-ci.yml | 0 docker-compose-dev.yml | 51 +++++++++++++++++++++ 3 files changed, 97 insertions(+) create mode 100644 .gitea/workflows/build.yml rename docker-compose.yml => docker-compose-ci.yml (100%) create mode 100644 docker-compose-dev.yml diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml new file mode 100644 index 0000000..e1f7440 --- /dev/null +++ b/.gitea/workflows/build.yml @@ -0,0 +1,46 @@ +name: Build and deploy + +on: + push: + branches: "**" + workflow-dispatch: + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Build and push app + run: | + docker build -t ${{ secrets.GIT_HOST }}/${{ gitea.repository }}:app -f app/Dockerfile ./app + docker push $ {{ secrets.GIT_HOST }}/${{ gitea.repository }}:app + + deploy: + runs-on: ubuntu-latest + needs: build + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Instasll SSH key + uses: webfactory/ssh-agent@v.0.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: 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 + cd /srv/app + docker compose up -d --force-recreate + docker image prune -f + EOF \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose-ci.yml similarity index 100% rename from docker-compose.yml rename to docker-compose-ci.yml diff --git a/docker-compose-dev.yml b/docker-compose-dev.yml new file mode 100644 index 0000000..1ecc8a2 --- /dev/null +++ b/docker-compose-dev.yml @@ -0,0 +1,51 @@ +services: + app: + build: + context: . + dockerfile: app/Dockerfile + command: uvicorn app.main:app --host 0.0.0.0 --port 8000 + env_file: + - .env + environment: + PROJECT_NAME: ${PROJECT_NAME} + VERSION: ${VERSION} + API_V1_PREFIX: ${API_V1_PREFIX} + DB_HOST: ${DB_HOST:-postgres} + DB_PORT: ${DB_PORT} + DB_NAME: ${DB_NAME} + DB_USER: ${DB_USER} + DB_PASSWORD: ${DB_PASSWORD} + SQLALCHEMY_ECHO: ${SQLALCHEMY_ECHO} + JWT_SECRET_KEY: ${JWT_SECRET_KEY} + JWT_ALGORITHM: ${JWT_ALGORITHM} + ACCESS_TOKEN_EXPIRE_MINUTES: ${ACCESS_TOKEN_EXPIRE_MINUTES} + REFRESH_TOKEN_EXPIRE_DAYS: ${REFRESH_TOKEN_EXPIRE_DAYS} + REDIS_ENABLED: ${REDIS_ENABLED} + REDIS_URL: ${REDIS_URL:-redis://redis:6379/0} + ANALYTICS_CACHE_TTL_SECONDS: ${ANALYTICS_CACHE_TTL_SECONDS} + ANALYTICS_CACHE_BACKOFF_MS: ${ANALYTICS_CACHE_BACKOFF_MS} + ports: + - "8000:8000" + depends_on: + - postgres + - redis + + postgres: + image: postgres:16-alpine + environment: + POSTGRES_DB: ${DB_NAME} + POSTGRES_USER: ${DB_USER} + POSTGRES_PASSWORD: ${DB_PASSWORD} + volumes: + - postgres_data:/var/lib/postgresql/data + ports: + - "5432:5432" + + redis: + image: redis:7-alpine + command: redis-server --save "" --appendonly no + ports: + - "6379:6379" + +volumes: + postgres_data: