diff --git a/docker-compose.ci.yml b/docker-compose.ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..e15e9ac8a9929bdb6671db356728830bdc0d804a
--- /dev/null
+++ b/docker-compose.ci.yml
@@ -0,0 +1,7 @@
+version: "3"
+services:
+  web:
+    build: ./solar
+    image: ${REGISTRY}/cn-tsn/project/solar/web:latest
+    volumes:
+      - ./solar:/code
\ No newline at end of file
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000000000000000000000000000000000000..9a7c0f1d8772e7a313a2663e3c77a12ae740f5d0
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,44 @@
+version: '3'
+
+services:
+  solar:
+    container_name: solar
+    build: ./solar
+    restart: always
+    command: sh -c "pipenv run python manage.py collectstatic --noinput && pipenv run uwsgi --socket=:9000 --module=solar.wsgi:application --py-autoreload=1"
+    volumes:
+      - ./solar:/code
+    networks:
+      - webnet
+
+  nginx:
+    container_name: nginx
+    image: nginx:latest
+    restart: always
+    depends_on:
+      - solar
+      - certbot
+    volumes:
+      - ./nginx/production/:/etc/nginx/conf.d
+      - ./solar/django_static/:/code/django_static
+      - ./solar/media/:/code/media
+      - ./fairing/build:/var/www/fairing
+      - ./nginx/certbot/conf:/etc/letsencrypt
+      - ./nginx/certbot/www:/var/www/certbot
+    networks:
+      - webnet
+    ports:
+      - "80:80"
+      - "443:443"
+    command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"
+
+  certbot:
+    image: certbot/certbot:latest
+    restart: unless-stopped
+    volumes:
+      - ./nginx/certbot/conf:/etc/letsencrypt
+      - ./nginx/certbot/www:/var/www/certbot
+    entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"
+
+networks:
+  webnet: