← Назад к вопросам

Как локально разработанное приложение открыть в тестовом окружении

1.0 Junior🔥 91 комментариев
#Docker, Kubernetes и DevOps

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Ответ

Перенос локально разработанного приложения в тестовое окружение — критически важный процесс. Рассмотрю основные подходы.

1. Docker контейнеризация (Рекомендуется)

Создайте Dockerfile:

FROM openjdk:17-jdk-slim
WORKDIR /app
COPY target/myapp-1.0.0.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

Сборка и запуск:

mvn clean package
docker build -t myapp:1.0.0 .
docker run -p 8080:8080 -e SPRING_PROFILES_ACTIVE=test myapp:1.0.0

2. Docker Compose для полного стека

Создайте docker-compose.yml для всех зависимостей:

version: '3.9'
services:
  app:
    build: .
    ports:
      - "8080:8080"
    environment:
      SPRING_PROFILES_ACTIVE: test
      SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/testdb
      SPRING_DATASOURCE_USERNAME: testuser
      SPRING_DATASOURCE_PASSWORD: testpass
    depends_on:
      - postgres
    networks:
      - app-network
  postgres:
    image: postgres:16
    environment:
      POSTGRES_DB: testdb
      POSTGRES_USER: testuser
      POSTGRES_PASSWORD: testpass
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data
    networks:
      - app-network
volumes:
  postgres_data:
networks:
  app-network:
    driver: bridge

Запуск:

docker-compose up -d
docker-compose ps
docker-compose logs -f app

3. Push в Docker Registry

Для командной разработки:

docker login
docker tag myapp:1.0.0 yourusername/myapp:1.0.0
docker push yourusername/myapp:1.0.0

# На тестовом сервере
docker pull yourusername/myapp:1.0.0
docker run -p 8080:8080 yourusername/myapp:1.0.0

4. SSH развёртывание на тестовый сервер

Скрипт deploy.sh:

#!/bin/bash
REMOTE_HOST="test-server.example.com"
REMOTE_USER="deploy"
APP_DIR="/opt/myapp"

mvn clean package
ssh $REMOTE_USER@$REMOTE_HOST "mkdir -p $APP_DIR"
scp target/myapp-1.0.0.jar $REMOTE_USER@$REMOTE_HOST:$APP_DIR/
ssh $REMOTE_USER@$REMOTE_HOST "\
    cd $APP_DIR && \
    pkill -f java || true && \
    sleep 2 && \
    nohup java -Dspring.profiles.active=test -jar myapp-1.0.0.jar > app.log 2>&1 &"
echo "Deploy completed!"

Запуск:

chmod +x deploy.sh
./deploy.sh

5. Kubernetes (Для масштабирования)

Файл k8s-deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-test
  namespace: test
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: yourusername/myapp:1.0.0
        ports:
        - containerPort: 8080
        env:
        - name: SPRING_PROFILES_ACTIVE
          value: "test"
        resources:
          requests:
            memory: "512Mi"
            cpu: "500m"
          limits:
            memory: "1Gi"
            cpu: "1000m"
        livenessProbe:
          httpGet:
            path: /actuator/health
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10

Развёртывание:

kubectl apply -f k8s-deployment.yaml
kubectl get pods -n test
kubectl logs -f deployment/myapp-test -n test

6. CI/CD Pipeline (Jenkins)

Jenkinsfile для автоматизации:

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                sh 'mvn clean package'
            }
        }
        stage('Build Docker Image') {
            steps {
                sh 'docker build -t myapp:${BUILD_NUMBER} .'
            }
        }
        stage('Deploy to Test') {
            steps {
                sh 'docker push myapp:${BUILD_NUMBER}'
                sh '''
                    ssh deploy@test-server \
                    "docker pull myapp:${BUILD_NUMBER} && \
                    docker stop myapp || true && \
                    docker run -d --name myapp -p 8080:8080 myapp:${BUILD_NUMBER}"
                '''
            }
        }
        stage('Health Check') {
            steps {
                sh 'curl -f http://test-server:8080/actuator/health'
            }
        }
    }
}

7. Основные переменные окружения

Для тестовой среды обычно нужны:

SPRING_PROFILES_ACTIVE=test
SPRING_DATASOURCE_URL=jdbc:postgresql://postgres:5432/testdb
SPRING_DATASOURCE_USERNAME=testuser
SPRING_DATASOURCE_PASSWORD=testpass
SPRING_JPA_HIBERNATE_DDL_AUTO=validate
LOGGING_LEVEL_ROOT=INFO
APPLICATION_NAME=myapp-test

8. Проверка готовности

Перед развёртыванием проверьте:

# Локально
mvn clean package
mvn test

# Docker образ
docker build -t myapp:test .
docker run -p 8080:8080 myapp:test
curl http://localhost:8080/actuator/health

# На сервере
ssh test-server "curl http://localhost:8080/actuator/health"

9. Логирование и мониторинг

Основные логи и метрики:

# Просмотр логов контейнера
docker logs -f container_id

# Просмотр логов на сервере
ssh test-server "tail -f /opt/myapp/app.log"

# Проверка здоровья приложения
curl -s http://test-server:8080/actuator/health | jq .

# Информация о приложении
curl -s http://test-server:8080/actuator/info | jq .

Рекомендуемый процесс

  1. Локально: mvn clean package + docker build + docker run
  2. Первая раз: Docker Compose для всего стека
  3. Командная работа: Docker Registry + SSH скрипт
  4. Production: Kubernetes + CI/CD

Чеклист развёртывания

  • Приложение собирается без ошибок
  • Все тесты проходят
  • Docker образ создаётся и запускается локально
  • Переменные окружения правильно установлены
  • База данных инициализирована
  • Health check endpoint доступен
  • Логи содержат информацию о запуске
  • Приложение доступно с удалённого клиента

Мой выбор — Docker Compose как универсальное решение: просто, надёжно, лёгко репликировать на других машинах и окружениях.

Как локально разработанное приложение открыть в тестовом окружении | PrepBro