Added docker/podman compose

main
TZGyn 3 years ago
parent 27e25e2ba2
commit ad42e88ae4
Signed by: TZGyn
GPG Key ID: 122EAF77AE81FD4A

@ -0,0 +1,37 @@
version: 3.4
services:
web:
container_name: twitter_clone_laravel
build:
context: ./docker
dockerfile: Dockerfile
depends_on:
- twitter_clone_mysql
volumes:
- .:/var/www/html:Z
ports:
- 8080:8080
networks:
- sail
depends_on:
- mysql
mysql:
container_name: twitter_clone_mysql
image: mysql
restart: always
environment:
MYSQL_DATABASE: twitter
MYSQL_ALLOW_EMPTY_PASSWORD: 1
ports:
- 3306:3306
volumes:
- dbdata:/var/lib/mysql
- ./docker/mysqld.conf:/etc/mysql/my.cnf
networks:
- sail
networks:
sail:
driver: bridge
volumes:
dbdata:
driver: local

@ -0,0 +1,27 @@
FROM ubuntu:22.04
WORKDIR /var/www/html
ENV DEBIAN_FRONTEND noninteractive
ENV TZ=UTC
RUN apt-get update \
&& apt-get install -y gnupg curl ca-certificates zip unzip git libcap2-bin libpng-dev python2 dnsutils librsvg2-bin \
&& curl -sS 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x14aa40ec0831756756d7f66c4f4ea0aae5267a6c' | gpg --dearmor | tee /etc/apt/keyrings/ppa_ondrej_php.gpg > /dev/null \
&& echo "deb [signed-by=/etc/apt/keyrings/ppa_ondrej_php.gpg] https://ppa.launchpadcontent.net/ondrej/php/ubuntu jammy main" > /etc/apt/sources.list.d/ppa_ondrej_php.list \
&& apt-get update \
&& apt-get install -y php8.2-cli php8.2-dev \
php8.2-gd php8.2-imagick \
php8.2-curl \
php8.2-imap php8.2-mysql php8.2-mbstring \
php8.2-xml php8.2-zip php8.2-bcmath php8.2-soap \
php8.2-intl php8.2-readline \
php8.2-ldap \
php8.2-msgpack php8.2-igbinary php8.2-redis php8.2-swoole \
php8.2-memcached php8.2-pcov php8.2-xdebug \
&& curl -sLS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer
EXPOSE 8080
CMD ["php", "artisan", "serve", "--host=0.0.0.0", "--port=8080"]

@ -0,0 +1,12 @@
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
# Where the database files are stored inside the container
datadir = /var/lib/mysql
# My application special configuration
max_allowed_packet = 32M
sql-mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION'
# Accept connections from any IP address
bind-address = 0.0.0.0

@ -1,8 +1,8 @@
import axios from 'axios' import axios from 'axios'
const request = axios.create({ const request = axios.create({
baseURL: 'http://localhost:8000', baseURL: 'http://localhost:8080',
withCredentials: true, withCredentials: true,
}) })
export { request } export { request }

@ -1,6 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
definePageMeta({ definePageMeta({
middleware: ['auth'], middleware: ['auth'],
}) })
import { z } from 'zod' import { z } from 'zod'
@ -10,45 +10,40 @@ const posts = ref<Posts>([])
const lastPost = ref<Number>(0) const lastPost = ref<Number>(0)
const responseValidator = z.object({ const responseValidator = z.object({
status: z.number(), status: z.number(),
data: z.unknown().array(), data: z.unknown().array(),
}) })
const getPosts = async () => { const getPosts = async () => {
const data = await request.get('http://localhost:8000/api/posts', { const data = await request.get('/api/posts', {
params: { lastPost: lastPost.value }, params: { lastPost: lastPost.value },
}) })
console.log(data) console.log(data)
const response = responseValidator.safeParse(data.data) const response = responseValidator.safeParse(data.data)
// console.log(parsePosts(response.data))
if (!response.success) return if (!response.success) return
posts.value = [...posts.value, ...parsePosts(response.data.data)] posts.value = [...posts.value, ...parsePosts(response.data.data)]
lastPost.value = posts.value[posts.value.length - 1].sequence lastPost.value = posts.value[posts.value.length - 1].sequence
} }
onMounted(() => { onMounted(() => {
getPosts() getPosts()
}) })
</script> </script>
<template> <template>
<div> <div>
<!-- {{ posts }} --> <!-- {{ posts }} -->
<div class="flex w-full items-center justify-center"> <div class="flex w-full items-center justify-center">
<div class="flex w-1/2 flex-col gap-4 px-4 pb-10 pt-2 2xl:w-1/3"> <div class="flex w-1/2 flex-col gap-4 px-4 pb-10 pt-2 2xl:w-1/3">
<div <div v-if="posts" v-for="post in posts">
v-if="posts" <PostCard :title="post.title" :description="post.description" />
v-for="post in posts"> </div>
<PostCard <button @click="getPosts()">More {{ lastPost }}</button>
:title="post.title" </div>
:description="post.description" /> </div>
</div> </div>
<button @click="getPosts()">More {{ lastPost }}</button>
</div>
</div>
</div>
</template> </template>

Loading…
Cancel
Save