ADVERTISEMENT

Russian drones strike Ukrainian city of Odesa, underlining challenges for even limited truce

Published Mar 21, 2025 11:24 am

KYIV, Ukraine (AP) — Russian drones pummeled the Ukrainian Black Sea port city of Odesa, injuring three people and sparking massive fires, officials said Friday, an attack that underlined Moscow's intention to pursue aerial attacks even as it agreed to temporarily halt strikes on energy facilities.

AP25080275983728.jpg
In this photo provided by the Ukrainian Emergency Service, firefighters put out the fire at a storehouse following a Russian attack in Odesa, Ukraine, Friday, March 21, 2025. (Ukrainian Emergency Service via AP)

The strike came shortly before Czech Republic President Peter Pavel visited Odesa early Friday morning and held meetings with the city's leaders and officials from other southern regions.

“This is another reminder to the whole world: the war continues and Ukraine continues to fight,” the head of the Odesa region, Oleh Kiper, said in a statement.

He reported blazes at at least three locations after the attack late Thursday. “Civilian infrastructure, commercial facilities are on fire, cars damaged,” Kiper said.

Over 70 people and 20 fire engines were involved in extinguishing what the emergency services called “massive fires.”

In another attack, Russian glide bombs injured at least six people, including a child, in the Zaporizhzhia region overnight Thursday to Friday. Regional head Ivan Fedorov published photos showing fire fighters extinguishing flames at multiple damaged residential buildings.

The Ukrainian air force reported that Russia fired 214 exploding drones and decoys in the latest wave of attacks. It said 114 of them were intercepted and another 81 were jammed.

Russia’s Defense Ministry said air defenses shot down 43 Ukrainian drones, 34 of them over the Volgograd region and others over Rostov, Kursk and Belgorod regions. The authorities didn’t report any casualties or significant damage.

Meanwhile, a massive blaze at an oil depot in the Krasnodar region has continued to rage since it was hit by a Ukrainian drone attack late Wednesday.

Ukraine and Russia agreed in principle Wednesday to a limited ceasefire after U.S. President Donald Trump spoke with the countries’ leaders this week, though it remained to be seen what possible targets would be off limits to attack.

After a roughly hourlong call with Trump on Wednesday, Ukrainian President Volodymyr Zelenskyy told reporters that “technical” talks in Saudi Arabia this weekend would seek to resolve what types of infrastructure would be protected from attack under the agreement.

The three sides appeared to hold starkly different views about what the deal covered. While the White House said “energy and infrastructure” would be covered, the Kremlin declared that the agreement referred more narrowly to “energy infrastructure." Zelenskyy said he would also like railways and ports to be protected.

Kremlin spokesman Dmitry Peskov emphasized Friday that the agreement reached between Trump and Putin referred only to energy facilities, adding that the Russian military is fulfilling Putin's order to halt such attacks for 30 days.

“The Russian military are currently refraining from strikes on Ukraine's energy infrastructure in accordance with the agreement reached between Russia and the United States,” Peskov said in a conference call with reporters.

Related Tags

World news
ADVERTISEMENT
.most-popular .layout-ratio{ padding-bottom: 79.13%; } @media (min-width: 768px) and (max-width: 1024px) { .widget-title { font-size: 15px !important; } }

{{ articles_filter_1561_widget.title }}

.most-popular .layout-ratio{ padding-bottom: 79.13%; } @media (min-width: 768px) and (max-width: 1024px) { .widget-title { font-size: 15px !important; } }

{{ articles_filter_1562_widget.title }}

.most-popular .layout-ratio{ padding-bottom: 79.13%; } @media (min-width: 768px) and (max-width: 1024px) { .widget-title { font-size: 15px !important; } }

{{ articles_filter_1563_widget.title }}

{{ articles_filter_1564_widget.title }}

.mb-article-details { position: relative; } .mb-article-details .article-body-preview, .mb-article-details .article-body-summary{ font-size: 17px; line-height: 30px; font-family: "Libre Caslon Text", serif; color: #000; } .mb-article-details .article-body-preview iframe , .mb-article-details .article-body-summary iframe{ width: 100%; margin: auto; } .read-more-background { background: linear-gradient(180deg, color(display-p3 1.000 1.000 1.000 / 0) 13.75%, color(display-p3 1.000 1.000 1.000 / 0.8) 30.79%, color(display-p3 1.000 1.000 1.000) 72.5%); position: absolute; height: 200px; width: 100%; bottom: 0; display: flex; justify-content: center; align-items: center; padding: 0; } .read-more-background a{ color: #000; } .read-more-btn { padding: 17px 45px; font-family: Inter; font-weight: 700; font-size: 18px; line-height: 16px; text-align: center; vertical-align: middle; border: 1px solid black; background-color: white; } .hidden { display: none; }
function initializeAllSwipers() { // Get all hidden inputs with cms_article_id document.querySelectorAll('[id^="cms_article_id_"]').forEach(function (input) { const cmsArticleId = input.value; const articleSelector = '#article-' + cmsArticleId + ' .body_images'; const swiperElement = document.querySelector(articleSelector); if (swiperElement && !swiperElement.classList.contains('swiper-initialized')) { new Swiper(articleSelector, { loop: true, pagination: false, navigation: { nextEl: '#article-' + cmsArticleId + ' .swiper-button-next', prevEl: '#article-' + cmsArticleId + ' .swiper-button-prev', }, }); } }); } setTimeout(initializeAllSwipers, 3000); const intersectionObserver = new IntersectionObserver( (entries) => { entries.forEach((entry) => { if (entry.isIntersecting) { const newUrl = entry.target.getAttribute("data-url"); if (newUrl) { history.pushState(null, null, newUrl); let article = entry.target; // Extract metadata const author = article.querySelector('.author-section').textContent.replace('By', '').trim(); const section = article.querySelector('.section-info ').textContent.replace(' ', ' '); const title = article.querySelector('.article-title h1').textContent; // Parse URL for Chartbeat path format const parsedUrl = new URL(newUrl, window.location.origin); const cleanUrl = parsedUrl.host + parsedUrl.pathname; // Update Chartbeat configuration if (typeof window._sf_async_config !== 'undefined') { window._sf_async_config.path = cleanUrl; window._sf_async_config.sections = section; window._sf_async_config.authors = author; } // Track virtual page view with Chartbeat if (typeof pSUPERFLY !== 'undefined' && typeof pSUPERFLY.virtualPage === 'function') { try { pSUPERFLY.virtualPage({ path: cleanUrl, title: title, sections: section, authors: author }); } catch (error) { console.error('ping error', error); } } // Optional: Update document title if (title && title !== document.title) { document.title = title; } } } }); }, { threshold: 0.1 } ); function showArticleBody(button) { const article = button.closest("article"); const summary = article.querySelector(".article-body-summary"); const body = article.querySelector(".article-body-preview"); const readMoreSection = article.querySelector(".read-more-background"); // Hide summary and read-more section summary.style.display = "none"; readMoreSection.style.display = "none"; // Show the full article body body.classList.remove("hidden"); } document.addEventListener("DOMContentLoaded", () => { let loadCount = 0; // Track how many times articles are loaded const offset = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; // Offset values const currentUrl = window.location.pathname.substring(1); let isLoading = false; // Prevent multiple calls if (!currentUrl) { console.log("Current URL is invalid."); return; } const sentinel = document.getElementById("load-more-sentinel"); if (!sentinel) { console.log("Sentinel element not found."); return; } function isSentinelVisible() { const rect = sentinel.getBoundingClientRect(); return ( rect.top < window.innerHeight && rect.bottom >= 0 ); } function onScroll() { if (isLoading) return; if (isSentinelVisible()) { if (loadCount >= offset.length) { console.log("Maximum load attempts reached."); window.removeEventListener("scroll", onScroll); return; } isLoading = true; const currentOffset = offset[loadCount]; window.loadMoreItems().then(() => { let article = document.querySelector('#widget_1690 > div:nth-last-of-type(2) article'); intersectionObserver.observe(article) loadCount++; }).catch(error => { console.error("Error loading more items:", error); }).finally(() => { isLoading = false; }); } } window.addEventListener("scroll", onScroll); });

Sign up by email to receive news.