Merge pull request 'Dockerize app' (#8) from feature/6-create-dockerfiles into main
Reviewed-on: https://codeberg.org/Feddev/lemmy-article-poster/pulls/8
This commit is contained in:
commit
9ac8e7d5ed
3 changed files with 194 additions and 0 deletions
53
Dockerfile
Normal file
53
Dockerfile
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
# Multi-stage build for Laravel with React frontend
|
||||
FROM node:22-alpine AS frontend-builder
|
||||
|
||||
WORKDIR /app
|
||||
COPY package*.json ./
|
||||
RUN npm install --only=production
|
||||
COPY . .
|
||||
RUN npm run build
|
||||
|
||||
FROM php:8.4-fpm-alpine
|
||||
|
||||
# Install system dependencies and PHP extensions
|
||||
RUN apk add --no-cache \
|
||||
git \
|
||||
curl \
|
||||
libpng-dev \
|
||||
oniguruma-dev \
|
||||
libxml2-dev \
|
||||
zip \
|
||||
unzip \
|
||||
&& docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
|
||||
|
||||
# Install Composer
|
||||
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
|
||||
|
||||
# Set working directory
|
||||
WORKDIR /var/www/html
|
||||
|
||||
# Copy composer files
|
||||
COPY composer*.json ./
|
||||
|
||||
# Copy application files (needed for artisan in composer scripts)
|
||||
COPY . .
|
||||
|
||||
# Install dependencies
|
||||
RUN composer install --no-dev --optimize-autoloader --no-interaction
|
||||
|
||||
# Copy built frontend assets
|
||||
COPY --from=frontend-builder /app/public/build /var/www/html/public/build
|
||||
|
||||
# Set permissions
|
||||
RUN chown -R www-data:www-data /var/www/html \
|
||||
&& chmod -R 755 /var/www/html/storage \
|
||||
&& chmod -R 755 /var/www/html/bootstrap/cache
|
||||
|
||||
# Create entrypoint script
|
||||
COPY docker/entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
EXPOSE 8000
|
||||
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
CMD ["web"]
|
||||
110
README.md
Normal file
110
README.md
Normal file
|
|
@ -0,0 +1,110 @@
|
|||
# Lemmy Poster
|
||||
|
||||
A Laravel application for posting articles to Lemmy platforms.
|
||||
|
||||
## Docker Deployment
|
||||
|
||||
### Building the Image
|
||||
|
||||
```bash
|
||||
docker build -t your-registry/lemmy-poster:latest .
|
||||
docker push your-registry/lemmy-poster:latest
|
||||
```
|
||||
|
||||
### Docker Compose
|
||||
|
||||
Create a `docker-compose.yml` file:
|
||||
|
||||
```yaml
|
||||
services:
|
||||
app-web:
|
||||
image: your-registry/lemmy-poster:latest
|
||||
command: ["web"]
|
||||
ports:
|
||||
- "8000:8000"
|
||||
environment:
|
||||
- APP_ENV=production
|
||||
- APP_KEY=${APP_KEY}
|
||||
- DB_CONNECTION=mysql
|
||||
- DB_HOST=mysql
|
||||
- DB_PORT=3306
|
||||
- DB_DATABASE=lemmy_poster
|
||||
- DB_USERNAME=lemmy_user
|
||||
- DB_PASSWORD=${DB_PASSWORD}
|
||||
- QUEUE_CONNECTION=database
|
||||
- LEMMY_INSTANCE=${LEMMY_INSTANCE}
|
||||
- LEMMY_USERNAME=${LEMMY_USERNAME}
|
||||
- LEMMY_PASSWORD=${LEMMY_PASSWORD}
|
||||
- LEMMY_COMMUNITY=${LEMMY_COMMUNITY}
|
||||
depends_on:
|
||||
- mysql
|
||||
volumes:
|
||||
- storage_data:/var/www/html/storage/app
|
||||
restart: unless-stopped
|
||||
|
||||
app-queue:
|
||||
image: your-registry/lemmy-poster:latest
|
||||
command: ["queue"]
|
||||
environment:
|
||||
- APP_ENV=production
|
||||
- APP_KEY=${APP_KEY}
|
||||
- DB_CONNECTION=mysql
|
||||
- DB_HOST=mysql
|
||||
- DB_PORT=3306
|
||||
- DB_DATABASE=lemmy_poster
|
||||
- DB_USERNAME=lemmy_user
|
||||
- DB_PASSWORD=${DB_PASSWORD}
|
||||
- QUEUE_CONNECTION=database
|
||||
- LEMMY_INSTANCE=${LEMMY_INSTANCE}
|
||||
- LEMMY_USERNAME=${LEMMY_USERNAME}
|
||||
- LEMMY_PASSWORD=${LEMMY_PASSWORD}
|
||||
- LEMMY_COMMUNITY=${LEMMY_COMMUNITY}
|
||||
depends_on:
|
||||
- mysql
|
||||
volumes:
|
||||
- storage_data:/var/www/html/storage/app
|
||||
restart: unless-stopped
|
||||
|
||||
mysql:
|
||||
image: mysql:8.0
|
||||
environment:
|
||||
- MYSQL_DATABASE=lemmy_poster
|
||||
- MYSQL_USER=lemmy_user
|
||||
- MYSQL_PASSWORD=${DB_PASSWORD}
|
||||
- MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
|
||||
volumes:
|
||||
- mysql_data:/var/lib/mysql
|
||||
restart: unless-stopped
|
||||
|
||||
volumes:
|
||||
mysql_data:
|
||||
storage_data:
|
||||
```
|
||||
|
||||
### Environment Variables
|
||||
|
||||
Create a `.env` file with:
|
||||
|
||||
```env
|
||||
APP_KEY=your-app-key-here
|
||||
DB_PASSWORD=your-db-password
|
||||
DB_ROOT_PASSWORD=your-root-password
|
||||
LEMMY_INSTANCE=your-lemmy-instance.com
|
||||
LEMMY_USERNAME=your-lemmy-username
|
||||
LEMMY_PASSWORD=your-lemmy-password
|
||||
LEMMY_COMMUNITY=your-target-community
|
||||
```
|
||||
|
||||
Generate the APP_KEY:
|
||||
```bash
|
||||
openssl rand -base64 32 | tr -d '='
|
||||
```
|
||||
|
||||
### Deployment
|
||||
|
||||
1. Build and push the image
|
||||
2. Copy the docker-compose.yml to your server
|
||||
3. Create the .env file with your environment variables
|
||||
4. Run: `docker-compose up -d`
|
||||
|
||||
The web interface will be available on port 8000, ready for CloudFlare tunnel configuration.
|
||||
31
docker/entrypoint.sh
Normal file
31
docker/entrypoint.sh
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
#!/bin/sh
|
||||
|
||||
# Exit on any error
|
||||
set -e
|
||||
|
||||
# Wait for database to be ready
|
||||
until php artisan tinker --execute="DB::connection()->getPdo();" > /dev/null 2>&1; do
|
||||
echo "Waiting for database connection..."
|
||||
sleep 2
|
||||
done
|
||||
|
||||
# Run migrations on first start (web container only)
|
||||
if [ "$1" = "web" ]; then
|
||||
php artisan migrate --force
|
||||
fi
|
||||
|
||||
# Execute the command based on the argument
|
||||
case "$1" in
|
||||
"web")
|
||||
echo "Starting web server..."
|
||||
exec php artisan serve --host=0.0.0.0 --port=8000
|
||||
;;
|
||||
"queue")
|
||||
echo "Starting queue worker..."
|
||||
exec php artisan queue:work --tries=3
|
||||
;;
|
||||
*)
|
||||
echo "Usage: $0 {web|queue}"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
Loading…
Reference in a new issue