diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..06aa958 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,10 @@ +node_modules +build +tmp +.cache +.dockerignore +.git +.gitignore +.env +npm-debug.log +yarn-error.log diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..3c51caf --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,47 @@ +name: Deploy Strapi + +on: + push: + branches: + - main + +jobs: + deploy: + environment: production + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Setup SSH key + run: | + mkdir -p ~/.ssh + echo "${{ secrets.VPS_SSH_KEY }}" > ~/.ssh/id_rsa + chmod 600 ~/.ssh/id_rsa + ssh-keyscan -H ${{ secrets.VPS_HOST }} >> ~/.ssh/known_hosts + + - name: Sync project to VPS + run: | + rsync -avz --delete . ${{ secrets.VPS_USER }}@${{ secrets.VPS_HOST }}:/home/${{ secrets.VPS_USER }}/strapi-app + + - name: Deploy on VPS + run: | + ssh ${{ secrets.VPS_USER }}@${{ secrets.VPS_HOST }} " + cd /home/${{ secrets.VPS_USER }}/strapi-app && \ + docker network create app || true && \ + export APP_KEYS='${{ secrets.APP_KEYS }}' && \ + export API_TOKEN_SALT='${{ secrets.API_TOKEN_SALT }}' && \ + export ADMIN_JWT_SECRET='${{ secrets.ADMIN_JWT_SECRET }}' && \ + export TRANSFER_TOKEN_SALT='${{ secrets.TRANSFER_TOKEN_SALT }}' && \ + export JWT_SECRET='${{ secrets.JWT_SECRET }}' && \ + export DATABASE_CLIENT=postgres && \ + export DATABASE_HOST='${{ secrets.POSTGRES_HOST }}' && \ + export DATABASE_PORT=5432 && \ + export DATABASE_NAME='${{ secrets.POSTGRES_DB }}' && \ + export DATABASE_USERNAME='${{ secrets.POSTGRES_USER }}' && \ + export DATABASE_PASSWORD='${{ secrets.POSTGRES_PASSWORD }}' && \ + export DATABASE_SSL=false && \ + docker-compose down && \ + docker-compose up -d --build + " diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..6b3fdf6 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,41 @@ +# ------------------- +# 1. Build stage +# ------------------- +FROM node:18-alpine AS builder + +# Устанавливаем pnpm глобально +RUN npm install -g pnpm + +WORKDIR /app + +# Копируем манифесты и устанавливаем зависимости +COPY pnpm-lock.yaml ./ +COPY package.json ./ +RUN pnpm install --frozen-lockfile + +# Копируем исходники и билдим Strapi admin +COPY . . +RUN pnpm build + +# ------------------------ +# 2. Runtime stage +# ------------------------ +FROM node:18-alpine + +# Устанавливаем pnpm +RUN npm install -g pnpm + +WORKDIR /app + +# Копируем только lockfile и package.json +COPY pnpm-lock.yaml ./ +COPY package.json ./ +RUN pnpm install --frozen-lockfile --prod + +# Копируем билд и исходники из builder +COPY --from=builder /app . + +# Открываем порт и запускаем +EXPOSE 1337 + +CMD ["pnpm", "start"] diff --git a/config/database.ts b/config/database.ts index 1853ca4..d46da46 100644 --- a/config/database.ts +++ b/config/database.ts @@ -1,7 +1,7 @@ import path from 'path'; export default ({ env }) => { - const client = env('DATABASE_CLIENT', 'sqlite'); + const client = env('DATABASE_CLIENT', 'postgres'); const connections = { mysql: { diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..4fb1441 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,29 @@ +services: + strapi: + build: . + ports: + - "1337:1337" + environment: + # HOST: ${HOST} + # PORT: ${PORT} + APP_KEYS: ${APP_KEYS} + API_TOKEN_SALT: ${API_TOKEN_SALT} + ADMIN_JWT_SECRET: ${ADMIN_JWT_SECRET} + TRANSFER_TOKEN_SALT: ${TRANSFER_TOKEN_SALT} + # DATABASE_CLIENT: ${DATABASE_CLIENT} + DATABASE_HOST: ${DATABASE_HOST} + DATABASE_PORT: ${DATABASE_PORT} + DATABASE_NAME: ${DATABASE_NAME} + DATABASE_USERNAME: ${DATABASE_USERNAME} + DATABASE_PASSWORD: ${DATABASE_PASSWORD} + # DATABASE_SSL: ${DATABASE_SSL} + # DATABASE_FILENAME: ${DATABASE_FILENAME} + JWT_SECRET: ${JWT_SECRET} + networks: + - app + + +networks: + app: + external: true +